收藏!小白程序员必看:LangGraph构建会思考的Agentic RAG系统指南

收藏!小白程序员必看:LangGraph构建会思考的Agentic RAG系统指南 本文深入探讨了传统RAG系统的缺陷引出Agentic RAG的必要性。Agentic RAG通过Think-Act-Observe循环实现主动推理和多工具协作显著降低幻觉率。文章详细介绍了如何使用LangGraph框架构建Agentic RAG系统包括环境准备、核心组件定义、状态图构建、节点实现等。此外还提供了进阶技巧与最佳实践如多检索器协同、记忆能力添加、流式输出等帮助开发者打造高效、智能的RAG系统。一、传统RAG的致命缺陷1.1 线性管道的脆弱性传统RAG的工作流程非常直观用户提问 → 向量检索 → 拼接上下文 → LLM生成回答这个流程看起来完美但实际生产中却处处踩坑问题一检索器装聋作哑当用户问Lilian Weng关于reward hacking的类型有什么观点时检索器可能只返回了reward hacking相关的片段却漏掉了types这个关键限定词。结果LLM基于不完整的信息生成了一个看似合理但完全偏离重点的回答。问题二查询歧义无法处理用户问那个产品怎么样——哪个产品传统RAG没有任何机制来澄清或细化查询只能硬着头皮检索然后生成一个模糊的回答。问题三错误无法自纠正当检索到的文档与问题无关时传统RAG没有意识到错误的能力。它只会忠实地把无关内容喂给LLM然后LLM会产生一个自信但错误的回答——这就是所谓的幻觉问题。1.2 为什么简单方案不够用你可能会想“那我们加个re-ranker或者调大top-k”这些都是治标不治本。真正的问题在于传统RAG是被动的而复杂问题需要主动的推理。就像一个只会按图索骥的图书管理员传统RAG从不质疑用户的查询从不反思检索结果的质量也从不主动寻找更多信息。而Agentic RAG就是要让系统具备这种主动性。二、什么是Agentic RAG2.1 从管道到循环范式的根本转变Agentic RAG的核心转变是从线性管道到推理循环。这不是简单的技术升级而是思维方式的根本改变。传统RAG的工作模式就像一个只会执行命令的流水线工人1.收到问题2.去仓库找资料3.把资料交给写手4.写手生成答案问题出在哪里每个环节都是盲执行。工人不会质疑问题是否清晰不会检查找来的资料是否相关更不会在发现问题后主动修正。Agentic RAG的工作模式则像一个有经验的咨询顾问5.先理解你的问题必要时追问澄清6.判断需要查哪些资料去哪里查7.拿到资料后评估是否真的有用8.如果资料不对换个角度再查9.确认信息可靠后才给出专业答案这就是从被动执行到主动推理的质变。2.2 Think-Act-Observe循环Agentic RAG的核心是Think-Act-Observe思考-行动-观察循环这个循环会持续进行直到系统认为已经获得足够信息来回答问题。Think思考LLM分析当前状态决定下一步做什么·这个问题需要查资料吗·用户真正想问的是什么·我现有的信息足够吗Act行动执行具体的操作·调用检索工具·改写查询词·选择合适的数据源Observe观察评估行动结果·检索到的文档相关吗·信息是否完整·需要进一步行动吗2.3 五大核心能力详解一个成熟的Agentic RAG系统具备以下五种核心能力它们共同构成了系统的智能能力1智能查询理解系统能够深入理解用户问题的真实意图而不是简单地匹配关键词。工作原理·意图识别分析问题是问什么、“怎么问”、“为什么问”·实体抽取识别问题中涉及的关键实体人名、产品名、概念等·复杂度评估判断问题是否需要多步推理或简单查询就能解决实际例子用户问“那个产品怎么样”→ 意图识别用户想了解某个产品→ 实体抽取那个没有指明具体产品→ 系统回复“您指的是哪个产品能提供更具体的名称吗”能力2动态检索策略系统不会用固定的检索策略而是根据问题类型动态选择。支持的策略·向量检索基于语义相似度适合概念性问题·关键词检索精确匹配术语适合事实查询·混合检索结合向量和关键词取长补短·多跳检索当结果不足时自动扩展搜索范围能力3自我反思与纠错当检索结果不理想时系统能够意识到问题并主动纠正。纠错机制·相关性评分判断检索到的内容是否真的有用·质量评估检查信息是否过时、是否有偏见·改写决策当文档不相关时决定如何改写查询能力4多工具协作系统不局限于向量数据库可以调用多种外部工具。常用工具·向量数据库存储文档的检索器·Web搜索API搜索实时信息·数据库查询查询结构化数据·计算工具执行数学运算·外部API调用第三方服务能力5记忆与上下文系统记住对话历史在后续交互中保持连贯性。记忆类型·短期记忆当前会话的上下文·长期记忆跨会话的历史信息·工作记忆中间推理步骤的保存2.4 Agentic RAG vs 传统RAG特性传统RAGAgentic RAG执行模式线性管道循环推理检索方式被动检索主动决策错误处理无法纠错自我反思工具支持单一向量库多工具协作幻觉率~30%5%响应延迟低略高什么时候选择Agentic RAG·检索失败时需要自动重试·答案不在知识库中时需要追问·需要多轮交互·对质量要求高2.5 核心架构组件一个完整的Agentic RAG系统通常包含以下组件查询分析器Query Analyzer·判断是否需要检索·识别查询意图和实体·生成检索策略检索器Retriever·向量相似度检索·关键词匹配·混合检索策略查询改写器Query Rewriter·扩展查询词·消除歧义·语义增强文档评分器Document Grader·评估文档相关性·过滤无关内容·生成质量信号回答生成器Answer Generator·基于有效上下文生成回答·标注引用来源·处理不确定情况2.6 为什么选择LangGraph在众多Agent框架中LangGraph有几个独特优势状态管理内置的状态机制让复杂的多步推理变得可控。每一步的状态变化都有迹可循便于调试和优化。可视化可以清晰地看到每一步的决策过程。出了问题一眼就能看出卡在哪一步。持久化支持会话记忆和断点恢复。长对话不会丢失上下文用户体验更连贯。灵活性既可以用预置模板快速开始也可以完全自定义。从简单到复杂平滑过渡。生产就绪支持流式输出、错误重试、并发控制等企业级特性。最重要的是LangGraph的设计哲学与Agentic RAG高度契合——用图来表示状态流转用节点来封装逻辑用边来定义决策。三、用LangGraph构建Agentic RAG3.1 环境准备首先安装必要的依赖pipinstalllanggraph langchain langchain-openai chromadb你需要准备·OpenAI API Key或其他LLM服务·一个向量数据库本例使用Chroma3.2 定义核心组件Step 1: 创建向量检索器from langchain_openaiimportOpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstoresimportChroma from langchain.text_splitterimportRecursiveCharacterTextSplitter from langchain_community.document_loadersimportTextLoader# 加载文档loaderTextLoader(your_knowledge_base.txt)documentsloader.load()# 分割文档text_splitterRecursiveCharacterTextSplitter(chunk_size1000,chunk_overlap200)splitstext_splitter.split_documents(documents)# 创建向量存储vectorstoreChroma.from_documents(documentssplits,embeddingOpenAIEmbeddings())retrievervectorstore.as_retriever(search_kwargs{k:5})Step 2: 定义检索工具from langchain.toolsimporttool tool def retrieve_documents(query: str)-str:从知识库中检索相关文档 docsretriever.invoke(query)return\n\n.join([doc.page_contentfordocindocs])retriever_toolretrieve_documentsStep 3: 初始化LLMfrom langchain.chat_modelsimportinit_chat_model llminit_chat_model(gpt-4.1,temperature0)3.3 构建状态图LangGraph的核心是StateGraph我们用它来定义整个工作流from langgraph.graphimportStateGraph, MessagesState, START, END from langgraph.prebuiltimportToolNode, tools_condition from langchain.messagesimportHumanMessage# 创建状态图workflowStateGraph(MessagesState)MessagesState 是LangGraph预置的状态类它包含一个messages列表用于存储对话历史。3.4 实现核心节点节点1: 查询生成/响应决策def generate_query_or_respond(state: MessagesState):让LLM决定是否需要检索 responsellm.bind_tools([retriever_tool]).invoke(state[messages])return{messages:[response]}节点2: 查询改写REWRITE_PROMPT 分析用户问题的语义意图生成一个更适合检索的改写版本。 原始问题{question}请生成一个改进后的问题要求1. 保留核心意图2. 添加可能的同义词3. 消除歧义 改写后的问题 def rewrite_question(state: MessagesState):改写原始问题以提高检索质量 questionstate[messages][0].content promptREWRITE_PROMPT.format(questionquestion)responsellm.invoke([{role:user,content:prompt}])return{messages:[HumanMessage(contentresponse.content)]}节点3: 文档评分from pydanticimportBaseModel, Field from typingimportLiteral class GradeDocuments(BaseModel):文档相关性评分 binary_score: strField(descriptionyes 如果文档相关no 如果不相关)GRADE_PROMPT 你是一个文档相关性评估器。 检索到的文档{context}用户问题{question}判断文档是否包含与问题相关的信息 只回答yes或no。 def grade_documents(state: MessagesState)-Literal[generate_answer,rewrite_question]:评估检索文档的相关性 questionstate[messages][0].content contextstate[messages][-1].content promptGRADE_PROMPT.format(questionquestion,contextcontext)graderllm.with_structured_output(GradeDocuments)responsegrader.invoke([{role:user,content:prompt}])ifresponse.binary_scoreyes:returngenerate_answerelse:returnrewrite_question节点4: 生成回答GENERATE_PROMPT 基于以下上下文回答用户问题。如果上下文中没有足够信息请明确说明。 上下文{context}问题{question}回答请标注信息来源 def generate_answer(state: MessagesState):基于检索到的上下文生成回答 questionstate[messages][0].content contextstate[messages][-1].content promptGENERATE_PROMPT.format(questionquestion,contextcontext)responsellm.invoke([{role:user,content:prompt}])return{messages:[response]}3.5 组装完整工作流# 添加节点workflow.add_node(generate_query_or_respond)workflow.add_node(retrieve, ToolNode([retriever_tool]))workflow.add_node(rewrite_question)workflow.add_node(generate_answer)# 设置入口workflow.add_edge(START,generate_query_or_respond)# 条件边决定是否检索workflow.add_conditional_edges(generate_query_or_respond, tools_condition,# 自动判断是否调用了工具{tools:retrieve, END: END# 如果不需要检索直接结束})# 条件边评估文档质量workflow.add_conditional_edges(retrieve, grade_documents# 返回 generate_answer 或 rewrite_question)# 回答后结束workflow.add_edge(generate_answer, END)# 改写后重新开始检索workflow.add_edge(rewrite_question,generate_query_or_respond)# 编译图graphworkflow.compile()3.6 执行和调试# 执行查询forchunkingraph.stream({messages:[{role:user,content:Lilian Weng关于reward hacking的类型有什么观点}]}):fornode, updateinchunk.items(): print(f {node} )update[messages][-1].pretty_print()print()输出示例generate_query_or_respond[调用工具: retrieve_documents]retrieve[检索到3篇文档]grade_documents[评分: no - 文档不相关]rewrite_question[改写为:Lilian Weng reward hacking types classification categorization]generate_query_or_respond[调用工具: retrieve_documents]retrieve[检索到5篇文档]grade_documents[评分:yes- 文档相关]generate_answer根据Lilian Weng的文章reward hacking主要有三种类型...四、进阶技巧与最佳实践4.1 多检索器协同复杂场景下你可能需要多个专业检索器tool def search\_product\_docs(query: str)-str:搜索产品文档returnproduct\_retriever.invoke(query)tool def search\_api\_docs(query: str)-str:搜索API文档returnapi\_retriever.invoke(query)tool def search\_troubleshooting(query: str)-str:搜索故障排除指南returntroubleshoot\_retriever.invoke(query)tools[search\_product\_docs, search\_api\_docs, search\_troubleshooting]LLM会根据问题自动选择合适的工具。4.2 添加记忆能力使用LangGraph的checkpointer实现会话记忆from langgraph.checkpoint.memoryimportInMemorySaver checkpointerInMemorySaver()graphworkflow.compile(checkpointercheckpointer)# 执行时指定thread_idconfig{configurable:{thread_id:user_123}}resultgraph.invoke({messages:[...]}, config)4.3 流式输出对于长回答使用流式输出提升用户体验asyncforeventingraph.astream({messages:[...]}, stream\_modevalues):ifmessagesinevent: print(event[messages][-1].content,end,flushTrue)4.4 错误处理与重试为关键节点添加错误处理from tenacityimportretry, stop\_after\_attempt, wait\_exponential retry(stopstop\_after\_attempt(3),waitwait\_exponential(multiplier1,min4,max10))def retrieve\_with\_retry(state: MessagesState): try:returnretrieve\_documents(state)except Exception as e: print(f检索失败: {e}, 正在重试...)raise4.5 性能优化缓存检索结果from functoolsimportlru\_cache lru\_cache(maxsize1000)def cached\_retrieve(query: str)-str:returnretriever.invoke(query)并行检索importasyncio async def parallel\_retrieve(queries: list[str])-list[str]: tasks[async\_retrieve(q)forqinqueries]returnawait asyncio.gather(\*tasks)批量处理对于大量文档使用批量嵌入# 批量嵌入比逐个嵌入快10倍以上embeddingsOpenAIEmbeddings()batch\_embeddingsembeddings.embed\_documents([doc.page\_contentfordocindocuments])五、常见问题与避坑指南5.1 检索质量差怎么办症状检索到的文档与问题无关解决方案10.检查分块策略chunk_size是否合适11.尝试混合检索向量关键词12.添加re-ranker重排序13.优化查询改写prompt5.2 响应太慢怎么办症状用户等待时间过长解决方案14.减少循环迭代次数设置最大重试次数15.使用更快的模型如GPT-4o-mini16.实现流式输出17.缓存常见查询5.3 幻觉仍然存在症状LLM生成错误信息解决方案18.强化文档评分逻辑19.在prompt中明确不知道就说不知道20.添加事实核查节点21.使用结构化输出强制引用来源5.4 状态管理混乱症状多轮对话中上下文丢失解决方案22.使用checkpointer持久化状态23.定期总结对话历史24.为每个用户使用独立的thread_id六、总结Agentic RAG代表了RAG技术的下一代演进——从被动的管道到主动的智能体。核心要点回顾传统RAGAgentic RAG线性流程循环推理被动检索主动决策无法纠错自我反思单一策略多工具协作LangGraph的优势·状态管理清晰·可视化调试友好·支持复杂控制流·生态成熟稳定下一步行动25.从简单场景开始先实现单检索器版本26.逐步添加查询改写和文档评分27.根据实际效果调整prompt和参数28.最后考虑多检索器和高级特性记住Agentic RAG不是银弹它解决的是检索质量问题。如果你的基础向量库质量很差再智能的Agent也无济于事。在追求架构复杂度之前先把基础打牢。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取