
为什么 Claude Code、Codex CLI 比直接用聊天界面强大得多?答案藏在 Agent 架构里。
你有没有好奇过:为什么 Claude Code 或 Codex CLI 用起来比在聊天界面中直接用同样的模型要强大得多?
很多人直觉上认为这是因为“模型更好”或“有特殊优化”。但 Sebastian Raschka 博士在最新文章中指出:真正的差异在于 Agent Harness,也就是围绕模型的软件框架。
Raschka 是《Build a Large Language Model From Scratch》和《Build a Reasoning Model From Scratch》两本书的作者。这篇文章把编程 Agent 的核心架构拆得比较清楚,拿来理解 Claude Code、Codex CLI 这类工具很合适。
在深入技术细节前,先厘清几个容易混淆的概念:
核心的“下一词预测”引擎。它是所有智能体系统的发动机。
仍是 LLM,但经过特殊训练,会在推理时花更多计算资源做中间推理、验证和搜索。可以理解为升级版引擎,更强,也更贵。
在模型之上的控制层。给定目标后,Agent 决定:
• 下一步检查什么
• 调用哪些工具
• 如何更新状态
• 何时停止
围绕 Agent 的软件脚手架,负责管理上下文、工具使用、提示词、状态和控制流。
Agent Harness 的特化版本,专门针对软件工程任务:管理代码上下文、工具、执行和迭代反馈。

Raschka 用了一个形象的比喻:
• LLM 像汽车引擎
• 推理模型 像升级版引擎,更强但更费油
• Agent Harness 像驾驶系统,帮你把车真正开起来
这个比喻不完美,LLM 也可以独立使用,但它有一个点很准确:模型决定“能跑多快”,Harness 决定“能开多远”。
更关键的是,在现在各大模型能力逐渐拉近的背景下,Harness 往往是决定体验差异的关键因素。 Raschka 甚至推测:如果把 GLM-5 放进类似 Claude Code 的 Harness 里,它的实际体验很可能不输给 GPT-5.4。
Raschka 将编程 Agent 拆解为六个核心组件:

这是最显而易见,也最重要的一层。
当用户说“修复测试”时,模型需要知道:
• 这是不是一个 Git 仓库
• 当前在哪个分支
• 项目有什么结构
• 有没有 AGENTS.md 或 README 说明
为什么重要?
“修复测试”不是自包含的指令。如果 Agent 看到了项目文档,就能知道运行哪个测试命令。如果知道仓库布局,就能在正确位置查找,而不是瞎猜。
实现要点通常是:
• 在开始工作前先收集一组稳定事实
• 包含 Git 状态、分支、最近提交
• 这些信息不要每次都从零重建
编程会话通常是重复性的:
• Agent 规则基本不变
• 工具描述基本不变
• 工作区摘要基本不变
主要变化的是:
• 用户请求
• 对话历史
• 短期记忆
聪明的设计不会每次都重建一个巨大的提示词。

核心洞见是:收集仓库事实,和打包缓存事实,是两个独立步骤。
这是从“聊天”变成“智能体”的关键。
普通模型只能用自然语言建议命令。编程 Agent 则会:
• 实际执行命令
• 获取结果
• 将结果反馈到下一轮推理
但也不是让模型放飞自我。实际流程更接近这样:

安全边界一般包括:
• 预定义的允许工具列表
• 路径检查,只在仓库内操作
• 用户审批机制
这些边界看起来像限制,真正作用是提高可靠性和可用性。
上下文膨胀是 LLM 的通病,编程 Agent 尤其严重:
• 重复的文件读取
• 冗长的工具输出
• 大量日志信息
如果保留所有内容,很快就会耗尽上下文窗口。
原文这里总结了两种核心压缩策略:
• 截断:缩短长文档、截断大输出、压缩记忆笔记
• 对话压缩:将历史转为摘要,保持最近事件更详细
额外技巧包括:
• 对旧文件读取去重,避免重复看到同一内容
• 保持最近事件更详细
• 对旧事件做更激进的压缩
原文这里有一句话很值得记:很多看似的模型能力问题,本质上是上下文质量问题。
这一层和上一组件紧密相关,但关注点不同。

两层状态管理可以概括成:
• 完整对话记录:存储所有请求、输出、响应,只追加,不修改,支持会话恢复
• 工作记忆:小型、精炼的状态,记录当前任务、重要文件、最近笔记,会被修改和压缩
为什么要委托?
• 并行化子任务
• 避免单一循环承载所有工作
• 例如查找符号、检查配置、诊断测试失败
核心挑战是:如何绑定子智能体。
子智能体需要继承足够上下文才能工作,但必须有边界:
• 只读模式:子智能体不能修改文件
• 递归深度:限制子智能体再启动子智能体
• 工作范围:限制操作的目录或文件
原文对这里的总结是:继承足够上下文才能有用,但约束边界防止失控。
把这六个组件整合起来,大致是这样一层结构:

这个总览图最重要的地方在于,它把 harness 放在了模型外面一整层。 也就是说,用户请求不是直接丢给模型,而是先经过:
• 代码库上下文
• 稳定提示词前缀
• 工具访问与使用
• 上下文管理
• 会话记忆
• 子智能体委托
最后才进到 LLM 或推理模型。
Raschka 还对比了编程 Agent(如 Claude Code)与通用 Agent 平台(如 OpenClaw):

核心差异是:
• 编程 Agent 优化的是“一个人在仓库中工作”的场景
• OpenClaw 优化的是“跨多个聊天、通道、工作区运行多个长期 Agent”
编程只是其中一种工作负载。
在很多实际应用里,围绕模型的系统和模型本身同样重要。这也是为什么同样的模型放进 Claude Code 后,体验会和聊天界面差很多。
在模型能力逐渐拉近的情况下,Agent Harness 往往就是体验差异的来源。一个设计良好的 Harness,可以让模型的能力更稳定地落出来。
很多看起来像模型能力的问题,最后都会落到上下文质量。
预定义工具、路径检查、审批机制这些边界,看起来像限制,实际会提高可靠性和实用性。
如果你想构建自己的编程 Agent,或者想理解现有系统:
• 从最小实现开始
• 重视上下文管理
• 工具设计要有边界
• 会话记忆要分层
• 提示词缓存尽量复用