Skip to content

响应模式#

当前我们支持以下选项:

  • refine:通过依次处理每个检索到的文本块来创建并优化答案。每个节点/检索到的文本块都会发起一次独立的LLM调用。

详情: 第一个文本块会使用text_qa_template提示模板进行查询。然后将答案与下一个文本块(以及原始问题)一起,使用refine_template提示模板进行另一次查询。如此循环直到处理完所有文本块。

如果某个文本块因提示模板大小限制无法放入上下文窗口,则会使用TokenTextSplitter进行分割(允许文本块间存在部分重叠),新增的文本块会被视为原始文本块集合的一部分(同样使用refine_template进行查询)。

适合需要更详细答案的场景。

  • compact(默认模式):与refine类似,但会事先压缩(串联)文本块,从而减少LLM调用次数。

详情: 尽可能多地将检索到的文本块串联/打包到上下文窗口中(考虑text_qa_templaterefine_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相同,但会像compact模式那样"压缩"每个LLM提示,并对每个文本块运行相同查询。

更多内容请参阅响应合成器