响应模式#
目前,我们支持以下选项:
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调用中被递归使用,依此类推,直到只剩下一个块,从而得到一个最终答案。
详情:尽可能将文本块拼接以适应上下文窗口,使用summary_template
提示,并在需要时进行分割(再次使用TokenTextSplitter
并保留部分文本重叠)。然后,针对每个生成的块/分割查询summary_template
(没有refine查询!)并获取尽可能多的答案。
如果只有一个答案(因为只有一个数据块),那么它就是最终答案。
如果有多个答案,这些答案本身会被视为数据块,并递归发送到tree_summarize
处理流程(进行连接/分割适配/查询)。
适用于摘要总结用途。
simple_summarize
: 将所有文本块截断以适应单个LLM提示。适用于快速摘要需求,但由于截断可能会丢失细节。no_text
: 仅运行检索器获取本应发送给LLM的节点,而不实际发送它们。然后可以通过检查response.source_nodes
来查看。accumulate
: 给定一组文本块和查询,将查询应用于每个文本块,同时将响应累积到数组中。返回所有响应连接而成的字符串。适用于需要对每个文本块单独运行相同查询的场景。compact_accumulate
: 与accumulate相同,但会对每个LLM提示进行"压缩"处理,类似于compact
,并对每个文本块运行相同的查询。
了解更多信息,请参阅Response Synthesizer。