尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GraphCallbackHandler:给你的 LangGraph 图引擎装一个“黑匣子”
上一篇我们聊了 LangChain 的BaseCallbackHandler它像快递通知一样让你在 LLM 调用开始、结束、出错时收到消息。但 LangGraph 不只是“链”它是一张图。图有自己的生命周期节点流转、条件分支、循环、中断、恢复。这些事件通用的BaseCallbackHandler可管不着。所以 LangGraph 在BaseCallbackHandler的基础上专门扩展了一个GraphCallbackHandler。一、先想清楚图需要什么样的“通知”假设你搭了一个客户支持 Agent用 LangGraph 编排text用户输入 → 意图识别 → 查询知识库 → 生成回答 ↓ 如果置信度低 ↓ 中断等待人工审核 ↓ 恢复继续生成回答你想知道图在哪个检查点checkpoint被中断了中断时带的是什么载荷payload人工审核后图是从哪个检查点恢复的这些问题on_llm_end、on_chain_end回答不了。它们关注的是LLM 调用和链执行不是图的生命周期。于是 LangGraph 定义了两个专属事件事件触发时机GraphInterruptEvent图因中断而暂停执行GraphResumeEvent图从检查点恢复执行以及一个专属基类GraphCallbackHandler。二、GraphCallbackHandler 是什么一句话它是BaseCallbackHandler的子类专门用来观察 LangGraph 特有的图生命周期事件。python class GraphCallbackHandler(BaseCallbackHandler): def on_interrupt(self, event: GraphInterruptEvent) - Any: 图因中断暂停时触发 def on_resume(self, event: GraphResumeEvent) - Any: 图从检查点恢复时触发它继承自BaseCallbackHandler所以LangChain 的所有回调钩子你依然能用on_llm_start、on_chain_end、on_tool_error……。它只是在父类的基础上增加了图级别的两个钩子。关键规则只有一条只有继承自GraphCallbackHandler的处理器才会收到on_interrupt和on_resume事件。普通的BaseCallbackHandler收不到。三、事件里有什么——认识两个 Event 对象GraphInterruptEvent图被中断时LangGraph 会构造这个事件对象塞进这些字段python dataclass(frozenTrue) class GraphInterruptEvent: run_id: UUID | None # 本次图运行的唯一 ID status: GraphLifecycleStatus # 中断发生时的循环状态 checkpoint_id: str # 中断关联的检查点 ID checkpoint_ns: tuple[str, ...] # 检查点命名空间路径主图/子图 interrupts: tuple[Interrupt, ...] # 导致图暂停的中断载荷status的可能值有input、pending、done、interrupt_before、interrupt_after、out_of_steps。它告诉你中断发生在生命周期的哪个位置。interrupts是最有意思的字段。它是一个元组里面装的是触发这次暂停的Interrupt对象。你的节点里调用interrupt()时传了什么值这里就能读到什么。GraphResumeEvent图从检查点恢复时构造这个事件python dataclass(frozenTrue) class GraphResumeEvent: run_id: UUID | None status: GraphLifecycleStatus checkpoint_id: str # 从哪个检查点恢复的 checkpoint_ns: tuple[str, ...]注意GraphResumeEvent没有interrupts字段。恢复事件只关心“从哪恢复”不关心“为什么中断”。四、动手写一个监控图的中断与恢复假设你要做一个“人工审核”流程当 Agent 准备执行某个敏感操作时先中断等人批准后再恢复。节点里触发中断python from langgraph.types import interrupt def sensitive_action_node(state): user_input state[user_input] # 中断把待审核的信息传出去 decision interrupt({ action: delete_user_data, target: user_input[user_id], reason: 用户请求删除账户 }) # 恢复后decision 是人工审核的结果 if decision approve: return {result: 已执行删除} else: return {result: 操作被拒绝}写一个监控 Handlerpython from langgraph.callbacks import GraphCallbackHandler, GraphInterruptEvent, GraphResumeEvent class HumanReviewMonitor(GraphCallbackHandler): def on_interrupt(self, event: GraphInterruptEvent): print( * 40) print(图被中断了) print(f 检查点 ID: {event.checkpoint_id}) print(f 循环状态: {event.status}) for i, interrupt_payload in enumerate(event.interrupts): print(f 中断 {i1}: {interrupt_payload.value}) def on_resume(self, event: GraphResumeEvent): print( * 40) print(图恢复了) print(f 从检查点: {event.checkpoint_id}) print(f 循环状态: {event.status})挂上去跑起来python monitor HumanReviewMonitor() # 第一次调用图会在 interrupt 处暂停 config {configurable: {thread_id: review-001}} result graph.invoke( {user_input: {user_id: u_123}}, config{callbacks: [monitor], **config} )# 输出 # # 图被中断了 # 检查点 ID: ckpt_abc123 # 循环状态: interrupt_before # 中断 1: {action: delete_user_data, target: u_123, reason: 用户请求删除账户}人工审核后恢复执行python from langgraph.types import Command # 恢复图传入审核结果 graph.invoke( Command(resumeapprove), config{callbacks: [monitor], **config} )# 输出 # # 图恢复了 # 从检查点: ckpt_abc123 # 循环状态: pending整个过程你的节点代码里只有interrupt()和Command(resume...)监控逻辑完全由GraphCallbackHandler承担。五、和 LangChain 回调混着用你可能会问我既想统计 token又想监控中断怎么办答案很简单把两类 handler 一起放进config[callbacks]。python from langchain_core.callbacks import BaseCallbackHandler from langgraph.callbacks import GraphCallbackHandler class TokenTracker(BaseCallbackHandler): def on_llm_end(self, response, **kwargs): # 统计 token ... class GraphMonitor(GraphCallbackHandler): def on_interrupt(self, event): # 处理中断 ... graph.invoke( inputs, config{callbacks: [TokenTracker(), GraphMonitor()]} )运行时LangGraph 内部会做一次筛选从所有回调中挑出GraphCallbackHandler的子类实例构建一个专用的图回调管理器。TokenTracker照常收到 LLM 事件GraphMonitor收到中断/恢复事件互不干扰。六、它到底解决了什么问题回到开头那个客户支持 Agent 的场景。没有GraphCallbackHandler时你想知道“图为什么停了”“从哪恢复的”只能在节点里手动写日志、存状态、发通知或者事后翻检查点数据库猜测发生了什么。有了GraphCallbackHandler这些信息由 LangGraph主动推给你中断发生时你知道哪个检查点、什么载荷、循环处于什么状态恢复发生时你知道从哪个检查点、状态是什么。这对于Human-in-the-Loop场景尤其关键。人工审核界面需要知道“当前在等什么”审核系统需要知道“从哪继续”而GraphCallbackHandler提供了标准化的观测入口。七、总结GraphCallbackHandler是 LangGraph 在 LangChain 回调体系上的专项扩展。继承自BaseCallbackHandler所以 LangChain 的所有回调钩子你依然能用。新增on_interrupt和on_resume专门观察图的中断与恢复。事件对象携带检查点 ID、命名空间、中断载荷让“图停在哪、为什么停、从哪继续”变得可编程。通过config[callbacks]挂载和 LangChain 回调无缝混用。如果说BaseCallbackHandler是给你的 LLM 调用装了一个“通话记录器”那么GraphCallbackHandler就是给你的整张图装了一个“黑匣子”——它记录的不只是一次调用而是图的生命周期本身。图会中断会恢复会流转。黑匣子会告诉你它到底经历了什么。
RELATED

