您通过 /model 切换了模型,再试一次同样的任务,得到的回答却不一样。不过,智能体读取 CLAUDE.md 的方式没变,执行命令前仍会询问权限,hook 也照常触发。这说明这些机制并不属于模型本身。
我们来看看模型的边界在哪里,模型周围的程序又从哪里开始。弄清这一点,就知道智能体出错时该检查什么。
模型与 harness
模型处理传入的上下文,然后生成回答或工具调用请求。比如,它会选择要读取哪个文件、运行哪条命令。要执行这些操作,还需要模型外围的程序:它访问文件、运行命令,再把结果交还给模型。
英文资料把这类程序称为 harness。这个词原本有"马具"的意思(没错,就是马身上那套),中文技术语境里通常直接说 harness,可以理解为智能体的执行框架。Anthropic 的文档说得很清楚:Claude Code 是 harness,Claude 是其中的模型。这个词在智能体相关文章里也常见,值得记住。
图中的 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 则会读取文件并把内容返回给模型。
智能体笃定地讨论一个项目里早已不存在的函数?先检查最新代码是否进入了上下文。您可以通过带文件路径的 @ 提供代码、直接粘贴到消息里,或使用读取工具获取。前两种方式可能不会出现单独的读取调用。如果调用过工具,就看看它返回了什么:文件内容,还是访问或路径错误。如果上下文里没有代码,请把代码提供给它,或让它读取文件。如果代码已经在上下文中,但结论仍有误,就对照具体代码行检查推理过程。这时换个模型也可能有帮助。
智能体出错时该调整什么
偶尔出错,直接补充一句通常就能解决:"文件不对,请看 src/utils.js"。如果错误在不同会话中反复出现,就该检查指令和可用数据。也许每次都得重新解释同一条规则。
实际处理时可以这样判断:
- 智能体每次会话都会忘记项目规则,比如测试要用
npm test运行 - 把规则写进CLAUDE.md。重要规则明确保存在文件里,比指望对话中的提醒可靠; - 同一个流程已经解释第三遍了 - 是时候把它整理成 skill。智能体可以按任务加载这份指令。工作时确认 skill 是否被调用;如果没有,就用
/skill-name手动调用,把其中的名称换成它的实际名称; - 智能体在猜测自己并不知道的数据 - 把所需信息交给它:通过
@将文件加入上下文,或通过 MCP 连接外部服务。反复催它猜不出正确数据; - 智能体没运行检查就说"完成了" - 可以设置针对
Stop事件的 hook 自动运行测试,不需要模型作决定。是否接受结果仍由您判断,依据是命令输出,而不是它的报告; - 数据已经提供并读取,但智能体仍在复杂推理中出错 - 通过
/model换个模型,在同一任务上比较结果。
先确认所需数据和工具是否可用。如果问题出在推理上,可以直接试试另一个模型。比较结果质量,并在 /usage 中查看用量:反复失败同样会消耗限额和您的时间。
GO TO FULL VERSION