Amazon Bedrockで文書検索をやってみた(FAISS、LangChain)

はじめに

Amazon Bedrockで文書検索をやってみました。ベクトル化にはamazon.titan-embed-text-v1モデル、回答生成にはanthropic.claude-v2モデルを使用しました。

環境

  • Windows11
  • Python 3.11.5
  • LangChain
  • OpenAI
  • FAISS
  • AWS CLI

実装

必要なライブラリのインストール

AWS CLIの設定

AWS IAMの「ユーザー」タブに移動して、任意のユーザーを選択または作成します。
「セキュリティ認証情報」タブから、「アクセスキーを作成」を選択します。

記事投稿用 (4).png

ユースケースは「コマンドラインインターフェイス(CLI)を選択し、「次へ」を選択します。

記事投稿用 (5).png

説明タグ値の入力は任意となるため、入力せずに「アクセスキーを作成」を選択します。

記事投稿用 (6).png

アクセスキーとシークレットキーをメモして「完了」を選択します。

記事投稿用 (7).png

続いて、AWS CLIをインストールしていない場合は、インストールします。
以下の記事を参考にして、インストールしてください。

今回のチャットボットを実行するディレクトリに移動し、AWS CLIがインストールされたかを以下のコマンドで確認します。

結果が表示されれば、インストールされています。

以下のコマンドで、アクセスキーとシークレットキーを設定します。
最初は空の状態なので、ご自身のアクセスキーやシークレットキーを入力し、エンターキーを押してください。region nameは「us-east-1」、output formatは「json」にしてください。

ベクトルストアの作成

まず、PDFをベクトル化してベクトルストアを作成します。
私は以下のAmazon KendraのPDFをベクトル化しました。

コードの解説は以下のとおりです。

  • BedrockEmbeddings(langchain.embeddings)
    Amazonのamazon.titan-embed-text-v1モデルを使ってテキストの埋め込み(ベクトル表現)を生成します。これにより、テキストの意味的内容を数値ベクトルとして表現できます。
  • FAISS(langchain.vectorstores)
    Facebook AI Similarity Search(FAISS)を使用して、生成されたテキストのベクトルを効率的に保存し、検索できるようにします。FAISSは、大量のベクトルを高速に検索するためのライブラリです。
  • PyPDFLoader(langchain.document_loaders)
    PDFファイルを読み込み、処理するためのツールです。PDFの各ページを読み込み、テキストを抽出します。
  • CharacterTextSplitter(langchain.text_splitter)
    文書を指定されたサイズのチャンクに分割するために使用されます。これにより、大きな文書も効率的に処理できるようになります。

文書検索を実行する

コードの解説は以下のとおりです。

  • LangChainとBedrockのインポート
    • from langchain.llms import Bedrock: LangChainライブラリからBedrockモジュールをインポートします。BedrockはAnthropic社のAIモデル、ClaudeのためのAPIラッパーです。
    • from langchain.embeddings import BedrockEmbeddings: 埋め込み(embeddings)の取り扱いに特化したBedrockEmbeddingsモジュールをインポートします。
  • FAISSとRetrievalQAのインポート
    • from langchain.vectorstores import FAISS: FAISSはFacebook AI Similarity Searchの略で、大規模なデータセットから効率的に類似アイテムを検索するためのライブラリです。
    • from langchain.chains import RetrievalQA: 質問応答のための複合型チェーンを提供するRetrievalQAモジュールをインポートします。
  • LangChainモデルの設定
    • llm = Bedrock(...): Claudeモデルの設定を行います。ここで、モデルIDと最大トークン数を指定します。
  • 埋め込みモデルの設定
    • embeddings = BedrockEmbeddings(...): Amazon Titanのテキスト埋め込みモデルを設定します。
  • ベクターストアのロードとリトリバーの設定
    • vectorstore = FAISS.load_local(...): ローカルに保存されているFAISSベクターストアをロードします。
    • retriever = vectorstore.as_retriever(): ロードしたベクターストアをリトリバー(検索エンジン)として設定します。
  • RetrievalQAチェーンの構築
    • chain = RetrievalQA.from_chain_type(...): LangChainモデルとリトリバーを使用して、質問応答チェーンを構築します。
  • 質問応答の実行と結果の出力
    • results = chain("..."): 指定した質問(ここでは「Amazon Kendraの仕組みについて教えてください。」)に対する応答を取得します。
    • print(results["result"]): 取得した応答を出力します。

      上記のPythonファイルを実行すると以下のような結果が返ってきました。

おわりに

お疲れ様でした!

参考文献は以下のとおりです。

この記事を書いた人

aws-recipe-user