LlamaIndex中的响应合成器
概念
响应合成器是使用用户查询和给定的一组文本块从LLM生成响应的组件。响应合成器的输出是一个响应对象。
这种方法可以有多种形式,从简单的迭代文本块到复杂的构建树。主要思想是通过LLM简化跨数据生成响应的过程。
在查询引擎中使用时,响应合成器在从检索器检索节点之后,以及运行任何节点后处理器之后使用。
提示
对响应合成器在RAG工作流中的位置感到困惑?阅读高级概念
使用模式
入门
使用response_mode
配置查询引擎的响应合成器:
from llama_index.core.data_structs import Node
from llama_index.core.schema import NodeWithScore
from llama_index.core import get_response_synthesizer
response_synthesizer = get_response_synthesizer(response_mode="compact")
response = response_synthesizer.synthesize(
"query text", nodes=[NodeWithScore(node=Node(text="text"), score=1.0), ...]
)
或者,更常见的是,在创建索引后在查询引擎中使用:
query_engine = index.as_query_engine(response_synthesizer=response_synthesizer)
response = query_engine.query("query_text")
提示
要了解如何构建索引,请参见索引
配置响应模式
响应合成器通常通过response_mode
关键字参数设置指定。
LlamaIndex中已经实现了几种响应合成器:
-
refine:通过依次遍历每个检索到的文本块来创建和提炼答案。这会对每个节点/检索到的块进行单独的LLM调用。
详细信息:第一个块使用text_qa_template
提示进行查询。然后,答案和下一个块(以及原始问题)在另一个查询中使用refine_template
提示。依此类推,直到所有块都被解析。
如果一个块太大而无法适应窗口(考虑提示大小),则使用TokenTextSplitter
进行拆分(允许块之间有一些文本重叠),并且(新)附加块被视为原始块集合的块(因此也使用refine_template
进行查询)。
适用于更详细的答案。 -
compact(默认):类似于refine,但事先压缩(连接)块,从而减少LLM调用。
详细信息:尽可能多地填充文本(从检索到的块中连接/打包),使其适应上下文窗口(考虑text_qa_template
和refine_template
之间的最大提示大小)。如果文本太长而无法适应一个提示,则根据需要拆分为多个部分(使用TokenTextSplitter
,因此允许块之间有一些重叠)。
每个文本部分被视为一个“块”,并发送给refine合成器。
简而言之,它类似于refine,但LLM调用更少。 -
tree_summarize:使用
summary_template
提示查询LLM,次数根据需要多次,以便所有连接的块都被查询,从而得到多个答案,这些答案本身递归地用作tree_summarize
LLM调用的块,依此类推,直到只剩下一个块,因此只有一个最终答案。
详细信息:尽可能多地连接块,以