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 进行查询(没有完善查询!),并获得尽可能多的答案。

如果只有一个答案(因为只有一个文本块),那么这就是最终答案。

如果有多个答案,则这些答案本身被视为文本块,并递归地发送到 tree_summarize 过程中(连接/拆分以适应/查询)。

适用于摘要目的。

  • simple_summarize:将所有文本块截断以适应单个 LLM 提示。适用于快速摘要目的,但由于截断可能会丢失细节。

  • no_text:仅运行检索器以获取本应发送到 LLM 的节点,而不实际发送它们。然后可以通过检查 response.source_nodes 进行检查。

  • accumulate:给定一组文本块和查询,对每个文本块应用查询,同时将响应累积到数组中。返回所有响应的连接字符串。适用于需要针对每个文本块单独运行相同查询的情况。

  • compact_accumulate:与 accumulate 相同,但会类似于 compact 对每个 LLM 提示进行“紧凑”,并针对每个文本块运行相同的查询。

请参阅响应合成器以了解更多信息。