以下の内容はhttps://kakakakakku.hatenablog.com/entry/2025/08/29/110515より取得しました。


LambdaDB の Quickstart を試す

LambdaDB は全文検索とベクトル検索を組み合わせた「ハイブリッド検索」を実現するサーバレスネイティブなサービス💡ウェブサイトには従量課金で使えるため Pinecone と比較してコスト削減ができるよ〜と書いてあったりする.

lambdadb.ai

また LambdaDB ブログに内部アーキテクチャの解説もあって,AWS Lambda / Amazon S3 / Amazon DynamoDB / Amazon EventBridge / Amazon EFS などを活用しているようだった.

“Serverless” Database Is Dead - It’s Time to Evolve から引用

Quickstart

LambdaDB をサクッと入門できる Quickstart があって,試してみた❗️

docs.lambdadb.ai

🚀 Step 1: Install the SDK

まずは LambdaDB SDK をインストールする.現在 Python と TypeScript の SDK が提供されていて,今回は LambdaDB Python SDK を使う.あと Python の仮想環境などは uv を使ってイイ感じに管理する.

$ uv venv
$ uv pip install lambdadb

github.com

🔑 Step 2: Get your API key

次に LambdaDB 検証用の認証情報を取得する.フォームを送信したらすぐにメールが届いた.

認証情報には「API Base URL」「Shared API Key」が含まれている.今回は Asia Pacific (Seoul) リージョンを使う.あくまで検証用の環境なので注意する🚨

📚 Step 3: Create a collection

さっそく LambdaDB に「コレクション」を登録する.コレクションに関してはドキュメントに詳しく書いてある.今回使う text タイプ・keyword タイプ・vector タイプ以外にもいくつかのインデックスタイプがサポートされているようだった.

docs.lambdadb.ai

ちなみに Quickstart のコードだと認証情報(server_urlproject_api_key)を直接 Python コードに入力するようになっていて,今回は dotenv を使って .env を読むように書き換えた👌

$ uv pip install python-dotenv

一箇所 Python コードにシンタックスエラーがあって,修正するプルリクエストを送ったらすぐに merge してもらえた🎉

github.com

Quickstart のコードではサンプルとして10次元(少なめ)のベクトル設定になっていた.

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB, models

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

# Create collection with text and vector indexes
res = lambda_db.collections.create(
    collection_name=collection_name,
    index_configs={
        "text": {
            "type": models.TypeText.TEXT,
            "analyzers": [
                models.Analyzer.ENGLISH,  # English text support
                models.Analyzer.KOREAN    # Korean text support
            ],
        },
        "keyword": {
            "type": models.Type.KEYWORD
        },
        "vector": {
            "type": models.TypeVector.VECTOR,
            "dimensions": 10,                        # Vector dimension
            "similarity": models.Similarity.COSINE,  # Cosine similarity metric
        },
    }
)
print(res)

実行結果は以下🐍

collection=CollectionResponse(project_name='playground', collection_name='kakakakakku', index_configs={'text': IndexConfigsText(type=<TypeText.TEXT: 'text'>, analyzers=[<Analyzer.ENGLISH: 'english'>, <Analyzer.KOREAN: 'korean'>]), 'keyword': IndexConfigs(type=<Type.KEYWORD: 'keyword'>), 'vector': IndexConfigsVector(type=<TypeVector.VECTOR: 'vector'>, dimensions=10, similarity=<Similarity.COSINE: 'cosine'>), 'id': IndexConfigs(type=<Type.KEYWORD: 'keyword'>)}, num_docs=0, collection_status=<Status.CREATING: 'CREATING'>, source_project_name=None, source_collection_name=None, source_collection_version_id=None)

📄 Step 4: Add documents

今度は作ったコレクションにドキュメントを追加する.ドキュメントとしては3つ.ベクトルはあくまでサンプル値になっていて,実際にはエンベディングをする必要がある.

LambdaDB Python SDK で呼び出す upsert() などの関数は GitHub にドキュメントがまとまっている📝

github.com

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

