核心思想
类比
原子思维 = "推理的 SQL"
正如 SQL 将复杂的数据操作拆分为原子的、可组合的语句一样,AoT 将推理拆分为最小的、可执行的步骤。
什么是原子?
原子(atom)是最小的推理单元,它:
- 表达一个想法
- 可以独立验证
- 可以确定性执行
- 无法隐藏错误
示例
非原子(复合语句):
"Search for rooms in Graz and filter by capacity"
原子(独立步骤):
1. Search for rooms in Graz
2. Filter rooms by minimum capacity of 30
三层架构
为什么分离很重要
传统 LLM 方法(ReAct)
原子思维方法
心智模型
| 烹饪 | 编程 |
|---|---|
| 食谱(AoT 计划) | 算法 |
| "烧开水" | boilWater() |
| "加入意面" | addPasta() |
| "煮 8 分钟" | cook(8) |
对比:
| 即兴发挥 | 自然语言 |
|---|---|
| "做顿晚餐" | "自己想办法" |
| (自己琢磨) | (产生幻觉) |
原子结构
{
"id": 2,
"kind": "tool", // tool | decision | final
"name": "multiply", // operation name
"input": { // explicit inputs
"a": "<result_of_1>", // reference to previous result
"b": 3
},
"dependsOn": [1] // must wait for atom 1
}
id:确定执行顺序kind:分类操作类型name:引用可执行函数input:使数据流显式化dependsOn:声明依赖关系
依赖图
原子构成一个有向无环图(DAG):
- 可以按拓扑顺序执行
- 可以并行化独立分支
- 失败时停止在失败的节点
- 易于可视化和调试
状态管理
const state = {};
// 原子 1 执行后
state[1] = 22; // add(15, 7) 的结果
// 原子 2 执行后
state[2] = 66; // multiply(22, 3) 的结果
// 原子 3 执行后
state[3] = 56; // subtract(66, 10) 的结果
- 显式(键值映射)
- 每个原子不可变(不覆盖)
- 可追溯(完整历史)
- 可检查(用于调试)
对比:AoT 与 ReAct
问题:"(15 + 7) * 3 - 10 等于多少?"
ReAct 输出(文本):
Thought: I need to add 15 and 7 first
Action: add(15, 7)
Observation: 22
Thought: Now multiply by 3
Action: multiply(22, 3)
Observation: 66
Thought: Finally subtract 10
Action: subtract(66, 10)
Observation: 56
Answer: 56
AoT 输出(JSON):
{
"atoms": [
{"id": 1, "kind": "tool", "name": "add", "input": {"a": 15, "b": 7}},
{"id": 2, "kind": "tool", "name": "multiply", "input": {"a": "<result_of_1>", "b": 3}, "dependsOn": [1]},
{"id": 3, "kind": "tool", "name": "subtract", "input": {"a": "<result_of_2>", "b": 10}, "dependsOn": [2]},
{"id": 4, "kind": "final", "name": "report", "dependsOn": [3]}
]
}
关键区别
| 方面 | ReAct | AoT |
|---|---|---|
| 格式 | 自然语言 | 结构化数据 |
| 验证 | 不可能 | 执行前验证 |
| 测试 | 模拟整个 LLM | 独立测试执行器 |
| 调试 | 阅读文本 | 检查第 N 个原子 |
| 重放 | 重新运行整个对话 | 从任意原子重新运行 |
| 审计轨迹 | 对话历史 | 数据结构 |
AoT 的适用场景
✅
非常适合
多步骤工作流、API 编排、金融交易、合规敏感系统、生产环境智能体
❌
不太适合
创意写作、开放式探索、头脑风暴、单步查询
隐藏优势:可调试性
ReAct 调试
"模型在第 7 次迭代中说了些奇怪的话"
→ 重新阅读整个对话
→ 猜测哪里出了问题
→ 希望不会再发生
AoT 调试
"原子 3 失败,错误:'Division by zero'"
→ 查看原子 3 的输入
→ 检查这些输入来自哪里(原子 1、2)
→ 修复工具或添加验证
→ 从原子 3 重新运行
总结
ReAct 的问题是:"一个智能体接下来会说什么?"
AoT 的问题是:"最小的、可执行的计划是什么?"
对于生产系统,你需要的是第二个问题。