如何利用 LangGraph 构建具备自我修正能力的 RAG 工作流
传统的 RAG 只要检索到无关文档,模型就会一本正经地胡说八道。要解决这个问题,不能靠堆 Prompt,得把 RAG 从「线性管道」改成「循环图」,让 AI 具备审视自己输出的能力。我最近用 LangGraph 撸了一套自我修正机制,核心逻辑是引入一个
grader(评分节点)来拦截错误答案。整个工作流的拓扑结构是:检索 → 评分 → 生成 → 验证 → (如果不合格) → 重新检索。
最关键的配置是在定义 State 时,得把检索到的文档和当前的查询状态记录下来,这样在修正循环中,AI 才知道之前哪里错了。
from typing import TypedDict, List
class GraphState(TypedDict):
question: str
generation: str
documents: List[str]
iteration_count: int # 防止死循环,设置最大尝试次数在 grade_documents 节点中,我没用复杂的 LLM 判定,而是写了一个极简的评分 Prompt,强制要求它只输出 yes 或 no。如果判定为 no,直接走一条边跳回检索阶段,并更新 query 尝试进行查询重写(Query Rewriting)。
避坑指南:
最容易踩的坑是死循环。如果检索库里根本没有答案,AI 会在「检索 → 评分 → 失败」这个环里一直转。建议给 iteration_count 设个阈值(比如 3 次),超过后直接输出「知识库中未找到相关信息」,而不是强行生成。
效率提升技巧:
为了加快速度,我把评分节点改用了更轻量的模型(比如 GPT-4o-mini 或 Claude Haiku),而生成节点保留高性能模型。这样在不牺牲质量的前提下,端到端延迟降低了约 40%。
具体的条件边逻辑配置如下:
# 定义条件路由
def decide_to_generate(state):
if not state["documents"]:
return "rewrite_query" # 文档不相关,重写问题重新搜
return "generate" # 相关,进入生成环节
workflow.add_conditional_edges(
"grade_documents",
decide_to_generate,
{
"rewrite_query": "rewrite_node",
"generate": "generate_node",
},
)通过这种方式,RAG 不再是赌运气,而是一个有闭环的系统。即使初次检索偏移,只要重写机制足够强,大概率能在第二次迭代中把正确文档捞回来。
免费 AI 工具箱 · 全部完全免费
同类方向的延伸案例可以参考AI大模型变现案例库,有不少直接可参考的案例。
全部回复 (0)
还没有回复,来发第一条吧!
