この記事では、LlamaIndex を使用してデータをインデックスし、FAQ の検索エンジンを実装します。Elasticsearch はベクター データベースとして機能し、ベクター検索を可能にします。一方、RAG (Retrieval-Augmented Generation) はコンテキストを充実させ、より正確な応答を提供します。

LlamaIndexとは何ですか?
LlamaIndex は、大規模言語モデル (LLM) を活用したエージェントとワークフローの作成を容易にし、特定のデータやプライベート データと対話できるようにするフレームワークです。さまざまなソース (API、PDF、データベース) からのデータを LLM と統合できるため、調査、情報抽出、コンテキストに応じた応答の生成などのタスクが可能になります。
重要な概念:
- エージェント: LLM を使用して、単純な応答から複雑なアクションに至るまでのタスクを実行するインテリジェント アシスタント。
- ワークフロー: 高度なタスク用のエージェント、データ コネクタ、ツールを組み合わせた複数ステップのプロセス。
- コンテキスト拡張: LLM を外部データで強化し、トレーニングの制限を克服する手法。
LlamaIndexと Elasticsearch の統合:
Elasticsearch は LlamaIndex を使ってさまざまな方法で使用できます。
- データ ソース: Elasticsearch Reader を使用してドキュメントを抽出します。
- 埋め込みモデル: セマンティック検索のためにデータをベクトルにエンコードします。
- ベクター ストレージ: ベクター化されたドキュメントを検索するためのリポジトリとして Elasticsearch を使用します。
- 高度なストレージ: ドキュメントの概要やナレッジ グラフなどの構造を構成します。
LlamaIndexとElasticsearchを使用してFAQ検索を構築する
データ準備
例として、 Elasticsearch Service FAQ を使用します。各質問はウェブサイトから抽出され、個別のテキスト ファイルに保存されました。データを整理するには任意の方法を使用できます。この例では、ファイルをローカルに保存することを選択しました。
サンプルファイル:
すべての質問を保存すると、ディレクトリは次のようになります。

依存関係のインストール
取り込みと検索は Python 言語を使用して実装します。使用したバージョンは 3.9 です。前提条件として、次の依存関係をインストールする必要があります。
Elasticsearch と Kibana は Docker を使用して作成され、docker-compose.yml を介してバージョン 8.16.2 を実行するように構成されます。これにより、ローカル環境の作成が容易になります。
LlamaIndexを使用したドキュメントの取り込み
ドキュメントは、LlamaIndex を使用して Elasticsearch にインデックスされます。まず、ローカル ディレクトリからファイルを読み込むことができるSimpleDirectoryReaderを使用してファイルを読み込みます。ドキュメントを読み込んだ後、 VectorStoreIndexを使用してインデックスを作成します。
LlamaIndex のベクター ストアは、ドキュメントの埋め込みの保存と管理を担当します。LlamaIndex はさまざまなタイプのベクター ストアをサポートしており、この場合は Elasticsearch を使用します。StorageContext で、Elasticsearch インスタンスを構成します。コンテキストはローカルなので、追加のパラメータは必要ありません。他の環境での構成については、ドキュメントを参照して必要なパラメータを確認してください: ElasticsearchStore 構成。
デフォルトでは、LlamaIndex は OpenAI text-embedding-ada-002モデルを使用して埋め込みを生成します。ただし、この例では、 text-embedding-3-smallモデルを使用します。モデルを使用するには OpenAI API キーが必要になることに注意してください。
以下はドキュメント取り込みの完全なコードです。
実行後、ドキュメントは以下に示すようにFAQインデックスにインデックス付けされます。

RAGで検索
検索を実行するには、 ElasticsearchStoreクライアントを構成し、 index_name フィールドとes_urlフィールドに Elasticsearch URL を設定します。retrieval_strategyでは、ベクトル検索用のAsyncDenseVectorStrategyを定義しました。AsyncBM25Strategy (キーワード検索) やAsyncSparseVectorStrategy (スパースベクトル) などの他の戦略も利用できます。詳細については、公式ドキュメントをご覧ください。
次に、 VectorStoreIndexオブジェクトが作成され、ElasticsearchStore オブジェクトを使用してvector_storeが構成されます。as_retrieverメソッドでは、クエリに最も関連性の高いドキュメントの検索を実行し、 similarity_top_kパラメータを通じて返される結果の数を 5 に設定します。
次のステップはRAGです。ベクトル検索の結果は LLM のフォーマットされたプロンプトに組み込まれ、取得された情報に基づいてコンテキストに応じた応答が可能になります。
PromptTemplate では、次の内容を含むプロンプト形式を定義します。
- コンテキスト ( {context_str} ): 取得者によって取得されたドキュメント。
- クエリ ( {query_str} ): ユーザーの質問。
- 指示: 外部の知識に依存せずに、コンテキストに基づいてモデルが応答するためのガイドライン。
最後に、LLM はプロンプトを処理し、正確でコンテキストに応じた応答を返します。
完全なコードは以下の通りです。
これで、「Elastic サービスは無料ですか?」などの検索を実行し、FAQ データ自体に基づいてコンテキストに応じた応答を取得できるようになりました。
この応答を生成するために、次の文書が使用されました。
まとめ
LlamaIndex を使用して、Elasticsearch をベクター データベースとしてサポートする効率的な FAQ 検索システムを作成する方法を示しました。ドキュメントは埋め込みを使用して取り込まれ、インデックス化され、ベクトル検索が可能になります。PromptTemplate を通じて、検索結果はコンテキストに組み込まれ、LLM に送信され、取得されたドキュメントに基づいて正確でコンテキストに沿った応答が生成されます。
このワークフローは、情報検索とコンテキストに応じた応答生成を統合して、正確で関連性の高い結果を提供します。
参照資料
https://www.elastic.co/guide/en/cloud/current/ec-faq-getting-started.html
https://docs.llamaindex.ai/en/stable/api_reference/readers/elasticsearch/
https://docs.llamaindex.ai/en/stable/module_guides/indexing/vector_store_index/
https://docs.llamaindex.ai/en/stable/examples/クエリエンジン/カスタムクエリエンジン/
よくあるご質問
LlamaIndexとは何ですか?
LlamaIndex は、大規模言語モデル (LLM) を活用したエージェントとワークフローの作成を容易にし、特定のデータやプライベート データと対話できるようにするフレームワークです。
LlamaIndex は Elasticsearch と統合できますか?
はい、Elasticsearch は LlamaIndex でさまざまな方法で使用できます。たとえば、データ ソース (Elasticsearch Reader を使用してドキュメントを抽出)、埋め込みモデル (セマンティック検索用にデータをベクトルにエンコード)、ベクトル ストレージ (ベクトル化されたドキュメントを検索するためのリポジトリとして Elasticsearch を使用)、高度なストレージ (ドキュメントの概要やナレッジ グラフなどの構造を構成する) などです。




