LangChain 工程师自愈部署流水线实践

深度LangChain2026年4月3日5 分钟阅读
LangChain 工程师自愈部署流水线实践
LangChain 工程师 Vishnu Suresh 为 GTM Agent 构建了一套自愈部署流水线。部署后自动检测回归问题,判断是否由变更引起,并触发智能体提交修复 PR,全程无需人工干预。

LangChain 软件工程师 Vishnu Suresh 为 GTM Agent 构建了一套自愈部署流水线。每次部署后,系统会自动检测回归问题,判断是否由变更引起,并触发智能体提交修复 PR,直到代码评审前都不需要人工介入。

真正难的不是把代码推出去,而是部署之后的一切:确认上次部署是否搞坏了什么,问题是不是你造成的,赶在用户发现前修复它。我想做到部署完就放手,相信如果出了什么问题,系统能自己发现并闭环处理。

自愈流程如何运作

GTM Agent 运行在 Deep Agents 上,通过 LangSmith Deployments 部署。我们内部已经有一个叫 Open SWE 的编码智能体,这是个开源的异步编码智能体,能研究代码库、写修复代码并提交 PR。缺失的一环是自动化的回归检测和分级处理,把生产环境错误反馈给 Open SWE。

主分支部署完成后,自愈 GitHub Action 立即触发,捕获构建和服务器日志。流程分两条路径:立即捕获构建失败,以及在监控窗口内检测服务器端回归。任一路径发现真实问题,就会启动 Open SWE 修复并提交 PR。

捕获 Docker 构建失败

首先检查构建日志,确保 Docker 镜像能正常构建。如果镜像构建失败,流水线会自动从 CLI 获取错误日志,抓取上次提交到主分支的 git diff,然后交给 Open SWE——全程无人参与。构建失败几乎总是由最近一次变更引起,所以窄范围的 diff 给 Open SWE 提供了足够的上下文来行动。

监控部署后错误

服务器端问题比构建失败更棘手。任何生产系统都有背景错误率、网络超时、第三方 API 问题、临时故障。理想情况下你会追踪并修复每一个错误,但当你想回答“我上次部署是否搞坏了什么”时,需要把变更引起的错误和已有的噪音分开。这一步就是做这个的。

首先,我收集过去 7 天的所有错误日志作为基线。这些日志被归一化成错误签名:用正则替换 UUID、时间戳和长数字字符串,然后截断到 200 字符,这样逻辑相同的错误即使具体细节不同也能归到同一组。

接着,我在部署后的 60 分钟窗口内轮询当前版本的错误,用同样的方式归一化。窗口关闭后,我得到了两个不同时间尺度的错误计数——一周的基线数据和一小时的部署后数据。虽然我可以简单比较这两个数字来判断最新变更是否引起了错误,但我想要更严谨的方法(顺便复习下概率分布 🙃)。

用泊松检验把关

泊松分布模拟事件在固定间隔内发生的次数,给定已知的平均速率(λ)和事件独立的假设:

我的观点是,任何生产系统总有背景错误率、网络超时、第三方 API 问题等。这些基线错误相当符合泊松模型。

使用 7 天基线,我估计每个错误签名每小时的预期错误率,然后缩放到 60 分钟部署后窗口。如果观测计数显著超过分布预测(p < 0.05),我就标记为潜在回归。对于基线中完全没有的全新错误签名,如果在监控窗口内反复出现,我也会标记。

但服务器错误并不总是独立的。流量高峰或 API 中断引起的相关故障可能违反独立性假设,单靠统计检验无法区分“这个错误飙升是因为我们的代码变更”和“这个错误飙升是因为第三方 API 挂了”。这就是分级智能体的作用。

分级智能体

与其直接把错误喂给 Open SWE(它倾向于做改动),我加了一层把关机制。上次提交的 diff 和具体错误会传给一个基于 Deep Agents 构建的分级智能体。

首先,分级智能体将每个变更文件分类为运行时、提示/配置、测试、文档或 CI。如果部署只涉及非运行时文件,几乎不可能引起错误。这防止了智能体可能从测试文件到生产 bug 编造因果链的误报。

