回収フェーズ

質問を受信すると、アプリケーションはまず 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を使用することです。

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

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

はじめましょう