# Prepare sample documents
docs = [
    {
        "id": "doc1",
        "text": "Serverless computing does not mean no servers are involved. It refers to a cloud computing model where the server management is abstracted away from developers.",
        "keyword": "serverless",
        "vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    },
    {
        "id": "doc2",
        "text": "Instead, it refers to a cloud computing model where developers can build and run applications without having to manage the underlying infrastructure.",
        "keyword": "cloud",
        "vector": [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1]
    },
    {
        "id": "doc3",
        "text": "The key aspect is that developers don't need to explicitly provision or manage servers. The cloud provider handles all server management automatically.",
        "keyword": ["serverless", "infrastructure"],  # Multiple keywords supported
        "vector": [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2]
    }
]

# Upload documents to the collection
res = lambda_db.collections.docs.upsert(
    collection_name=collection_name,
    docs=docs
)
print(res)

実行結果は以下🐍

message='Upsert request is accepted'

さらに追加したドキュメントを取得する.

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

# Check collection status and document count
res = lambda_db.collections.get(collection_name=collection_name)
print(res)

実行結果は以下🐍

期待通りに num_docs=3 と出力されている👌ちょっと見にくいけど...

collection=CollectionResponse(project_name='playground', collection_name='kakakakakku', index_configs={'vector': IndexConfigsVector(type=<TypeVector.VECTOR: 'vector'>, dimensions=10, similarity=<Similarity.COSINE: 'cosine'>), 'text': IndexConfigsText(type=<TypeText.TEXT: 'text'>, analyzers=[<Analyzer.ENGLISH: 'english'>, <Analyzer.KOREAN: 'korean'>]), 'id': IndexConfigs(type=<Type.KEYWORD: 'keyword'>), 'keyword': IndexConfigs(type=<Type.KEYWORD: 'keyword'>)}, num_docs=3, collection_status=<Status.ACTIVE: 'ACTIVE'>, source_project_name=None, source_collection_name=None, source_collection_version_id=None)

コレクションとドキュメントの準備が整ったので,まずは「全文検索」をする.今回は text の検索と keyword の一致が条件になっていた.ちなみに Quickstart のコードで検索キーワードが I hate managing servers(私はサーバー管理が嫌い) になっててイイw

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

res = lambda_db.collections.query(
    collection_name=collection_name,
    size=10,
    query={
        "bool": [
            {
                "queryString": {
                    "query": "I hate managing servers",  # Main search query
                    "defaultField": "text"               # Search in text field
                }
            },
            {
                "queryString": {
                    "query": "keyword:serverless"       # Filter by keyword
                },
                "occur": "must"
            }
        ]
    },
    consistent_read=True
)

# Display results
print("🔍 Search Results:")
for result in res.docs:
    doc_id = str(result.doc['id'])
    score = f"{result.score:.2f}"
    keyword = str(result.doc['keyword'])
    text = str(result.doc['text'])

    print(f"{doc_id:<5} | {score:<5} | {keyword:<15} | {text}")

クエリ条件の occur は以下のドキュメントに詳しくまとまっていた.

docs.lambdadb.ai

実行結果は以下🐍

2つのドキュメントがヒットして,スコアも確認できた👌

🔍 Search Results:
doc3  | 0.83  | ['serverless', 'infrastructure'] | The key aspect is that developers don't need to explicitly provision or manage servers. The cloud provider handles all server management automatically.
doc1  | 0.80  | serverless      | Serverless computing does not mean no servers are involved. It refers to a cloud computing model where the server management is abstracted away from developers.

次は「ハイブリッド検索」をする.検索条件としては I hate managing servers のベクトル(今回はあくまでサンプル値)を指定してベクトル検索をしているような感じだった.

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

res = lambda_db.collections.query(
    collection_name=collection_name,
    size=10,
    query={
        "l2": [  # L2 normalization combines scores
            {
                "queryString": {
                    "query": "I hate managing servers",
                    "defaultField": "text"
                }
            },
            {
                "knn": {  # K-nearest neighbors vector search
                    "field": "vector",
                    "k": 5,
                    "queryVector": [
                        0.9, 0.8, 0.7, 0.6, 0.5,
                        0.4, 0.3, 0.2, 0.1, 1.0
                    ]
                }
            }
        ]
    },
    consistent_read=True
)

# Display hybrid search results
print("🔄 Hybrid Search Results:")
for result in res.docs:
    doc_id = str(result.doc['id'])
    score = f"{result.score:.2f}"
    keyword = str(result.doc['keyword'])
    text = str(result.doc['text'])

    print(f"{doc_id:<5} | {score:<5} | {keyword:<15} | {text}")

実行結果は以下🐍

全文検索ではヒットしなかった doc2 もヒットするようになっていた👌

🔄 Hybrid Search Results:
doc3  | 0.66  | ['serverless', 'infrastructure'] | The key aspect is that developers don't need to explicitly provision or manage servers. The cloud provider handles all server management automatically.
doc1  | 0.62  | serverless      | Serverless computing does not mean no servers are involved. It refers to a cloud computing model where the server management is abstracted away from developers.
doc2  | 0.33  | cloud           | Instead, it refers to a cloud computing model where developers can build and run applications without having to manage the underlying infrastructure.

🧹 Step 7: Clean up

最後はコレクションを削除しておく.ちなみに今回は検証用の環境なので翌日には自動的にコレクションが削除されているような気がした🗑️ブログをまとめながら数回 Quickstart を試していて気付いた.

import os
from dotenv import load_dotenv
from lambdadb import LambdaDB

load_dotenv()

# Initialize the LambdaDB client
lambda_db = LambdaDB(
    server_url=os.getenv("SERVER_URL"),
    project_api_key=os.getenv("PROJECT_API_KEY"),
)

collection_name = "kakakakakku"

lambda_db.collections.delete(collection_name=collection_name)

まとめ

LambdaDB の Quickstart を試してみた❗️まだ新しいプロダクトなので今後もウォッチしていきたいな〜と思う.最近だと Amazon S3 Vectors のプレビューリリースもあったりして,選択肢の幅も増えそう.

aws.amazon.com




以上の内容はhttps://kakakakakku.hatenablog.com/entry/2025/08/29/110515より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14