Claude 之思考
提示词
1 | |
- CLAUDE.md:团队手写的静态项目规约(构建命令、代码规范、禁止写法),属于人注入的硬性约束。
- MEMORY.md:Agent 在过往工作中用 Write 工具自动沉淀的经验库(踩过的坑、纠正过的错误、技术决策),属于模型自发沉淀的软记忆。且记忆不全量进上下文:每次会话只载入这份目录,具体文件用到才读——索引常驻,明细按需召回。
第三层里 assistant 与 user 的你往我来,展开看正是 ReAct 循环,只是论文里的三个环节成了 API 协议里的三种消息块:
| 论文(2022) | 今天 Claude API |
|---|---|
| Thought(思考) | thinking block |
| Action(行动) | tool_use block |
| Observation(观察) | tool_result block |
还有一点 JSON 里看不出来:模型并不能真的执行命令。它只是输出一段 tool_use 请求,真正执行的是框架,且执行前要过权限门——哪类命令免询问、哪类必须用户确认,都在这层拦截。安全因此是双保险:system prompt 里的安全规则是软约束(靠模型自觉),权限门是硬约束(不批准就执行不了)。
三层结构也不是铁板一块:第三层随交互一直变长,逼近上下文上限(约 200k token)时需要压缩——把历史总结成摘要、丢弃原文重启会话(Claude Code 的 /compact)。代价是前缀改变、KV 缓存整体失效,下一请求从头重算,详见后文缓存一节。
顺带一个回环:记忆的“索引常驻 + 按需召回”本身就是一次 ReAct 循环——判断需要哪条记忆(思考)→ 读文件(行动)→ 内容进上下文(观察)。内核在自己吃自己的狗粮。
姚顺宇
在 ReAct 出现之前,思考与行动是两条平行线:纯思考一派是 CoT(思维链,Wei et al.,2022.01),只靠模型内部知识推理,容易幻觉;行动一派是 WebGPT(2021.12)、SayCan(2022.04),只预测下一步动作,不做高层规划。两者无法闭环。弥合它们的核心论文:《ReAct: Synergizing Reasoning and Acting in Language Models》(2022.10,ICLR 2023)。作者姚顺宇,论文发表时是普林斯顿大学博士生,在 Google Brain 实习。
该论文首次系统实证(而非数学证明——全文没有一个定理,靠的是少样本示例引导 PaLM-540B 加消融实验):让大模型交替进行“思考(Thought)- 行动(Action)- 观察(Observation)”的循环,可以大幅减少幻觉,并使模型具备自主解决复杂多步骤任务的能力。论文对 100 条轨迹的人工误差分析给出了硬数字:幻觉导致的失败,CoT 占 56%,ReAct 占 0%;成功案例中的假阳性 6% vs 14%。但接地有代价:推理错误率从 16% 升到 47%——外部知识增强了事实性,却束缚了推理灵活性。论文的最优解是两者互补:ReAct 失败时回退到 CoT 多数投票,反之亦然,3-5 个样本就能达到 CoT-SC 21 个样本的准确率。
这正是今天所有 Agent(包括 Claude Code)底层工作循环的理论鼻祖。后续谱系也基本是姚顺宇一条线串下来的:ReAct(2022.10)→ Reflexion(自我反思,2023.03)→ Tree of Thoughts(2023.05)→ SWE-agent(2024.05)。
顺带一提:论文当年靠 few-shot 示例固定行为范式,今天的 Agent 框架则把这些示例固化成了 system prompt 指令(即本文第一节三层提示词里的“固定 ReAct 范式”)——同一个东西的两种形态。
DeepSeek R1:喂出来还是激励出来
DeepSeek 的破圈(2025 年 1 月的 R1)常被归因于思维链,但 CoT 是 2022 年的技术,o1(2024.09)也早是推理模型——真正的引爆点是可见性:o1 把思维链藏起来只给摘要,R1 完整裸露,普通用户第一次实时“看见”AI 自我怀疑、推翻重来。叠加“560 万美元训练成本”叙事与 MIT 开源免费(1 月 27 日 NVIDIA 单日蒸发约 5890 亿美元市值),思维链截图本身成了传播素材。
| 阶段 | 代表 | 思维链状态 |
|---|---|---|
| 2022 | CoT / ReAct | 显式写在输出里(prompt 出来的) |
| 2024.09 | o1 | 存在但隐藏,只给摘要 |
| 2025.01 | R1 | 完整裸露,破圈引爆点 |
| 2025 至今 | Claude | extended thinking + 思考与工具调用交替——绕回 ReAct |
学界震动则在另一件事:R1-Zero 证明了推理能力可以被激励出来,而不是喂出来的。喂出来(SFT)是用几十万条高质量思维链样本逐 token 模仿,模型学的是“好思维的形”,上限就是样本质量;激励出来(RL)则零示范,奖励只有两条程序判定规则——答案对加分、过程写进 <think> 标签加分。训练推进后,模型自发涌现出回溯与自我修正:写到一半“等等,这不对”,推倒重来,即论文表 2 的 “aha moment”。没人教过“回头检查”,这类行为本来以极低概率存在于基座分布里,RL 只放大统计上与高分相关的行为——检查不是被教的,是被选择出来的,像进化筛出眼睛。(训练算法 GRPO 则是砍掉 PPO 的 value model,改为同一道题采样一组输出互相当 baseline,成本大降。)
两个注脚:“涌现”并非无中生有,RL 是放大器不是造物主;R1-Zero 本身可读性差、中英混杂,最终产品 R1 还是加了少量冷启动 SFT——“零数据”是真的,产品喂了一点引子。
回到主线:ReAct 时代思维链是 prompt 出来的,R1 时代是 RL 激励出来的——同一个东西,获取方式的范式转移,Claude 的 extended thinking 正是合流后的形态。
自发建立多agent任务
在多 Agent 系统中,顶层的“主 Agent”(Orchestrator)在初始化时,会被赋予一套极其详尽的元提示词(Meta-prompt)。这套指令明确告诉它:
- 角色定位:你是一个项目管理者/架构师,而不是单纯的问答助手。
- 能力边界:你有权调用某些特定的工具(Tools),或者在内部模拟不同的专家角色(如代码编写员、测试员、代码审查员)。
- 工作流协议:面对复杂任务时,必须先规划(Plan),再分解(Decompose),最后分发和聚合。
“自发”体现在派生时机:不需要用户指定,主 Agent 判断任务适合并行或隔离时,自己决定派生子 Agent——派生本身就是它的一个 Action,子 Agent 内部再跑完整的 ReAct 循环,循环套循环,像分形。
多 Agent 真正的动机是上下文隔离:子任务(比如通读几十个文件)在子 Agent 自己的上下文窗口里烧掉,主 Agent 只收回一份摘要报告,自己的 200k 预算不被动穿——这是第一节滚动缓冲区压力的解药。但代价是信息双向流失:子 Agent 只知道主 Agent 写给它的提示词,主 Agent 只拿回它的总结,细节两头丢。所以派生并不免费,滥用会得到一堆自信但缺细节的结论。
关于使用命令工具
工具的定义(JSON Schema)第一节已经见过,这里看一次完整的循环怎么走。以“帮我运行单元测试并修复报错”为例:
- 用户消息进上下文,模型决定跑测试,发出 tool_use:bash(npm test);
- 框架过权限门、执行命令,把 Traceback 原文包成 tool_result 回填——这是 Observation;
- 模型读 Traceback,定位到出错的那一行——这是 Thought;
- 发出 tool_use 改文件,再跑一次测试验证——又是 Action;
- 测试通过,输出总结答复,循环结束。
命令工具的价值就在这一步步回流里:模型的每个行动都被真实环境校正,而不是靠猜。这也是第一节 JSON 里那三条消息的展开。
缓存命中率
Claude 的缓存机制:把输入上下文里靠前、稳定不变的 token 段(system prompt、工具定义、固定的角色指令、长文档前置部分),在第一次传入后,在 Anthropic 侧的服务器上缓存这个 KV Cache(键值缓存,Transformer 注意力的 KV)。
- 重点:它不是普通 HTTP 缓存(缓存完整响应文本),是 Transformer 内部的 KV 缓存。
- Transformer 推理时,每一个 token 都会计算 Key、Value,用来做注意力计算;KV 就是这个注意力状态。
- 当你下一次请求,开头一段 token 序列和上一次完全一样 → 这一段不用重新跑前向计算,直接复用已经算好的 KV。
失效规则和命中同样重要,三条:
- 断点是 token 级的:不是全有全无——从第一个不同的 token 起,之后全部重算。所以内容排布要精确:稳定的放前,易变的放后,一处抖动毁掉后面整段。
- /compact 是最大杀器:压缩用摘要重写了历史,前缀全变,缓存整体报废——第一节说的代价在这里兑现。
- 价差给动机:缓存写约 1.25 倍、命中读约 0.1 倍于普通输入价。三层结构把规约放最前、交互放最后,本质是被 10 倍价差规定的经济学。
评论