Skip to content

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 硬拦
对完成度过于乐观给可验证的完成标准

延伸阅读

基于 VitePress 构建 · 内容采用原作者授权