检索阶段
收到问题后,应用程序首先会在 Elasticsearch 索引中搜索相关文档。具体做法是为问题生成一个稀疏的向量嵌入,然后在索引中搜索与之最接近的嵌入,每个嵌入都与文档的一个段落相关联。
与摄取阶段一样,Elasticsearch 索引通过ElasticsearchStore 与 Langchain 的集成进行管理:
store = ElasticsearchStore(
es_connection=elasticsearch_client,
index_name=INDEX,
strategy=ElasticsearchStore.SparseVectorRetrievalStrategy(model_id=ELSER_MODEL),
)Langchain 的 retriever 接口的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 模型中创建并搜索稀疏向量。您可以评估的另一个有趣选项是使用ApproxRetrievalStrategy ,它使用密集向量嵌入。