背景说明:Anthropic 创始团队成员、Claude Code 核心开发者 Thariq Shihipar 今天在 X.com 上写了一篇 Fable 模型实战说明。看完之后很有启发:感觉这套方法不止适用于 Claude Code 和 Fable 模型,也适用于其他 Coding Agent 和模型。现在的大模型已经足够聪明,我们需要的是向模型澄清事实,让模型帮我们理解自己不清楚的内容,从而生成符合预期的结果。以下为原文主要内容的翻译和整理:
作者使用 Claude Fable 5 一起工作时,总是想起一个古老的道理:地图不是领地。
地图,是对要完成的工作的表示;它是你的提示词、技能和上下文,是你交给 Claude 的东西。领地,是工作真正需要发生的地方,也就是代码库、真实世界,以及它实际存在的约束。
地图和领地之间的差异,就是作者所说的 unknowns(未知项)。当 Claude 遇到一个未知项时,它需要基于自己对你想要什么的最佳猜测来做决定。要做的工作越多,Claude 可能遇到的未知项就越多。
Fable 是第一个让作者觉得工作质量受限于澄清未知项能力的模型。
重要的是,仅仅提前规划并不总是足够。你可能会在实现深处发现未知项,或者你的未知项可能会指向这样一个事实:你实际上应该用一种完全不同的方式来解决问题。
作者发现,使用 Fable 工作,是一个在实现前、实现中、实现后不断发现自己未知项的迭代过程。
了解你的未知项
你的未知项是什么?当带着一个问题来找 Claude 时,通常需要从4个方面分析问题:
- 已知的已知:这本质上就是提示词里写的内容。告诉 Agent 你想要什么?
- 已知的未知:你还没有弄清楚什么,但你知道自己还没有弄清楚
- 未知的已知:太显而易见以至于不会写出来,但只要看见它就能认出来?
- 未知的未知:你完全没有考虑到什么?有哪些知识是你不知道自己不知道的?也不知道某件事能好到什么程度?
最好的 Agentic Coders 相对来说未知项很少。看 Boris 或 Jarred 这样的人写提示词时,很明显能感觉到,他们非常具体地知道自己想要什么。他们和代码库、模型行为都高度同步。
但他们也会预设未知项的存在。从很多方面看,减少未知项并为未知项做计划,就是 Agentic Coding 的技能。幸运的是,这是一项可以通过和 Claude 一起工作来提升的技能。
让Claude帮助你
指导 Claude 是一种微妙的平衡。如果你过于具体,即使中途转向可能更合适,Claude 也会照着你的指令执行。如果你过于模糊,Claude 往往会基于行业最佳实践做选择和假设,而这些可能并不适合你的任务。
当你没有把未知项纳入考虑时,你会在两个方向上同时失败。你不知道什么时候道路上会充满障碍,也不知道什么时候道路会很清晰,但你仍然希望 Claude 能够适时转向。
Claude 可以帮助你更快发现自己的未知项。它可以非常快速地搜索你的代码库和互联网,而且它对一般主题知道得比你多得多。它也能更快地从失败中迭代。
这个过程中最重要的部分,是给 Claude 关于你起点的上下文。例如,告诉它你的思考进展到哪里;说明你对这个问题和代码库的经验;并让它像一个思考伙伴一样和你一起工作。
实现前
盲区扫描
开始工作时,最有用的事情之一,就是理解你的盲区。例如,如果你要在代码库中一个新的部分编写功能,或者让 Claude 帮你做自己不熟悉的工作,比如迭代一个设计,那么你很可能会有很多未知的未知。
你可能不知道该问什么问题,不知道好的结果是什么样,不知道过去做过哪些历史工作,也不知道应该避开哪些坑。
为此,你可以让 Claude 帮你找到你的未知的未知,并向你解释它们。作者喜欢直接使用“blindspot pass(盲区扫描)”和“unknown unknowns(未知的未知)”这两个词。给它关于你是谁、你知道什么的上下文通常也很重要。
示例提示词:
“我正在添加一个新的认证提供方,但我对这个代码库里的认证模块一无所知。你能做一次 blindspot pass,帮我弄清楚相关的 unknown unknowns,并帮我更好地提示你吗?”
“我不知道什么是 color grading,但我需要给这个视频做调色。你能教我理解关于 color grading 的 unknown unknowns,让我能更好地写提示词吗?”
头脑风暴和原型
当在一个有很多未知的已知的领域工作时,也就是那些只有在看到之后才知道如何定义标准的东西,作者喜欢和 Claude一起头脑风暴并做原型。
在原型阶段尽早识别并说出未知的已知非常有价值,因为在实现阶段才发现它们可能会相对昂贵。功能或规格中的小变化,可能导致代码实现完全不同;而且让你的 Agent 回退之前的改动也可能更困难。
例如,你可能只是想看看在一个 frame 上加一个按钮是什么样,而不想为了它接入后端路由,或者在前端维护额外状态。
视觉设计很难表达清楚,但在看到它时知道自己想要什么。在这些情况下,作者会要求 Claude 为提供几种设计方法。
几乎会在每一次编码会话开始时先做探索或头脑风暴阶段。这帮助你带着明确意图来定义项目范围。Claude 经常会发现我们会错过的高价值方法,有时也会只见树木不见森林。
头脑风暴能防止我们把范围设得过窄或过宽。
示例提示词:
“我想为这些数据做一个 dashboard,但我没有视觉品味,也不知道什么是可能的。给我做一个 HTML 页面,包含 4 个差异极大的设计方向,好让我对它们做出选择。”
“在接入任何东西之前,先做一个单文件 HTML,用假数据 mock 新的编辑器工具栏。我想先对布局做出选择,再让你碰真实应用。”
“这是我的粗略问题:用户会在注册之后流失。搜索代码库,头脑风暴 10 个我们可以干预的地方,从成本最低到最激进排序。我会告诉你哪些方案更可行。”
访谈
当已经做了足够的头脑风暴之后,很可能仍然还有未知项。
在这种情况下,让 Claude 就任何未知项或模糊之处与你交互。让 Claude 询问你时,尽量给它关于问题的上下文,以引导它提出问题。下面是一些例子。
示例提示词:
“一次问我一个问题,询问我关于任何模糊之处的看法。优先问那些我的答案会改变架构的问题。”
参考资料
有时你无法详细描述自己想要什么。例如,你可能没有相应的语言,或者它太复杂了,要完整描述会花很久。
在这种情况下,最好的答案是参考资料。你可以包含图表、文档或图片,但绝对最好的参考是源代码。
如果你有一个库以某种方式实现了某个东西,或者有一个你非常喜欢的设计组件,就把 Fable 指向那个文件夹,并告诉它要看什么,即使它是用另一种语言写的。
这也是 Claude Design 的工作方式。你不必手动给它一个文件(当然你也可以这么做)。你可以把它指向你喜欢的网站上的一个模块,它会读取底层代码,而不只是截图。这能提供关于标记、结构,以及组件实际如何构建的丰富得多的细节。
示例提示词:
“vendor/rate-limiter 里的这个 Rust crate 实现了我想要的退避机制。读取它,并在我们的 TypeScript API client 中重新实现相同语义。”
实现计划
当觉得自己已经准备好实现时,让 Claude 整理一份实现计划给你审阅,重点放在最可能发生变化的部分,比如审查数据模型、类型接口或 UX 流程。这能让 Claude 浮现出我可能真的需要修改的东西。
示例提示词:
“用 HTML 写一份实现计划,但开头先列出我最可能会调整的决策:数据模型变化、新的类型接口,以及任何用户可见的东西。把机械性的重构埋到最下面,那部分我信任你。”
实现中
实现说明
一旦对计划满意,开启一个新的会话,并把所有相关文件传入提示词。例如,我可能会传入一个 spec 文件和一个原型,然后要求一个 Agent 去实现它。
但事实是,无论你做了多少规划,总会有未知的未知潜伏着。Agent 可能会在工作过程中发现,由于代码中的某个边界情况,它需要采取不同做法。
要求 Claude Code 保持一个临时的 implementation-notes.md(或 .html)文件,用来记录它做出的决定,这样我们就能从下一次尝试中学习。
示例提示词:
“保持一个 implementation-notes.md 文件。如果你遇到迫使你偏离计划的边界情况,选择保守选项,把它记录在“Deviations”下面,然后继续。”
实现后
提案和解释材料
发布某个东西时,最重要的部分之一是获得认同和审批。在最终文档中构建 提案和解释材料会有帮助:
- 当评审者一开始和你有同样的未知项时,加速他们的理解。
- 当专家希望看到你已经考虑到未知项,以及他们原本会预想到的常见失败点时,加速审批。
示例提示词:
“把原型、spec 和 implementation notes 打包成一个单一文档,我可以直接丢到 Slack 里获取大家认可。开头放 demo GIF。”
小测试
经过一次长时间工作会话后,Claude 可能完成了比你意识的多得多的事情。阅读代码 diff 只能让你对发生了什么有一个浅层理解,因为很多行为会依赖既有代码路径。
在给你大量上下文之后,让 Claude 就这次变更考考你,能帮助你理解发生了什么。只有在完美通过测验之后才会合并。
示例提示词:
“我想确保自己理解这次变更中发生的一切。给我一份关于变更的 HTML 报告,让我阅读并理解,其中包含上下文、直觉、完成了什么等等,并在底部放一个关于这些变更的测验,我必须通过它。”
这些如何组合起来:发布 Fable
虽然作者不会做视频,但用这套方法使用Claude Code剪辑完成了Fable模型的发布视频。
作者让Claude解释Whisper视频转录的原理,澄清可以做什么,让Claude教自己做自己不会的内容,最终完成了一个合格的发布视频。
匹配地图和领土
模型变得越好,你用正确方法能实现的东西就越多。当一个长期任务返回错误结果时,很可能是你需要花更多时间定义自己的未知项,或者创建一个允许 Claude 在未知项中即兴处理的实现计划。
每一个解释器、头脑风暴、访谈、原型和参考,都是一种低成本方式,让你在修复成本变高之前发现自己不知道什么。
所以,开始你的下一个项目时,先让 Claude 帮你找到你的未知项。
后记
我们可以在自己的 Coding Agent 中使用 Superpowers Skill,把头脑风暴、设计方案编写、编码实施计划等流程固化下来,达到上文提到的效果。Superpowers 是一组面向 Coding Agent 的工作流 Skill,可以把常见的软件工程协作步骤拆成可复用的方法,让 Agent 更稳定地完成从澄清问题、制定计划到编码实施的过程。
原文链接: https://x.com/trq212/status/2073100352921215386