Bug描述
RetrieverQueryEngine在传递自定义混合检索器时无法处理response_synthesizer对象,出现以下错误信息:
合成器对象没有'metadata'属性
其中合成器可以是CompactAndRefine、Refine等。
版本
版本:0.10.22
重现步骤
def get_retriever_query_engine_for_cache():
cache_bm25_retriever = get_BM25_retriever_for_cache()
cache_vector_retriever = index_storage.index_cache().as_retriever(similarity_top_k=2)
hybrid_retriever = HybridRetriever(cache_vector_retriever, cache_bm25_retriever)
reranker = LLMRerank(
choice_batch_size=20,
top_n=2,
)
response_synthesizer = get_response_synthesizer(structured_answer_filtering=True)
return RetrieverQueryEngine(
retriever=hybrid_retriever,
response_synthesizer=get_response_synthesizer(response_synthesizer),
node_postprocessors=[reranker,SimilarityPostprocessor(similarity_cutoff=SIMILARITY_CUTOFF_CACHE_CUSTOM_HYBRID)],
)
自定义混合检索器:
class HybridRetriever(BaseRetriever):
def __init__(self, vector_retriever, bm25_retriever):
self.vector_retriever = vector_retriever
self.bm25_retriever = bm25_retriever
super().__init__()
def _retrieve(self, query, **kwargs):
bm25_nodes = self.bm25_retriever.retrieve(query, **kwargs)
vector_nodes = self.vector_retriever.retrieve(query, **kwargs)
# combine the two lists of nodes
all_nodes = []
node_ids = set()
for n in bm25_nodes + vector_nodes:
if n.node.node_id not in node_ids:
all_nodes.append(n)
node_ids.add(n.node.node_id)
return all_nodes
相关日志/回溯
- 无响应*
1条答案
按热度按时间3df52oht1#
你好!我在这里协助你解决遇到的问题。让我们一起解决你遇到的bug。
要解决在使用自定义混合检索器和
response_synthesizer
对象(如CompactAndRefine
或Refine
)时出现的synthesizer object has no attribute 'metadata'
错误,你需要确保RetrieverQueryEngine
和response_synthesizer
正确设置并使用。以下是如何设置和使用
RetrieverQueryEngine
和Refine
类的示例:确保
RetrieverQueryEngine
示例化时使用了必要的参数,并且Refine
类已正确定义以处理响应。这样的设置应该有助于解决synthesizer object has no attribute 'metadata'
错误。此外,
RetrieverQueryEngine
类有一个使用response_synthesizer
生成响应的方法synthesize
。请确保response_synthesizer
正确初始化并传递给RetrieverQueryEngine
:这个方法应用于从检索到的节点合成响应。请确保在自定义的
response_synthesizer
中正确定义所有必要的属性和方法,以避免属性错误1(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/tests/response_synthesizers/test_refine.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/query_engine/retriever_query_engine.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/query_engine/retriever_query_engine.py)。