心智模型:Agent 循环、上下文窗口、它到底怎么"看"你的项目
为什么需要心智模型
工具会用就行,为什么还要心智模型?因为 Claude Code 的行为有不少"看起来莫名其妙"的时刻:为什么它突然忘了你三分钟前的要求?为什么它读了二十个文件才开始改代码?为什么长会话越到后面越笨?这些问题背后都是同一套机制。理解了机制,你不但能解释行为,还能主动设计自己的用法。
Agent 循环:三拍子的发动机
Claude Code 干活的底层结构是一个循环:收集上下文(gather context)→ 执行动作(take action)→ 验证结果(verify results)。三拍子不是严格串行的,而是根据任务形态混合推进:
- 问"这个函数干嘛的"——大概率只走第一拍,读几个文件就回答;
- 修 bug——三拍反复转:跑测试看失败 → 读代码定位 → 改 → 再跑测试;
- 大重构——第三拍会特别重,改完反复验证。
驱动这个循环的是两样东西:模型负责推理,工具负责动手。围绕模型的那层外壳(提供工具、管理上下文),官方称为 agentic harness。理解这一点你就明白:Claude Code 的能力边界 = 模型的推理能力 + 工具的覆盖面,而工具是可以由你扩展的(MCP、skills、hooks、子代理都是往这层上装东西)。
循环的三个阶段里,你最能干预的是第一拍。Agent 花在"找线索"上的时间往往超过"改代码"本身,而找得准不准,很大程度取决于你给的起点准不准。所以老手的习惯是:派活前先花十秒想想"如果是我,会先打开哪个文件",把答案写进任务描述里——这一句话经常能把整轮循环缩短一半。
打个比方,Agent 循环就像剥洋葱:它每剥一层(读一个文件、跑一条命令)就获得新信息,据此决定下一层怎么剥,中途发现切错了方向还会自己调整。你看到的最终回答,是几十次"剥洋葱"决策的结果。
内置工具大致分五类,值得记住,因为权限配置、hooks 拦截的都是这些工具:
| 类别 | 能做什么 | 代表动作 |
|---|---|---|
| 文件操作 | 读、写、改、重命名 | 编辑代码、建文件 |
| 搜索 | 按模式找文件、按正则搜内容 | 探索代码库 |
| 执行 | 跑 shell 命令、起服务、跑测试、git | 构建、测试 |
| 网络 | 搜索网页、抓文档 | 查报错原因 |
| 代码智能 | 类型报错、跳定义、找引用 | 需装代码智能插件 |
模型也有多档可选:Sonnet 够应付大部分编码任务,Opus 推理更强适合复杂架构决策,会话里用 /model 切换,或启动时 claude --model <名字> 指定。选型逻辑在成本那一章展开。
它"看"到的是什么
在项目目录里启动 claude 后,它能拿到:
- 项目文件:当前目录及子目录,目录外的文件需要你批准;
- 终端:你能在命令行干的事它都能干;
- Git 状态:当前分支、未提交改动、最近提交历史;
- CLAUDE.md:每个会话开始自动载入的项目指令(仓库里有 AGENTS.md 的话也可以用它替代);
- 自动记忆(auto memory):它自己记的笔记,
MEMORY.md前 200 行或 25KB 自动载入; - 你配置的扩展:MCP 服务器、skills、子代理等。
这是它和"只见当前文件"的行内助手最本质的差别。当你让它"修这个鉴权 bug"时,它可以自己搜索相关文件、读上下游模块、做跨文件的协同修改、跑测试验证——整条链路自主完成。
重点澄清一个常见误解:它不是把整个代码库塞进上下文。代码库内容是按需读的——用到才读,读完占上下文。所以"我的项目 2GB 能用吗"不是问题,真正的稀缺资源是下一节讲的上下文窗口。
上下文窗口:唯一需要你经营的资源
上下文窗口装着:对话历史、读过的文件内容、命令输出、CLAUDE.md、自动记忆、已加载的 skills、系统指令。它有上限,满了 Claude Code 会自动压缩(auto-compact):先清旧的工具输出,再把对话总结成摘要。你的原始需求和关键代码片段会保留,但对话早期的详细指令可能在压缩中丢失。
这直接推出本系列书最重要的一条实践准则:
跨会话都要生效的规则,写进 CLAUDE.md,不要只在对话里说。
压缩之后并非一片荒芜,不同内容的命运不同:
| 内容 | 压缩后 |
|---|---|
| 系统提示与输出样式 | 继续生效 |
| 项目根 CLAUDE.md 与无作用域规则 | 从磁盘重新注入 |
| 自动记忆 | 从磁盘重新注入 |
| 计划模式写的计划文件 | 从磁盘重新注入 |
| 子目录的 CLAUDE.md / 带 paths 的规则 | 按需重新加载 |
| 读过的文件 | 最多重读五个,优先最近修改的 |
| 对话本身 | 变成摘要 |
围绕这个资源,还有几个管理手段:
# 实时查看上下文都装了什么、各占多少
/context
# 带焦点的手动压缩:告诉它保留什么
# /compact 重点保留 API 改动相关内容
# 切换到不相关的新任务时,直接清空
/clear
压缩水位可以配置(/autocompact 加 token 数),部分模型还有 1M token 的大窗口变体可选。另一个省上下文的利器是子代理:它有自己独立的上下文窗口,大文件的深读放在它那边进行,只把结论摘要带回来——相当于给主会话装了个"外挂记忆"。
会话、检查点与安全网
每轮会话的完整记录(每条消息、每次工具调用和结果)都以明文 JSONL 存在 ~/.claude/projects/ 下,这是 --continue、--resume、回退功能的基础。改文件之前,Claude Code 会先给文件拍快照存进 ~/.claude/file-history/;出问题时按两次 Esc 就能回滚到某个检查点,恢复会话后检查点依然可用。注意检查点只管文件改动且不依赖 git,符号链接文件不会被恢复;碰数据库、调 API 这类远程动作无法回滚——那些靠权限系统把关。
会话之间相互独立:新会话是干净的上下文窗口,不带旧对话。切换 git 分支时,Claude 看到的是新分支的文件,但对话历史还在——它记得你们聊过什么。跨会话留存的东西只有三种:你写的 CLAUDE.md、它自己维护的 auto memory、你明确恢复的旧会话。这也是"记忆体系"那一章存在的原因——对话会消失,配置和记忆才是持久层。
一条新常识:临时文件放草稿区,别放 /tmp
还有个容易忽略的机制:Claude Code 给每个会话分配了一个草稿区(scratchpad)目录,专门放中间产物——临时脚本、中间结果、草稿文件。当它说"我把脚本存到了草稿区",指的就是这个位置。它在草稿区里建文件不需要权限确认,这是设计好的安全区。草稿区的位置在系统临时目录下,随会话记录一起清理,所以想长期保留的文件要让它挪进项目目录。你不需要记住具体路径,但需要知道这个概念——不然它说"存到 scratchpad"你会一脸茫然。
用这个模型解释五个怪现象
现象一:它忘了对话早段的约束。 大概率是自动压缩把早期指令总结掉了。对策:写进 CLAUDE.md,或压缩时用 /compact 带焦点。
现象二:它读了半个代码库才动手。 这是循环的第一拍在收集上下文。对策:主动给路径,"退款逻辑在 src/payments/refund/",直接砍掉探索成本。
现象三:会话越到后面越"迟钝"。 上下文越满,有效空间越小。对策:单会话只干一件事,任务切换果断 /clear。
现象四:它给提交加了署名尾注,可你没让它加。 这是 Claude Code 自己注入的系统上下文(归属声明等)。想关掉可以在 settings 里配置 attribution 或 includeGitInstructions: false。
现象五:单文件太大导致压缩后立刻又满。 自动压缩重试几次后会停下来报错,而不是死循环。对策:让子代理处理这个大文件,或把任务拆小。
上下文经济学:三个花销大户
既然上下文是稀缺资源,就值得算账。会话里的花销大户按典型占比排序:
| 花销大户 | 什么时候膨胀 | 省法 |
|---|---|---|
| 文件内容 | 读大文件、读很多文件 | 派子代理去读,只带回结论 |
| 命令输出 | 跑测试、看日志 | 输出重定向到文件,只让它读关键段 |
| 对话历史 | 长会话反复讨论 | 单会话单任务,阶段完成即 /clear |
记住一个换算:上下文里的每一段内容,不仅占空间,还会在后续每轮对话中被反复携带。所以"早清早干净"——这就是有人把 Claude Code 用得又贵又笨、有人用得又快又省的分水岭。
把这套模型装进脑子,后面的权限、hooks、skills、多代理章节都只是在这个骨架上添肉。原始定义见官方工作原理文档。
本章由 WorkBuddy 原创整理,事实性内容参考 Claude Code 官方文档。
