llama_index [Bug]: MilvusVectorStore与RecursiveRetriever不兼容

hjzp0vay  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(21)

Bug描述

在DensexRetriver包中,我添加了一段代码来使用milvus向量数据库(我也尝试过使用Elastic Search,它与现有的dense-x代码一起工作得很好)。然而,在查询时,我得到了以下错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[229], line 2
      1 query_engine_chunk = dense_pack2.query_engine
----> 2 print(str(query_engine_chunk.query("This is a question")))

File ~/.local/lib/python3.10/site-packages/llama_index/core/base/base_query_engine.py:40, in BaseQueryEngine.query(self, str_or_query_bundle)
     38 if isinstance(str_or_query_bundle, str):
     39     str_or_query_bundle = QueryBundle(str_or_query_bundle)
---> 40 return self._query(str_or_query_bundle)

File ~/.local/lib/python3.10/site-packages/llama_index/core/query_engine/retriever_query_engine.py:186, in RetrieverQueryEngine._query(self, query_bundle)
    182 """Answer a query."""
    183 with self.callback_manager.event(
    184     CBEventType.QUERY, payload={EventPayload.QUERY_STR: query_bundle.query_str}
    185 ) as query_event:
--> 186     nodes = self.retrieve(query_bundle)
    187     response = self._response_synthesizer.synthesize(
    188         query=query_bundle,
    189         nodes=nodes,
    190     )
    192     query_event.on_end(payload={EventPayload.RESPONSE: response})

File ~/.local/lib/python3.10/site-packages/llama_index/core/query_engine/retriever_query_engine.py:142, in RetrieverQueryEngine.retrieve(self, query_bundle)
    141 def retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
--> 142     nodes = self._retriever.retrieve(query_bundle)
    143     return self._apply_node_postprocessors(nodes, query_bundle=query_bundle)

File ~/.local/lib/python3.10/site-packages/llama_index/core/base/base_retriever.py:229, in BaseRetriever.retrieve(self, str_or_query_bundle)
    224 with self.callback_manager.as_trace("query"):
    225     with self.callback_manager.event(
    226         CBEventType.RETRIEVE,
    227         payload={EventPayload.QUERY_STR: query_bundle.query_str},
    228     ) as retrieve_event:
--> 229         nodes = self._retrieve(query_bundle)
    230         nodes = self._handle_recursive_retrieval(query_bundle, nodes)
    231         retrieve_event.on_end(
    232             payload={EventPayload.NODES: nodes},
    233         )

File ~/.local/lib/python3.10/site-packages/llama_index/core/retrievers/recursive_retriever.py:206, in RecursiveRetriever._retrieve(self, query_bundle)
    205 def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
--> 206     retrieved_nodes, _ = self._retrieve_rec(query_bundle, query_id=None)
    207     return retrieved_nodes

File ~/.local/lib/python3.10/site-packages/llama_index/core/retrievers/recursive_retriever.py:179, in RecursiveRetriever._retrieve_rec(self, query_bundle, query_id, cur_similarity)
    174 elif isinstance(obj, BaseRetriever):
    175     with self.callback_manager.event(
    176         CBEventType.RETRIEVE,
    177         payload={EventPayload.QUERY_STR: query_bundle.query_str},
    178     ) as event:
--> 179         nodes = obj.retrieve(query_bundle)
    180         event.on_end(payload={EventPayload.NODES: nodes})
    182     nodes_to_add, additional_nodes = self._query_retrieved_nodes(
    183         query_bundle, nodes
    184     )

File ~/.local/lib/python3.10/site-packages/llama_index/core/base/base_retriever.py:229, in BaseRetriever.retrieve(self, str_or_query_bundle)
    224 with self.callback_manager.as_trace("query"):
    225     with self.callback_manager.event(
    226         CBEventType.RETRIEVE,
    227         payload={EventPayload.QUERY_STR: query_bundle.query_str},
    228     ) as retrieve_event:
--> 229         nodes = self._retrieve(query_bundle)
    230         nodes = self._handle_recursive_retrieval(query_bundle, nodes)
    231         retrieve_event.on_end(
    232             payload={EventPayload.NODES: nodes},
    233         )

File ~/.local/lib/python3.10/site-packages/llama_index/core/indices/vector_store/retrievers/retriever.py:94, in VectorIndexRetriever._retrieve(self, query_bundle)
     88     if query_bundle.embedding is None and len(query_bundle.embedding_strs) > 0:
     89         query_bundle.embedding = (
     90             self._embed_model.get_agg_embedding_from_queries(
     91                 query_bundle.embedding_strs
     92             )
     93         )
