View a markdown version of this page

DynamoDB と LangChain の使用 - Amazon DynamoDB

DynamoDB と LangChain の使用

LangChain は、大規模言語モデル (LLM) を使用してアプリケーションを構築するためのフレームワークです。DynamoDB を使用する LangChain 統合は 2 つあります。DynamoDBChatMessageHistory クラスは会話履歴を保存してモデルがセッション間でユーザーとやり取りできるようにし、DynamoDBVectorStore クラスは類似性検索のために DynamoDB ベクトルインデックスに LangChain ベクトルストアインターフェイスを実装します。

チャットメッセージ履歴

DynamoDBChatMessageHistory クラスは、Python 用の langchain-community パッケージと JavaScript 用の @langchain/community パッケージで、チャットメッセージを DynamoDB テーブルに保持します。このクラスは、パーティションキーが SessionId という名前の文字列属性 (primary_key_name を使用して設定可能) である既存のテーブルを前提としています。AWS CLI を使用してテーブルを作成します。

aws dynamodb create-table \ --table-name SessionTable \ --attribute-definitions AttributeName=SessionId,AttributeType=S \ --key-schema AttributeName=SessionId,KeyType=HASH \ --billing-mode PAY_PER_REQUEST

パッケージをインストールし、セッション ID をキーとする履歴の読み書きを行います。

pip install langchain-community boto3
from langchain_community.chat_message_histories import DynamoDBChatMessageHistory history = DynamoDBChatMessageHistory( table_name="SessionTable", session_id="user-42", ) history.add_user_message("Hello!") history.add_ai_message("How can I help you today?") print(history.messages)

各チャットセッションのメッセージは session_id の下に保存されるため、戻ってきたユーザーは中断した会話を再開できます。コンストラクタは、ユーザー ID (key)、古いセッションの TTL ベースの有効期限 (ttl)、保存メッセージの上限 (history_size) など、アプリケーションの詳細別に履歴を分離するための複合キーもサポートしています。完全な API については、「Python リファレンス」および「JavaScript リファレンス」を参照してください。

ベクトルインデックスに基づくベクトルストア

langchain-aws パッケージの DynamoDBVectorStore クラスは、DynamoDB ベクトルインデックスを使用して LangChain ベクトルストアインターフェイスを実装します (「DynamoDB でのベクトルインデックスの使用」を参照)。ドキュメントは通常の DynamoDB 項目として保存され、SearchVectors API を使用してテーブルのベクトルインデックスが検索されるため、LangChain リトリーバーと RAG チェーンは、データを保持するテーブルに対して類似度検索を直接実行します。

パッケージをインストールする:

pip install langchain-aws boto3

テーブル名と埋め込み関数を指定します。テーブルとベクトルインデックスが存在しない場合、最初の書き込み時に作成されます。

from langchain_aws.embeddings import BedrockEmbeddings from langchain_aws.vectorstores.dynamodb import DynamoDBVectorStore vector_store = DynamoDBVectorStore.from_texts( ["hello", "developer", "wife"], embedding=BedrockEmbeddings(model_id="amazon.titan-embed-text-v2:0"), table_name="my-documents", ) docs = vector_store.similarity_search("greeting", k=2)

検索の範囲を指定するには、ストアを構築するときに partition_attribute を渡します。次に、ベクトルインデックスはそのドキュメントメタデータフィールドの検索スキーマパーティションキーを使用して作成され、各検索はコーパス全体ではなく、コレクション、カテゴリ、テナントなどの値を 1 つだけ調べます。その後、すべての検索で、filter={partition_attribute: value} またはストアレベルの default_partition_value を通じて値が提供されます。パーティションキーはインデックススキーマの一部であり、インデックスの作成後に変更することはできません。

以下に留意してください。

  • グローバルセカンダリインデックスと同様に、ベクトルインデックスは結果整合性があります。add_texts の直後に発行された検索には、インデックスが追いつくまで、直前に書き込まれたドキュメントが含まれない場合があります。

  • SearchVectors はクエリごとに最大 100 件の一致を返すため、ストアの k パラメータは 100 に制限されます。

  • インデックスのディメンション、距離関数、および検索スキーマは、作成時に固定されます。ストアは、不一致のまま処理を続行するのではなく、既存のインデックスに対して検証を行います。

API の詳細については、「langchain-aws リポジトリの DynamoDBVectorStore」を参照してください。

その他のリソース