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

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

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

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

概要

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

Docs エージェントの機能図 図 1. Docs エージェント プロジェクト アプリの機能図。

Docs エージェントがコンテンツに関する質問に回答できるようにするには、そのコンテンツのベクトル データベースを作成することが重要です。コンテンツを論理的なテキスト チャンクに分割し、それぞれにベクトルを生成します。これらのベクトルは、各チャンク内の情報を数値で表したもので、Google の生成モデルの AI テキスト エンベディング関数で生成されます。

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

プロジェクトの設定

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

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

Docs エージェント プロジェクトは、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 ライブラリを追加できます。

環境変数を設定する

Docs エージェント コード プロジェクトを実行するために必要な環境変数をいくつか設定します。これには、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 ソース管理ソフトウェアが必要です。プロジェクト コードをダウンロードして構成するには:

  1. 次のコマンドを使用して、Git リポジトリのクローンを作成します。
    git clone https://github.com/google/generative-ai-docs
    
  2. 必要に応じて、スパース チェックアウトを使用するようにローカル Git リポジトリを構成し、Docs エージェント プロジェクトのファイルのみを取得します。
    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 install コマンドを実行して依存関係をダウンロードし、プロジェクトを構成します。
    poetry install
    

コンテンツを準備する

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

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

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

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

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

Docs エージェントのテストにコンテンツ セットが必要な場合は、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 文字以下に制限しています。つまり、コンテンツをその文字数制限以下のチャンクに分割する必要があります。このセクションでは、Docs エージェント プロジェクトに付属のスクリプトを使用して、Markdown ファイルを小さなテキスト チャンクに分割する方法について説明します。他のコンテンツ形式の操作に関するヒントについては、他の形式を処理するをご覧ください。

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 コマンド(
    )を実行して、マークダウン ソース コンテンツを分割します。
    agent chunk
    

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

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

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

テキスト エンベディングを生成し、ベクトル データベースに入力する手順は次のとおりです。

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

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

他の形式を処理する

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

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

プロジェクトで他のコンテンツ形式を使用することもできますが、それらの追加方法は、ユーザーまたはコミュニティの他のメンバーが作成する必要があります。コード リポジトリのIssuesPull Requests で、同様のソリューションを構築しているユーザーを確認します。

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

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

アプリをテストする

ベクトル データベースへのデータの入力が完了したら、プロジェクトはテストの準備が整います。このプロジェクトには、プロジェクトをローカルで実行できるようにするパッケージ化関数があります。

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

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

選べる実装方法

Gemini API は、ドキュメント エージェント実装のコンポーネント(特に、セマンティック リトリーブと属性付き質問応答(AQA)の Gemini モデル バリアント)に代わるプログラミング ツールを提供します。Gemini API の セマンティック リトリーブ機能を使用して、個別のベクター データベースを置き換えることができます。セマンティック リトリーブ機能を使用すると、コンテンツのエンベディングを生成して保存できます。AQA Gemini モデルは、プロンプトで提供されたソース資料を使用して質問に回答するようにチューニングされています。セマンティック リトリーブと AQA モデルを使用して、Gemini API 内でコンテンツに関する質問に回答します。

Docs エージェントには、Semantic Retrieval API 機能、AQA Gemini モデル、またはその両方を使用する構成オプションが含まれています。詳細については、Docs エージェントの Readme をご覧ください。

参考情報

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

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

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