
LambdaDB は全文検索とベクトル検索を組み合わせた「ハイブリッド検索」を実現するサーバレスネイティブなサービス💡ウェブサイトには従量課金で使えるため Pinecone と比較してコスト削減ができるよ〜と書いてあったりする.
また LambdaDB ブログに内部アーキテクチャの解説もあって,AWS Lambda / Amazon S3 / Amazon DynamoDB / Amazon EventBridge / Amazon EFS などを活用しているようだった.

から引用
Quickstart
LambdaDB をサクッと入門できる Quickstart があって,試してみた❗️
🚀 Step 1: Install the SDK
まずは LambdaDB SDK をインストールする.現在 Python と TypeScript の SDK が提供されていて,今回は LambdaDB Python SDK を使う.あと Python の仮想環境などは uv を使ってイイ感じに管理する.
$ uv venv $ uv pip install lambdadb
🔑 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 タイプ以外にもいくつかのインデックスタイプがサポートされているようだった.
ちなみに Quickstart のコードだと認証情報(server_url と project_api_key)を直接 Python コードに入力するようになっていて,今回は dotenv を使って .env を読むように書き換えた👌
$ uv pip install python-dotenv
一箇所 Python コードにシンタックスエラーがあって,修正するプルリクエストを送ったらすぐに merge してもらえた🎉
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 にドキュメントがまとまっている📝
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)
🔍 Step 5: Full-text search
コレクションとドキュメントの準備が整ったので,まずは「全文検索」をする.今回は 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 は以下のドキュメントに詳しくまとまっていた.
実行結果は以下🐍
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.
🔍 Step 6: Hybrid search
次は「ハイブリッド検索」をする.検索条件としては 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 のプレビューリリースもあったりして,選択肢の幅も増えそう.














