第 08 课:LangGraph 有状态工作流精讲

发布时间:2026/7/9 4:08:41
第 08 课:LangGraph 有状态工作流精讲 第 08 课LangGraph 有状态工作流精讲配套代码仓库https://gitee.com/wang-zeyong111/lang-chain-lecture本课定位LangChain 的create_agent适合快速创建常见 Agent但当你需要精确控制状态、分支、节点、人机协作、暂停恢复时就需要 LangGraph。LangGraph 让你把 LLM 应用设计成图节点执行任务边决定流向状态在图中传递和更新。学习目标理解状态图的基本概念。掌握 StateGraph、节点、边、条件边。能构建一个无需 API Key 的路由问答图。理解 LangChain Agent 与 LangGraph 的关系。能判断什么时候需要从 Agent 升级到 LangGraph。一、为什么需要图简单链是线性的输入 - prompt - model - parser但真实应用常常不是线性的问题短则先改写问题长则直接检索检索不到则换查询再检索答案高风险则人工审核工具失败则重试用户中断后稍后恢复多个 Agent 轮流处理。这些需求用普通链会越来越乱用图可以清楚表达。二、LangGraph 的核心概念State状态是图中流动的数据。可以是 TypedDict包含用户问题当前路由检索上下文中间结果最终答案错误信息审核结果。Node节点是一个函数读取 state返回要更新的字段。defretrieve_context(state):return{context:...}Edge边连接节点表示执行顺序。Conditional Edge条件边根据 state 决定下一步。例如需要检索 - retrieve不需要检索 - answer_directly审核失败 - human_review。START 和 END图的入口和结束。三、StateGraph 的基本写法典型步骤graphStateGraph(MyState)graph.add_node(route,route_question)graph.add_node(retrieve,retrieve_context)graph.add_node(answer,answer)graph.add_edge(START,route)graph.add_conditional_edges(route,decide_next,{...})graph.add_edge(answer,END)appgraph.compile()编译后的app可以像 Runnable 一样调用app.invoke(initial_state)也可以 stream 观察每个节点输出。四、状态设计原则状态字段不要随意堆。建议分层输入字段question、user_id控制字段route、step、retry_count数据字段context、documents输出字段answer、sources质量字段confidence、passed_check错误字段error。状态设计得好图就清楚状态混乱图会很难维护。五、节点设计原则一个节点应该只负责一类任务路由节点检索节点生成节点检查节点工具节点人工审核节点。节点返回局部更新不要在一个节点里偷偷修改所有状态。这样更容易测试和复用。六、什么时候从 Agent 升级到 LangGraph继续用create_agent工具数量少只是常规工具调用不需要复杂分支不需要人工审核不需要自定义状态。升级到 LangGraph要精确控制每一步要可恢复执行要人机协作要多 Agent要复杂路由要自定义检查和重试要清晰测试节点。七、LangGraph 与 RAGRAG 很适合用图表达输入 - 问题改写 - 检索 - 检索质量检查 - 答案生成 - 答案检查 - 输出如果检索质量不够检索质量检查 - 改写查询 - 再检索如果答案风险高答案检查 - 人工审核 - 输出这类流程用普通链会很绕用 LangGraph 更自然。八、流式观察图LangGraph 的stream可以输出每个节点的更新这对调试非常重要。你能看到路由结果检索上下文生成答案检查结果错误节点。开发复杂 Agent 时不要只看最终答案。要观察每个节点状态。九、常见坑状态字段太随意后期难维护。节点做太多事难测试。条件边逻辑不完整出现死路。没有限制循环次数可能无限重试。没有错误字段失败后难定位。简单任务过早使用 LangGraph增加复杂度。十、自测清单我能解释 State、Node、Edge、Conditional Edge。我能写一个最小 StateGraph。我知道节点应该返回 state 更新。我能判断什么时候用 create_agent什么时候用 LangGraph。我知道如何用 stream 观察图执行。十一、课后练习给课程图新增rewrite_question节点。当问题少于 5 个字时先改写再检索。新增check_answer节点答案为空时进入重试。设计一个human_review节点用于高风险答案。