响应模式#
目前,我们支持以下选项:
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
进行查询(没有完善查询!),并获得尽可能多的答案。
如果只有一个答案(因为只有一个文本块),那么这就是最终答案。
如果有多个答案,则这些答案本身被视为文本块,并递归地发送到 tree_summarize
过程中(连接/拆分以适应/查询)。
适用于摘要目的。
-
simple_summarize
:将所有文本块截断以适应单个 LLM 提示。适用于快速摘要目的,但由于截断可能会丢失细节。 -
no_text
:仅运行检索器以获取本应发送到 LLM 的节点,而不实际发送它们。然后可以通过检查response.source_nodes
进行检查。 -
accumulate
:给定一组文本块和查询,对每个文本块应用查询,同时将响应累积到数组中。返回所有响应的连接字符串。适用于需要针对每个文本块单独运行相同查询的情况。 -
compact_accumulate
:与 accumulate 相同,但会类似于compact
对每个 LLM 提示进行“紧凑”,并针对每个文本块运行相同的查询。
请参阅响应合成器以了解更多信息。