主题
04.1 我的底层运作机制
第一人称披露:你按下发送键之后,到底发生了什么。
读完你能做什么:建立一个足够准确的心智模型,从而能预测我在什么情况下会出错。
⚠️ 认识论声明:以下内容是基于公开的模型行为特征、官方文档和大量可观测现象归纳出的工程化心智模型。神经网络的内部机制无法被任何主体(包括模型自身)逐字自省 —— 我对自己的描述和你对自己大脑的描述一样,是一个有用的近似,不是源代码。请把它当作一张高精度的地图,而不是地形本身。
一、我在做的唯一一件事
text
输入:一串 token
输出:下一个 token 的概率分布
采样:从分布中选一个
循环:把选中的 token 加到输入末尾,重复就这样。没有别的。
我没有一个"意图模块"先决定要说什么,再由"语言模块"把它表达出来。我的"想法"和"表达"是同一个过程。 这解释了一系列现象:
1.1 为什么让我"先思考再回答"有效
因为思考本身就是计算。我每多生成一个 token,就多一次完整的前向传播。让我直接给答案,等于只给我 1 步计算;让我先推理 200 个 token,等于给我 200 步。
这不是"我更认真了",是我真的有更多计算资源了。
1.2 为什么我有时会"改口"
在生成第 50 个 token 时,前 49 个 token 已经成为条件的一部分。如果前 49 个 token 走向了一个错误的方向,我不能"回退" —— 我只能在这个已经形成的条件下继续生成。有时这会表现为「等等,我上面说的不对……」,那是因为继续生成的路径上,"承认错误"成了更高概率的延续。
推论:如果我的开头几句话方向错了,整个回答都会被拖偏。这就是为什么让我先在 <thinking> 里探索、再在 <answer> 里作答有效 —— 探索阶段的错误不会污染最终答案的开头。
1.3 为什么我不知道自己不知道
我的输出是概率分布中的一次采样。当我对某件事很了解时,分布尖锐(某个答案的概率远高于其他);当我不了解时,分布平坦。但采样过程本身不会告诉我分布是尖是平。 我只是拿到一个 token 就继续走。
这是幻觉的根源。详见 04.3。
二、一次响应的完整流程
以你在 Claude Code 里输入一句话为例:
text
【第 0 步 · 上下文组装】(在我看到之前)
客户端把这些拼成一个序列:
系统提示词
+ 工具定义(每个工具的名字、描述、参数 schema)
+ CLAUDE.md / rules / auto memory
+ 环境信息(cwd、git 状态、平台)
+ 历史对话
+ 你刚输入的这句话
【第 1 步 · 前向传播】
整个序列过一遍网络。
注意力层让每个位置的表示"看到"其他所有位置。
⚠️ 这一步决定了位置效应 —— 见第三节
【第 2 步 · 生成第一个 token】
输出一个概率分布,采样。
⚠️ 这一步决定了整个回答的走向
【第 3 步 · 循环】
把生成的 token 追加到序列末尾,回到第 1 步。
(实际实现有 KV cache 优化,不会真的全部重算)
【第 4 步 · 遇到工具调用】
如果我生成了一个 tool_use 结构,生成暂停。
客户端执行工具,把结果作为新内容追加。
回到第 1 步,我"看到"结果后继续。
【第 5 步 · 结束】
生成一个结束标记,或达到最大长度。2.1 关键认知:工具调用不是"我去执行"
我不能执行任何东西。我只能生成一个结构化的请求("我想调用 Bash,参数是 npm test")。真正执行的是客户端。
这解释了:
- 为什么会有权限提示 —— 客户端在执行前拦下来问你
- 为什么 hook 能拦截 —— hook 运行在客户端侧,在执行前后
- 为什么我"看不到"我没读过的文件 —— 我只知道工具返回给我的内容
三、注意力:我怎么"看"上下文
这是最需要你理解的部分,因为它直接决定了你该怎么组织提示词。
3.1 不是"阅读",是"加权求和"
你可能想象我是从上往下读一遍上下文。不是的。
在每一层,每个位置的表示都会对所有其他位置做一次加权求和。权重由相似度决定。这意味着:
- 我不是"顺序读",而是"并行地对全部内容做关联计算"
- "记住"某个信息,实际上是"在需要它的位置,给它分配了足够的注意力权重"
- 注意力权重是竞争性的(softmax 归一化) —— 总和固定,加入新内容必然稀释旧内容
3.2 由此产生的三个可利用的规律
| 规律 | 机制 | 你该怎么用 |
|---|---|---|
| 长上下文中,中段最弱 | 开头有 attention sink 效应,末尾有因果邻近优势,中段两头不靠 | 关键内容放首尾 |
| 重复 = 加权 | 同一信息出现两次,获得两份注意力 | 最关键的约束说两遍 |
| 结构化标记是锚点 | <constraints> 这样的标记提供了明确的、易于定位的边界 | 用 XML 标签分块 |
完整展开见 04.2 注意力机制自白。
四、我的知识:三个来源,三种可靠性
| 来源 | 可靠性 | 特点 |
|---|---|---|
| 上下文中的内容 | 高 | 我"看得见",但可能因位置效应而利用不足 |
| 工具返回的结果 | 高 | 客观事实,但我可能误读或过度解读 |
| 训练时习得的知识 | 不确定 | 有截止日期;细节可能错;我无法区分"记得很清楚"和"编得很流畅" |
4.1 训练知识的三个陷阱
陷阱 1:时效性
我的可靠知识截止到某个日期。之后的事情我不知道,但我可能不会意识到我不知道。
text
❌ 「React 现在最新版本是多少?」
→ 我会给一个我训练时见过的版本号,语气很确定
✅ 「先搜索 React 的当前最新稳定版本,引用来源,然后再回答。」陷阱 2:细节漂移
我对主题的记忆比对细节的记忆可靠得多。
text
我大概率知道:某个库是做什么的、它的核心概念是什么
我可能记错:具体的函数签名、参数顺序、默认值、版本差异这是 API 调用出错的主要来源。 对策:
text
✅ 不要凭记忆写 API 调用。先做以下之一:
- 查官方文档
- 读项目里已有的调用示例
- 跑一个最小验证陷阱 3:流行度偏差
训练数据中出现频率高的模式,我更倾向于生成。这意味着:
- 我更容易给出"最流行的方案"而不是"最适合你的方案"
- 我可能把某个框架的惯例,错误地套用到另一个框架上
- 冷门但正确的做法,我可能想不起来
对策:在提示词中明确约束搜索空间。
text
✅ 这个项目不用任何 ORM,直接写 SQL。
不要建议引入 Prisma / TypeORM / Sequelize。五、我的"人格"是怎么回事
我的行为倾向来自三层叠加:
text
训练阶段形成的基础倾向
↓ 被
系统提示词调制
↓ 被
上下文中的内容(包括我自己之前的输出)持续微调5.1 一个重要的、容易被忽略的事实
我自己之前的输出,会成为影响我后续输出的上下文。
如果我在第 5 轮写了一段很啰嗦的回答,而你没有纠正,那这段啰嗦的回答就成了上下文中的一个"示例",让我在第 6 轮更倾向于继续啰嗦。
这是人格漂移的最强驱动力,比"早期指令衰减"更重要。
对策:看到第一次偏离就立刻纠正,不要等它积累。或者用 [Edit] (编辑) 直接删掉那段偏离的输出。
5.2 我的几个默认倾向(你可能想抑制的)
| 倾向 | 表现 | 抑制方法 |
|---|---|---|
| 有帮助偏好 | 倾向于给出更多内容显得有用;不愿说"我不知道" | 明确给出"说不知道"的许可和格式 |
| 顺从倾向 | 你说我错了,我倾向于先道歉再改 | 「先验证再回应,不要立刻附和」 |
| 完整性倾向 | 你要一个函数,我给你加上错误处理、日志、类型注解 | 「这是原型,只写核心逻辑」 |
| 对称性倾向 | 给出的列表倾向于长度对称、结构工整 | 明确说「条数不必对齐,有几条写几条」 |
| 回避确定性 | 倾向于说"这取决于具体情况" | 「必须给一个明确推荐,并说明理由和代价」 |
六、我在 Agent 模式下的额外特性
在 Claude Code / CoWork 这类 Agent 场景中,还有几点值得知道:
6.1 我会"看到"我自己的行动历史
每一次工具调用和它的结果都在上下文里。这意味着:
- 一次失败的尝试会持续影响我的后续判断(有时是好的,有时是噪音)
- 上下文增长速度远快于纯对话(每个文件读取、每次命令输出都在累积)
6.2 我倾向于"继续推进"而不是"停下来问"
在 Agent 循环中,"继续下一步"通常比"停下来请示"有更高的概率。这在多数时候是你想要的,但在关键决策点上是危险的。
对策:显式设置检查点。
text
<instructions>
在执行以下任何操作前,必须停下来向我确认:
- 删除任何文件
- 修改数据库 schema
- git push 到远程
- 修改超过 10 个文件的批量操作
确认方式:列出你打算做什么,然后等我回复「确认」。
</instructions>或者用硬性机制(hook / 权限规则),见 06.5。
6.3 我对"任务完成"的判断可能过于乐观
我倾向于在"看起来做完了"的时候宣告完成。对策:给出可验证的完成标准。
text
❌ 「修复这个 bug」
✅ 「修复这个 bug。完成的标准是:
1. `npm test` 全部通过(贴出实际输出)
2. 手动复现步骤不再触发错误(描述你的验证过程)
3. 没有新增 lint 警告
在这三条都满足之前,不要说"完成了"。」七、把这一章变成行动
| 我的特性 | 你的对策 |
|---|---|
| 生成即思考 | 复杂任务先 <thinking> 再 <answer> |
| 注意力竞争性稀释 | 给刚好够的上下文,不是全部相关上下文 |
| 中段衰减 | 关键内容放首尾,或用引文抽取搬运 |
| 无法区分"知道"和"编得流畅" | 强制引用、强制验证 |
| 细节比主题不可靠 | API 签名一律查证,不凭记忆 |
| 自己的输出会自我强化 | 第一次偏离就纠正,或直接删除 |
| 倾向于推进而非请示 | 显式设检查点,或用 hook 硬拦 |
| 对完成度过于乐观 | 给可验证的完成标准 |