跳到主要内容

第 2.8.2 节:用 State、Node 和 Edge 描述工作流骨架

本节围绕“用 State、Node 和 Edge 描述工作流骨架”展开,先建立直观判断,再进入工程细节。完成本节后,你应该能够说清 State、Node 与 Edge 的处理顺序、关键检查点和失败处理。

核心概念​

读图重点:从 State 开始:Node 只完成一个可验收动作,Edge 决定下一步;遇到补信息、审批或故障时保存检查点,中断恢复后继续使用同一任务状态。

LangGraph(智能体状态图框架)​

层级解释
人话解释LangGraph(智能体状态图框架)是用“状态图”组织复杂 Agent(智能体)流程的框架。它让系统知道现在处于哪一步、下一步该去哪里、什么时候循环、什么时候暂停、什么时候结束。
项目位置在客服工作台里,它位于 Agent 决策层和业务工具层之间,把“退款投诉处理”编排成识别意图、补信息、查订单、查政策、人工确认、创建工单、最终答复等节点。
工程动作你要定义状态字段、节点职责、固定边、条件边、循环上限、人工中断点、检查点、恢复策略和节点日志。
面试说法LangGraph(智能体状态图框架)适合把多步骤、可恢复、可审计的 Agent 流程显式化。重点不是 API(应用程序接口),而是把业务状态迁移变成可测试的编排。

State(状态)​

层级解释
人话解释State(状态)是状态图运行时的任务快照,记录当前知道什么、缺什么、做过什么、下一步受什么约束。
项目位置客服工作台的 State(状态)包含 session_id(会话编号)、task_id(任务编号)、intent(意图)、order_id(订单号)、risk_level(风险等级)、tool_results(工具结果)、approval_required(需要审批)、retry_count(重试次数)和 stop_reason(停止原因)。
工程动作状态字段要服务路由和恢复。不要把全部聊天历史塞进状态,也不要缺少影响分支判断的关键字段。
面试说法状态不是聊天记录,而是驱动工作流的结构化事实。状态设计越清楚,节点和条件边越容易测试。

Node(节点)​

层级解释
人话解释Node(节点)是工作流中的一个处理步骤。它读取当前状态,完成一个明确动作,然后把更新写回状态。
项目位置客服流程中的节点可以是 classify_intent(识别意图)、ask_for_order_id(追问订单号)、check_order_status(查订单状态)、search_after_sales_policy(查售后政策)、prepare_ticket_draft(准备工单草稿)、human_confirm(人工确认)、create_ticket(创建工单)。
工程动作每个节点要定义输入状态、输出状态、可调用工具、失败类型、日志字段和验收样例。
面试说法我会按业务职责拆节点,让每个节点可测试、可复盘、可替换,而不是把所有逻辑塞进一个巨大 Agent。

Edge(边)​

层级解释
人话解释Edge(边)定义一个节点完成后流向哪里。固定边表示一定进入下一步。
项目位置例如 validate_order_scope(校验订单归属)成功后一定进入 check_order_status(查订单状态),create_ticket(创建工单)成功后一定进入 final_response(最终答复)。
工程动作固定边适合稳定、无争议的顺序动作。边的设计要避免绕过权限、绕过确认或绕过日志。
面试说法边不是画图装饰,它表达业务顺序和执行约束。固定边适合确定流程,条件边适合分支决策。

Conditional Edge(条件边)​

层级解释
人话解释Conditional Edge(条件边)根据状态决定下一步去哪。它是状态图控制分支的关键。
项目位置如果 missing_fields(缺失字段)包含 order_id(订单号),就去 ask_for_order_id(追问订单号);如果 risk_level(风险等级)为 high(高),就去 human_confirm(人工确认);如果 retry_count(重试次数)超过上限,就去 handoff_to_human(转人工)。
工程动作条件边要写清判断依据、优先级、默认分支和异常分支。高风险分支不能只靠模型自由判断。
面试说法条件边把“模型可能的下一步”收束成“系统允许的下一步”。这是 Agent 工程化的核心。

循环控制​

层级解释
人话解释循环控制允许流程在必要时回到前一步,例如工具失败后重试、资料不足时继续追问、模型输出不合格时重新生成。
项目位置查订单工具超时后,可以回到 check_order_status(查订单状态)节点重试一次;用户补充资料后,从 ask_for_order_id(追问订单号)回到 validate_order_scope(校验订单归属)。
工程动作循环必须有 retry_count(重试次数)、最大次数、退出条件和兜底路径。没有上限的循环是事故。
面试说法我不会让 Agent 无限自我修正。每个循环都要有计数、日志和转人工条件。

人工确认与中断​

