ドキュメント エージェントを使用した AI コンテンツ検索の構築

情報の検索は、人工知能(AI)生成モデルの最も一般的な用途の一つです。AI を使用してコンテンツの会話型検索インターフェースを構築すると、ユーザーは特定の質問をして、直接的な回答を得ることができます。

このチュートリアルでは、コンテンツ用に AI を活用した会話型検索インターフェースを構築する方法について説明します。これは、Google Gemini API を使用して会話型検索インターフェースを作成するオープンソース プロジェクトの Docs Agent をベースにしています。新しい AI モデルのトレーニングや、Gemini モデルによるモデルのチューニングは必要ありません。つまり、この検索機能を迅速に構築して、規模の大小にかかわらずコンテンツ セットに使用できます。

プロジェクトの概要と、プロジェクトの構築者からの分析情報を含むプロジェクトを拡張する方法については、AI コンテンツ検索 | Google AI で構築をご覧ください。まだ作成していない場合は、次の手順でプロジェクトの拡張を開始できます。

概要

ドキュメント エージェント プロジェクトは、Google Gemini API と生成モデルを基盤とする、特定のコンテンツ セット用の会話型検索インターフェースを提供します。ユーザーは会話形式で詳細な質問をし、特定のコンテンツ セットに基づいて詳細な回答を得ることができます。ドキュメント エージェントはバックグラウンドで質問を受け取り、コンテンツのベクトル データベースに対して検索を行い、関連テキストのスニペットを含む生成モデルの詳細なプロンプトを作成します。生成モデルが質問に対する回答を生成し、ドキュメント エージェントが回答をフォーマットしてユーザーに提示します。

ドキュメント エージェントの機能図 図 1. ドキュメント エージェント プロジェクト アプリの機能図。

ドキュメント エージェントがコンテンツに関する質問に回答できるようにする鍵は、そのコンテンツのベクトル データベースを作成することです。コンテンツを論理的なテキストのチャンクに分割し、各チャンクのベクトルを生成します。これらのベクトルは、各チャンクの情報の数値表現であり、Google の生成モデルから AI テキスト エンベディング関数を使用して生成されます。

ユーザーが質問すると、ドキュメント エージェントは同じテキスト エンベディング関数を使用して質問の数値表現を作成し、その値を使用してベクトル データベースを検索し、関連コンテンツを見つけます。上位の結果を取得し、その情報を生成モデルのプロンプトに追加します。AI モデルは、質問と追加のコンテキスト情報を受け取り、回答を生成します。

プロジェクトの設定

ここでは、開発とテスト用にドキュメント エージェント プロジェクトをセットアップする手順について説明します。一般的な手順は、前提条件のソフトウェアのインストール、いくつかの環境変数の設定、コード リポジトリからのプロジェクトのクローン作成、構成のインストールの実行です。コード プロジェクトでは、Python Poetry を使用してパッケージと Python ランタイム環境を管理しています。

前提条件をインストールする

ドキュメント エージェント プロジェクトでは、Python 3 と Python Poetry を使用してパッケージを管理し、アプリケーションを実行します。次のインストール手順は、Linux ホストマシン用です。

必要なソフトウェアをインストールするには:

  1. Python 3 と Python 用の venv 仮想環境パッケージをインストールします。
    sudo apt update
    sudo apt install git pip python3-venv
    
  2. Python Poetry をインストールして、プロジェクトの依存関係とパッケージ化を管理します。
    curl -sSL https://install.python-poetry.org | python3 -
    

プロジェクトを拡張する場合は、Python Poetry を使用して Python ライブラリを追加できます。

環境変数を設定する

ドキュメント エージェント コード プロジェクトの実行に必要ないくつかの環境変数(Google Gemini API キーや Python Poetry 設定など)を設定します。Linux を使用している場合は、これらの変数を $HOME/.bashrc ファイルに追加して、ターミナル セッションのデフォルト設定にできます。

環境変数を設定するには:

  1. Google Gemini API キーを取得して、キー文字列をコピーします。
  2. API キーを環境変数として設定します。Linux ホストでは、次のコマンドを使用します。
    export API_KEY=<YOUR_API_KEY_HERE>
    
  3. PYTHON_KEYRING_BACKEND パラメータを設定して、Python Poetry の既知の問題を解決します。Linux ホストでは、次のコマンドを使用します。
    export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
    

プロジェクトのクローンを作成して構成する

