在使用 LangGraph 设计 Agent 时,直接跳进代码里定义 Node 或 Edge 很容易导致逻辑混乱。LangGraph 的核心本质是 "有状态的图(Stateful Graph)"。
优先级排序:
- 业务工作流 (Workflow/Graph Topology) ------ 先画图,不写码
- 状态定义 (State Schema) ------ 数据的"血液"
- 节点功能 (Nodes) ------ 执行的"手脚"
- 边与路由 (Edges & Routing) ------ 决策的"大脑"
详细构思指南
1. 优先级最高:业务工作流 (Visualizing the Graph)
核心问题: 我的 Agent 是怎么思考和做事的?
在定义 State 或 Node 之前,你必须在纸上或白板上画出流程图。LangGraph 的强大在于处理循环 (Cycles) 和 分支 (Branches)。
-
构思要点:
- 起点与终点: 用户输入是什么?最终产出是什么?
- 关键步骤: 需要检索吗 (RAG)?需要写代码吗?需要审核吗?
- 循环逻辑: 如果检索结果不满意,Agent 应该重试吗?重试多少次?
- 人机交互: 哪一步需要人类确认(Human-in-the-loop)?
-
决策结果:
- 是单一直线流程(DAG)?
- 还是典型的 ReAct 循环(思考-行动-观察-循环)?
- 还是多 Agent 协作(Supervisor 模式)?
2. 优先级第二:状态定义 (State Design)
核心问题: 节点之间如何传递信息?Agent 需要记住什么?
LangGraph 的 State 是所有节点共享的上下文(Context)。这是它与普通 Chain 的最大区别。必须在写 Node 代码前定义好 State,因为 Node 的输入输出都依赖它。
-
构思要点:
- 消息历史: 是否需要标准的
messages列表(User/AI/Tool Message)? - 共享数据: 是否需要存储检索到的文档 (
documents)、生成的草稿 (draft)、当前的步骤计数 (steps)? - Reducer 逻辑: 当一个 Node 返回数据时,是覆盖 旧数据,还是追加 数据?
- 例如:消息通常是
add_messages(追加),而生成的最终摘要通常是直接覆盖。
- 例如:消息通常是
- 消息历史: 是否需要标准的
-
代码预想:
pythonclass AgentState(TypedDict): messages: Annotated[list, add_messages] # 追加模式 documents: list[str] # 覆盖模式 retry_count: int # 用于控制循环次数
3. 优先级第三:节点设计 (Node Design)
核心问题: 每一步具体做什么?
有了 State 定义,你就可以设计 Node 了。每个 Node 本质上就是一个 Python 函数:Input: State -> Output: State Update。
- 构思要点:
- 主要指责:
Agent Node:调用 LLM 做决策或生成回答。Tool Node:执行具体工具(搜索、计算、API调用)。Logic Node:不调用 LLM,仅做数据清洗或格式化。
- 输入输出: 这个 Node 读取 State 中的哪些字段?它更新 State 中的哪些字段?
- 工具绑定: 如果是 LLM Node,它需要绑定哪些 Tools?
- 主要指责:
4. 优先级第四:边与路由 (Edges & Routing)
核心问题: 做完这一步,下一步去哪里?
这是连接 Node 的桥梁。
- 构思要点:
- 普通边 (Normal Edge): 固定的流向(例如:检索完 -> 总结)。
- 条件边 (Conditional Edge): 这是 Agent 智能的核心。
- 逻辑: 基于 LLM 的输出决定。
- 场景: 如果 LLM 返回了
tool_calls,转到ToolNode;如果 LLM 返回了结束语,转到END。 - 校验: 检查
retry_count,如果超过 3 次,强制结束(防止死循环)。
5. 附加构思(进阶)
在完成以上 4 步后,考虑以下 LangGraph 特有的增强功能:
- Checkpointer (记忆持久化): 是否需要跨会话记忆?(用户关掉网页回来还能接着聊吗?)
- Interrupt (人机协同): 在执行敏感操作(如发邮件、写代码)前,是否需要暂停图的运行,等待用户输入
resume?
总结:你的设计清单
在你打开 IDE 之前,请先回答以下问题:
- [图] 画出流程图:我有几个圈(循环)?
- [状态] 定义数据结构:我的 State 里面有哪些字段?哪些是 Append,哪些是 Overwrite?
- [节点] 确定工具:Agent 需要用到哪些 Tool?
- [路由] 确定条件:什么情况下 Agent 会决定"重做"或"结束"?
按照这个顺序,你的 LangGraph 开发体验会非常丝滑。