← 全部文章

技术笔记 · 2026-09-15

Agent graph:把下一步交给明确的状态与路由

从资料搜集、证据检查和写作的分支出发,理解 state、node、edge 与循环,避免把流程图、知识图谱和多智能体混为一谈。

延伸分析 · 从项目场景展开的原理与方案讨论。

  • AI 学习
  • Graph
  • LangGraph
  • 状态管理

资料整理助手遇到两个来源互相矛盾时,应该继续搜索、标注争议,还是直接写结论?如果所有判断都塞进一个大循环,分支会逐渐藏在字符串判断和异常处理里。graph 提供了一种把这些路径显式表达出来的方法。

可以先把 graph 理解为一张会根据当前情况选择路线的任务流程图。 “读完了没有”“证据够不够”“还能再查几次”,就是决定路线的条件。图上的一个框代表一步工作,箭头表示接下来可以去哪一步。

这里的 graph 指执行图。它不是用实体和关系组织知识的知识图谱,也不意味着必须有多个 agent。

三个概念,回答三个不同的问题

LangGraph 的 Graph API 文档围绕 state、nodes 和 edges 描述工作流。可以用自己的话把它们分成:当前掌握什么、这一步做什么、接下来走哪里。图允许回到前面的步骤,并非所有执行图都是“只能向前、不能回头”的无环图。

概念 资料整理助手中的例子
State 问题、资料条目、来源、缺失证据、剩余搜索次数
Node 搜索、阅读、检查引用、起草笔记
Edge 证据不足时返回搜索,证据充分时进入写作

节点可以是普通函数、模型调用,也可以封装一个小型 agent loop。把函数叫作节点不会自动增加智能,模型调用也不必独占一个节点。

先写状态,再画箭头

下面是自定义的状态草图,用于讨论设计,不是 LangGraph 的完整配置:

{
  "question": "工具调用超时后能直接重试吗?",
  "sources": [{"id": "source-1", "status": "read"}],
  "claims": [{"text": "超时可能发生在写入之后", "sourceIds": ["source-1"]}],
  "openQuestions": ["目标接口是否提供幂等键?"],
  "searchesRemaining": 2,
  "draftPath": null
}

sources 说明读过哪些材料;claims 把结论与依据关联起来;openQuestions 表示仍有不确定性。若只保存一段 summary,程序很难区分“已经证实”“模型猜测”和“还没调查”。

状态不是越全越好。资料正文可以保存在外部,图里保存稳定引用与摘要;不需要让每个节点都复制所有原始页面。这里与上下文和记忆的区别是:执行状态中存在的内容,不一定全部发送给本轮模型。

路由要同时考虑进展和预算

开始 → 搜索 → 阅读 → 检查证据
                     ├─ 满足要求 → 起草 → 验证产物 → 结束
                     ├─ 有缺口且还有预算 → 搜索
                     └─ 有缺口但预算耗尽 → 输出缺口报告 → 结束

这里把“缺口报告”作为合法产物:助手可以解释已确认什么、还缺什么,而不是强行凑出确定结论。它和一篇验收通过的完整报告应有不同状态。

一个容易漏掉的细节是剩余次数何时减少。若只有搜索成功才扣减,持续失败的请求可能永远绕着循环跑。可以在发起尝试前记账,同时区分模型调用、工具调用和实际费用等不同预算。

并行会把合并规则变成业务规则

设两个阅读节点并行工作,都把新资料写入 sources。若每次更新都覆盖旧值,后写的结果可能抹掉前一份;简单追加又可能出现重复来源。不同字段需要不同合并约定。框架中常见的 reducer,就是决定“旧值和新值怎样合成结果”的函数,要核对它实际做了什么。

在这个例子中,可以按规范化 URL 或稳定来源 ID 去重,保留抓取时间与版本;对于彼此冲突的结论,则保留两条证据并进入复核,而不是让“最后写入者获胜”。URL 去重也不意味着两个不同 URL 的转载就是独立证据。

如果先做串行版本,就能先验证这些数据契约。并行通常只改变调度速度,不会替你定义正确的合并行为。

checkpoint 不等于任意副作用只执行一次

Checkpoint 可以先理解为任务的“存档点”:记录做到哪一步,下次从记录继续。这里的副作用指改变外部世界的操作,例如保存文件、创建记录;读资料通常不改变这些内容。

持久化状态有助于恢复运行,但“文件已经写出、完成记录尚未保存时进程退出”仍然可能发生。LangGraph 的 Functional API 文档强调对可能重放的操作设计幂等性。恢复点不能自动替外部系统提供事务保证。

因此应分别讨论图恢复到哪里,以及外部操作是否可以安全重放;后者见工具重试的契约

怎样判断自己是否需要 graph

只有两个固定步骤时,清晰的函数调用已经很好。当分支、回退、等待人工输入和恢复位置开始影响测试时,显式状态图更容易让这些行为被看见。

可以做一个不调用模型的练习:给“检查证据”节点三组固定输入——证据齐全、证据不足但还有预算、预算已耗尽。逐一画出应走的边。再模拟两个来源给出相反结论,确认程序不会因为列表变长就自动判定证据充分。