回収フェーズ
質問を受信すると、アプリケーションはまず Elasticsearch インデックスで関連するドキュメントを検索します。これは、質問に対するスパース ベクトル埋め込みを生成し、次に、ドキュメントの一節に関連付けられた、それに最も近い埋め込みのインデックスを検索することによって実現されます。
取り込みフェーズと同様に、Elasticsearch インデックスは Langchain とのElasticsearchStore統合を通じて管理されます。
store = ElasticsearchStore(
es_connection=elasticsearch_client,
index_name=INDEX,
strategy=ElasticsearchStore.SparseVectorRetrievalStrategy(model_id=ELSER_MODEL),
)質問の埋め込みを生成し、それを検索することは、Langchain の取得インターフェースのinvoke()メソッドによってすべてうまく抽象化されており、このメソッドはこれらすべてのタスクを実行し、見つかった最も関連性の高いドキュメントのリストを返します。
docs = store.as_retriever().invoke(question)
for doc in docs:
doc_source = {**doc.metadata, 'page_content': doc.page_content}
yield f'data: {SOURCE_TAG} {json.dumps(doc_source)}\n\n'ここでは、返された文章がソースとしてクライアントに送信される様子を確認できます。React アプリケーションでは、これらが回答の下に「検索結果」として表示されます。
ElasticsearchStoreクラスで使用されるstrategy引数は、取り込み時に使用される戦略と一致する必要があることに注意することが重要です。この例では、 SparseVectorRetrievalStrategy Elastic の ELSER モデルからスパース ベクトルを作成して検索します。評価できるもう 1 つの興味深いオプションは、密なベクトル埋め込みを使用するApproxRetrievalStrategyを使用することです。