SOURCE TEXT / FULL VERSION

VibeCoding 的不可能三角

这个“不可能三角”很适合描述 Vibe Coding:

> **效率、速度、Token 消耗,通常很难同时做到最优。**

更准确一点,可以把它定义成:

* **效率**:一次任务真正完成到可用状态的概率,包括正确性、修改次数、返工成本。
* **速度**:从下达任务到拿到结果的时间。
* **Token 消耗**:模型读取上下文、推理、工具调用、输出所消耗的总 token,也基本对应成本。

三者的冲突,本质上来自一个事实:

> AI 要想“更懂你的项目”,就必须读更多;
> 要想“更快”,就不能每次都读很多、想很久;
> 要想“更省 Token”,就必须减少上下文、减少尝试,但这样又可能增加返工。

## 一个很典型的例子

假设你对 Codex / Claude Code 说:

> 给现有 Spring Boot 项目增加“设备缺陷管理”功能。

### 模式 A:追求速度

Agent 只看当前几个文件:

```text
Controller
Service
Entity
Repository
```

然后直接写。

优点:

```text
速度 ★★★★★
Token ★★★★★(省)
```

但很容易出现:

```text
Result<T> 没遵循
异常体系没遵循
权限体系没遵循
DTO 命名不一致
数据库字段规范不一致
已有工具类重复造轮子
```

于是:

```text
第一次 2 分钟
修改 5 次
总共 20 分钟
```

所以:

> **局部速度快,不代表整体效率高。**

---

### 模式 B:追求一次成功率

Agent 先读:

```text
AGENTS.md
README
pom.xml
项目目录
已有类似模块
统一返回值
异常体系
权限代码
数据库 migration
测试
```

可能先消费:

```text
50K~200K tokens
```

然后再实现。

结果很可能:

```text
第一次就完成 80~95%
```

特点:

```text
效率 ★★★★★
速度 ★★★
Token ★★
```

这实际上是很多成熟 Vibe Coding 工作流的选择。

---

### 模式 C:极端省 Token

只给:

```text
需求
+
3 个相关文件
+
几条 Rules
```

特点:

```text
Token ★★★★★
速度 ★★★★
```

但是依赖于一个前提:

> **你本人必须非常清楚到底哪些上下文是重要的。**

否则 Agent 会因为缺少信息而猜。

这就引出了我认为 Vibe Coding 最关键的一件事。

# 真正优化的不是 Token,而是“有效 Token”

很多人会看:

```text
这次 Agent 用了 200K token
```

觉得很浪费。

其实应该看:

```text
有效工作 / Token
```

也就是我称之为:

> **Token Efficiency / Token ROI**

例如:

### Agent A

用了:

```text
50K tokens
```

但因为上下文不足:

```text
生成
→ 报错
→ 修复
→ 又错
→ 查项目
→ 重构
→ 测试
```

最终:

```text
250K tokens
```

### Agent B

开始先花:

```text
120K
```

理解项目。

然后:

```text
一次完成
```

总共:

```text
170K
```

所以:

> **“少读上下文”经常是假节省。**

这一点在大型 Java 项目尤其明显。

---

# Vibe Coding 最容易出现的 Token 黑洞

我觉得主要有 5 类。

### 第一类:每次重新理解整个项目

例如每个 Task 都:

```text
扫描 repo
读取 README
读取 pom
搜索类
分析架构
```

这是最明显的浪费。

解决办法就是你上一问提到的:

```text
Rules
AGENTS.md
Architecture.md
Repo Map
```

把稳定知识压缩掉。

原来需要:

```text
读取 80 个文件
↓
70K token
```

可以变成:

```text
读取 AGENTS.md
↓
5K token
```

所以 Rules 本质上不仅仅是规范。

它其实还是:

> **上下文压缩技术。**

---

# 第二类:超长会话

这也是你之前问 Codex 长会话是否需要归档的核心原因。

比如一个会话:

```text
Turn 1   10K
Turn 2   30K
Turn 3   60K
Turn 4   100K
Turn 5   150K
...
```

后面的任务哪怕只是:

> 改一个 Controller。

Agent 每轮都有可能背着巨大的历史上下文。

于是出现:

```text
简单修改
↓
几十万 token
```

而且长上下文还有另一个问题:

> **Context ≠ Attention。**

上下文越大,模型未必越聪明。

大量无关历史反而形成:

```text
Context Noise
```

因此我非常赞成:

```text
一个目标
=
一个相对独立的 Session
```

而不是:

```text
整个项目
=
一个永不结束的 Session
```

---

# 第三类:Agent 无目标探索

这类特别烧 Token。

比如:

> 帮我看看这个项目有什么问题。

Agent 可能开始:

```text
ls
find
grep
cat
search
read
search
read
```

十几二十轮工具调用。

你会看到它似乎很勤奋,但实际上:

> 搜索空间没有被约束。

如果改成:

> 检查订单查询接口为什么超过 5 秒,重点看 PostgreSQL SQL、索引和 JPA 查询,先定位问题,不要修改代码。

搜索空间一下缩小。

于是:

```text
Token ↓
速度 ↑
准确率 ↑
```

这是一种少见的:

> **三者同时改善。**

所以 Vibe Coding 最大的杠杆其实不是模型,而是:

> **Task Definition Quality。**

---

# 第四类:让最强模型干所有事情

例如全程 GPT-5.6 / Opus 级模型:

```text
找文件
改 import
格式化
写 DTO
分析架构
Debug
```

这其实很浪费。

更合理的是:

```text
简单任务 → Flash/Fast 模型

中等编码 → 主力 coding 模型

复杂 Debug / 架构 → Pro/Reasoning 模型
```

这就是:

> **Model Routing**

成熟 AI Coding 最终一定会变成这种模式。

类似传统计算机:

```text
CPU
GPU
Cache
RAM
Disk
```

不是所有东西都放 GPU 算。

---

# 第五类:让 Agent 无限自我修复

例如:

```text
实现
↓
build
↓
error
↓
修
↓
build
↓
error
↓
修
↓
test
↓
error
...
```

如果方向本身错了,就会形成:

> Agent Loop。

这种时候:

```text
Token ↑↑↑
时间 ↑↑↑
效率 ↓↓↓
```

比较好的机制应该是:

```text
连续失败 2~3 次

↓

停止编码

↓

重新分析 root cause

↓

再继续
```

这实际上是 Agent Workflow 设计问题。

---

# 所以三角真正应该这样理解

我更愿意画成:

```text
                 一次成功率 / 效率
                       ▲
                      / \
                     /   \
                    /     \
                   /       \
                  /         \
                 /           \
                /             \
               /               \
        速度 ◀────────────────▶ Token成本
```

你不可能无限同时优化三者。

但是可以通过:

```text
Rules
Repo Map
Context Engineering
Model Routing
Task Decomposition
Session Management
```

把整个三角形**向外推**。

这点非常重要。

“不可能三角”不是说:

> 三选二。

更准确是:

> **在既定模型和工作流下存在 Pareto Frontier。**

好的 Vibe Coding 工程体系,就是不断把这个 Frontier 往外推。

---

# 举个非常实际的优化过程

最原始:

```text
Prompt
↓
Agent
↓
整个 Repo
```

可能表现:

| 指标    | 表现 |
| ----- | -- |
| 速度    | 低  |
| Token | 很高 |
| 成功率   | 中  |

升级成:

```text
Prompt
+
Rules
+
Repo Map
+
Relevant Files
↓
Agent
```

变成:

| 指标    | 表现 |
| ----- | -- |
| 速度    | 高  |
| Token | 中  |
| 成功率   | 高  |

再加入:

```text
Task decomposition
+
Model routing
+
自动测试
+
失败熔断
```

可能进一步变成:

```text
               Planner
                  │
          ┌───────┴───────┐
          ↓               ↓
     Context Select     Task Split
          │               │
          └───────┬───────┘
                  ↓
             Coding Agent
                  ↓
              Test Agent
                  ↓
             Review Agent
```

这才是真正的企业级 Vibe Coding。

---

## 我认为最值得追求的不是“速度最快”

而是一个指标:

> **完成一个可交付 Task 的总成本。**

可以写成:

```text
Task Cost
=
模型调用成本
+
Token
+
等待时间
+
人工介入
+
返工成本
```

甚至还应该算:

```text
Defect Cost
```

如果一个模型:

```text
30秒
10万 token
```

完成,但是你后面人工修 1 小时,

它其实非常贵。

另一个模型:

```text
3分钟
30万 token
```

但一次完成,

反而便宜得多。

所以对于专业开发者,我会把排序定成:

```text
1. 正确完成
2. 少人工干预
3. 总耗时
4. Token成本
5. 单次响应速度
```

而不是很多 Vibe Coding 产品宣传里的:

```text
Tokens/sec
```

Tokens/sec 更多体现的是“体感爽不爽”,不等于工程生产力。

---

你还可以进一步把这个“不可能三角”细化成我认为更有价值的一个 **Vibe Coding 五维模型**:

```text
        正确率
          ▲
          │
上下文 ──┼── 速度
          │
    Token │ 人工干预
```

最后真正要优化的是:

> **单位人工介入下,AI 完成的有效工程量。**

这其实已经不是单纯的“哪个模型更聪明”的问题,而是 **Context Engineering + Agent Engineering + Software Engineering 三者的交叉问题**。

而且这里面有一个很反直觉的结论:**模型上下文从 200K 发展到 1M 以后,Vibe Coding 下一阶段最大的竞争点可能不再是谁能“塞更多 Token”,而是谁能“更少地读、但恰好读对”。**这也是 Rules、Repo Map、Semantic Search、Sub-Agent、Context Compaction 越来越重要的原因。
返回 PPT:不可能三角与五维模型 ↗