プロジェクト コードをダウンロードし、Poetry インストール コマンドを使用して必要な依存関係をダウンロードし、プロジェクトを構成します。プロジェクトのソースコードを取得するには、git ソース管理ソフトウェアが必要です。 external プロジェクト コードをダウンロードして構成するには:

  1. 次のコマンドを使用して、git リポジトリのクローンを作成します。
    git clone https://github.com/google/generative-ai-docs
    
  2. 必要に応じて、スパース チェックアウトを使用するようにローカルの Git リポジトリを設定し、ドキュメント エージェント プロジェクトのファイルのみが含まれるようにします。
    cd generative-ai-docs/
    git sparse-checkout init --cone
    git sparse-checkout set examples/gemini/python/docs-agent/
    
  3. docs-agent プロジェクトのルート ディレクトリに移動します。
    cd examples/gemini/python/docs-agent/
    
  4. Poetry インストール コマンドを実行して依存関係をダウンロードし、プロジェクトを構成します。
    poetry install
    

コンテンツを準備する

ドキュメント エージェント プロジェクトはテキスト コンテンツを処理するように設計されており、Markdown をソース形式として使用するウェブサイトで使用するためのツールを備えています。ウェブサイトのコンテンツを扱う場合は、提供されるウェブサイトのディレクトリ構造を保持(または複製)して、コンテンツ処理タスクがそのコンテンツへのリンクをマッピングして作成できるようにする必要があります。

コンテンツの形式と詳細によっては、非公開情報、内部メモ、検索できないようにしたくないその他の情報を削除するために、コンテンツをクリーンアップする必要があります。コンテンツ処理ステップで、論理的なテキスト分割(チャンク)の作成に役立つタイトルや見出しなど、基本的な書式設定は保持する必要があります。

処理するコンテンツを準備するには:

  1. AI エージェントに検索させるコンテンツのディレクトリを作成します。
    mkdir docs-agent/content/
    
  2. コンテンツを docs-agent/content/ ディレクトリにコピーします。コンテンツがウェブサイトの場合は、提供されているウェブサイトのディレクトリ構造を保持(または複製)します。
  3. 必要に応じてコンテンツをクリーンアップまたは編集して、非公開の情報など、検索に含めたくない情報を削除します。

テストに Flutter ドキュメントを使用する

ドキュメント エージェントをテストするための一連のコンテンツが必要な場合は、Flutter デベロッパー ドキュメントをテストに使用できます。

Flutter のデベロッパー向けドキュメントは、次の手順で入手できます。

  1. AI エージェントに検索させるコンテンツのコンテンツ ディレクトリに移動します。
    cd docs-agent/content/
    
  2. Flutter ドキュメントのクローンを docs-agent/content/ ディレクトリに作成します。
    git clone --recurse-submodules https://github.com/flutter/website.git
    

コンテンツを処理する

検索エージェントがユーザーの質問に関連するコンテンツを効果的に検索するには、コンテンツを表すベクトルのデータベースを構築する必要があります。ベクトルは、テキスト エンベディングと呼ばれる AI 生成モデル関数を使用して生成されます。テキスト エンベディングは、テキスト コンテンツの数値表現です。一連の数値としてテキストのセマンティックな意味を近似します。情報の数値表現があることにより、システムはユーザーの質問を取得し、同じテキスト エンベディング関数を使用してその意味を近似し、k 最近傍(k-NN)アルゴリズムを使用して関連情報を数学計算として見つけることができます。

テキスト コンテンツの分割

テキスト エンベディング ベクトルが効果的に表現できるテキストの量には制限があります。このプロジェクトでは、ベクターで表現されるテキストが 3, 000 文字以下に制限されているため、この文字数制限未満でコンテンツをチャンクに分割する必要があります。このセクションでは、ドキュメント エージェント プロジェクトに付属のスクリプトを使用して、Markdown ファイルを小さなテキスト チャンクに分割する方法について説明します。他のコンテンツ形式を使用する際のヒントについては、他の形式を処理するをご覧ください。

マークダウン形式のコンテンツを分割するには:

  1. docs-agent/config.yaml ファイルを編集して、処理スクリプトの入力パラメータを構成します。この例では、Flutter ドキュメントのサブセットをターゲットとしています。
    input:
    - path: "content/website/src/ui"
      url_prefix: "https://docs.flutter.dev/ui"
    
  2. この構成ファイルに変更を保存します。
  3. docs-agent プロジェクト ディレクトリに移動します。
    cd docs-agent/
    
  4. agent chunk コマンドを実行して、Markdown ソース コンテンツを分割します。
    agent chunk
    

このスクリプトは、入力コンテンツを処理し、docs-agent/data ディレクトリに出力テキスト ファイルを作成し、タイトル、見出し、関連する段落に基づいてテキストを分割します。コンテンツのサイズによっては、処理に時間がかかることがあります。

テキスト エンベディング ベクトルを作成する

