このアプリケーションでは、すべてのサンプル ドキュメントの取り込みはflask create-indexコマンドによってトリガーされます。このコマンドの実装は、 api ディレクトリの app.py ファイルにあり、 データ ディレクトリから index_data.pymain() モジュールをインポートし、その 関数を呼び出して、 data.json ファイルに保存されているすべてのドキュメントを完全にインポートします。

ドキュメント構造

各ドキュメントの構造は次のとおりです。

  • name: 文書のタイトル
  • url: 外部サイトでホストされているドキュメントへの URL
  • summary: 文書の内容の短い要約
  • content: 文書の本文
  • created_on: 作成日
  • updated_at: 更新日(ドキュメントが更新されていない場合は欠落している可能性があります)
  • category: ドキュメントのカテゴリ。 githubsharepoint 、または teams
  • rolePermissions: ロール権限のリスト

このサンプルアプリケーションでは、 contentフィールドをインデックスとなるテキストとして使用し、 namesummaryurlcategory 、およびupdated_atを関連メタデータとして追加します。

次の Python コード スニペットは、ドキュメントがインポートされる方法を示しています。

ここでは、Python 標準ライブラリのjsonモジュールを使用してデータ ファイルを読み取り、含まれるドキュメントごとに Langchain のDocumentオブジェクトが作成されます。ドキュメントには、ベクトルに変換されて検索されるコンテンツを定義するpage_content属性と、メタデータとして保存されるいくつかの追加フィールドがあります。metadata_keys 、ソース コンテンツのどのフィールドをドキュメント メタデータとして保存するかを決定します。

取り込みのニーズに応じて、方法を調整または変更できます。Langchain プロジェクトは、ソース コンテンツの形式に応じて使用できるさまざまなドキュメント ローダーを提供します。

弾性学習スパースエンコーダ(ELSER)モデル

このアプリケーションで使用される Elasticsearch インデックスは、挿入されるすべてのドキュメントに対してスパース ベクトル埋め込みを自動的に作成するように構成されています。index_data.pyinstall_elser()関数は、使用している Elasticsearch インスタンスに ELSER モデルがインストールされ、デプロイされていることを確認します。

テキスト分割

これらのドキュメントのcontentフィールドは長いため、単一の埋め込みでは完全に表現できません。大量のテキストを扱う場合の標準的な解決策は、テキストを短い文章に分割し、個々の文章の埋め込みを取得し、それらをすべて保存してインデックス付けすることです。

このアプリケーションでは、 LangchainライブラリのRecursiveCharacterTextSplitterクラスが、LLM が使用するのと同じ単位であるトークン内のパッセージの長さをカウントする OpenAI のtiktokenエンコーダーと組み合わせて使用されます。

アプリケーション内でテキスト分割がどのように機能するかを示す次の例を検討してください。

テキスト スプリッターのchunk_size引数を設定することで、結果の文章の長さを制御できます。chunk_overlapは、パッセージ間のある程度の重複を許可しており、これにより、埋め込みをより適切に行うことができます。

実際のアプリケーションでは、スプリッターは次の引数で初期化されます。

これらの値を変更して、その変更がチャットボットの品質にどのように影響するかを確認してください。スプリッターの設定を変更するたびに、 flask create-indexコマンドを実行してインデックスを再生成する必要があります。

ELSER モデルと組み合わせたテキスト分割については、さらに考慮すべき点があることに注意してください。本番環境での使用例では、このチュートリアルのように別のトークン化方法を選択する必要がある場合があります。

ドキュメントストア

ドキュメントは Elasticsearch インデックスに保存されます。インデックスの名前は、 .envで定義されているES_INDEX環境変数によって制御されます。ファイル。デフォルトではこのインデックスの名前はworkplace-app-docsです。

アプリケーションは、 Langchainの Elasticsearch 統合の一部であるElasticsearchStoreクラスと、Python 用の公式 Elasticsearch クライアント ライブラリを使用します。

Elasticsearch インデックスを処理する完全なロジックを以下に示します。

ElasticsearchStore.from_documents()メソッドは、 workplace_docsに格納されているすべてのDocumentインスタンスをインポートし、 index_name引数で指定されたインデックスに書き込みます。すべての操作は、 es_connection引数で指定されたクライアントを通じて実行されます。

strategy引数は、このインデックスの使用方法を定義します。このアプリケーションでは、 SparseVectorRetrievalStrategyクラスは、各ドキュメントに対してスパース ベクトル埋め込みが維持されることを示します。これにより、要求されたモデル (この場合は ELSER バージョン 2) を通じて埋め込みを生成するパイプラインがインデックスに追加されます。

Elasticsearch と Langchain の統合により、ユースケースに応じて使用できる他の戦略が提供されます。特に、 approxRetrievalStrategyは、密なベクトル埋め込みが使用される場合に使用できます。

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう