
1. 从能跑到扛得住Agent 系统在 2026 上半年的分水岭如果你在 2025 年搭过一个能跑通工具调用的 Agent大概率会有一种错觉这东西好像也没那么难。一个循环、几个工具定义、一段系统提示词接上模型 API它就能查天气、读文件、发请求。Demo 阶段确实如此几十行代码就能让一个 Agent 活起来。但到了 2026 年上半年真正把 Agent 推到生产环境的人会发现问题根本不在能不能跑而在跑多久、跑多稳、跑多省。一个单轮任务成功率 90% 的 Agent放到需要连续调用 30 次工具的长链路里端到端成功率会掉到 4% 左右——这个数字不是危言耸听而是很多团队在压测时真实撞到的墙。于是整个上半年Agent 系统的技术迭代几乎都围绕同一件事展开把那个脆弱的 while 循环改造成一套可观测、可恢复、可计费的工程系统。这就是 harness 这个概念被反复提起的原因。很多人第一次听到 harness 会以为是某个具体框架的名字其实它更像一个角色定位包裹在模型外面的那层挽具负责上下文组装、工具调度、循环控制、状态持久化、错误恢复、成本核算。模型是马harness 是缰绳和马具。马再强壮没有合适的挽具你也没法让它拉车走长途。2026 上半年最明显的变化就是大家不再争论用哪个 Agent 框架而是开始认真设计自己的 harness 层。这篇文章不打算给你一个照着抄就能用的模板因为 Agent 系统的形态差异太大——有人做的是代码助手有人做的是客服机器人有人做的是自动化运维。我想做的是把这半年里反复出现的几个核心问题拆开讲清楚上下文到底该怎么管、记忆为什么不能只靠向量库、工具循环的终止条件怎么设计、并发上来之后哪里先崩、以及那些看起来不起眼但会让你半夜被叫起来的小坑。适合已经动手写过 Agent、正在往生产推、或者被长链路稳定性折磨过的同学。2. 上下文管理不是塞得越多越好而是该忘的必须忘2.1 上下文窗口变大之后反而更容易翻车2026 年上半年一个很反直觉的现象是模型上下文窗口从 128K 涨到 1M 甚至更多之后很多 Agent 的表现不升反降。原因不复杂——上下文越长噪声越多模型注意力被稀释得越厉害。你把整个对话历史、所有工具返回结果、全部检索文档一股脑塞进去模型确实看得到但它抓不住重点。我实测过一个典型场景一个需要读取 5 个文件、调用 3 次外部 API 的任务如果把所有中间结果原样保留到第 8 轮时模型开始重复调用已经成功过的工具因为它已经分不清哪些信息是当前有效的。把中间结果做摘要压缩后同样的任务成功率从 62% 提到了 89%。这个差距不是模型能力问题是上下文组织问题。所以上半年一个共识逐渐形成上下文管理不是装填问题而是调度问题。你需要决定在每一轮里哪些信息必须原文保留、哪些可以摘要、哪些应该直接丢弃。这背后是一套分层策略而不是一个简单的 truncate 函数。2.2 三层上下文结构系统层、任务层、瞬时层我在自己的项目里最终稳定下来的做法是把上下文分成三层每层的生命周期和压缩策略完全不同层级内容生命周期压缩策略系统层角色定义、工具说明、全局约束整个会话不变不压缩但要做精简任务层当前目标、已完成步骤摘要、关键中间结论随任务推进更新定期摘要保留结论丢弃过程瞬时层最近几轮原始对话、当前工具返回滚动窗口超窗口即摘要或丢弃系统层最容易被人忽视。很多人的系统提示词写了三千字里面一半是重复的约束和示例。实测下来系统提示词每多 500 字首轮响应延迟平均增加 8% 到 12%而且过长的系统提示会让模型对任务层指令的服从度下降。我的做法是把系统提示控制在 800 字以内工具说明用结构化 JSON Schema 而不是自然语言描述能省一大截。任务层是真正需要动脑筋的地方。我的经验是每完成一个子步骤就让模型自己输出一句当前结论然后把这句结论追加到任务层原始的工具返回结果只保留最近两轮。这样做的代价是多一次轻量模型调用但收益是长链路任务的成功率显著提升。你可以把这理解为给 Agent 做工作日志而不是让它记住每一句话。2.3 摘要不是万能药什么时候摘要反而有害这里要泼一盆冷水。摘要压缩不是无脑用就对的。我踩过一个坑在一个需要精确数值计算的任务里让模型对中间结果做摘要结果它把用户余额 12345.67 元摘要成了用户余额约 1.2 万元后续计算全错。涉及精确数值、ID、路径、代码片段的内容绝对不能摘要必须原文保留。所以我的策略是给上下文里的每一段打标签PRECISE精确不压缩、SUMMARY_OK可摘要、DISCARDABLE可丢弃。工具返回结果在进入上下文之前先由 harness 层根据工具类型打标签。比如文件读取返回的内容标记为SUMMARY_OK但数据库查询返回的主键标记为PRECISE。这个标签机制看起来笨但它把该不该压缩这个判断从模型手里拿回到了工程层稳定性提升非常明显。提示摘要压缩一定要用独立的、便宜的模型来做不要用主模型。主模型的上下文已经满了再让它做摘要等于在拥堵的路上再加一辆车。3. 记忆系统向量库解决不了我上次说到哪了3.1 长期记忆和短期记忆被混为一谈太久了2026 上半年关于 Agent 记忆的讨论里最大的混乱是把两件完全不同的事都叫记忆。一件是跨会话的长期知识——用户偏好、历史事实、领域知识这些适合用向量库做语义检索。另一件是单会话内的状态延续——我刚才让你改的那个文件改到哪了上一步的中间结果是什么这些根本不该进向量库它们是会话状态。我见过太多项目把会话状态也塞进向量库然后每次都要做一次语义检索才能知道当前进度延迟高不说检索还可能召回错误的旧状态。正确的做法是会话状态用结构化存储Redis、SQLite 都行按 session_id 直接读取零检索开销。向量库只负责那些可能在未来某个不相关时刻被想起的知识。这个区分听起来简单但它直接决定了你的 Agent 能不能支持断点续跑。用户关掉页面第二天回来Agent 要能接着上次的进度继续靠的是结构化状态不是向量检索。3.2 记忆的写入时机比检索策略更重要大部分人在优化记忆系统时精力都花在怎么检索得更准上但我的实测结论是写入时机错了检索再准也没用。常见的错误是每轮对话结束就把整段对话写入记忆库结果记忆库里全是噪声检索出来的东西又长又杂。我现在的做法是事件驱动写入只有当发生明确的状态变更时才写记忆。比如用户明确说以后都用中文回复我这是一个偏好事件写入长期记忆用户说这个项目的配置文件在 /etc/app/config.yaml这是一个事实事件写入项目记忆。普通的闲聊、中间推理过程一律不写。这样记忆库的条目数量能降一个数量级检索准确率反而上去了。还有一个细节记忆条目要带时间戳和衰减权重。有个同行分享过一个很实用的公式记忆得分 基础相关度 时间半衰期因子。意思是越久远的记忆在相关度相近的情况下排序越靠后。这符合直觉——用户三个月前的偏好可能已经变了。实现上不需要多复杂检索时给每条记忆算一个score * exp(-λ * age)就行λ 根据业务调整我一般取 0.01 到 0.05 之间。3.3 跨设备、跨账号的记忆迁移是个被低估的工程问题热词里有个问题特别真实一台电脑上的记忆配置怎么用到另一台电脑上。这背后是 Agent 记忆的可移植性问题。如果你的记忆存在本地文件里换台机器就丢了存在云端又要考虑账号体系和隐私边界。我的建议是记忆存储和 Agent 运行时解耦。记忆层做成一个独立的服务通过标准接口读写Agent 本身不关心记忆存在哪。这样换设备、换账号、甚至换 Agent 实现记忆都能平滑迁移。具体到实现记忆条目用 JSON 序列化包含namespace区分不同用户/项目、key、value、timestamp、ttl几个字段导出导入就是一次序列化操作。别小看这个设计它决定了你的 Agent 是一次性玩具还是能长期陪伴用户的工具。4. 工具循环终止条件设计不好Agent 会自己把自己绕死4.1 为什么模型说停就停是个危险的默认值最朴素的 Agent 循环是这样的模型输出工具调用 → 执行 → 结果回填 → 再问模型 → 直到模型不再调用工具。这个循环的终止完全依赖模型自觉。问题是模型经常不自觉。它会因为工具返回格式不符合预期而反复重试同一个调用会因为目标模糊而无限探索会在两个工具之间来回横跳。我统计过自己项目里失败的任务超过 40% 的失败是循环没有正常终止导致的而不是单步执行出错。所以 harness 层必须有一套独立的终止判据不能把控制权完全交给模型。这套判据至少包括最大轮次限制、连续重复调用检测、无进展检测、以及显式的完成信号。4.2 四道闸门让循环该停的时候一定停我在 harness 里设了四道闸门任何一道触发都会强制终止或改变循环行为第一道是硬轮次上限。这个最简单但数值要调。设太小复杂任务做不完设太大出问题时浪费 token。我的经验值是简单任务 10 轮中等任务 25 轮复杂任务 50 轮。超过上限不是直接失败而是让模型基于当前已有信息给出部分完成的结论这样至少能给用户一个交代。第二道是重复调用检测。维护一个最近 N 次工具调用的指纹列表工具名 参数哈希如果同一个指纹连续出现 3 次强制中断并让模型解释为什么重复。实测这一条能拦掉大部分卡死情况。第三道是无进展检测。每轮结束后评估距离目标是否更近了这个评估可以是一个轻量模型调用也可以是规则判断比如关键字段是否被填充。连续 3 轮无进展就触发反思让模型换策略而不是继续硬刚。第四道是显式完成信号。要求模型在认为任务完成时必须调用一个特殊的finish工具并给出结论而不是靠不再调用工具来隐式表示完成。这个改动看起来小但它让完成变成了一个可观测、可校验的事件。4.3 工具返回结果的格式化决定了循环的稳定性工具返回给模型的内容格式直接影响模型下一步的判断。我见过最坑的做法是把原始 HTTP 响应整个 JSON 塞回去几百行嵌套结构模型根本抓不住重点。正确的做法是在 harness 层做结果归一化成功就返回关键字段失败就返回错误类型和可操作的建议。比如一个查询订单的工具失败时不要返回{code: 500, message: internal error, trace_id: ...}而是返回{status: failed, reason: 订单服务暂时不可用, suggestion: 可以稍后重试或改用订单号精确查询。后者让模型知道下一步该干嘛前者只会让它一脸茫然地重试。注意工具返回里绝对不要包含大段无关的日志或堆栈。模型不是日志分析器塞进去只会污染上下文。需要排查的问题让 harness 记到自己的日志里别往模型嘴里塞。5. 并发与成本Agent 扛并发的瓶颈往往不在模型5.1 先搞清楚你的瓶颈在哪一层AI Agent 怎么扛并发是上半年被问得最多的问题之一。但很多人一上来就想着加机器、换更快的模型其实方向错了。Agent 系统的并发瓶颈通常出现在三个地方而且顺序往往是固定的第一个瓶颈是工具调用的外部依赖。你的 Agent 要调数据库、调第三方 API、读写文件这些操作的延迟和限流才是真正的天花板。模型推理再快工具调用卡住整个链路就卡住。我做过一个压测单 Agent 实例在工具调用平均延迟 200ms 的情况下QPS 上不去 5。第二个瓶颈是上下文组装的开销。每轮都要重新拼装上下文、做摘要、算 token 数这些 CPU 操作在并发高的时候会变成瓶颈。特别是摘要压缩如果用同步调用会直接阻塞整个循环。第三个瓶颈才是模型推理本身。而且现在大部分模型 API 都支持并发这一层反而相对好扩展。5.2 异步化 连接池比堆机器管用我的做法是把整个 Agent 循环改成全异步。工具调用、摘要压缩、记忆读写全部走 async循环本身不阻塞。这样单个 Agent 实例在等待工具返回的时候可以处理其他会话的请求。配合连接池管理外部依赖实测同样的硬件QPS 能提升 3 到 5 倍。具体到实现Python 里用asyncioaiohttpNode 里用原生 PromiseGo 里用 goroutine。关键是不要在异步链路里混入同步阻塞调用一个同步的数据库查询就能把整个事件循环拖垮。这个坑我踩过排查了半天才发现是一个日志写入用了同步文件 IO。5.3 成本控制别让 Agent 在后台偷偷烧钱并发上来之后成本会以你意想不到的速度增长。一个失控的循环可能在一分钟内烧掉几十次模型调用。所以 harness 层必须有成本预算机制每个会话、每个任务、每天都有 token 预算超了就降级或终止。我的做法是给每个任务设一个 token 上限循环每轮结束后累加消耗接近上限时给模型发一个预算告警让它优先完成核心目标。这个机制救过我好几次——有一次一个 Agent 因为工具返回格式问题陷入重试预算告警触发后它主动放弃了那个工具改用备选方案完成了任务。另外不同环节用不同档位的模型也是省钱的关键。意图识别、摘要压缩、结果评估这些环节用便宜的小模型完全够用只有核心推理才需要大模型。我粗略算过这样分层之后整体成本能降 40% 以上而任务成功率几乎没变化。6. 那些让你半夜被叫起来的小坑6.1 工具调用的幂等性比你想的重要Agent 重试是常态但很多工具不是幂等的。一个创建订单的工具重试一次就多一个订单。一个发送通知的工具重试一次用户就收到两条。这类问题在 Demo 阶段看不出来上了生产就是事故。我的做法是所有有副作用的工具都必须支持幂等键。harness 在调用工具时生成一个唯一 ID工具端根据这个 ID 去重。如果工具是第三方提供的、不支持幂等那就在 harness 层做去重记录最近调用过的工具名 参数组合短时间内重复的直接返回缓存结果。这个缓存不需要持久化内存里存几分钟就够。6.2 上下文里的隐形字符会毁掉工具调用这个坑极其隐蔽。有时候工具返回的内容里带了不可见字符比如零宽空格、BOM模型在生成下一次工具调用时参数里会莫名其妙带上这些字符导致调用失败。排查的时候你看日志觉得参数完全正确但就是匹配不上。解决办法是在 harness 层对工具返回内容做一次清洗去掉所有非打印字符。一行正则的事但能省掉你几个小时的排查。我现在所有进入上下文的内容都会过一遍re.sub(r[\x00-\x1f\x7f-\x9f\u200b-\u200f\ufeff], , text)养成习惯之后就没再遇到过这类问题。6.3 模型假装调用了工具还有一种情况模型在回复里写了一段看起来像工具调用的文本但实际上没有真正触发调用。这在用自然语言描述工具的场景里特别常见。用户看到 Agent 说我已经帮你查了天气但其实它根本没调工具天气是编的。根治办法是用结构化工具调用function calling / tool use而不是让模型输出文本再解析。如果模型不支持结构化调用那就在 harness 层做严格校验任何声称已完成某操作的回复都必须有对应的工具调用记录没有就判定为幻觉强制重新执行。这个校验逻辑不复杂但能拦掉大量一本正经胡说八道的情况。6.4 日志和可观测性是 Agent 系统的生命线最后说一个最不性感但最重要的点可观测性。Agent 系统出问题时你面对的是一个黑盒——模型为什么这么决策、上下文里到底有什么、工具返回了什么全靠日志。如果日志不全排查就是盲人摸象。我的做法是每一轮循环都记录完整快照输入上下文脱敏后、模型原始输出、工具调用参数、工具返回、耗时、token 消耗。这些日志按 session_id 和 turn_id 组织出问题时能完整回放。存储上不用太讲究JSON 行格式写文件就行需要查询的时候再导入分析工具。有了这套日志大部分问题都能在几分钟内定位而不是靠猜。7. 我对这半年迭代的一点个人体会回头看 2026 上半年Agent 系统最大的进步不是模型变强了而是工程层终于开始认真对待可靠性这件事。harness 从一个模糊的概念变成了大家愿意花时间设计的核心模块。上下文管理、记忆分层、循环终止、并发控制、成本预算这些听起来不酷的东西才是决定一个 Agent 能不能上生产的关键。我自己最大的转变是不再追求让模型做更多决策而是把能确定的判断都收到工程层。什么时候压缩上下文、什么时候写记忆、什么时候终止循环、什么时候降级这些都不该交给模型临场发挥。模型负责它擅长的——理解意图、生成内容、做模糊判断harness 负责它擅长的——状态管理、边界控制、资源调度。分工清楚了系统才稳。如果你现在正在搭 Agent我的建议是先把 harness 层的骨架搭好哪怕功能少一点。一个只有三个工具但循环稳定、日志完整、成本可控的 Agent比一个有三十个工具但动不动卡死的 Agent 有价值得多。工具可以慢慢加但地基没打好后面每加一个功能都是在给自己挖坑。