响应合成器 #

概述 #

响应合成器(Response Synthesizer)负责将检索到的节点合成为最终回答。选择合适的合成模式对回答质量至关重要。

text
┌─────────────────────────────────────────────────────────────┐
│                    响应合成器架构                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   Retrieved Nodes                                           │
│   ┌─────────┐ ┌─────────┐ ┌─────────┐                      │
│   │  Node 1 │ │  Node 2 │ │  Node 3 │                      │
│   └─────────┘ └─────────┘ └─────────┘                      │
│        │           │           │                             │
│        └───────────┼───────────┘                             │
│                    │                                         │
│                    ▼                                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              Response Synthesizer                    │  │
│   │                                                     │  │
│   │   1. 处理节点(合并/迭代/分层)                       │  │
│   │   2. 构建提示词                                      │  │
│   │   3. 调用 LLM 生成回答                               │  │
│   │                                                     │  │
│   └─────────────────────────────────────────────────────┘  │
│                    │                                         │
│                    ▼                                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    Response                          │  │
│   │   "根据检索到的信息,回答如下..."                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

基本用法 #

使用默认合成器 #

python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)

query_engine = index.as_query_engine()

response = query_engine.query("你的问题")
print(response)

指定响应模式 #

python
query_engine = index.as_query_engine(
    response_mode="compact"
)

response = query_engine.query("你的问题")

直接使用合成器 #

python
from llama_index.core import VectorStoreIndex, get_response_synthesizer

index = VectorStoreIndex.from_documents(documents)

response_synthesizer = get_response_synthesizer(
    response_mode="compact"
)

query_engine = index.as_query_engine(
    response_synthesizer=response_synthesizer,
)

响应模式详解 #

Compact 模式 #

将所有节点合并后一次性生成回答:

text
┌─────────────────────────────────────────────────────────────┐
│                    Compact 模式                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  流程:                                                      │
│  Node1 + Node2 + Node3 ──→ 合并 ──→ 单次 LLM 调用 ──→ 回答  │
│                                                             │
│  特点:                                                      │
│  ✅ 速度快,只需一次 LLM 调用                               │
│  ✅ 适合节点数量较少的场景                                   │
│  ⚠️ 可能丢失部分细节                                        │
│                                                             │
│  适用场景:                                                  │
│  - 一般问答                                                  │
│  - 快速响应需求                                              │
│  - 节点数量 < 5                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="compact",
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

Refine 模式 #

逐个节点迭代优化回答:

text
┌─────────────────────────────────────────────────────────────┐
│                    Refine 模式                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  流程:                                                      │
│  Node1 ──→ 初始回答                                         │
│      ↓                                                       │
│  Node2 + 初始回答 ──→ 优化回答                               │
│      ↓                                                       │
│  Node3 + 优化回答 ──→ 最终回答                               │
│                                                             │
│  特点:                                                      │
│  ✅ 回答更全面、更精细                                       │
│  ✅ 逐步整合信息                                            │
│  ⚠️ 需要多次 LLM 调用                                       │
│  ⚠️ 速度较慢                                                │
│                                                             │
│  适用场景:                                                  │
│  - 需要高质量回答                                            │
│  - 信息分散在多个节点                                        │
│  - 复杂问题                                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘
python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="refine",
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

Tree Summarize 模式 #

分层总结后合并:

text
┌─────────────────────────────────────────────────────────────┐
│                 Tree Summarize 模式                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  流程:                                                      │
│  Node1 + Node2 ──→ 摘要1                                    │
│  Node3 + Node4 ──→ 摘要2                                    │
│  Node5 + Node6 ──→ 摘要3                                    │
│       ↓           ↓           ↓                              │
│  摘要1 + 摘要2 + 摘要3 ──→ 最终摘要                          │
│                                                             │
│  特点:                                                      │
│  ✅ 适合大量节点                                             │
│  ✅ 层级化处理                                               │
│  ⚠️ 可能丢失细节                                            │
│                                                             │
│  适用场景:                                                  │
│  - 文档总结                                                  │
│  - 大量节点的场景                                            │
│  - 需要综合概览                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="tree_summarize",
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

Simple Summarize 模式 #

简单拼接后生成:

python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="simple_summarize",
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

No Text 模式 #

不生成回答,只返回节点:

python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="no_text",
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

response = query_engine.query("查询内容")

for node in response.source_nodes:
    print(node.node.text)

Accumulate 模式 #

对每个节点单独生成回答:

python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="accumulate",
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

response = query_engine.query("查询内容")
print(response)

自定义提示词 #

自定义 QA 提示词 #

python
from llama_index.core import PromptTemplate, get_response_synthesizer