对于运行时变更,智能体必须在 diff 中的特定行和观测到的错误之间建立具体的因果联系。

智能体返回结构化裁决,包含决策、置信度、推理过程以及归因于变更的错误签名。这种聚焦意味着 Open SWE 收到的是有针对性的调查提示,而不是所有飙升错误的垃圾堆。

用 Open SWE 闭环

一旦分级智能体批准调查,Open SWE 接手,处理 bug 并提交 PR。修复准备就绪时我会收到通知,所以从错误检测到修复建议的整个流程都无需人工干预。

到目前为止,它最有用的是捕获那些不严重崩溃的 bug:返回错误默认值的静默故障、代码和部署之间的配置不匹配,以及修复一个 bug 后在后续部署中暴露下一个的级联回归。

未来改进方向

扩大回溯窗口

分级智能体目前只查看当前和上次部署版本之间的 diff。早期部署引入但后来才浮现的 bug 不会被自动归因。扩大回溯范围是明显的解决方案,但喂给分级的 diff 越多,信号越嘈杂,越难精确定位因果联系。我还没找到合适的平衡点。

更智能的错误分组

当前方法通过清理错误消息中的 ID 和时间戳进行模糊匹配。花了一些时间才调好,可能仍有相关错误因清理逻辑限制而未能归组的情况。

我考虑的一个想法是将错误消息嵌入向量空间并聚类,而不是依赖正则归一化。意思相同的错误无论表面差异如何都会自然靠近,我们可以通过监控部署后新集群形成或现有集群增长来检测回归。挑战在于调整距离阈值,区分有意义的集群变化和正常方差。

另一个选择是用更小、更便宜的模型分类和分组错误,然后将这些结构化集群直接作为调查提示的一部分传给 Open SWE——让它更全面地了解什么在失败以及完整错误的样子。

Ramp 在让他们的 Sheets 产品自维护方面采取了有趣的方法。每次 PR 合并时,LLM 读取 diff 并生成针对变更代码的监控器,每个都有错误率飙升、延迟回归等的明确阈值。监控器触发时,webhook 将警报上下文直接传给智能体进行分级。预先定义有针对性的监控器能产生更清晰的信号,让下游智能体更容易诊断问题。

前向修复 vs 回滚

目前系统总是前向修复,Open SWE 处理 PR 时,有问题的部署仍在线运行。更智能的方法是根据严重性、错误率和分级置信度在两者间做决定。高严重性飙升但因果链置信度低的情况可能需要立即回滚,而有明确修复路径、归因清晰的 bug 则更适合前向推送补丁。

结语

我认为这种模式会在部署产品中越来越普遍。系统越能检测、分级和修复自身回归,你就能越快交付,工程师花在盯着仪表盘而不是构建上的时间就越少。

本文编译自 How My Agents Self-Heal in Production,版权归原作者所有。

觉得有用?分享给更多人

获取每周 AI 工具精选

工具推荐、实战教程和生态洞察,每周更新。

相关文章

Simon Willison 正在重构 LLM Python 库的抽象层,以支持服务器端工具执行等新功能。他利用 Claude Code 分析了四大 LLM 提供商的客户端库,生成了用于测试的 curl 命令和 JSON 输出。这些调研材料已开源,旨在帮助设计更通用的 API 抽象。

深度Simon Willison·4月5日·1 分钟

智能体技能——包含程序性知识和可执行资源的结构化包,供智能体在推理时动态加载——已成为增强 LLM 智能体的可靠机制。然而,推理时技能增强存在根本性限制:检索噪声引入无关指导,注入的技能内容带来大量 token 开销,而模型从未真正习得它所遵循的知识。我们提出一个问题:技能是否可以被内化到模型参数中,使其在无需任何运行时技能检索的情况下实现零样本自主行为?我们提出 Skill0,一个专为技能内化设计的上下文强化学习框架。Skill0 引入了一种训练时课程,从提供完整技能上下文开始,逐步撤除。技能按类别离线分组,并与交互历史一起渲染为紧凑的视觉上下文,教授模型工具调用和多轮任务完成。动态课程机制…

深度·4月5日·17 分钟

评论