コンテンツを適切なサイズの有意義なチャンクに分割したら、テキスト エンベディング関数を使用してベクトル データベースにコンテンツを入力できます。ドキュメント エージェント プロジェクトでは、Chroma ベクトル データベースを使用してテキスト エンベディング ベクトルを保存します。ここでは、ドキュメント エージェント スクリプトを使用して、分割したコンテンツをベクター データベースに挿入する方法について説明します。

テキスト エンベディングを生成し、ベクトル データベースにデータを入力するには:

  1. docs-agent プロジェクト ディレクトリに移動します。
    cd docs-agent/
    
  2. agent populate コマンドを使用して、ベクター データベースにコンテンツを追加します。
    agent populate
    

このスクリプトは、Google Gemini API を使用してテキスト エンベディング ベクトルを生成し、出力をベクトル データベースに保存します。コンテンツのサイズによっては、処理に時間がかかることがあります。

他の形式の処理

ドキュメント エージェント プロジェクトは、Markdown 形式のウェブサイト コンテンツと連携するように設計されています。プロジェクトの作成者は、Google ドキュメント、Portable Document Format(PDF)、Gmail など、他の種類のコンテンツを Markdown 形式に生成するためのコンバータ スクリプトをいくつか構築しました。これらのコンバータの使用方法については、コード リポジトリの docs-agent/apps_script ディレクトリをご覧ください。

他のコンテンツ形式を変換する

プロジェクトで他のコンテンツ形式を使用することもできますが、それらの追加のメソッドは、ご自身またはコミュニティの他のメンバーが構築する必要があります。同様のソリューションを作成している方は、コード リポジトリの問題pull リクエストを確認してください。

他のコンテンツ形式をサポートするために作成する必要があるキーコードは、files_to_plain_text.py スクリプトのような分割スクリプトです。このスクリプトと同様の出力を作成するスクリプトまたはプログラムを作成します。最終的なテキスト出力では、書式設定と余分な情報を最小限に抑える必要があります。HTML や JSON などのコンテンツ形式を使用する場合は、情報以外の形式(タグ、スクリプト、CSS)を可能な限り削除して、生成するテキスト エンベディングの値に偏りが発生しないようにしてください。

コンテンツ形式のスプリッター スクリプトを作成したら、populate_vector_database.py スクリプトを実行してベクター データベースにデータを入力できるようになります。ドキュメント エージェントで使用するファイルの処理について詳しくは、ドキュメント エージェントの前処理の Readme をご覧ください。

アプリをテストする

ベクター データベースへのデータ入力が完了すると、プロジェクトのテストができるようになります。プロジェクトには、プロジェクトをローカルで実行できるパッケージ化関数が用意されています。

プロジェクトのウェブ インターフェースを実行してテストするには:

  1. docs-agent プロジェクト ディレクトリに移動します。
    cd docs-agent/
    
  2. ウェブ アプリケーションの起動スクリプトを実行します。
    agent chatbot
    
  3. ウェブブラウザを使用して、起動スクリプトの出力に表示された URL ウェブアドレスに移動し、アプリケーションをテストします。
    * Running on http://your-hostname-here:5000
    

実装オプション

Gemini API は、ドキュメント エージェント実装のコンポーネント、具体的にはセマンティック検索と Attributed Question Answering(AQA)Gemini モデル バリアントを置き換えるプログラミング ツールを提供します。Gemini API のセマンティック取得機能を使用して、個別のベクトル データベースを置き換えることができます。セマンティック検索機能を使用すると、コンテンツのエンベディングを生成して保存できます。AQA Gemini モデルは、プロンプトで提供されるソース マテリアルを使用して質問に回答するように調整されています。セマンティック取得と AQA モデルを併用して、コンテンツに関する質問に回答します。これらはすべて Gemini API 内で行います。

ドキュメント エージェントには、Semantic Retrieval API 機能、AQA Gemini モデル、またはその両方を使用するための構成オプションがあります。詳しくは、ドキュメント エージェントの Readme をご覧ください。

参考情報

ドキュメント エージェント プロジェクトの詳細については、コード リポジトリをご覧ください。アプリケーションの構築についてサポートが必要な場合や、デベロッパーの協力者を探している場合は、Google Developers Community Discord サーバーをご覧ください。

本番環境のアプリケーション

大規模なユーザーに対してドキュメント エージェントをデプロイする予定の場合は、Google Gemini API の使用がレート制限やその他の使用制限の対象となる可能性があるので注意してください。ドキュメント エージェントなどの Gemini API を使用して本番環境アプリケーションを構築することを検討している場合は、アプリのスケーラビリティと信頼性を高める Google Cloud Vertex AI サービスを確認してください。