03
相变 · Phase Transition
统计物理 · 用于发现系统临界点
核心直觉
水在 99°C → 100°C 发生质变,不是量变
Agent 系统在某个临界点发生质变,不是线性退化
关键:找到你系统的相变点,在它之前设置硬限制
永远不要做线性外推("再多加一点应该没问题")
Claude Code 中的三类相变点
| 变量 | 相变表现 | 典型临界点 | 处理方式 |
|---|---|---|---|
| Context 长度 | 质量从 8/10 突然跌到 3/10 | ~60-80% 窗口上限 | 硬截断 + 摘要压缩 |
| Prompt 复杂度 | 模型开始幻觉、跳过指令 | 约 15+ 条规则 | 分层 prompt + 子 agent |
| 并发 Agent 数量 | 协调延迟 > 并行收益 | 通信复杂度 O(n²) 拐点 | 分组 + 层级编排 |
| Retry 次数 | 质量不再提升,开始循环 | 3-5 次 | 切换策略,不增加次数 |
代码模式 — 主动探测相变点
phase-detector.ts
压力测试工具
// 主动探测 Context 相变点 async function findPhaseTransition( basePrompt: string, targetTask: string, ) { const results: { tokens: number; quality: number }[] = []; const tokenLevels = [1000, 2000, 4000, 8000, 16000, 32000]; for (const tokens of tokenLevels) { const paddedPrompt = padToTokens(basePrompt, tokens); const quality = await evaluateQuality(paddedPrompt, targetTask); results.push({ tokens, quality }); // 检测相变:质量突然下降超过 30% if (results.length > 1) { const prev = results[results.length - 2]; const drop = (prev.quality - quality) / prev.quality; if (drop > 0.3) { console.log(`⚡ 相变点发现: ${tokens} tokens`); console.log(` 质量从 ${prev.quality.toFixed(1)} 跌至 ${quality.toFixed(1)}`); console.log(` 建议硬限制: ${prev.tokens} tokens`); break; } } } return results; } // 在系统中设置硬限制(不是软限制) const CONTEXT_HARD_LIMIT = 6000; // 实测相变点 × 0.75 function safeContext(messages: Message[]): Message[] { const totalTokens = countTokens(messages); if (totalTokens <= CONTEXT_HARD_LIMIT) return messages; // 不是线性截断,是结构化压缩 return [ messages[0], // system prompt 保留 ...summarizeMiddle(messages.slice(1, -4)), // 中间压缩 ...messages.slice(-4), // 最近 4 条保留 ]; }
⚠ 反模式
发现 10 个 agent 开始变慢,加到 12 个试试。这是线性外推思维。相变之后增加更多只会加剧问题,因为协调成本是 O(n²) 的。
拿走就能用 — 粘贴进你的 CLAUDE.md
CLAUDE.md
系统临界点约束
## System 临界点管理(相变原则)
### 已知的 Claude Code 相变点(设为硬限制)
- Context 长度:超过 60% 窗口上限开始压缩,到 80% 必须截断
- Prompt 规则数:不超过 15 条,超出则拆分为子 agent
- Retry 次数:最多 3 次,超出换策略而不是继续重试
- 并发 Agent 数:超过 5 个必须分组,不能扁平并发
### 设置方式:硬限制,不是软警告
- 不是"快到了提示一下",是"到了就截断/拒绝/换策略"
- 限制值 = 实测相变点 × 0.75(留安全边际)
### 禁止线性外推
- "再加几个 agent 应该没问题" → 协调成本是 O(n²)
- "context 再长一点应该还好" → 相变是突然发生的,不是线性的