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

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 则更适合前向推送补丁。
结语
我认为这种模式会在部署产品中越来越普遍。系统越能检测、分级和修复自身回归,你就能越快交付,工程师花在盯着仪表盘而不是构建上的时间就越少。
觉得有用?分享给更多人