响应模式(Response Modes)
在处理和合成响应时,LlamaIndex 提供了多种响应模式,每种模式都有其独特的处理方式和适用场景。以下是对这些模式的详细解释和编程示例。
1. 精炼模式(refine)
概念解释:
精炼模式通过依次处理每个检索到的文本块来创建和精炼答案。每次处理一个节点或检索到的文本块时,都会进行一次 LLM 调用。
详细过程:
- 使用
text_qa_template
提示对第一个文本块进行查询。 - 将答案和下一个文本块(以及原始问题)一起用于
refine_template
提示的另一个查询。 - 重复上述过程,直到所有文本块都被处理。
如果一个文本块太大,无法适应窗口大小(考虑提示大小),则使用 TokenTextSplitter
将其拆分(允许文本块之间有一些重叠),并将新生成的文本块视为原始文本块集合的一部分(同样使用 refine_template
进行查询)。
适用场景:
适用于需要更详细答案的场景。
编程示例:
from llama_index import VectorStoreIndex, ServiceContext
from llama_index.response.schema import Response
# 创建索引
index = VectorStoreIndex.from_documents(documents)
# 设置服务上下文
service_context = ServiceContext.from_defaults(chunk_size=512)
# 使用精炼模式进行查询
query_engine = index.as_query_engine(
response_mode="refine",
service_context=service_context
)
response: Response = query_engine.query("你的问题")
print(response)
2. 紧凑模式(compact,默认模式)
概念解释:
紧凑模式类似于精炼模式,但事先将文本块紧凑(连接),从而减少 LLM 调用次数。
详细过程:
- 尽可能多地连接(打包)检索到的文本块,使其适应上下文窗口大小(考虑
text_qa_template
和refine_template
之间的最大提示大小)。 - 如果文本太长,无法适应一个提示,则使用
TokenTextSplitter
将其拆分为所需的部分(允许文本块之间有一些重叠)。 - 每个文本部分被视为一个“文本块”,并发送给精炼合成器。
适用场景:
类似于精炼模式,但减少了 LLM 调用次数。
编程示例:
from llama_index