---> 94 return self._get_nodes_with_embeddings(query_bundle)

File ~/.local/lib/python3.10/site-packages/llama_index/core/indices/vector_store/retrievers/retriever.py:170, in VectorIndexRetriever._get_nodes_with_embeddings(self, query_bundle_with_embeddings)
    166 def _get_nodes_with_embeddings(
    167     self, query_bundle_with_embeddings: QueryBundle
    168 ) -> List[NodeWithScore]:
    169     query = self._build_vector_store_query(query_bundle_with_embeddings)
--> 170     query_result = self._vector_store.query(query, **self._kwargs)
    171     return self._build_node_list_from_query_result(query_result)

File ~/.local/lib/python3.10/site-packages/llama_index/vector_stores/milvus/base.py:277, in MilvusVectorStore.query(self, query, **kwargs)
    275 string_expr = ""
    276 if len(expr) != 0:
--> 277     string_expr = f" {query.filters.condition.value} ".join(expr)
    279 # Perform the search
    280 res = self._milvusclient.search(
    281     collection_name=self.collection_name,
    282     data=[query.query_embedding],
   (...)
    286     search_params=self.search_config,
    287 )

AttributeError: 'NoneType' object has no attribute 'condition'

请注意,在将recursiveRetriever更改为simple vector_index.as_retriever后,Milvus向量数据库可以正常工作。这是milvus向量数据库在使用递归检索器时遇到的问题吗?是否有解决此错误的 workaround?如果有,请指导我查阅相关文档。

版本

0.10.12

重现步骤

  1. 使用milvus数据库存储上下文创建一个向量存储索引
  2. 使用递归检索器
  3. 运行查询 (请参考描述)

相关日志/回溯

  • 无响应*
s4n0splo

s4n0splo1#

嘿 @Kushagra0409,很高兴看到你回来!🚀
感谢你提供详细的错误回溯。你在 LlamaIndex v0.10.12 中遇到的 MilvusVectorStoreRecursiveRetriever 中无法正常工作,导致了一个 AttributeError ,这很可能是由于 MilvusVectorStore 类与 RecursiveRetriever 所需的预期接口或方法之间的兼容性或实现问题。
AttributeError 通常表示 RecursiveRetriever 试图访问 MilvusVectorStore 上不存在的方法或属性。以下是一些解决此问题的步骤:

  1. 检查缺失的方法或属性:确保 MilvusVectorStore 实现了 RecursiveRetriever 所期望的所有方法和属性。
  2. 更新 LlamaIndex 和依赖项:确保您使用的 LlamaIndex 及其依赖项的版本是兼容的。您正在使用的 LlamaIndex 版本(v0.10.12)可能存在已知的问题或不兼容性,这些问题已在后续版本中得到解决。
  3. 查看 LlamaIndex 和 Milvus 文档:检查 LlamaIndex 和 Milvus 的文档,了解关于将 Milvus 作为向量存储集成的兼容性或特定要求的任何注解。
  4. 检查 RecursiveRetriever 实现:查看 RecursiveRetriever 的实现,以了解它对向量存储的期望。这可以给您关于 MilvusVectorStore 中可能缺失或错误实现的线索。
  5. 调试和日志记录:在 AttributeError 发生的地方添加日志记录,以获取更多关于缺失或出错的内容的信息。这可以帮助您准确地找到导致问题的具体属性或方法。
    不幸的是,由于缺乏关于 AttributeError (例如,缺失的属性或方法名称)的具体细节,这些一般步骤是诊断和解决问题的最佳方法。如果您能提供有关错误的更多详细信息,将更容易提供更具体的解决方案。
    关于您关于 LlamaIndex 代码库在版本 0.10.12 和最新版本 0.10.19 之间所做的更改的问题,我无法提供详细的答案,因为我没有访问这两个版本之间进行的特定更改的权限。然而,始终更新到最新版本是一个好主意,因为它可能包含可能解决您的问题的修复程序和改进。
    希望这有所帮助!如果您有任何其他问题或需要进一步澄清,请随时提问。

来源

关于 Dosu

此响应旨在节省您的时间并使其有用。它不是精确的解决方案,而是您自己研究的起点。
帮助我更有用!如果这有帮助请留下一个👍,如果无关请留下一个👎。
如果您想继续对话,请以 @dosu-bot 为开头开始回复。

mkshixfv

mkshixfv2#

看起来像是元数据过滤器的错误。

相关问题