Bug 描述
看起来大多数节点后处理器在运行时,不会在配置的回调管理器的范围内运行,因此导致跟踪丢失重新排名步骤。.
版本
llama-index==0.10.34
重现步骤
尝试这个简单的示例:
from llama_index.core.query_pipeline import QueryPipeline
from llama_index.core import PromptTemplate
from llama_index.core.postprocessor import LLMRerank
import os
from llama_index.core import (
StorageContext,
VectorStoreIndex,
load_index_from_storage,
)
from llama_index.core.response_synthesizers import TreeSummarize
if not os.path.exists("storage"):
index = VectorStoreIndex.from_documents(documents)
# save index to disk
index.set_index_id("vector_index")
index.storage_context.persist("./storage")
else:
# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="storage")
# load index
index = load_index_from_storage(storage_context, index_id="vector_index")
# define modules
prompt_str = "Please generate a question about Paul Graham's life regarding the following topic {topic}"
prompt_tmpl = PromptTemplate(prompt_str)
llm = OpenAI(model="gpt-3.5-turbo")
retriever = index.as_retriever(similarity_top_k=3)
reranker = LLMRerank()
summarizer = TreeSummarize(llm=llm)
# define query pipeline
p = QueryPipeline(verbose=True)
p.add_modules(
{
"llm": llm,
"prompt_tmpl": prompt_tmpl,
"retriever": retriever,
"summarizer": summarizer,
"reranker": reranker,
}
)
p.add_link("prompt_tmpl", "llm")
p.add_link("llm", "retriever")
p.add_link("retriever", "reranker", dest_key="nodes")
p.add_link("llm", "reranker", dest_key="query_str")
p.add_link("reranker", "summarizer", dest_key="nodes")
p.add_link("llm", "summarizer", dest_key="query_str")
response = p.run(topic="YC")
print(response)
预期结果是在 langfuse
(我正在使用的可观察性平台)中记录所有这些元素的跟踪。
但是,收到的跟踪如下:
在查看代码后,我们在组件中初始化后处理器,但只有在Sbert重新排名中我们才使用它,如下所示:
with self.callback_manager.event(
CBEventType.RERANKING,
payload={
EventPayload.NODES: nodes,
EventPayload.MODEL_NAME: self.model,
EventPayload.QUERY_STR: query_bundle.query_str,
EventPayload.TOP_K: self.top_n,
},
) as event:
# Rest of re-ranking logic
更新本地分支后,我意识到,我们在像CohereReranker这样的新集成中添加了新的重新排名器,但在原生核心重新排名器中除了sbert之外都没有做这个。这显然是一个bug。.
这应该在基本级别处理吗?在 PostprocessorComponent._run_component()
内部?
如果我们在基本组件中处理,那么我想不是每个人都需要在他们的集成中复制相同的代码。.
预期的跟踪应该是:
当使用Cohere Reranker时会出现这种情况。
相关日志/回溯
- 无响应*
3条答案
按热度按时间insrf1ej1#
为了解决后处理器中回调管理器设置不正确导致重新排序步骤缺失跟踪的问题,你应该在所有后处理器中实现一致的模式,类似于
SentenceTransformerRerank
、FlagEmbeddingReranker
和CohereRerank
类中所做的那样。这涉及到将重新排序逻辑 Package 在一个处理回调事件的上下文管理器中,并利用调度器进行事件处理。下面是一个简洁的例子,指导你如何调整你的后处理器:
为了确保项目中后处理步骤的全面可见性和可追溯性:
with self.callback_manager.event(...)
上下文管理器和调度器事件(ReRankStartEvent
和ReRankEndEvent
)中。payload
,以包含相关信息。event.on_end(payload={...})
和调度器来指示重新排序过程的完成。这种方法将确保包括那些最初未设计用于SBERT重新排序的所有后处理器都在配置的回调管理器和调度器的范围内执行,从而允许在跟踪中包含重新排序步骤。
详细信息
来源
关于Dosu
这个响应旨在帮助你节省时间并提高效率。它不是精确的解决方案,而是你自己研究的一个起点。
请帮助我变得更有用!如果这个有帮助,请留下一个👍;如果无关紧要,请留下一个👎。
zte4gxcn2#
我的建议基本上是将
更改为
,但在尝试时我意识到
model
参数和top_k
可能对每个积分非常具体,即不同的名称或其他东西?我提供的方法是一种“hacky”的方式。希望听到您对此是否有更好的方法的想法。jecbmhm33#
要有效地确保所有节点后处理器在配置的回调管理器的范围内运行,同时容纳集成特定的参数,如
model
和top_k
,你可以在PostprocessorComponent
中细化_run_component
方法。以下是一个保持灵活性以处理其他集成特定参数的方法:此修改确保
postprocess_nodes
在回调管理器内执行,对于在重新排序步骤中有效捕获跟踪至关重要。通过将**kwargs
传递给postprocess_nodes
,该方法仍然具有处理其他参数的灵活性,而无需对其接口进行直接修改。请确保你的postprocess_nodes
方法在BaseNodePostprocessor
实现中已准备好处理这些额外的参数。这种方法提供了一种结构化的方式,将所有必要的操作包含在回调管理器的范围内,解决了重新排序步骤中缺失跟踪的问题。详细信息
来源
关于 Dosu
此响应旨在帮助你节省时间并提高效率。它不是精确的解决方案,而是你自己研究的一个起点。
帮助我变得更有用!如果这有帮助,请留下一个👍,如果不相关,请留下一个👎。