Amazon Web Services ブログ

LangChain と Amazon DocumentDB のベクトル検索を使用した生成 AI チャットボットの構築

Amazon DocumentDB (with MongoDB compatibility) は、ヘルスケアゲーム金融など、さまざまな分野でモダンアプリケーションを構築するお客様にメリットをもたらします。フルマネージド型のドキュメントデータベースであり、柔軟性、スケーラビリティ、高パフォーマンス、高度な機能によってユーザー体験を向上できます。Amazon DocumentDB がサポートする JSON データモデルを利用する企業は、半構造化データへの対応により、アプリケーション開発の高速化とデータの読み取り速度の向上を実現できます。

ある推計によると、非構造化データは企業の新規データの 80 ~ 90% を占める可能性があり、構造化データをはるかに上回る速度で増加しています。この傾向は、生成 AI の新しい機会によって加速されています。AWS のお客様は、この技術をどのように活用し、自社の豊富なデータに適用できるかについて、ますます関心を寄せています。多くのお客様は、ベクトルデータベースエンジンを使用して、レコメンデーションエンジンを実装したり、リッチメディアを検索したり、クエリのコンテキストと意味に合わせてより関連性の高い文書を取得したりすることを検討しています。

最近の Amazon DocumentDB でのベクトル検索サポート などの機能リリースまでは、ワークロードにベクトル検索機能を実現するには、企業はデータをマネージドデータベースサービスから別のベクトルデータベースエンジンやサービスに連携させる必要があり、アーキテクチャのコストと複雑さが増加していました。このようなアーキテクチャの変更により、アプリケーションがドキュメントとは別の場所にエンベディングを格納および取得する必要があるため、さらにコード変更が必要になります。

既存の Amazon DocumentDB クラスターでセマンティック検索機能を有効にすると、最新の機械学習 ( ML ) および生成 AI ( AI ) アプリケーションを容易に構築できます。Amazon DocumentDB でベクトル検索を使用し、Amazon Bedrock や Amazon SageMaker などの AWS ML サービス、OpenAI、Hugging Face、LangChain などのサードパーティサービスと連携できます。また、ベクトルを元のドキュメントに格納できるようになりました。この機能は、HNSW インデックスのサポートによってさらに強化され、低レイテンシーでベクトル類似度検索を実行し、高い関連性の結果を生成できるようになりました。

この記事では、エンベディングを Amazon DocumentDB に正しくロードした後、LangChain を使用して大規模言語モデル (LLM) にクエリを行うチャットボットを作成する例を示します。

LLM による検索補助生成

Retrieval Augmented Generation (RAG) を使用すると、基盤モデルの外部からデータを取得し、取得された関連データをコンテキストとしてプロンプトに追加することで、プロンプトを強化できます。これは、エンドユーザーに対話型の体験を提供できるチャットボットを構築する際に有用です。企業のナレッジベースやコンテンツから、ユーザーのリクエストに最も関連する情報を取得し、ユーザーのリクエストとともにコンテキストとしてバンドルし、LLM に送信して生成 AI レスポンスを取得するため、直感的なインターフェースを提供します。

この例では、LangChain の PyPDFDirectoryLoader を使用して、Amazon DocumentDB Developer Guide の PDF バージョンを取り込みました。これを使用して、サービスの機能、使用法、ベストプラクティスについて質問できるチャットボットを作成しました。完全なソリューションは、amazon-documentdb-samples GitHub リポジトリにあります。

Amazon DocumentDB にデータをロードする前に、コレクションに HNSW インデックスを作成します:

collection.create_index([("vectorContent","vector")],
    vectorOptions= {
        "type": "hnsw",
        "similarity": "euclidean",
        "dimensions": 1536,
        "m": 16,
        "efConstruction": 64},
    name="hnsw")

IVFFlat とは異なり、HNSW にはトレーニングステップが関与しないため、初期データロードなしでインデックスを生成できます。

開発者ガイドを LangChain の RecursiveCharacterTextSplitter を使用して分割した後、Amazon Titan Embeddings G1 Text model (amazon.titan-embed-text-v1) を使用してエンベディングを作成します。

embeddings = BedrockEmbeddings(model_id= "amazon.titan-embed-text-v1", client=bedrock_client)
 INDEX_NAME = "hnsw"
 vector_store = DocumentDBVectorSearch.from_documents(
    documents=docs,
    embedding=embeddings,
    collection=collection,
    index_name=INDEX_NAME,
)

最後に、Anthropic Claude for Amazon Bedrock  を推論エージェントとして初期化し、ユーザーが要求したタスクを複数のステップに分割します。

llm = BedrockChat(model_id="anthropic.claude-3-sonnet-20240229-v1:0", client=bedrock_client)

ソリューションをテストするために、PromptTemplate を作成し、RetrievalQA チェーンを使用して、HNSW インデックスから質問に関連するドキュメントを収集します。これらのドキュメントを使用して、次のスクリーンショットに示すように、質問に対する一意の回答を作成します。

Screenshot displaying Jupyter Notebook of Code

クエリ、チャット履歴、コンテキストを引数として受け取る RAG の使用例、および Amazon DocumentDB での集約パイプラインを使用したベクトル検索 の方法については、完全なノートブックを確認できます。

サマリー

Amazon DocumentDB のベクトル検索は、JSON ベースのドキュメントデータベースの柔軟性と豊富なクエリ機能と、ベクトル検索の強力な機能を組み合わせたものです。LangChain のような強力なフレームワークと、Amazon Titan Text Embeddings のようなテキストエンベディング、そして Amazon Bedrock 経由でアクセスできる Anthropic の Claude 3 のような基盤モデルを使うことで、セマンティック検索体験、商品レコメンデーション、パーソナライゼーション、チャットボット、不正検知、異常検知などの ML と生成 AI ソリューションを構築できます。

既存のワークロードでベクトル検索を使い始めるには、amazon-documentdb-samples GitHub リポジトリを参照し、この記事で説明した例をダウンロードしてください。

著者について

この記事は、Andrew Chen, Cody Allen, Inderpreet Singh によって投稿された記事を翻訳したものです。

原文はこちらです。