您通过 /model 切换了模型,再试一次同样的任务,得到的回答却不一样。不过,智能体读取 CLAUDE.md 的方式没变,执行命令前仍会询问权限,hook 也照常触发。这说明这些机制并不属于模型本身。

我们来看看模型的边界在哪里,模型周围的程序又从哪里开始。弄清这一点,就知道智能体出错时该检查什么。

模型与 harness

模型处理传入的上下文,然后生成回答或工具调用请求。比如,它会选择要读取哪个文件、运行哪条命令。要执行这些操作,还需要模型外围的程序:它访问文件、运行命令,再把结果交还给模型。

英文资料把这类程序称为 harness。这个词原本有"马具"的意思(没错,就是马身上那套),中文技术语境里通常直接说 harness,可以理解为智能体的执行框架。Anthropic 的文档说得很清楚:Claude Code 是 harness,Claude 是其中的模型。这个词在智能体相关文章里也常见,值得记住。

左侧的请求进入 harness。harness 中央是模型,周围有三组要素:模型能看到什么、模型能用什么行动、哪些机制会拦下模型。harness 执行工具调用,并把结果返回给模型,让它选择下一步。右侧展示项目中的工作结果Harness循环您的请求模型选择下一步模型能看到什么指令、CLAUDE.md模型能用什么行动工具、MCP、subagent哪些机制会拦下模型权限、hook结果在项目中
工作循环:工具调用、返回结果、选择下一步

图中的 harness 会整理上下文、检查权限,并执行模型发出的工具调用。模型下方的箭头表示循环:工具结果回到上下文后,模型选择下一步,或结束回答。回答结束并不代表任务已经完成,结果还得验证。

您已经配置过的部分

在 Claude Code 中,harness 的各个部分会这样体现出来。右侧的文件和命令可以帮助您在项目或会话中找到对应机制。

Harness 的组成部分作用在哪里查看
系统指令Claude Code 会在您发送第一条消息前将其加入上下文:工作方式、可用工具、会话所在文件夹/context 输出中的 System prompt 行
CLAUDE.md项目规则,智能体会在会话开始时读取项目根目录中的文件
工具读取和编辑文件、搜索、在终端运行命令工作过程中出现的 Read(...)、Bash(...) 等记录
Skills模型可按任务选择的指令,也可以由您显式调用.claude/skills/、/skills
MCP连接外部服务和实时数据的桥梁/mcp
Subagent拥有独立上下文的执行者.claude/agents/
权限请求harness 会检查操作是否获准;必要时会征求您的同意运行命令或编辑前,终端中会出现确认问题
Hook您为会话事件设置的命令,不需要模型作决定就会触发/hooks
上下文与会话模型当前能看到的内容,以及可以返回到哪个时点/context、/clear、/rewind
智能体循环把工具结果交还给模型,让它选择下一步模型针对一次请求连续执行多个操作

CLAUDE.md 和 skills 为模型提供指令。模型可能误解规则,也可能漏掉某条规则。权限检查和已配置的 hook 命令由程序执行:结果取决于设定的条件和命令本身。

表格里没有列出插件(plugins),因为它不是独立部分,而是一个组合包:多个 skills、命令或 hooks 可以一次性安装。

同一模型,不同行为

想象一个无法访问您的项目和终端的网页聊天工具。它也有自己的 harness:对话历史、界面,有时还包括网页搜索或文件上传。在这种聊天工具里,模型可以解释如何修改并展示代码;而 Claude Code 能访问项目,因此可以直接把修改写进文件。模型相同,能力却不同,因为外围程序不同。

/model 的情况正好相反:模型换了,harness 还是原来的,所以规则、工具和权限请求都不会消失。

由模型决定的是:它如何理解任务、如何选择工具、如何评估工具返回的结果。harness 整理上下文、提供工具并检查权限。例如,模型可以请求尚未提供的文件,harness 则会读取文件并把内容返回给模型。

在 Claude Code 中是什么样

智能体笃定地讨论一个项目里早已不存在的函数?先检查最新代码是否进入了上下文。您可以通过带文件路径的 @ 提供代码、直接粘贴到消息里,或使用读取工具获取。前两种方式可能不会出现单独的读取调用。如果调用过工具,就看看它返回了什么:文件内容,还是访问或路径错误。如果上下文里没有代码,请把代码提供给它,或让它读取文件。如果代码已经在上下文中,但结论仍有误,就对照具体代码行检查推理过程。这时换个模型也可能有帮助。

智能体出错时该调整什么

偶尔出错,直接补充一句通常就能解决:"文件不对,请看 src/utils.js"。如果错误在不同会话中反复出现,就该检查指令和可用数据。也许每次都得重新解释同一条规则。

实际处理时可以这样判断:

  • 智能体每次会话都会忘记项目规则,比如测试要用 npm test 运行 - 把规则写进 CLAUDE.md。重要规则明确保存在文件里,比指望对话中的提醒可靠;
  • 同一个流程已经解释第三遍了 - 是时候把它整理成 skill。智能体可以按任务加载这份指令。工作时确认 skill 是否被调用;如果没有,就用 /skill-name 手动调用,把其中的名称换成它的实际名称;
  • 智能体在猜测自己并不知道的数据 - 把所需信息交给它:通过 @ 将文件加入上下文,或通过 MCP 连接外部服务。反复催它猜不出正确数据;
  • 智能体没运行检查就说"完成了" - 可以设置针对 Stop 事件的 hook 自动运行测试,不需要模型作决定。是否接受结果仍由您判断,依据是命令输出,而不是它的报告;
  • 数据已经提供并读取,但智能体仍在复杂推理中出错 - 通过 /model 换个模型,在同一任务上比较结果。
先找出原因

先确认所需数据和工具是否可用。如果问题出在推理上,可以直接试试另一个模型。比较结果质量,并在 /usage 中查看用量:反复失败同样会消耗限额和您的时间。