LangGraph 子图是什么?父图和子图怎么传状态?
🧑💻 面试官:LangGraph 里,什么时候会用到子图?
🙋♂️ 我:一段流程本身有多个步骤,而且其他流程也会用到,可以把它封成子图,在父图里当成一个节点使用。
🧑💻 面试官:父图叫 topic,子图接收的是 query,框架会自动知道它们是同一件事吗?
🙋♂️ 我:不会,需要在调用子图的节点里转换输入,再把结果映射回来。
🧑💻 面试官:子图搜索出来的全部网页,会自动进入父图吗?下一次调用,它会不会还带着上一次的资料?
子图最需要讲清的,不是“把大图套小图”,而是这段流程接收什么、返回什么,以及内部状态保留到什么时候。
面试速答(60 秒版)
LangGraph 子图 就是把一个图放进另一个图里,作为其中的一个节点使用。它适合封装可以独立理解和复用的多步流程,例如把搜索、阅读和资料汇总做成一个资料收集子图。
父子图怎样传状态,要看它们的接口。如果共享状态键,并且字段含义和更新规则一致,可以直接把编译后的子图接入父图。
如果双方字段不同,就在父图节点里先整理子图输入,调用以后,再把需要的结果转换成父图的状态更新。子图内部用到的资料不必全部传回去。
另外,内部字段和跨调用记忆是两回事。要根据任务选择状态保留方式,并配合检查点处理恢复。子图不是独立的安全沙箱,也不代表它一定是一个 Agent。

知识点详解:把“收集资料”拆出去以后,数据怎么走?
先看父图为什么需要这个子图
假设咱们在做一个报告助手。主流程是:确定主题、收集资料、撰写报告、检查引用。
其中“收集资料”本身又有几步:搜索相关文档,读取候选内容,筛选可用证据,再整理成摘要。如果全部摊在主图里,主流程会混着很多检索细节。
可以把这段过程做成一个子图。父图只需要知道:给它主题,它会返回整理后的资料。
LangGraph 的子图文档把子图定义为在另一个图中作为节点使用的图。这样做可以复用一组节点,也方便分别维护不同部分。
不过,如果所谓子流程只是一次简单函数调用,也不必为了层级好看,硬拆成图。子图的价值在于内部确实有值得单独管理的执行过程。
双方字段一样,可以直接连接
先假设父图和子图都使用 topic 表示报告主题,使用 research 表示整理好的资料。
这时,可以把编译好的子图直接作为父图中的节点。它通过共享状态键读取输入,并把更新交回父图,不需要再写一层只负责改字段名的包装。
但“字段同名”还不够,含义也得一致。父图的 research 如果代表最终可引用证据,子图就不应该把未经筛选的网页全文塞进同一个字段。
共享键的更新规则也要明确。例如列表是整体替换,还是追加合并,要按对应状态定义处理。把子图接上去,不会替我们决定业务上哪种更新才正确。
这更像是在对齐两个模块的接口,不能因为都用了 LangGraph,就省掉接口设计。
字段不一样,就把映射写清楚
现在换一种设计。父图保存 topic 和 research,子图内部则使用 query、documents 和 summary:
| 字段 | 属于哪里 | 本例中的用途 |
|---|---|---|
| topic | 父图 | 用户需要的报告主题 |
| query | 子图 | 本次资料收集的问题 |
| documents | 子图 | 搜索和阅读得到的材料 |
| summary | 子图 | 汇总后的资料摘要 |
| research | 父图 | 交给报告撰写节点的资料 |
调用时,父图节点先用 topic 的值构造 query。子图运行完以后,包装节点取出 summary,再把它作为 research 返回给父图。
也就是:topic → query,子图内部处理,最后 summary → research。
这个例子里,父图只需要摘要,就不必把 documents 整包带回来。如果报告还需要逐条引用,应把来源一起设计进返回结果,而不是丢掉以后再让模型补。JavaScript 子图文档也明确展示了这种调用前后转换状态的方式。
有了清晰映射,子图内部怎样搜索、筛选和整理,就可以单独改动。只要约定的输入输出仍然成立,父图不需要跟着修改所有细节。

“内部状态”不是自动永久保存,也不是保密边界
documents 没有被包装节点返回,只能说明父图的后续业务状态没有接收这个字段。
它不意味着数据被安全隔离了。运行环境、日志和检查点中是否仍能看到这些资料,是另一层问题。如果材料有访问限制,读取和使用时仍要执行权限检查。
至于下一次调用会不会继续带着旧资料,要看子图的持久化模式。
按当前文档,常见的按调用保存方式适合独立任务:每次新调用从新的输入开始,在单次调用内部仍可配合父图检查点支持中断与恢复。需要同一线程中多次调用积累状态时,再选择相应的跨调用模式;明确关闭检查点,则不具备同样的恢复能力。
这里最容易混淆的是:“每次新调用不继承上一次资料”,不等于“本次任务中断后不能恢复”。新任务和恢复同一次任务,本来就不是一个动作。
资料收集子图如果每次服务不同主题,就应特别检查旧资料是否残留。可以连续调用两个完全不同的主题,查看第二次输入和结果;再测试一次中断恢复,确认恢复的是原任务,而不是额外启动一份。
面试官继续追问
子图就是多 Agent 吗?
不是。子图内部可以全部是固定逻辑,例如清洗文档、提取字段和校验结果,根本不需要模型做开放决策。
多 Agent 可以用子图组织,但不能因为出现了两个子图,就声称系统里有两个 Agent。
子图里要人工确认,父图怎样配合?
父图需要配置合适的检查点,调用过程也要保留正确的线程和任务上下文,让中断向外传递,再按同一次执行恢复。
不能捕获到中断以后,就重新调用一份没有历史的新任务。恢复时仍要遵守 LangGraph 的重放规则,可能重复经过的业务副作用需要单独保护。
多个请求能共用同一个子图吗?
可以复用编译后的图定义,但不等于让它们共用同一份运行状态。
独立任务要使用合适的调用和线程隔离。如果使用跨调用保留状态的模式,还要避免并发调用写进同一个检查点命名空间。是否安全复用,取决于执行状态怎样区分,而不是变量里是不是只存了一个图对象。
面试速记卡
- 子图:把一段多步过程封装成父图里的节点。
- 共享状态:键名、含义和更新规则一致时,可以直接接入。
- 不同接口:调用前映射输入,结束后映射需要的输出。
- 状态范围:内部字段、单次调用恢复、跨调用记忆分别判断。
- 概念边界:子图不必是 Agent,也不是安全隔离环境。