层级解释
人话解释人工确认是让状态图在关键节点暂停,把待执行动作交给用户、客服或审核人确认,再根据确认结果继续。
项目位置创建投诉工单前,系统要展示问题摘要、关联订单、风险提示和下一步影响;用户确认后才进入 create_ticket(创建工单),拒绝则回到 revise_ticket_draft(修改工单草稿)或结束。
工程动作人工确认要保存待确认内容、确认人、确认时间、确认结果和恢复入口。用户刷新页面或审核延迟时,流程不能丢。
面试说法高风险动作不能只靠 Prompt(提示词)约束。我会在状态图里设置人工中断点,让系统暂停、记录、确认后再恢复。

检查点与恢复​

层级解释
人话解释检查点是在关键步骤保存状态快照。流程中断、工具失败或人工确认等待后,可以从最近的可靠位置继续,而不是从头重跑。
项目位置用户补充订单号前,状态停在 waiting_for_order_id(等待订单号);人工审核前,状态停在 waiting_approval(等待审批);系统重启后可以根据 task_id(任务编号)恢复。
工程动作你要定义哪些节点后保存检查点、恢复时需要校验哪些字段、哪些写入动作必须幂等。
面试说法恢复不是简单重试,而是基于检查点、状态日志和幂等控制继续执行,避免重复建单、重复通知和重复审批。

可视化编排​

层级解释
人话解释可视化编排让产品、开发、测试和面试官看到流程到底有哪些路径,而不是只听你说“系统会自动处理”。
项目位置客服工作台可以把退款投诉流程展示成状态图:当前节点高亮、已执行节点标记、等待确认节点展示待办、失败节点展示原因。
工程动作你要确保图上的节点、代码里的节点、日志里的节点名称一致。否则可视化会变成另一份容易过期的文档。
面试说法状态图可视化的价值是辅助调试、验收和沟通,不是替代权限、状态和日志。

本章在客服 Agent(智能体)工作台中的位置​

客服工作台可以分成 8 层。本章负责复杂工作流编排层。

层级作用本章关注点
用户入口接收用户问题、补充资料和确认动作提供会话编号、用户身份和确认事件。
分流层判断意图、风险和初始动作把前面章节的问题分流和治理结果写入状态。
知识库层检索售后政策、商品说明和客服规范作为 search_after_sales_policy(查售后政策)节点的数据来源。
工具治理层查订单、查历史工单、创建工单作为状态图中的工具节点或工具调用节点。
状态与记忆层保存会话状态、任务状态和必要记忆承接客服任务的状态字段和状态迁移表。
复杂工作流编排层用状态图组织节点、边、分支、循环和人工确认本章核心。
日志审计层记录节点执行、状态迁移、工具结果和人工确认为恢复、质检和面试提供证据。
展示层展示当前进度、待确认动作和最终结果根据状态图节点展示不同界面状态。

一个重要判断是:LangGraph(智能体状态图框架)不应该吞掉所有业务逻辑。它负责“编排”,订单归属校验仍然在业务系统或工具治理层完成,售后政策仍然来自知识库,工单创建仍然由工单系统返回真实编号。

系统流程图​

下面是客服退款投诉流程的状态图表达。

这张图有 5 个重点:

  • 所有分支都由状态或业务规则驱动,不让模型自由跳过流程。
  • 缺信息和人工确认都会暂停,暂停时必须保存状态。
  • 工具失败不是简单报错,而是先判断能否重试,再决定是否转人工。
  • 创建工单属于写入动作,必须经过确认和幂等控制。
  • 最终状态不只记录回答,还要记录 stop_reason(停止原因)和路径证据。

模块拆分​

客服工作台里的 LangGraph(智能体状态图框架)能力,可以拆成 9 个模块。

模块作用关键产出
状态模型模块定义状态图运行需要的字段运行状态字段表、字段来源、字段更新规则。
节点目录模块管理所有业务节点节点清单、节点职责、输入输出、失败类型。
路由规则模块管理固定边和条件边条件判断表、默认分支、异常分支。
工具节点适配模块把查订单、查政策、创建工单接入节点工具输入、工具输出、权限校验、幂等规则。
人工确认模块处理暂停、待确认内容和恢复确认卡片字段、确认结果、恢复入口。
检查点模块保存关键步骤的状态快照检查点策略、恢复策略、过期策略。
循环与重试模块控制工具重试、草稿修改和补信息循环retry_count(重试次数)、最大次数、退出原因。
可观测性模块记录节点、边、工具和状态变化trace_id(追踪编号)、node_run_id(节点运行编号)、状态迁移日志。
可视化与验收模块给开发、测试和业务方查看流程状态图、路径样例、验收清单。

模块拆分的目的不是让项目变复杂,而是让每个职责有边界。尤其是“路由规则”和“工具执行”要分开:条件边决定去哪,工具节点负责做事,权限和业务系统负责判断能不能做。

继续学习​