为何 LLM 能"读懂"DOT?为何 DOT 比散文更有效?背后是 LLM 训练数据的语料富集、Tokenization 友好性、形状语义的多模态先验,以及形式语言理论的降维之作。
Superpowers 在核心 skill 中嵌入大量 DOT graph,不是为了好看 —— 它是一种针对 LLM 行为约束的提示工程技术。
本文要论证四件事:
① AI 能理解 DOT —— 因为它在训练数据中富集、tokenization 友好、形状语义有先验。
② DOT 比散文更有效 —— 把决策路径离散化、消除指代歧义、压缩 token、形成不可绕过的状态机。
③ 背后是形式语言理论 + 认知负荷理论 + format priming 的综合应用。
④ 项目内有真实 A/B 实证(commit 9d2b886)。
DOT graph 是 LLM 行为约束的"领域专用语言(DSL)"—— 它把 prompt 从自然语言降维到正则语言,把 agent 的行为从"建议遵守"提升到"沿边必经"。
人类看到 DOT 是先视觉渲染再理解。LLM 没有视觉系统 —— 那它为何还能正确解析"决策树"语义?答案有三层。
->、[shape=...]、[label="..."] 在主流 BPE tokenizer 中是少数稳定 token,不会被切碎。
-> 这个 token 在训练数据中语义分布极其集中:C/C++ 成员访问、graphviz、数学逻辑蕴含、UML、Haskell 类型签名 —— 它本身就携带"A 引出 B"的语义先验,不像散文中的 "then"、"and"。
.dot / .gv 文件、Wikipedia 状态机文章、graphviz 学术示例、编译器 CFG、StackOverflow 几万问答。
这意味着 DOT 是 LLM 训练时见过最多的"图描述语言" —— 它的语法和语义已被深度内化到模型权重中。
A -> B 天然就是一个 attention 模式——attention head 容易学到"看到 ->,就把右侧节点聚合到当前位置"。
而散文中 "if A happens, then B follows but only when C is true unless..." 把同一关系埋在 10+ 个非语义 token 后,attention 不容易锁定。
DOT 允许节点定义和边定义任意顺序。把同一段 DOT 完全打乱顺序,语义对 LLM 来说完全等价—— 它能正确解析图结构,与文本顺序无关。
这说明 LLM 不是把 DOT 当字符串处理,而是真的在内部建立了图的拓扑表示。
这与 Anthropic 的可解释性研究一致:复杂结构化输入会激活 LLM 中专门的"组合电路"。
逐项展开 DOT 相比散文的优势。每一条都对应一种 agent 在散文中可能产生的失败模式。
散文版包含的歧义:"consider whether"——必须做还是可以做?"if so, refactor"——refactor 谁?"otherwise"——指代什么?"be careful about"——怎么 careful?
每个决策只有有限个出边,每条边都有显式 label,没有"otherwise / consider / be careful"的逃生口。
LLM 在散文中常见的失败:跳过中间步骤、重新解读规则、提前终止。DOT 把流程编码为有限状态机——每个状态是节点,状态转移必须通过显式的边,终点节点(doublecircle)是唯一合法的"结束"。
这与形式语言理论(Formal Language Theory)直接相关:DOT 描述的图在语义上是有限状态自动机,agent 的行为被限制在图的可达路径内。
这些形状的语义先验已经在 LLM 预训练阶段被编码进权重。当 SKILL.md 写 "NEVER use git add -A" [shape=octagon, fillcolor=red],LLM 不需要查 dot 文档就知道这是警告——octagon、red、fillcolor 这些 token 组合在训练语料中等价于"危险/停止"。
| 形状 | DOT 名 | 语义 | 训练数据来源 |
|---|---|---|---|
| box | 行为 / 动作 | 流程图标准 | |
| diamond | 决策 | 流程图教科书 / UML 活动图 | |
| octagon (red) | 警告 / STOP | 道路标志 / 安全文档 | |
| doublecircle | 入口 / 出口 | 自动机理论中的接受状态 | |
| ellipse | 状态 | UML 状态图 | |
| plaintext | 字面命令 | shell 文档约定 |
语义压缩:用 4-5 个 token 替代了一段散文("This is an EXTREMELY important warning, you must absolutely never...")。
Superpowers 的做法是反向的:不是让 LLM 自己生成图(Tree of Thoughts、Graph of Thoughts),而是把图作为约束预先放进 prompt —— agent 沿图行动,无需自己规划。
散文中常见 "...do this, then check it, if it fails, retry that step..." —— "this"、"it"、"that" 指代什么?人类靠上下文,LLM 靠 attention,但都有出错可能。
DOT 中所有引用都是节点字符串字面量:"Run test" -> "Test passes?" —— 字符串完全匹配,没有指代消解的空间,attention 锁定 100%。这在 NLP 领域称为 anaphora resolution,是自然语言理解的经典难题之一,DOT 直接绕过了它。
实测对比(subagent-driven-development/SKILL.md):
密度高的内容在 attention 中权重更高 —— 10 个 token 的关键决策比埋在 50 个 token 散文中的同一决策更易触发 agent 关注。
同一段 DOT 既能让 agent 读懂,也能让人类用 dot -Tsvg 渲染成图来审查。文档作者修改 SKILL.md 时,可以渲染图看自己的设计意图是否清晰 —— 这种"自我审查"循环散文做不到。
项目专门为此提供了 render-graphs.js 工具,输入 SKILL.md 路径即可批量生成 SVG。
DOT 提示工程不是凭空发明,而是建立在多个学科基础之上的综合应用。
Superpowers 的创新:把 LLM 的 prompt-following 行为也建模为 FSM。每个 SKILL.md 是一个"程序",每个 dot graph 是这个程序的 CFG。
参考 [Min et al., 2022]:format 对 ICL 的影响超过 content 本身。DOT 让 agent 进入"按节点遍历"的思维模式,减少创造性偏离。
DOT 把这些隐式工作显式化:节点和边把句法解析做完,字面量引用消除指代消解,[label="yes"] 把语义直接写在边上 —— 给 agent 留更多 attention 处理本质问题。
如果用乔姆斯基语言层级看,Superpowers 的关键洞察是:把 prompt 从 0 型(散文)"降维"到 3 型(DOT/FSM) —— LLM 的输出空间也随之被约束。
| 层级 | 类型 | 例子 | 描述能力 |
|---|---|---|---|
| 0 | 无限制 | 自然语言、英文散文 | 最强 / 最易歧义 |
| 1 | 上下文有关 | XML 嵌套规则 | 强 |
| 2 | 上下文无关 | 程序语言、JSON | 中 |
| 3 | 正则 / FSM | DOT graph、正则表达式 | 受限 / 最少歧义 ★ |
输入语言层级越受限,输出空间越受限 —— 这就是为什么 dot graph 能减少 hallucination 和 deviation。
近期可解释性研究发现 Transformer 内部存在专门处理结构化输入的 attention 电路:Induction heads(识别重复模式)、Successor heads(识别 a→b→c 序列)、Composition circuits(组合多步推理)。DOT 的 A -> B -> C 模式天然激活这些电路 —— 这是结构化 prompt 比散文更有效的微观机制。
Superpowers 不是基于理论推断使用 DOT,而是经过实证验证。以下是 git 历史中可追溯的证据。
9d2b886 — Add spec review loop to checklist and flow diagram这是一次自然的 A/B 测试:
修复:把同一个步骤同时加进 checklist 和 dot graph,agent 立即开始遵守。
030a222 — Description trap 现象当 skill 的 YAML description 总结了 workflow,agent 倾向于读 description 就停下,忽略下面的 flowchart。
修复方法:把 description 改为只描述触发条件,不做 workflow 总结,强制 agent 必须读 graph。
这反向证明:当 description(散文)和 graph 冲突时,agent 倾向于跟散文走 —— 所以不能让散文偷跑在 graph 前面。
v4.0.0 单版本 39 commits 中,与 DOT 相关的关键 commits:
28ba020 · Add render-graphs.js tool for visualizing skill flowchartsa9b94ae · Rewrite subagent-driven-development with executable flowcharts这是项目从"用图装饰文档"到"图就是文档主体"的范式转变。
为什么有这些禁区:Reference material 用表格更密集;Code examples 在 DOT 标签里无法 copy-paste;Linear instructions 用编号列表更清晰;无语义标签等于没有图,只是装饰。
这条规则承认 DOT 是工具不是教条 —— 用错地方反而降低 agent 理解。
8e38ab8 — Simplify brainstorming skill to match original vision项目早期曾尝试用 6-stage 流程图大规模引导 brainstorming,结果是机械化执行而失去对话感。
教训:DOT graph 的最佳用途是决策点和分支("该往哪走?"),而不是线性的 step-by-step 教程("按 1234 做")。
把 DOT 提示工程放在 Structured Prompting 流派的版图中。
| 方法 | 思路 | 与 Superpowers DOT 的关系 |
|---|---|---|
| Chain of Thought (CoT) | 让 LLM 显式推理 | 互补 — CoT 是输出端,DOT 是输入端 |
| Tree of Thoughts (ToT) | LLM 在分支上探索 | 互补 — ToT 让 LLM 生成树,DOT 给 LLM 树 |
| Graph of Thoughts (GoT) | 用图组织思考 | 最接近 — 但 GoT 让 LLM 生成图,DOT 让 LLM 沿图走 |
| Program-of-Thought (PoT) | 输出可执行代码 | 互补 — PoT 输出程序,DOT 输入程序 |
| Constrained Generation | 解码层约束 | 互补 — 不修改解码,纯 prompt 实现 |
Superpowers 的独特位置:它是输入端的图约束——不修改模型、不修改解码,纯靠 prompt engineering 实现行为约束。
| 维度 | DOT | Mermaid |
|---|---|---|
| 训练语料规模 | ★★★ 大 | ★★ 中 |
| LLM 解析能力 | ★★★ 强 | ★★ 中 |
| 形状语义化 | ★★★ 丰富 | ★ 有限 |
| 渲染工具 | dot CLI | mermaid-cli |
| GitHub 内联渲染 | ✗ 无 | ✓ 有 |
Mermaid 的优势是 GitHub 渲染好看,但这是给人类的好处,对 agent 没用。DOT 的训练数据规模和形状语义丰富度更适合 LLM。
基于以上理论和项目实践,给出实操判定。
DOT 不是万能。承认局限是工程严肃性的一部分。
目前 Superpowers 选择的 DOT 是 2025 年 LLM 时代下"成熟度 / 效果 / 成本"的最优解。可能的扩展方向包括 Petri net(并发)、TLA+ 风格的状态约束、多模态 DOT + 真实渲染图。
把所有理论与实证压缩为带得走的核心论断。
DOT graph 在 Superpowers 中扮演的角色,是 LLM 行为约束的"领域专用语言(DSL)"—— 它把 prompt 从自然语言降维到正则语言,把 agent 的行为从模糊的"建议遵守"提升到结构化的"必经路径"。
三大理论根基:形式语言 / FSM · 把 prompt 降维到正则层级。In-Context Format Priming · 格式影响输出。Cognitive Load Theory · 把隐式工作显式化。
实证证据链:9d2b886 graph > prose A/B 实证 · 030a222 description trap 反向证据 · a9b94ae v4.0.0 引入完整 DOT 体系 · 8e38ab8 过度结构化的反例教训。