ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Harness容错与恢复设计:从故障预防到上下文修复的完整指南

Harness容错与恢复设计:从故障预防到上下文修复的完整指南 1. 为什么要单独把容错与恢复拎出来讲做 Agent 系统的人应该都有同感一个 demo 级的 Code Agent 跑通并不难难的是让它长时间、稳定地在真实环境里干活。而一旦 Agent 从在受控环境里跑个示例进入到让 Harness 去执行真实任务最先崩溃的往往不是大模型不是工具 API而是整体流程的韧性——最典型的表现就是Agent 卡在某个步骤里反复重试或者一次小异常直接让整条执行链路报废几小时的会话功亏一篑。在继续这个系列之前我在前面几篇已经拆过 Harness 的上下文管理、规划循环和工具调用框架。当时评论区有位朋友问了一句特别实际的话Harness 怎么保证不把自己搞崩溃这个问题的答案就是这次要展开的容错与恢复设计。需要先说明一点容错不等于堆 try-catch。尤其在 Harness 这类作为执行骨架的组件里容错的对象不只是代码异常还包括模型输出格式漂移、工具返回超时、前置任务失败、上下文被污染、用户中途改需求等一连串非代码层面的故障。也就是说Harness 面对的容错压力比传统后端服务要高一个维度它不仅要在进程级别不崩溃还要在执行逻辑层面保证即使某个环节出错了整条任务链依然能继续推进或体面地停止。这篇不打算泛泛而谈高可用故障转移这些宏大概念。我想聚焦在 Harness 这个特定场景里把真正值得投入精力的容错设计拆成四层故障预防、预算熔断、策略化恢复、上下文修复。每一层都会结合我实际搭建和反复踩坑的经验来讲包括具体怎么设计、参数怎么定、哪里容易想当然。这篇文章适合已经对 Code Agent 有一定了解、正在思考怎么让 Agent 更抗造的开发者。如果你是第一次接触 Harness 的概念建议先看完本系列前面几篇再回来否则直接看容错细节会有点跳。2. 从故障谱系开始先搞清楚 Harness 到底在防什么谈容错设计之前必须先建立一份清晰的故障谱系。我在设计 Harness 容错方案时第一件事不是写代码而是把所有已经遇到过的、能想象到的失败场景全部列出来然后按来源分类。这个动作的价值在于每一类故障的应对手段完全不同混在一起处理必然顾此失彼。2.1 Harness 执行链路中的四类典型故障来源我在生产环境里实际跑过的 Agent 任务故障来源基本逃不出下面四类第一类工具层故障。这是最容易被预判到的一类——工具抛异常、返回非预期结构、执行超时、被外部服务限流。比如 Agent 调了一个代码搜索工具结果那个服务恰好返回 500或者执行 shell 命令时因为权限问题直接 Permission denied。这类故障的特点是比较显性只要在工具调用边界做了异常捕获基本能兜住。第二类模型层故障。这一类隐蔽得多。大模型返回的格式不合法在稳定版模型上已经不常见但在长上下文中模型经常出现逐步偏离指令规范的行为。典型的例子是用户明确要求工具返回结果必须是一个 JSON 对象前 20 轮 Agent 都遵守了到第 47 轮突然直接输出一段自然语言描述没有包 JSON 标记。这是 Harness 最需要防的故障之一——模型的行为漂移。严格说这不是报错但危害和报错一样大因为 Harness 一旦无法解析模型输出整个循环就会停摆。第三类外部环境故障。包括网络闪断、依赖下载超时、上游 API 限流、文件系统权限变化、环境变量缺失等。外部环境的诡异之处在于你无法在代码层面修复它只能通过重试、降级、旁路等策略规避。处理这类故障核心不是消灭异常而是降低故障半径。第四类上下文完整性故障。这一类是 Harness 架构专属的问题传统后端开发几乎不会遇到。在执行长任务时Harness 维护的世界状态World Model可能因为信息冲突、关键日志被剪掉、记忆覆盖策略过于激进而变得不可信。比如 Agent 以为文件已经写好了实际上写入操作被工具层静默失败了或者用户已经改了需求Harness 还按旧目标在跑。这类故障最危险——不报错但每一步的决策都建立在错误的前提上。2.2 按可恢复性给故障分优先级我列完这份清单后的第二个动作是给故障分优先级——不是按发生频率而是按可恢复性。这是我后来处理故障时最重要的判断依据。高可恢复性的故障工具一次调用超时、网络瞬断、模型一次输出不合规。这类故障重试一次就能过不需要改变整体执行策略处置成本最低。中等可恢复性的故障连续多次工具调用失败可能依赖服务挂了、模型反复输出同一格式错误行为漂移的前兆、部分工具结果可用但另一些失败。这类故障需要切换到替代策略比如换一个等价的工具查同一份数据。低可恢复性的故障上下文已经被污染关键信息丢了、用户的最终目标发生变化、执行路径依赖的某个外部服务被完全移除。这类故障重试也没用必须停下来重新规划。把这个优先级表画出来之后容错设计的目标就非常清楚了把高可恢复性故障用最小成本兜住避免它们升级成中等或低可恢复性故障对中等可恢复性故障提供策略切换对低可恢复性故障做体面的降级与终止。Harness 里所有容错组件本质上都是为这三层目标服务的。提示如果你正在设计自己的 Harness我强烈建议先花一小时做故障谱系整理再动手写代码。直接上手写重试逻辑很容易把方案做成一把梭式的全链路重试最终该失败的还是失败不该重试的反倒被无限重试拖垮。3. 故障预防在容错之前先想办法不让错发生容错的下限是出了错能扛住上限是让错根本没机会发生。在 Harness 里绝大多数故障其实是可以靠设计规避的。这里讲三个我认为投入产出比最高的预防手段。3.1 工具契约校验把故障拦截在模型输出之外之前提到模型行为漂移一个很有效的预防手段是给每个工具定义严格的契约文件。所谓契约就是对这个工具的输入输出做结构化定义包括参数类型、必填字段、取值范围、输出格式模板。Harness 在拿到模型生成的工具调用请求时不直接执行而是先通过校验层跑一遍契约检查。这看起来多了一层开销但价值极大。工具执行前发现问题成本只是拒绝一次调用并生成修正反馈工具执行到一半才发现传参不合法成本是回滚部分副作用重试补偿工具全执行完了才发现结果不是预期格式成本就变成上下文已经混入脏数据了。三者代价天差地别。具体做法上我给每个工具写一份 JSON Schema 描述文件Harness 启动时加载到校验模块。模型每产出一个工具调用意图校验模块先验证参数结构、必填字段、枚举值是否合法。校验不通过则直接进入修正循环把校验失败的具体原因反馈给模型请它重新生成调用请求。从实际效果看这个简单的防御动作能拦截掉大约 70% 的看似能跑实际上必挂的调用——尤其是文件路径写错、必填参数遗漏这一类低级错误。3.2 预检与前置条件探测把外部环境故障提前暴露外部环境故障里有一类非常讨厌不是运行时崩溃而是前置条件不满足Agent 跑了一半才发现。比如 Mission 需要访问某个 API但环境变量里没有配 API Key——如果 Harness 不做前置检查Agent 会在执行到那一步时才发现问题然后触发一整轮的排查和降级浪费时间不说还可能把已执行步骤的结果污染。我的做法是在 Harness 的规划阶段结束后、进入执行阶段前插入一个轻量的预检步骤扫描当前 Mission 涉及的所有外部资源检查凭据是否存在、服务地址是否可达、依赖文件是否就位。预检不是深度测试而是快速探测每个项目最多几千毫秒把所有一眼就能发现的缺失暴露出来。这个设计最初我并没有意识到它的价值直到有一次跑一个涉及数据库迁移的 Agent 任务预检发现目标库连接串配的是测试环境地址。如果在执行阶段才暴露Agent 大概率会在错误的库上执行迁移——那可比超时、报错严重得多。现在预检已经是我所有 Harness Mission 的标配环节。3.3 模型行为约束用指令与模板减少漂移空间模型输出格式的漂移不可能彻底消除但可以通过约束显著降低概率。我在 Harness 的提示词体系里做了两点约束第一每次调用大模型时输出格式规范不是放在大段提示词中间而是单独抽成一个 Fixed Instruction Block固定在上下文的首部。这个块里用极简的 BNF 式语法描述工具调用的输出格式不给模型自由发挥的余地。第二在 Harness 内部的最近一轮输出记忆区里始终保留上一次工具的调用示例作为 Few-shot 参考放在模型需要生成调用请求的位置之前。模型在生成当前响应时旁边就有一个照着写的样例漂移概率会明显下降。这两招不能做到 100% 规整但配合前面说的契约校验可以把模型层故障的实际影响降到非常低——即便模型偶尔写歪了Harness 也能在校验层就发现问题并进入修正循环而不是让错误一路传导到工具执行层。4. 预算熔断当费用、轮次或耗时失控时强制叫停容错设计里最容易忽略的一块是限制系统能造成的最大损失。Agent 一旦跑起来就是一个自主行动的进程——它会持续调用工具、消耗 token、占用执行时间。如果没有止损机制一次错误的任务规划可能让用户在毫无察觉的情况下烧掉一大笔费用或浪费数小时。4.1 多维预算不只是限制 tokens我做预算熔断时定义了四个独立的预算维度Token 预算这是最直观的。每轮模型调用消耗的 token 会累积尤其当上下文很长时单轮消耗可能非常惊人。我给每个 Mission 设了一个硬上限超过即终止避免上下文越长、每轮越贵、任务越无限循环的死亡螺旋。步骤预算限制 Agent 最多能执行多少轮推理-调用工具-观察结果的循环。我通常在 30~50 之间取值具体看任务复杂度。步骤预算的真正作用是阻断无限修正循环——模型在处理某个工具报错时可能陷入尝试-失败-再尝试的重复步骤预算保证这个循环最多持续 N 轮。耗时预算墙上时钟时间超限即终止。这个维度经常被忽略但很重要比如用户只希望 Agent 在一个小时内完成代码审查结果它跑了三个小时——即使 token 没超限、步骤没超限从用户视角看依然是灾难。费用预算通过 token 数折算成成本设置一个金额上限。这个维度在企业场景特别敏感因为最终为失控执行买单的是钱。4.2 软熔断与硬熔断分级处置而非一刀切预算耗尽后不是直接杀死进程就完事了。我做了两级熔断软熔断当预算消耗达到阈值的 80% 时触发Harness 停止向模型发起新的探索性行动比如再搜索一下相关资料这类非必要调用强制切换到收尾模式——只允许模型执行能直接推动 Mission 完成的任务并提示模型尽快收敛。软熔断阶段模型仍可正常推理但不能无限延展探索范围。硬熔断达到 100% 时立即终止所有工具调用和模型生成回到执行状态归集流程。硬熔断触发后Harness 会把当前已经执行的步骤、已获得的部分结果、未完成的目标整理成一份完整的中断报告而不是让执行痕迹散落在日志里。长期跑下来预算熔断最大的价值不在于省钱——那只是表面收益。真正的价值在于给整个系统定义了失败成本的上限这让 Harness 更适合无人值守的长时任务你可以放心地把一个需要跑半小时的 Agent 任务挂后台而不必担心它因为某个 bug 变成天价账单生成器。提示预算熔断的阈值不是拍脑袋定的而是从真实任务样本里统计出来的。初期可以先跑一批已知任务统计 token 消耗和步骤数的 P85 值85%的任务都低于该值把预算上限设为 P85 的 1.5~2 倍。留出余量是为了避免正常波动触发误杀但要坚决拒绝怕超就调大的惰性思维——预算熔断的边界越模糊它的存在感就越低。5. 策略化恢复错误发生之后是重试、换路还是回退故障预防做得再好也不可能消灭所有错误。真正的容错核心在于错误发生后怎么办。我的经验是恢复策略必须按场景分类而不是用一个万能的重试机制去硬扛。5.1 适配四类故障的恢复方案针对前面整理的故障谱系我在 Harness 里设计了四类恢复策略瞬时故障 —— 有限重试。网络闪断、服务限流、工具超时这类瞬时故障直接重试往往能解决。关键是重试要有节奏我采用指数退避Exponential Backoff 抖动Jitter策略初始间隔 1 秒每次翻倍封顶 30 秒。抖动是为了避免多个 Agent 实例同时重试同一服务导致惊群效应。重试次数不是无限我通常设 3~5 次上限。持续故障 —— 替代路径。当同一个工具连续重试 3 次还是失败基本可以判定这不是闪断而是这个工具/服务当前不可用。此时恢复策略从重试切换到找别的路——比如代码搜索工具挂了换用 grep 类命令HTTP API 超时改用对应的 SDK 本地实现。替代路径的前提是 Harness 在注册工具时就为每个高危工具登记了可替换的兄弟工具并按优先级排序。状态损坏 —— 回退检查点。如果错误发生在执行链路的中间而且当前步骤对外部环境产生了副作用写文件、改配置、发请求简单重试可能造成重复副作用。这时需要回退到上一个干净检查点从那个状态重新规划执行路径。回退检查点的设计细节会在下一节展开这里先提一句检查点是一个完整的任务状态快照不是简单的步骤序号。目标失效 —— 终止与上报。如果错误导致任务前置条件永远无法满足比如用户要分析的数据源整个被删了任何重试和替代路径都没有意义。这时需要的是体面终止Harness 输出一份清晰的失败报告说明为什么无法继续、尝试过哪些路径、还缺什么信息最后回到初始状态等待用户重新指示。5.2 动态失败处理让模型参与恢复决策前面四种恢复策略都是规则驱动的——预设条件、预设动作。但真实场景里还有一类情况规则覆盖不到错误信息模棱两可既不像瞬时故障也不像持续故障。比如工具返回了一长串日志其中有一个 ERROR 关键字但从日志看任务其实已经成功了。遇到这种可读但难判定的失败我会把错误上下文工具返回值前 50 行、退出码、已执行操作列表打包塞给模型请求它做一次失败分类并把分类结果映射到上述四类恢复策略之一。模型不需要重新规划整个任务只需要回答一个问题基于这些信息你觉得这个错误属于哪一类应该重试、换路、回退还是终止我一开始对这种让模型判断错误类型的做法存疑但实测下来效果比预期好。原因也简单大模型的日志模式识别能力远强于规则匹配。人能看出来Permission denied 意味着什么、Timeout 在什么语境下是暂时的模型同样能只需要给它足够清晰的分类提示词。当然模型判断出错的情况也存在所以 Harness 层保留了最终否决权——如果模型选择的恢复策略在执行中再次失败就降级为规则策略兜底。5.3 恢复策略里的优先级和快速失败设计在恢复策略的执行顺序上我定义了明确的优先级有限重试 替代路径 回退检查点 终止上报。这个顺序不是按成功概率排的而是按恢复成本排的——成本从低到高。低成本的策略失败后升到高成本的策略不会跳跃。与此配套的是快速失败原则不要在低层策略上反复消耗时间。比如一个工具明明已经连续失败 4 次如果重试上限是 5 次就绝不上 10 次——你该做的是快速切换到替代路径而不是在一条确定走不通的路上多试一次。快速失败意味着把时间让给更有希望成功的策略这是我在实战中总结的效率铁律。注意恢复策略的重试上限必须区分幂等和非幂等操作。对于幂等操作查询、只读分析可以放心重试对于非幂等操作写入、删除、转账重试前必须确认上一次调用是否已生效。如果无法确认宁可走人工确认分支也不盲目重试否则同样的副作用会被执行两遍。6. 上下文修复让 Agent 在出错后依然保持清醒这部分是我认为整个容错设计里最核心、也最容易被忽视的环节。很多 Harness 的设计者处理完工具层异常、重试策略、预算熔断就觉得容错做完了——但真正让 Agent 任务从撑住不崩变成恢复后还能高质量完成的是上下文层的修复能力。6.1 上下文污染比工具报错更危险我给上下文污染的定义是Agent 依据的世界模型信息与真实世界状态不一致但 Agent 自己没有感知到。最典型的案例是Harness 在某一步调用了写入文件工具工具层执行失败被重试机制拦住了但重试前 Harness 并没有把这次写入未确认的标记写入上下文。模型在下一轮规划时就会以为文件已经写好了于是接下来的所有决策都建立在幻象之上。上下文污染不报错但会悄悄侵蚀任务质量。你会看到 Agent 在后面的步骤里正常执行、正常回复但你最终会发现产出的文件根本不存在或者代码逻辑里引用了从未创建过的变量。这种故障是最难排查的——因为它不在任何错误日志里。6.2 执行日志压缩与关键状态摘要我当前使用的修复方案是给 Harness 增加一个执行日志摘要器在每轮工具调用结束后执行保留本轮调用的操作类型、目标对象、返回码、关键输出片段作为结构化执行记录对超过长度阈值的工具原始输出执行摘要缩到 200~300 字以内标注本轮操作是否已确认成功已确认失败未确认结果未知三类状态将摘要结果写入上下文的执行状态区同时把旧轮次的原始日志挪进可回收的滚动区避免上下文膨胀。这套机制解决了两个问题一是压住了上下文长度长任务的上下文不会线性膨胀二是建立了一个操作状态表模型每轮决策前可以先看一眼这个表确认当前世界状态里哪些操作是实打实成功的、哪些还是悬空的。这是对抗上下文污染的基础设施。6.3 世界模型回摆从继续执行转向重新校准上下文出现偏差之后最难的决策是继续还是停止。我的经验是一旦检测到关键状态的不确定性Harness 应该进入重新校准模式——不再继续推进任务而是先向模型提供当前已确认状态的全部摘要并明确要求模型回答三个问题基于当前可确认的状态任务还差几步可以完成之前哪些步骤的前提条件可能已经失效如果要继续应该从哪一个环节开始重做这个过程我称它为世界模型回摆——就像开车时发现导航地图和实际路况对不上了最优策略不是继续闷头开而是先停到路边重新定位再规划新路线。世界模型回摆的实际价值在下一条会细说。这里先给结论它是整个容错体系里唯一能修复低可恢复性故障的机制。前面说的重试和换路都是绕开错误只有回摆能修正 Agent 对世界的认知——而认知修正之后策略失误带来的连锁错误才会被切断。6.4 检查点快照故障恢复的存档点检查点机制是上下文修复的载体。我在 Harness 里把任务的完整状态快照定义为以下四件套任务状态文件当前目标、已完成的子任务列表、进行中但未确认的任务、待办队列执行状态表每步工具的调用参数、返回摘要、确认状态成功/失败/未知决策轨迹摘要最近 N 轮的关键决策及其理由方便回摆时理解为什么走到了这一步环境快照当前工作目录、关键文件列表、临时文件位置、环境变量状态。快照的保存时机不是固定时间间隔而是在关键副作用操作前自动存档——比如写文件前、发请求前、执行破坏性命令前。这样一旦后续出错回退的粒度不会太粗。我在长任务中实测的效果是加了检查点快照之后一次典型的中途故障恢复时间从完全从头跑的小时级降到从最近确认状态继续的分钟级。而且因为上下文里的信息始终以最近一次快照为准模型不会被历史上已经失败的操作干扰决策质量明显提升。7. 真实故障复盘一次上下文污染引发的完整恢复链路说再多设计理念不如看一次真实故障的处理过程。这里复盘一个我印象很深的案例它能非常清晰地展示容错与恢复各层机制是如何串联运作的。7.1 故障现场一个看起来正常但实际全错的任务有一次我让 Agent 执行一个复杂的代码迁移任务把一个旧 Java 项目的核心模块迁移到新框架涉及十几个文件的读写和编译验证。任务跑到第 23 步时Agent 调用了文件替换工具返回码为 0看起来执行成功。但实际那次操作因为目标文件被进程锁定替换并没有生效——这是文件替换工具的一个隐藏 bug它在文件被锁定时会静默失败只写日志不抛错。问题在于Harness 当时的工具契约校验只检查返回码是否为 0没有校验目标文件的内容是否真的变成了预期值。于是这轮操作被标记为成功后续步骤全部基于文件已替换这个错误前提继续执行。Agent 在第 28 步开始编译验证发现编译错误它判断是新框架代码本身有 bug开始尝试修复代码——但实际上错误是旧代码没被替换导致的。从第 28 步到第 40 步Agent 一直在错误前提上做看似合理的修复。你从日志看每一步都是正常执行、正常得出结论但整体已经在错误道路上狂奔了。这就是上下文污染的典型形态不是系统崩了是系统在用一个错误的世界模型指导行动。7.2 触发恢复检查点检查发现未确认状态这个故障之所以没有造成不可挽回的后果是因为检查点机制在发挥作用。Harness 在每个检查点存档时除了执行状态表还会对关键副作用操作做一次确认型探测——检查目标文件的修改时间、内容哈希、文件大小三个指标是否与预期一致。在第 23 步的检查点保存后确认型探测发现目标文件的内容哈希与预期替换版本不一致。Harness 立刻把第 23 步的状态从已确认成功改为未确认结果未知并触发了世界模型回摆模式。模型拿到更新后的执行状态表后很快就定位到文件替换结果存疑这个关键偏差。在重新校准阶段模型没有继续推进任务而是先请求重新执行一次文件替换并且这次替换前主动关闭了锁定文件的进程。7.3 恢复链路是如何串联的一次完整的故障处置复盘回看整个处理过程各层机制是这样协作的故障没有在发生时被预防层拦住工具契约校验只校验了返回码但它被检查点探测发现了避免了污染扩大。预算熔断没有发挥作用——因为故障本身不涉及超时和超限。真正起作用的是从检查点触发、世界模型回摆定位、到重新执行修复的完整链路。这次复盘让我后来做了一个重要改进所有涉及写操作的工具都在 Harness 层增加后置验证步骤。工具返回码为 0 只是第一个条件更可靠的是验证目标对象的实际状态——文件写完了就验证文件内容配置改了就验证配置是否加载请求发出去了就验证响应是否符合预期。这个后置验证把很多静默失败变成了显性失败让错误在发生的当下就能被感知到而不是等它污染到后续步骤才被发现。7.4 教训总结容错设计的边界在哪里这个案例最值得反思的不是工具返回码校验不够而是容错设计的边界感任何一层容错机制都不可能覆盖所有故障场景但它们协作起来的收益远大于单点的堆叠。预防层挡掉了 70% 的低级错误契约校验挡掉了大部分格式漂移预算熔断限制了失控的损失而上下文修复与检查点则负责兜住最隐蔽、最难防的那部分污染。说得更直白一点容错设计的目标不是做到永不犯错而是做到每条错误路径都有对应的纠正机制。当错误最终无法被纠正时系统要能做到有尊严地停止——不是留下一堆半成品和脏状态而是把已知信息、已做操作、未完成项、失败原因完整保留下来交给用户决策。8. Harness 容错体系里那些拿不到台面上说但非常有用的经验最后分享几个在实战中摸出来的细节。它们看起来很小但往往能决定你的容错方案是看着合理还是真正好用。第一重试时务必保留上一次错误的完整堆栈。这不是废话——很多重试机制只记录了错误类型和错误信息但没记录触发错误的具体输入参数。一旦要诊断为什么重试也失败缺失的那部分信息就是致命的。我在 Harness 的错误对象里固定保留了触发错误时的完整工具调用参数 环境快照这让事后排障的效率提升了不止一个量级。第二给所有恢复动作加恢复痕迹。Harness 在恢复时会在上下文里明确写入一条结构化记录第 23 步被标记为未确认原因为文件哈希不匹配已触发重新执行。这条痕迹能让模型在后续决策时感知到当前状态是恢复后的状态而不是一直在顺畅执行的状态——避免模型因为缺少历史上下文而做出与恢复动作冲突的决策。第三预算熔断的阈值不要做成全局静态值。不同任务的 token 消耗特征差异极大一个简单的代码格式化任务可能 2 万 token 就够一个跨仓库重构可能需要 30 万。按任务类型维护一组熔断参数比一个全局值要合理得多。我是按照任务类别代码审查/构建执行/静态分析/多文件编辑分别统计基线然后为每类单独设置熔断阈值。第四日志分级要能让容错动作一目了然。我在 Harness 的日志体系里给容错相关操作打了独立标签比如[RECOVERY]、[RETRY-ATTEMPT]、[CONTEXT-REPAIR]、[BUDGET-LIMIT]。排障时直接 grep 这些标签就能在几秒钟内看到这轮任务经历了哪些故障处置。没有这些标签你要从密密麻麻的执行日志里徒手扒出恢复链路那才是真的灾难。第五也是我个人感受最深的容错设计永远不要在理想环境里验证。只跑正常路径的 Demo重试逻辑再完美也体现不出价值。真正的验证方式是故障注入——人为地把工具返回改为超时、故意让模型输出坏格式、模拟外部服务限流然后观察 Harness 是否按预期走完恢复链路。搭一套故障注入测试脚本虽然麻烦但它能帮你把容错体系里的盲区一个个挖出来这个收益怎么强调都不为过。关于 Harness 的容错与恢复到这里就拆完了一层。每次做完一次故障复盘我都会对稳定这个词有新的理解在 Agent 系统里稳定不是永远不出错而是每次出错都有对应的回应、每条恢复路径都能被验证。这种理解不是从文档里读来的是看着一长串失败日志、反复调整恢复策略之后才真正沉淀下来的。
返回列表