1. 项目概述:RAG与Agent的融合演进
在当今AI技术快速发展的背景下,检索增强生成(RAG)系统已成为处理知识密集型任务的主流解决方案。然而,传统RAG系统在面对复杂查询时往往力不从心,这促使我们思考如何突破现有技术瓶颈。Deep Thinking RAG正是这一思考的产物,它将RAG与Agent技术深度融合,通过LangGraph构建循环推理机制,实现了从简单检索到深度思考的跨越。
1.1 传统RAG的局限性分析
传统RAG系统采用"检索→增强→生成"的线性流程,这种设计在面对以下场景时表现欠佳:
- 多跳推理问题:需要综合多个文档片段才能回答的复杂查询
- 动态知识需求:无法获取实时信息或外部数据源
- 检索策略单一:对所有问题采用相同的检索方法
- 自我评估缺失:缺乏判断检索信息是否充分的能力
这些问题本质上源于传统RAG系统的静态、线性特性,使其难以应对现实世界中的复杂信息需求。
1.2 Deep Thinking RAG的创新突破
Deep Thinking RAG通过引入Agent技术,实现了以下关键创新:
- 规划能力:将复杂查询智能分解为结构化的多步研究计划
- 自适应检索:根据问题特性动态选择最佳搜索策略
- 反思机制:在每一步骤后评估进展并调整策略
- 决策能力:判断何时继续研究或终止流程
这种设计使系统能够像人类研究者一样思考和工作,而不仅仅是简单的信息检索工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体架构概览
Deep Thinking RAG的核心架构由以下几个关键组件构成:
code复制用户查询
↓
┌─────────────────────┐
│ Planning Agent │ ──→ 分解为多步子任务,选择工具
└──────────┬──────────┘
↓
┌─────────────────────────────┐
│ Retrieval Supervisor │ ──→ 动态选择检索策略
│ (Vector/Keyword/Hybrid) │
└──────────┬──────────────────┘
↓
┌─────────────────────┐
│ Multi-Stage │ ──→ 检索 → 重排 → 蒸馏
│ Retrieval Funnel │
└──────────┬──────────┘
↓
┌─────────────────────┐
│ Policy Agent │ ──→ 判断:继续 or 完成
└─────────────────────┘
↓
最终答案(含引用)
2.2 状态管理设计
系统通过RAGState维护全局状态,这是实现循环推理的关键:
python复制from typing import List, Dict, TypedDict, Literal, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Step(BaseModel):
"""单步任务定义"""
sub_question: str = Field(description="具体的子问题")
tool: Literal["search_10k", "search_web"] = Field(description="工具选择")
keywords: List[str] = Field(description="关键检索词")
document_section: Optional[str] = Field(description="目标文档章节")
class Plan(BaseModel):
"""执行计划"""
steps: List[Step]
class RAGState(TypedDict):
"""全局状态"""
original_question: str # 原始问题
plan: Plan # 执行计划
past_steps: List[Dict] # 历史推理记录
current_step_index: int # 当前步骤
retrieved_docs: List[Document] # 检索结果
reranked_docs: List[Document] # 重排后文档
synthesized_context: str # 蒸馏上下文
final_answer: str # 最终答案
状态管理实现了以下关键功能:
- 保存完整的推理链条
- 支持内部文档与外部搜索的智能路由
- 实现断点续推和轨迹分析
3. 核心组件实现
3.1 规划代理实现
规划代理是系统的"战略大脑",负责查询分解与工具选择:
python复制from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
planner_prompt = ChatPromptTemplate.from_messages([
("system", """你是研究策略专家。将复杂查询拆解为多步计划。
可用工具:
1. search_10k:检索 NVIDIA 2023 年 10-K 财报(历史数据)
2. search_web:搜索互联网最新信息(实时数据)
要求:
- 每个子问题选择最合适的工具
- 对 search_10k 指定目标章节(如 'Item 1A. Risk Factors')"""),
("human", "查询: {question}")
])
reasoning_llm = ChatOpenAI(model="gpt-4o", temperature=0)
planner_agent = planner_prompt | reasoning_llm.with_structured_output(Plan)
实际应用示例:
输入查询:"基于 NVIDIA 2023 年 10-K,识别竞争风险。然后查找 2024 年 AMD AI 芯片战略,分析其对 NVIDIA 风险的影响。"
输出计划:
code复制步骤 1: 工具=search_10k, 章节=Item 1A. Risk Factors
子问题: NVIDIA 列出了哪些竞争相关风险?
步骤 2: 工具=search_web
子问题: AMD 在 2024 年推出了哪些 AI 芯片产品?
步骤 3: 工具=search_10k, 章节=Item 1A. Risk Factors
子问题: AMD 新战略如何影响 NVIDIA 的竞争风险?
3.2 自适应检索监督者
监督者通过分析查询特征,动态选择最优检索策略:
python复制class RetrievalDecision(BaseModel):
strategy: Literal["vector_search", "keyword_search", "hybrid_search"]
justification: str
retrieval_supervisor_prompt = ChatPromptTemplate.from_messages([
("system", """选择最佳检索策略:
- vector_search:概念性查询(如"公司对气候变化的态度")
- keyword_search:精确查询(如"Item 1A"、"Hopper 架构")
- hybrid_search:复杂查询(结合语义与关键词)"""),
("human", "查询: {sub_question}")
])
retrieval_supervisor = retrieval_supervisor_prompt | \
reasoning_llm.with_structured_output(RetrievalDecision)
决策示例:
- 查询:"2023 财年 Compute 部门营收" → keyword_search
- 查询:"市场竞争的总体情绪" → vector_search
3.3 多策略检索与重排
系统实现三种检索策略,并通过交叉编码器进行高精度重排:
python复制from langchain_community.vectorstores import Chroma
from rank_bm25 import BM25Okapi
from sentence_transformers import CrossEncoder
# 向量检索(支持元数据过滤)
def vector_search_only(query: str, section_filter: str = None, k: int = 10):
filter_dict = {"section": section_filter} if section_filter else None
return vector_store.similarity_search(query, k=k, filter=filter_dict)
# BM25 关键词检索
def bm25_search_only(query: str, k: int = 10):
tokenized_query = query.split(" ")
scores = bm25.get_scores(tokenized_query)
top_k_indices = np.argsort(scores)[::-1][:k]
return [doc_map[doc_ids[i]] for i in top_k_indices]
# 混合检索(RRF 融合)
def hybrid_search(query: str, section_filter: str = None, k: int = 10):
bm25_docs = bm25_search_only(query, k=k)
semantic_docs = vector_search_only(query, section_filter, k=k)
return rrf_fusion(bm25_docs, semantic_docs, k)
# 高精度重排序
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
def rerank_documents(query: str, documents: List[Document], top_n: int = 3):
pairs = [(query, doc.page_content) for doc in documents]
scores = reranker.predict(pairs)
doc_scores = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, _ in doc_scores[:top_n]]
检索流程的关键优势:
- 第一阶段(广度):检索Top-K候选文档,最大化召回
- 第二阶段(精度):交叉编码器深度对比query-document,筛选Top-N高质量文档
- 元数据过滤:精确定位目标章节
4. LangGraph编排实现
4.1 核心图节点定义
系统通过LangGraph构建推理闭环,主要节点包括:
python复制from langgraph.graph import StateGraph, END
def plan_node(state: RAGState):
"""生成执行计划"""
plan = planner_agent.invoke({"question": state["original_question"]})
return {"plan": plan, "current_step_index": 0, "past_steps": []}
def retrieval_node(state: RAGState):
"""内部文档检索(自适应策略)"""
step = state["plan"].steps[state["current_step_index"]]
# 查询重写
rewritten_query = query_rewriter_agent.invoke({
"sub_question": step.sub_question,
"keywords": step.keywords,
"past_context": get_past_context(state['past_steps'])
})
# 策略选择与执行检索
decision = retrieval_supervisor.invoke({"sub_question": rewritten_query})
if decision.strategy == 'vector_search':
docs = vector_search_only(rewritten_query, step.document_section, k=10)
elif decision.strategy == 'keyword_search':
docs = bm25_search_only(rewritten_query, k=10)
else:
docs = hybrid_search(rewritten_query, step.document_section, k=10)
return {"retrieved_docs": docs}
def web_search_node(state: RAGState):
"""外部网络搜索"""
step = state["plan"].steps[state["current_step_index"]]
docs = web_search_function(step.sub_question)
return {"retrieved_docs": docs}
def rerank_node(state: RAGState):
"""文档重排序"""
step = state["plan"].steps[state["current_step_index"]]
reranked = rerank_documents(step.sub_question, state["retrieved_docs"], top_n=3)
return {"reranked_docs": reranked}
def compression_node(state: RAGState):
"""上下文蒸馏"""
step = state["plan"].steps[state["current_step_index"]]
context = "\n\n".join([doc.page_content for doc in state["reranked_docs"]])
synthesized = distiller_agent.invoke({
"question": step.sub_question,
"context": context
})
return {"synthesized_context": synthesized}
def reflection_node(state: RAGState):
"""总结当前步骤"""
summary = reflection_agent.invoke({
"sub_question": state["plan"].steps[state["current_step_index"]].sub_question,
"context": state['synthesized_context']
})
new_past_step = {
"step_index": state["current_step_index"] + 1,
"summary": summary,
"retrieved_docs": state['reranked_docs']
}
return {
"past_steps": state["past_steps"] + [new_past_step],
"current_step_index": state["current_step_index"] + 1
}
def final_answer_node(state: RAGState):
"""生成最终答案(含引用)"""
final_context = aggregate_all_evidence(state['past_steps'])
final_answer = final_answer_agent.invoke({
"question": state['original_question'],
"context": final_context
})
return {"final_answer": final_answer}
4.2 条件边与控制策略
python复制def route_by_tool(state: RAGState) -> str:
"""根据工具类型路由"""
return state["plan"].steps[state["current_step_index"]].tool
def should_continue(state: RAGState) -> str:
"""判断是否继续推理"""
# 检查计划是否完成
if state["current_step_index"] >= len(state["plan"].steps):
return "finish"
# 检查是否超过最大迭代
if state["current_step_index"] >= 7:
return "finish"
# LLM自我判断
history = get_past_context(state['past_steps'])
decision = policy_agent.invoke({
"question": state["original_question"],
"history": history
})
return "finish" if decision.next_action == "FINISH" else "continue"
4.3 图构建与编译
python复制# 创建状态图
graph = StateGraph(RAGState)
# 添加节点
graph.add_node("plan", plan_node)
graph.add_node("retrieve_10k", retrieval_node)
graph.add_node("retrieve_web", web_search_node)
graph.add_node("rerank", rerank_node)
graph.add_node("compress", compression_node)
graph.add_node("reflect", reflection_node)
graph.add_node("generate_final_answer", final_answer_node)
# 设置入口
graph.set_entry_point("plan")
# 条件路由:根据工具类型
graph.add_conditional_edges(
"plan",
route_by_tool,
{"search_10k": "retrieve_10k", "search_web": "retrieve_web"}
)
# 处理流程
graph.add_edge("retrieve_10k", "rerank")
graph.add_edge("retrieve_web", "rerank")
graph.add_edge("rerank", "compress")
graph.add_edge("compress", "reflect")
# 循环判断
graph.add_conditional_edges(
"reflect",
should_continue,
{"continue": "plan", "finish": "generate_final_answer"}
)
graph.add_edge("generate_final_answer", END)
# 编译
deep_thinking_rag = graph.compile()
5. 系统评估与优化
5.1 性能对比测试
我们使用RAGAs框架对系统进行了量化评估:
python复制from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
context_precision, # 检索精度
context_recall, # 检索召回
faithfulness, # 答案忠实度
answer_correctness # 答案正确性
)
# 构建评估数据
eval_data = {
'question': [complex_query, complex_query],
'answer': [baseline_result, final_state['final_answer']],
'contexts': [baseline_contexts, advanced_contexts],
'ground_truth': [ground_truth, ground_truth]
}
result = evaluate(Dataset.from_dict(eval_data),
metrics=[context_precision, context_recall,
faithfulness, answer_correctness])
评估结果:
| 系统 | Context Precision | Context Recall | Faithfulness | Answer Correctness |
|---|---|---|---|---|
| Baseline RAG | 0.50 | 0.33 | 1.00 | 0.40 |
| Deep Thinking RAG | 1.00 | 1.00 | 1.00 | 0.99 |
关键发现:
- Context Precision提升100%
- Context Recall提升203%
- Answer Correctness提升148%
5.2 生产环境优化建议
- 性能优化:
python复制# Redis缓存降低重复查询成本
from langchain.cache import RedisCache
set_llm_cache(RedisCache(redis_client))
# LangSmith可观测性
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "DeepThinking-RAG-Prod"
# 模型蒸馏(GPT-4o → Llama-3-8B)
# 推理速度提升10x,成本降低95%
- 容错机制:
python复制def safe_retrieval_node(state: RAGState):
try:
return retrieval_node(state)
except Exception as e:
logger.error(f"检索失败: {e}")
# 降级:返回缓存的相关文档
return {"retrieved_docs": get_cached_docs(state)}
- 扩展方向:
- 多模态支持:整合图表、视频等非文本信息
- 并行执行:独立子任务并行处理
- 强化学习:通过用户反馈优化策略选择
- 个性化定制:为不同场景训练专属策略模型
6. 应用场景与价值
6.1 适用场景
Deep Thinking RAG特别适合以下场景:
- 企业智能问答:结合内部文档与行业动态
- 金融研报生成:整合财报、新闻、市场数据
- 法律案例分析:关联法条、判例、最新裁决
- 科研文献综述:跨论文、跨时间的知识图谱构建
6.2 核心价值对比
| 维度 | 传统 RAG | Deep Thinking RAG |
|---|---|---|
| 认知模式 | 被动检索 | 主动推理 |
| 知识边界 | 单一静态库 | 多源动态融合 |
| 执行流程 | 固定流水线 | 自适应策略 |
| 可解释性 | 黑盒输出 | 完整溯源链 |
6.3 技术突破点
- 从工具到智能体:系统具备规划、决策、反思能力
- 从单源到多源:无缝整合内部知识库与外部实时信息
- 从固定到自适应:根据任务特性动态优化检索策略
- 从结果到过程:每个结论都附带完整的推理轨迹
7. 实践经验与注意事项
在实际部署Deep Thinking RAG系统时,我们总结了以下关键经验:
- 检索策略调优:
- 不同领域需要定制不同的检索策略权重
- 金融领域更依赖精确匹配,而创意领域更侧重语义相似度
- 状态管理优化:
- 状态对象不宜过大,否则会影响性能
- 建议对历史记录进行压缩或摘要处理
- 循环控制策略:
- 设置合理的最大迭代次数防止无限循环
- 实现成本监控机制,避免资源浪费
- 评估体系建设:
- 建立全面的评估指标,不只看最终答案正确性
- 关注推理过程的合理性和效率
- 错误处理机制:
- 实现完善的降级策略
- 记录完整的错误日志用于后续分析
一个典型的错误处理实现示例:
python复制def safe_node_execution(state: RAGState, node_func):
try:
return node_func(state)
except Exception as e:
logger.error(f"节点执行失败: {str(e)}")
# 记录错误上下文
error_context = {
"timestamp": datetime.now().isoformat(),
"node": node_func.__name__,
"state": state
}
error_store.log(error_context)
# 执行降级逻辑
return fallback_strategy(state, node_func.__name__)
8. 未来发展方向
基于当前实践经验,我们认为Deep Thinking RAG技术有以下值得关注的发展方向:
- 多模态扩展:
- 支持图像、视频等非文本信息的检索与推理
- 实现跨模态的知识关联与综合
- 分布式推理:
- 将复杂查询分解后分配到多个工作节点并行处理
- 通过分布式架构提升系统吞吐量
- 持续学习机制:
- 根据用户反馈自动优化检索策略
- 实现系统参数的动态调整
- 领域自适应:
- 开发轻量级的领域适配模块
- 支持快速部署到新领域
- 可解释性增强:
- 提供更直观的推理过程可视化
- 支持用户干预和引导
这些发展方向将使Deep Thinking RAG系统更加智能、高效和易用,进一步拓展其应用场景和价值。
