问题验证
- 我已经在文档和discord上搜索了答案。
问题
当我尝试使用Dense-x从Elasticsearch重用嵌入时,遇到了一个问题。当我尝试使用之前创建的嵌入来获取响应时,问题就出现了。在第一次运行时,嵌入成功创建,没有遇到任何问题。然而,在随后的运行中,当尝试重用这些嵌入时,我遇到了以下错误:ValueError: Query id [id] not found in either retriever_dict or query_engine_dict.
以下是用于创建和重用嵌入的代码片段:
self.documents = SimpleDirectoryReader(input_dir=os.environ.get('DOC_PATH'), required_exts=[".docx", ".doc", ".pdf", ".txt"]).load_data()
nodes = self.text_splitter.get_nodes_from_documents(self.documents)
sub_nodes = await self._gen_propositions(nodes)
all_nodes = nodes + sub_nodes
all_nodes_dict = {n.node_id: n for n in all_nodes}
vector_store = ElasticsearchStore(
index_name=os.environ.get('INDEX_NAME'),
es_url=os.environ.get('ES_URL'),
)
service_context = ServiceContext.from_defaults(
llm=self._proposition_llm,
embed_model=Settings.embed_model,
num_output=self._proposition_llm.metadata.num_output,
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
if os.path.exists("./elastic_db"):
print("From Elasticsearch")
self.vector_index = VectorStoreIndex.from_vector_store(vector_store, service_context=service_context)
else:
self.vector_index = VectorStoreIndex(
all_nodes, service_context=service_context, show_progress=True, storage_context=storage_context
)
os.makedirs("./elastic_db")
self.retriever = RecursiveRetriever(
"vector",
retriever_dict={
"vector": self.vector_index.as_retriever(
similarity_top_k=self.similarity_top_k
)
},
node_dict=all_nodes_dict,
)
self.query_engine = RetrieverQueryEngine.from_args(
self.retriever, streaming=self.streaming
)
response = self.query_engine.query("Query in String")
print(response)
预期行为:
我希望能够重用Elasticsearch中的嵌入并成功获取响应,而不会遇到ValueError。
重现步骤:
- 运行代码以首次创建嵌入并将它们存储在Elasticsearch中。
- 再次运行代码以使用之前创建的嵌入获取响应。
- 观察ValueError。
附加信息:
- 我正在使用Dense-x和Elasticsearch进行向量存储。
- 代码检查./elastic_db目录是否存在,以确定是从Elasticsearch加载还是创建新的嵌入
需要帮助:
如何修改代码以成功重用来自Elasticsearch向量存储的嵌入并避免ValueError?
1条答案
按热度按时间pdsfdshx1#
要成功地从Elasticsearch向量存储中重用嵌入并避免
ValueError: "Query id [id] not found in either retriever_dict or query_engine_dict"
,您需要确保retriever_dict
和query_engine_dict
得到正确设置,并且查询ID被正确引用。以下是如何修改代码以实现此目的的示例:在这种情况下,
函数通过从
VectorStoreIndex
创建retriever
和query_engine
并确保查询ID被正确引用来正确设置retriever_dict
和query_engine_dict
。这应该有助于避免与缺少查询ID相关的ValueError
。此外,ElasticsearchStore
类及其方法,如_to_elasticsearch_filter
和_mode_must_match_retrieval_strategy
,确保检索策略与查询模式兼容,这对于在查询过程中避免错误至关重要。