简介:本文围绕 Agent 架构中的控制流、上下文工程、工具设计与多 Agent 组织等关键维度展开对比分析,揭示为何 Harness 与验证测试质量对成功率的影响往往大于模型成本本身。读者将理解不同工程方案的适用边界、选型依据与迁移注意事项,并获得可落地的调优思路。
在 Agent 系统的工程实践中,团队常常面临一组看似简单、实则影响深远的选择:控制流应该内嵌于循环体,还是外化到文件与数据库?工具设计应该追求大而全,还是小而精?多 Agent 组织是必要的分工,还是过度设计?这些问题没有唯一答案,但不同选择带来的工程后果差异巨大。本文围绕 Agent 架构中的几组关键对比展开分析,帮助开发者在实际项目中做出更有依据的判断。
在早期的 Agent 实践中,一种常见的思路是:把尽可能多的能力塞进主循环,用更复杂的条件分支处理各种异常,用更贵的模型兜底所有不确定性。但随着系统从 Demo 走向生产,很多团队发现,真正决定成功率的往往不是模型参数规模,而是外围工程结构——也就是常说的 Harness(脚手架层)与验证测试质量。
一个值得注意的观察是:更贵的模型带来的提升,很多时候没有想象中那么大。相反,验证测试是否充分、工具描述是否准确、上下文组织是否清晰,对最终效果的影响更为直接。这促使我们重新对比几种主流的架构取向。
本文对比两组核心取向:
对象 A:厚循环架构——把状态管理、分支逻辑、子 Agent 调度、上下文压缩等能力尽量集中到主循环内部,循环体随着功能增加不断膨胀,逐渐演变为一个大型状态机。
对象 B:薄循环 + 外置状态架构——主循环保持极简,新增能力通过扩展工具集与 handler、调整系统提示结构、把状态外化到文件或数据库三种方式接入,循环体本身几乎不变。
这两类取向在控制流设计、上下文工程、工具设计和多 Agent 组织上会呈现出系统性差异。
无论选择哪种取向,以下几项基础逻辑是共通的:
从最小实现看,一个 Agent Loop 的抽象逻辑其实不到 20 行代码:
messages = [{ role: "user", content: userInput }]while (true) {response = model.create({ tools, messages })if (response.stop_reason == "tool_use") {results = 并行执行所有 tool_use 并收集结果messages.push(assistant 消息)messages.push(tool_result 消息)} else {return response 中的纯文本}}
这段结构在大量实现中高度稳定,从最小版本一路扩展到支持子 Agent、上下文压缩和技能加载,主循环本身基本没有变化。
薄循环架构的关键分工是:模型负责推理,外部系统负责状态和边界。一旦这个分工确定,核心循环逻辑就很少需要频繁调整。新能力通常叠加在循环外部,而不是改动循环内部。
厚循环架构则倾向于把状态判断写进循环,短期看似直观,长期会导致循环体变成一个巨大的状态机,分支组合爆炸,调试困难。
在调试 Agent 行为时,一个被反复验证的经验是:应优先检查工具定义,因为多数工具选择错误都出在描述不准确。工具描述是模型理解能力边界的唯一入口,描述模糊会直接导致误选。
对比来看:
上下文工程关注的是:哪些信息进入模型窗口、以什么顺序进入、何时压缩。薄循环架构通常把上下文组织外置为可配置结构,便于独立调整;厚循环架构则容易把上下文拼装逻辑散落在循环各处,修改成本高。
评测系统本身的问题,很多时候比 Agent 出问题更难发现。如果一直在 Agent 代码上反复调,效果未必明显,因为瓶颈可能在评测集设计或追踪数据缺失。
| 对比维度 | 厚循环架构 | 薄循环 + 外置状态架构 |
|---|---|---|
| 控制流 | 状态机内嵌,分支多 | 循环极简,稳定 |
| 状态管理 | 内存与循环耦合 | 外化到文件/数据库 |
| 扩展方式 | 修改循环内部 | 扩展工具、提示、状态 |
| 工具设计 | 易与分支耦合 | 强调描述准确性 |
| 调试难度 | 分支组合复杂 | 边界清晰,易定位 |
| 迁移成本 | 改动影响面大 | 新增能力叠加外部 |
| 适用场景 | 逻辑固定的窄场景 | 能力持续演进的生产系统 |
选型时可参考以下条件化判断:
Agent 架构的对比,本质上是”把复杂性放在哪里”的选择。厚循环把复杂性放进循环内部,薄循环把复杂性外置到工具、提示与状态系统。前者在窄场景下可能更快落地,后者在能力持续演进的生产系统中更稳健。真正影响成功率的,往往不是模型价格,而是 Harness、工具描述与验证测试的质量。理解这一差异,才能在选型与迁移中做出更清醒的判断。