DynamoDB と LangChain の使用
LangChainDynamoDBChatMessageHistory クラスは会話履歴を保存してモデルがセッション間でユーザーとやり取りできるようにし、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 リファレンス
ベクトルインデックスに基づくベクトルストア
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