没人愿意谈的RAG问题#
到2026年中,几乎所有正经的AI应用都在使用某种形式的RAG(检索增强生成)。但如果你在生产环境部署过RAG,就知道那个不光彩的秘密:大多数RAG管线在悄无声息地失败。 它们检索出看似相关但实际无法回答问题的文档,它们杜撰引用,它们从未更新的索引中返回过时数据。
2024年代的"嵌入-检索-塞进提示词"管线已经死了。取而代之的是Agentic RAG——一种由AI Agent驱动检索过程的范式,Agent推理需要什么信息、评估检索结果的质量,并持续迭代直到获得可信的答案。
本文将带你用2026年可用的工具构建生产级Agentic RAG系统:MCP用于工具编排,知识图谱用于结构化推理,现代LLM API用于自纠错循环。
一、传统RAG为何会崩塌#
来看一个真实场景:开发者问你的AI助手,“XiDao API Gateway配合Claude 4.7 API使用流式响应时,如何配置限流?”
传统RAG管线会:
- 嵌入查询
- 对文档索引执行向量相似度搜索
- 检索top-k个文本块
- 塞进上下文窗口
- 生成答案
失败模式是可预见的:
- 语义失配:嵌入捕获了"限流",但遗漏了问题具体涉及流式传输 + Claude 4.7 + XiDao Gateway三个交叉关注点。
- 文本块碎片化:答案跨越三页不同文档。每个文本块单独计算的相似度都低于阈值。
- 检索过时:索引包含2025年的文档,但Claude 4.7的流式API有不同的限流头。
结果就是:一个自信的、格式优美的、完全错误的答案。
二、Agentic RAG架构#
Agentic RAG将检索视为规划问题。Agent不是单步检索生成,而是:
- 分解查询为子问题
- 规划每个子问题使用哪些检索工具(向量搜索、知识图谱、网页搜索、API文档查找)
- 迭代执行检索
- 评估检索信息的质量和完整性
- 自纠错:发现不足时生成新的检索查询
- 综合生成带验证引用的最终答案
整体架构如下:
用户查询
|
v
查询分解 Agent(将问题拆解为子问题)
|
v
检索规划 Agent(每个子问题用哪些工具?)
|
+---> 向量搜索
+---> 知识图谱
+---> 网页搜索
+---> 代码搜索
|
v
质量评估 Agent(信息是否充分?有无矛盾或遗漏?)
|
+-- 是 --> 发现信息缺口 --> 重新检索
|
+-- 否 --> 最终综合生成三、实现:MCP驱动的Agentic RAG#
2026年,最优雅的实现方式是用MCP(Model Context Protocol)暴露检索工具,让LLM Agent编排调用。
3.1 配置MCP检索工具#
首先,将检索工具定义为MCP服务器:
# mcp_retrieval_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import chromadb
from neo4j import GraphDatabase
server = Server("agentic-rag-tools")
# 向量数据库客户端
chroma = chromadb.PersistentClient(path="./embeddings_db")
doc_collection = chroma.get_collection("documentation")
# 知识图谱客户端
neo4j_driver = GraphDatabase.driver(
"bolt://localhost:7687",
auth=("neo4j", "password")
)
@server.tool()
async def vector_search(query: str, top_k: int = 5) -> list[TextContent]:
"""对文档嵌入进行语义搜索。
适用场景:查找概念相关的内容、自然语言查询。"""
results = doc_collection.query(
query_texts=[query],
n_results=top_k,
include=["documents", "metadatas", "distances"]
)
formatted = []
for doc, meta, dist in zip(
results["documents"][0],
results["metadatas"][0],
results["distances"][0]
):
formatted.append(TextContent(
type="text",
text=f"[相关度: {1-dist:.3f}] {meta['source']}\n{doc}\n"
))
return formatted
@server.tool()
async def knowledge_graph_query(cypher: str) -> list[TextContent]:
"""查询知识图谱获取结构化关系。
适用场景:实体关系、层级结构、X和Y之间有什么联系类查询。
使用Cypher查询语言。"""
with neo4j_driver.session() as session:
result = session.run(cypher)
records = [dict(r) for r in result]
return [TextContent(
type="text",
text=f"图查询返回 {len(records)} 条结果:\n"
+ "\n".join(str(r) for r in records[:20])
)]
@server.tool()
async def hybrid_search(
query: str,
entity_filter: str = "",
top_k: int = 5
) -> list[TextContent]:
"""混合向量+图谱搜索。
先从查询中提取实体,查找相关图节点,
再用图谱上下文对向量结果进行重排序。"""
# 步骤1: 实体提取(生产环境使用NER)
# 步骤2: 图遍历获取实体上下文
# 步骤3: 图谱增强的向量搜索
# ... 具体实现 ...
pass
@server.tool()
async def check_document_freshness(
source_path: str
) -> list[TextContent]:
"""检查文档最后更新时间。
返回最后修改日期和版本信息。"""
# 查询文档管理系统
# ...
pass3.2 Agent编排器#
现在构建使用这些工具的Agent。关键洞察:使用结构化推理,而非自由生成。
# agentic_rag.py
import asyncio
from dataclasses import dataclass, field
from openai import AsyncOpenAI
client = AsyncOpenAI(base_url="https://api.xidao.online/v1")
RETRIEVAL_AGENT_SYSTEM_PROMPT = """你是一个检索规划Agent。
给定用户查询,你必须:
1. 分解查询为具体子问题
2. 为每个子问题选择最佳检索工具:
- vector_search: 概念性/自然语言查询
- knowledge_graph_query: 实体关系、结构化数据
- hybrid_search: 需要两种能力的复杂查询
- check_document_freshness: 时间敏感的信息
3. 生成优化后的检索查询(不是简单复制用户原文)
4. 执行工具并评估结果
5. 如果结果不足,生成新查询重试(最多3轮)
输出格式(JSON):
{
"sub_questions": ["..."],
"retrieval_plan": [
{"tool": "...", "query": "...", "rationale": "..."}
],
"evaluation": {
"sufficient": true/false,
"gaps": ["..."],
"next_action": "..."
}
}"""
@dataclass
class AgenticRAG:
max_iterations: int = 3
min_confidence: float = 0.7
async def query(self, user_query: str) -> str:
"""执行完整的Agentic RAG管线。"""
# 阶段1: 分解与规划
decomposition = await self._decompose_query(user_query)
# 阶段2: 迭代检索
all_context = []
for iteration in range(self.max_iterations):
# 执行检索计划
results = await self._execute_retrieval(
decomposition["retrieval_plan"]
)
all_context.extend(results)
# 阶段3: 评估质量
evaluation = await self._evaluate_results(
user_query, all_context
)
if evaluation["sufficient"]:
break
# 阶段4: 自纠错——为信息缺口生成新查询
decomposition["retrieval_plan"] = (
await self._generate_correction_queries(
evaluation["gaps"]
)
)
# 阶段5: 综合生成最终答案
return await self._synthesize(user_query, all_context)
async def _decompose_query(self, query: str) -> dict:
response = await client.chat.completions.create(
model="claude-4.7-sonnet",
messages=[
{"role": "system", "content": RETRIEVAL_AGENT_SYSTEM_PROMPT},
{"role": "user", "content": f"分解并规划检索方案: {query}"}
],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
async def _evaluate_results(
self, query: str, context: list
) -> dict:
"""用LLM评判检索质量。"""
eval_prompt = f"""评估检索到的上下文是否足以全面、准确地回答此查询。
查询: {query}
检索到的上下文:
{self._format_context(context)}
评估维度:
1. 覆盖度: 上下文是否涵盖了查询的所有方面?
2. 相关性: 上下文是否真的在回答被问的问题?
3. 时效性: 信息是否是最新的(2026年)?
4. 一致性: 是否存在矛盾?
输出JSON: {{"sufficient": bool, "confidence": float, "gaps": [...]}}"""
response = await client.chat.completions.create(
model="claude-4.7-sonnet",
messages=[{"role": "user", "content": eval_prompt}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)四、知识图谱:缺失的那一层#
单靠向量搜索是不够的。2026年,最有效的RAG系统将向量与知识图谱结合,实现结构化推理。
4.1 构建知识图谱#
从文档中提取实体和关系:
# kg_builder.py
import spacy
from neo4j import GraphDatabase
nlp = spacy.load("zh_core_web_trf")
driver = GraphDatabase.driver(
"bolt://localhost:7687", auth=("neo4j", "password")
)
def build_knowledge_graph(documents: list[dict]):
"""从文档中提取实体和关系,
存储到Neo4j知识图谱。"""
with driver.session() as session:
for doc in documents:
text = doc["content"]
source = doc["source"]
# 使用spaCy NER + LLM增强的关系提取
entities = extract_entities(text)
relations = extract_relations(text, entities)
# 创建文档节点
session.run("""
MERGE (d:Document {source: $source})
SET d.updated = datetime()
""", source=source)
# 创建实体节点和关系
for entity in entities:
session.run("""
MERGE (e:Entity {name: $name, type: $type})
WITH e
MATCH (d:Document {source: $source})
MERGE (d)-[:MENTIONS]->(e)
""", name=entity["name"],
type=entity["type"],
source=source)
for rel in relations:
session.run("""
MATCH (a:Entity {name: $source_name})
MATCH (b:Entity {name: $target_name})
MERGE (a)-[r:RELATES_TO {type: $rel_type}]->(b)
SET r.confidence = $confidence
""", source_name=rel["source"],
target_name=rel["target"],
rel_type=rel["relation"],
confidence=rel["confidence"])4.2 图谱增强检索#
查询到达时,利用图谱发现向量搜索遗漏的上下文:
def graph_enhanced_retrieval(query_entities: list[str]) -> dict:
"""给定查询中发现的实体,遍历图谱
查找相关上下文。"""
with driver.session() as session:
# 查找查询实体的2跳邻居
result = session.run("""
UNWIND $entities AS entity_name
MATCH (e:Entity {name: entity_name})
MATCH (e)-[:RELATES_TO*1..2]-(related:Entity)
MATCH (related)<-[:MENTIONS]-(d:Document)
RETURN DISTINCT d.source AS source,
collect(DISTINCT related.name) AS related_entities,
count(*) AS relevance
ORDER BY relevance DESC
LIMIT 10
""", entities=query_entities)
return [dict(r) for r in result]五、生产环境注意事项#
5.1 API网关集成#
生产环境中,Agentic RAG系统部署在API网关后面。网关负责:
- 限流:按用户、按Token的检索操作限制
- 缓存:在网关层缓存频繁的检索结果
- 降级路由:主LLM响应慢时,将评估查询路由到更快的模型
- 可观测性:追踪检索延迟、命中率和纠错循环次数
# API网关配置(XiDao Gateway示例)
routes:
- path: /api/rag/query
methods: [POST]
plugins:
- rate_limiting:
second: 10
policy: token_bucket
- response_cache:
ttl: 300
vary_by:
- body.query_hash
- observability:
trace_retrieval: true
log_corrections: true
upstream:
targets:
- url: http://rag-service:8080
weight: 90
- url: http://rag-fallback:8080
weight: 105.2 监控自纠错循环#
自纠错循环是Agentic RAG的亮点——但也是成本可能失控的地方。监控以下指标:
# 关键监控指标
metrics = {
"retrieval_iterations": histogram(
"rag_retrieval_iterations",
"收敛前的检索轮次数量",
buckets=[1, 2, 3, 5, 8]
),
"correction_rate": counter(
"rag_corrections_total",
"触发的自纠错次数"
),
"confidence_distribution": histogram(
"rag_confidence_score",
"最终置信度分数分布",
buckets=[0.1, 0.3, 0.5, 0.7, 0.8, 0.9, 0.95]
),
"tool_usage": counter(
"rag_tool_invocations_total",
"检索工具使用量",
["tool_name", "iteration"]
)
}5.3 成本优化#
Agentic RAG的Token消耗远超传统RAG。成本控制策略:
| 策略 | Token节省 | 权衡 |
|---|---|---|
| 评估用快速模型 | ~40% | 评估质量略降 |
| 缓存检索结果 | ~60% | 可能过时 |
| 最多3轮迭代 | ~25% | 可能遗漏边缘情况 |
| 嵌入预过滤 | ~30% | 增加基础设施复杂度 |
| 批量子问题查询 | ~20% | 延迟增加 |
六、趋势展望:RAG、Agent与MCP的融合#
趋势已经很清晰。到2026年底,RAG系统、AI Agent和工具编排协议之间的边界将完全模糊:
- RAG走向Agent化:静态管线让位于推理驱动的检索
- Agent内置RAG:每次Agent调用都隐式包含检索
- MCP统一工具层:一个协议搞定检索、执行和通信
- 知识图谱成为标配:不是替代向量,而是与之互补
今天就在构建这种融合的团队,将在下一代AI原生应用到来时占据显著优势。
核心要点#
- 传统RAG会悄无声息地失败——自信但错误是常态,不是例外
- Agentic RAG将检索视为规划——分解、检索、评估、自纠错、综合
- 知识图谱提供结构化推理——向量找相似性,图谱找关系
- MCP提供统一工具层——一个协议搞定所有检索和工具操作
- 监控纠错循环——质量在此提升,成本也在此飙升
- 从简单开始,迭代优化——一个2轮的Agentic RAG胜过一个从未上线的5轮系统
搭建管线。上线。度量。优化。这就是2026年的方式。