相关推荐

小黄鸭机器人技术全解-第 13 章 被动连杆机构与轮滑变体

小黄鸭机器人技术全解-第 13 章 被动连杆机构与轮滑变体

前十二章我们把"步行版 Microduck"拆了个干净:14 个受控自由度、M2 螺丝系统、外挂电池、仿真网格的工程化。但上游仓库里还有两个"非主流"的机构,是完整复刻绕不开的: 第 15 个舵机——它驱动喙/下颚,却在所有 MJCF 里没有自己的关节,靠一套 passive…

📅 2026/9/28 20:23:02
游戏服务端架构拆解:登录、游戏、跨服是怎么各司其职的

游戏服务端架构拆解:登录、游戏、跨服是怎么各司其职的

游戏服务端架构拆解:登录、游戏、跨服是怎么各司其职的引言 很多游戏服务端部署时,会看到一大排可执行文件或脚本:xxx-login、xxx-game、xxx-cross……新手往往一脸懵:不就是一个服务端吗,为什么要拆这么多进程&#x…

📅 2026/9/28 20:18:02
从“改得像人”到“写得有据”:学术文本优化的新趋势

从“改得像人”到“写得有据”:学术文本优化的新趋势

过去,论文修改常被理解为“换几个词、调一下句式”。但随着学术平台对重复率和AIGC特征的关注不断提高,单一的文字替换已经很难满足实际需求。今天的论文优化,正在从局部润色走向围绕内容质量、表达方式与学术规范的综合处理。从职臣Ai的功能…

📅 2026/9/28 20:18:02
MORE NEWS

更多资讯

📰

还是要做一个全自动制作视频的脚本

因为天天坚持制作AI视频太无聊了,------------------最关键是:没有什么回报----------你都不知道视频播放量是500还是3000,----------------还是1000,有的可能就是200,如果用全自动脚本就没有问题--------------------…

📰

Webiny 后端日志规范:用 DI Logger 取代 console.*(`@webiny/api-core/features/logger` 实战指南)

CMS后端前端 【免费下载链接】webiny-js Open-source, self-hosted CMS platform on AWS serverless (Lambda, DynamoDB, S3). TypeScript framework with multi-tenancy, lifecycle hooks, GraphQL API, and AI-assisted development via MCP server. Built for developers at…

📰

企业官网前端组件怎么拆?从落地页到内容页的分层思路

前段时间帮一家做工业设备的公司梳理官网改版,技术栈从 jQuery 跳到 Vue3,前端组件拆分纠结了挺久。今天把当时的思路整理出来,给同样在做企业站前端的朋友做个参考。 一、为什么企业官网也需要组件化很多人觉得企业官网就是几个静态页面&…

📰

OpenClaw 本地 AI 自动化办公搭建教程:TaoToken 统一 Key 配置与安装包验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

为什么选择 Zeek:NSM 数据范式下的定位、核心能力与适用边界

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 导读:本文基于 Zeek 官方文…

📰

抖音直播间弹幕评论用户信息数据获取

做抖音、做直播运营的朋友经常会问:抖音直播间的数据,能不能用程序拿下来、拿下来分析? 今天就把这条路上哪些拿得到、哪些拿不到、能拿来干嘛、有啥坑,一次讲透。 先把最关键的一句话摆出来 不是所有直播间的数据都能拿到。 只有…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