qa_prompt_tmpl = (
    "你是一个专业的助手。请根据以下上下文信息回答问题。\n"
    "如果上下文中没有相关信息,请明确说明。\n\n"
    "上下文信息:\n"
    "---------------------\n"
    "{context_str}\n"
    "---------------------\n\n"
    "问题:{query_str}\n\n"
    "回答:"
)

qa_prompt = PromptTemplate(qa_prompt_tmpl)

synthesizer = get_response_synthesizer(
    response_mode="compact",
    text_qa_template=qa_prompt,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

自定义 Refine 提示词 #

python
from llama_index.core import PromptTemplate, get_response_synthesizer

refine_prompt_tmpl = (
    "你是一个专业的助手。你已经有了一个初始回答。\n"
    "请根据新的上下文信息优化这个回答。\n\n"
    "原始问题:{query_str}\n\n"
    "初始回答:{existing_answer}\n\n"
    "新的上下文信息:\n"
    "---------------------\n"
    "{context_msg}\n"
    "---------------------\n\n"
    "请优化回答,使其更加准确和完整:"
)

refine_prompt = PromptTemplate(refine_prompt_tmpl)

synthesizer = get_response_synthesizer(
    response_mode="refine",
    refine_template=refine_prompt,
)

高级配置 #

使用 Refine 合成器 #

python
from llama_index.core.response_synthesizers import Refine

synthesizer = Refine(
    llm=llm,
    text_qa_template=qa_prompt,
    refine_template=refine_prompt,
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

使用 CompactAndRefine 合成器 #

python
from llama_index.core.response_synthesizers import CompactAndRefine

synthesizer = CompactAndRefine(
    llm=llm,
    text_qa_template=qa_prompt,
    refine_template=refine_prompt,
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

使用 TreeSummarize 合成器 #

python
from llama_index.core.response_synthesizers import TreeSummarize

synthesizer = TreeSummarize(
    llm=llm,
    summary_template=summary_prompt,
    verbose=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

流式响应 #

python
from llama_index.core import get_response_synthesizer

synthesizer = get_response_synthesizer(
    response_mode="compact",
    streaming=True,
)

query_engine = index.as_query_engine(
    response_synthesizer=synthesizer,
)

response = query_engine.query("你的问题")

for text in response.response_gen:
    print(text, end="", flush=True)
print()

异步响应 #

python
import asyncio
from llama_index.core import get_response_synthesizer

async def async_query():
    synthesizer = get_response_synthesizer(
        response_mode="compact",
    )
    
    query_engine = index.as_query_engine(
        response_synthesizer=synthesizer,
    )
    
    response = await query_engine.aquery("你的问题")
    print(response)

asyncio.run(async_query())

响应模式选择指南 #

text
┌─────────────────────────────────────────────────────────────┐
│                    响应模式选择指南                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  场景                          推荐模式                      │
│  ─────────────────────────────────────────────────────────  │
│  一般问答                      compact                      │
│  需要高质量回答                refine                       │
│  文档总结                      tree_summarize               │
│  大量节点                      tree_summarize               │
│  只需要检索结果                no_text                      │
│  每个节点独立回答              accumulate                   │
│  快速响应                      compact / simple_summarize   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

完整示例 #

python
import os
from llama_index.core import (
    VectorStoreIndex,
    SimpleDirectoryReader,
    Settings,
    PromptTemplate,
    get_response_synthesizer,
)
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding

os.environ["OPENAI_API_KEY"] = "sk-your-key"

Settings.llm = OpenAI(model="gpt-4o-mini")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)

qa_prompt = PromptTemplate(
    "你是一个专业的技术助手。请根据上下文回答问题。\n\n"
    "上下文:\n{context_str}\n\n"
    "问题:{query_str}\n\n"
    "回答:"
)

print("\n=== Compact 模式 ===")
compact_synthesizer = get_response_synthesizer(
    response_mode="compact",
    text_qa_template=qa_prompt,
)
compact_engine = index.as_query_engine(response_synthesizer=compact_synthesizer)
response = compact_engine.query("文档的主要内容是什么?")
print(response)

print("\n=== Refine 模式 ===")
refine_synthesizer = get_response_synthesizer(
    response_mode="refine",
    text_qa_template=qa_prompt,
    verbose=True,
)
refine_engine = index.as_query_engine(response_synthesizer=refine_synthesizer)
response = refine_engine.query("详细解释文档的核心概念")
print(response)

print("\n=== Tree Summarize 模式 ===")
tree_synthesizer = get_response_synthesizer(
    response_mode="tree_summarize",
    text_qa_template=qa_prompt,
)
tree_engine = index.as_query_engine(response_synthesizer=tree_synthesizer)
response = tree_engine.query("总结所有文档的主要内容")
print(response)

下一步 #

掌握响应合成器后,接下来学习 RAG 高级技术 探索更多 RAG 优化策略!

最后更新:2026-03-30