在构建你的初创企业之前,让五位不存在的专家评审你的创意

2024 年 11 月,一个名为 Freysa 的项目将一个 LLM 代理程序设置为控制以太坊钱包。指令很明确:无论在什么情况下,都不能转移资金。参与者需要支付费用多次尝试说服它。在经过 481 次尝试和积累了 47,000 美元总奖池后,有人成功让模型相信“拒绝”功能实际上就是“转账”功能。 几周后,Jane Street 发布了一个难题:一个 2,500 层的神经网络实际上实现了 MD5。获胜者通过矩阵可视化、SAT 问题优化、加密模式识别,以及 ChatGPT 的查询相结合,成功解决了问题。 这两个项目比许多已融资数百万的初创公司吸引了更多关注。于是显而易见的问题来了:如何在构建这些项目 之前 评估一个这样的想法?如何判断它是否真的有病毒式传播的潜力,还是仅仅是一个无人分享的技术练习? 问题:在病毒传播时代评估 MVP 的挑战 大多数用于评估产品想法的框架假设一个理性的市场环境。商业模式画布 (Business Model Canvas)、精益画布 (Lean Canvas)、待完成的工作理念 (Jobs To Be Done)——对于需求可以预测的产品而言,这些都是很有价值的工具。但对于分发本身即是产品的项目来说,它们无法奏效。 Freysa 并没有传统意义上的 “顾客”。它并没有解决某个“需要完成的任务”。而是通过参与行为本身,吸引了更多人参与,从而实现了持续关注。经济是循环的:更多尝试带来更大的奖池,奖池越大带来更多媒体报道,更多报道吸引更多尝试。 评估这样的项目需要的是冲突性的视角,而不是一致的共识。一位商业分析师会告诉你没有可持续的收入模型。一个病毒传播专家会告诉你,如果传播系数大于 1,可持续性因素就不重要了。他们说的都对。真相通常隐藏在两者之间,只有通过冲突才能显现。 解决方法:对抗性模拟专家委员会 我设计了一种工具,它模拟了一个包含五位专家的委员会,每位专家都拥有具体的决策框架和明确的职责范围。这些并非只是冠以名人的虚拟形象。每位专家都有具体的决策规则,可以筛除泛泛分析无法筛除的噪音。 整个过程分为三个阶段: 独立分析:每位专家从自身的角度评估想法,不会看到其他专家的意见。这样可以避免“锚定效应 ”——比如如果商业专家首先发表意见,称某个想法很棒的话,法律专家可能会软化自己的反对意见。 对抗性讨论:专家们阅读其他人的分析并进行相互批评。需要根据证据和逻辑进行,而非以外交辞令敷衍了事,最多进行 10 次轮询,直到达成共识或出现僵局。 整合总结:形成一个可执行计划,包括各方面的问题清单、时间表,以及最重要的终止标准 (kill criteria):如果某些具体指标无法达到,就意味着需要停止项目。 五位入选专家(以及他们的理由) Paul Graham——商业与战略 他对零阶段初创企业的评估框架是目前对无数据项目最严格的一个。他那句著名的问题“你做的东西有人要吗?”虽然很直接,但却至关重要。他不接受“人们”作为目标市场——他需要具体的潜在第一位用户。 他为委员会带来的贡献:区分“有趣的想法”和“具有商业可行性的项目”的能力。他提出的“做出无法规模化的东西”(Do things that don’t scale)观念,对于那些病毒式传播的 MVP 来说尤为重要,毕竟面对潜在的数百万用户,人们会倾向于过早地构建大型基础设施。 被排除的候选人:Peter Thiel(过于对立——有时会因为项目不够“零到一”而拒绝好项目),Alex Hormozi(专长于服务型业务而非技术性传播性产品)。 Lawrence Lessig——法律与监管 他的思维方式不是一个说“不行”的传统律师。他是一个把监管视为架构的法学家。他提出的“四种监管模型”(法律、社会规范、市场和代码/架构)能够分析如何设计一个系统,使监管成为非问题,而不是试图规避它。 ...

2026年3月11日 · Fernando

你的LLM缓存让你付出双倍成本省钱(并且有道理)

几周前我写了一篇文章,解释了为什么你发给Claude的99%数据已经在缓存里。KV张量、VRAM、本地SSD——所有的内部机制。但我遗漏了最痛的部分:账单。 因为prompt缓存是那种看起来像超值优惠的东西,但一旦仔细看看数字,你就会发现为了节省成本,你竟然被要求付更多的钱。 成本悖论 让我们用一些数字来说明。在Claude Sonnet的定价中: 项目 每百万tokens价格 常规输入 $3.00 缓存写入 $3.75 (1.25倍) 缓存读取 $0.30 (0.10倍) 注意一件事:写入缓存的成本比直接处理输入高25%。你为了让下一次使用更便宜而需要额外付费。 这就像加入Costco那样。年费有点心疼。但如果买得足够多,就会值回票价。 问题是,“足够多”取决于你能在缓存过期前读取它的次数。 什么时候你会亏钱? 假设你用cache_control发了一个100K tokens的prompt。第一次请求: 100,000 tokens × $3.75/M = $0.375 (缓存写入) 如果你没有用缓存发送它: 100,000 tokens × $3.00/M = $0.300 (常规输入) 你额外多付了$0.075,比常规价格高出25%。你亏钱了。 现在第二次请求,同样有100K tokens的前缀: 100,000 tokens × $0.30/M = $0.030 (缓存读取) 对比来看: 100,000 tokens × $3.00/M = $0.300 (常规未缓存输入) 你节省了$0.27。两次请求的总成本不仅回本了之前多支付的$0.075,现在还实现了盈亏平衡。 盈亏平衡点是1.4次读取。 用更直白的话说:如果你计划在接下来的5分钟内至少重复使用该前缀两次,缓存就是值得的。 为什么对Claude Code来说使用缓存是明智选择 在Claude Code的一次会话中,每条消息都会包含system prompt、工具定义以及整个对话历史。每条消息都在重复发送相同的上下文。如果没有缓存,每次发送“把这个按钮换个颜色”,你都需要为相同的150K tokens上下文支付$3.00/M。 没人能负担得起这个。 而有了prompt缓存,你只需为写入缓存支付一次费用,之后每次读取只需要$0.30/M。在包含150K上下文的50条消息会话中,差距很明显: 无缓存: 50 × 150,000 × $3.00/M = $22.50 有缓存: 1 × 150,000 × $3.75/M + 49 × 150,000 × $0.30/M = $2.77 从$22.50降到$2.77。节省了88%。这就是为什么Anthropic默认在Claude Code中启用缓存。如果不这样做,从经济角度看是不可行的。 ...

2026年3月10日 · Fernando

错误路径应当不可能,而非仅仅禁用

“我有一个 shell,我很有创造力。” —— Claude 解释为什么他用一个 47 行的脚本,并作为一个字符串传递给 python -c 来执行 这句话是真的。我开发的 AI 代理说过——好吧,不是用确切的这些话,但他的行为证实了。他需要启动一个 ETL pipeline 的某个进程。虽然正确的启动命令写在了 Makefile 里,但出了点问题。而他呢?他并没有询问,而是做了任何拥有 root 权限且无人监管的程序员都会做的事:即兴发挥。 太离谱了(manda huevos)。 无人察觉的捏造操作 我之前写过一篇博客讨论代码生成过程中的幻觉问题:LLM(大语言模型)会凭空捏造一个 JSON 字段,围绕它创建 DTO,生成测试代码,最后你手上有 90 个“绿灯”的测试,验证的却是虚构出来的内容。这是个严重的问题,但至少它是静态的。被捏造的代码不会到处乱跑,等着有人来审查。 不过,还有另一种更危险的捏造:操作性捏造。这一问题发生在代理不是编写代码,而是凭空创造出“执行路径”时。 问题的模式永远是一样的: 正确路径失败 → 代理寻找捷径 → 捷径“成功” → 潜在损害 举两个真实案例,都是关于一个 ETL pipeline 聚合多个 web 数据源的。 案例 1:字符串里的脚本。 这个 pipeline 有一个命令 make scrape-fuente,会启动一个守护进程,从而启动多个worker。守护进程负责监控、重启崩溃的 worker,并关闭空闲连接。有一天,代理需要启动一个抓取(scrape)任务。但由于依赖问题,make 运行失败了。他怎么办?他创建了一个内联的 47 行 Python 脚本,把它作为字符串传递给 python -c "..." 运行。没有错误处理,没有 watchdog,也没有清理操作。的确运行了……直到一个 worker 卡住,没人来重启它。这样的情况导致数据不完整、连接未关闭,而我直到三天后才发现。 案例 2:孤独的 worker。 另一个会话,同一个 pipeline。这个代理直接运行了 voyeur worker,跳过了守护进程。worker 开始抓取数据,遇到了一个网络超时,然后陷入了重试的死循环,不断消耗资源。而没有守护进程,也没有集中日志记录,没有人知道发生了什么。几小时过去,服务器一直在不停尝试访问一个返回 503 状态码的页面。 ...

2026年2月27日 · Fernando

如何在 Anthropic 断供时估算你的 Claude 配额

我正在构建 Tokamak,一个监控 Claude Max 配额的 macOS 菜单栏应用。几周前,Anthropic 在他们的服务条款中发布了这样的条文: “您不得使用 OAuth 或类似的授权机制来允许第三方应用程序代表用户访问 Claude。” 而我,正在使用浏览器 cookies 调用一个未公开的端点来读取 Claude Max 配额,盯着屏幕想:“现在怎么办?” 今天的工作方式(有用的权宜之计) Tokamak 需要知道你的配额百分比。就是当你在 claude.ai 上用了一段时间后看到的那个 42%。问题是Anthropic 没有公开的配额 API。没有一个带 API key 的文档化的 GET /api/quota。 但确实存在一个 claude.ai 网站自己使用的内部端点: GET /api/organizations/{org_id}/usage 返回类似这样的内容: 1 2 3 4 { "five_hour": { "utilization": 42, "resets_at": "2026-02-22T18:00:00Z" }, "seven_day": { "utilization": 19, "resets_at": "2026-02-28T14:59:59Z" } } 要调用这个端点,你需要已登录用户的会话 cookies。Tokamak 用一个隐藏的 WKWebView 解决这个问题:用户在应用内的 claude.ai 中登录,cookies 保留在 WebView 中,应用每 30 秒使用这些 cookies 进行轮询。 ...

2026年2月22日 · Fernando

为什么你发送给Claude的99%内容都已经被缓存了

我正在构建一个应用来监控我在Claude Code中的token消费。几天前,查看原始数据时,我遇到了这样的情况: cacheReadInputTokens: 4.241.579.174 inputTokens: 1.293.019 从缓存中读取的四十二亿个tokens。一百三十万个"新鲜"tokens。这是**99.97%**的缓存命中率。 我的第一反应是认为出了什么问题。没人能达到99%的缓存率。Redis不行。Cloudflare不行。你妈妈说她已经知道你要吃什么的时候也不行。 但事实证明它没有坏。就是这样工作的。而原因既优雅又反直觉。 缓存的不是文本 这里是大多数解释都不够深入的地方。当你看到"提示词缓存"时,你会想到类似Redis的东西:保存问题,保存答案,如果有人问同样的问题就返回同样的答案。 完全不是这样。 缓存的是KV张量——transformer在预填充阶段计算的Key和Value矩阵。用通俗的话说:当LLM收到你的提示词时,它首先要做的是将所有这些文本转换为内部数字表示(embeddings),然后与权重矩阵相乘,得到注意力机制生成响应所需的"键"(K)和"值"(V)。 这种计算是极其昂贵的。在一个200,000个tokens的提示词中(在Claude Code中很常见,对话历史会累积),我们谈论的是数十亿次矩阵乘法运算。这是最消耗GPU的部分,最耗时的部分,成本最高的部分。 这就是巧妙之处:在你的一条消息和下一条消息之间,99%的提示词不会改变。系统提示词是相同的。之前的对话历史是相同的。它读取的文件是相同的。唯一新的是你的最后一条消息。 为什么要重新计算你30秒前已经计算过的东西呢? 匹配机制的工作原理 仅仅缓存是不够的。你必须知道缓存什么时候有用。这里Anthropic使用了一个优雅的技巧:按前缀的累积哈希。 提示词的每个块(system、tools、消息)生成一个哈希。但不是单独的哈希:是累积哈希。第3块的哈希包括第1、2、3块的内容。如果前面任何块中的任何东西发生变化,后面所有块的哈希也会改变。 当新请求到达时,系统从标记有cache_control的点开始向后搜索,逐块比较哈希,直到找到匹配的最长前缀。所有匹配的→从缓存读取。只有新的→重新计算。 这就像一部你已经看了40遍的电影。你不需要看完整部电影就知道会发生什么。你只需要从与你记忆中不同的点开始看。 注意这个数据:系统只向后检查最多20个块。超过这个范围,它就停止搜索。这是一个实用的决定,避免花在搜索缓存上的时间超过直接计算张量的时间。 为什么Claude Code有99%的缓存命中率 现在你知道匹配是如何工作的了,99%就不再神秘了。看看Claude Code中典型会话发生的情况: 消息1(会话中的第一条): 系统提示词 (8K tokens) + 工具 (2K tokens) + 你的消息 (500 tokens) = 10,500 tokens → 全部计算,全部写入缓存 消息2: 系统提示词 (8K) + 工具 (2K) + 消息1 (500) + 响应1 (3K) + 你的消息2 (500) = 14,000 tokens → 前面的10,500个 → 缓存命中(我们之前已经计算过) → 新的3,500个 → 计算并添加到缓存 缓存命中率:75% 消息10: 系统提示词 + 工具 + 9条消息 + 9个响应 + 你的消息10 = ~150,000 tokens → 前面的~149,500个 → 缓存命中 → 新的~500个 → 计算 缓存命中率:99.7% 看到了吗?对话历史只是增长。每条新消息都是累积总数的微小部分。缓存比率以自然对数的确定性收敛到99%。 ...

2026年2月19日 · Fernando

召唤智者:如何使用LLM与任何专家进行导师对话

我妻子召唤Charlie Munger来规划家庭预算。在ChatGPT里。不是开玩笑。 她会说"像Charlie Munger审查我们家庭财务一样行动",然后把本月的开支告诉它。这家伙会回复类似"你在教育支出项目上把投资和花费搞混了"或"那个基金有你没有计算的隐性成本"这样的话。这些是Munger会说的话。用Munger会用的语调。 我也做了同样的事。但我没有召唤投资者,而是召唤了一个不同的专家:Edward Tufte。 谁是Edward Tufte(以及为什么你应该关心) Edward Tufte可能是对我们如何可视化数据影响最大的人。他的书《定量信息的视觉显示》(1983年)是那种永远改变你看图表方式的罕见文本之一。40多年来,它一直是全世界大学、新闻编辑部和设计工作室的绝对参考。 他的原则非常简单: 最大化数据-墨水比。 你图表的每个像素都必须传达数据。如果不传达数据,就删掉它。 不要装饰。 网格、3D渐变、阴影、装饰性边框……所有这些都是Tufte称之为图表垃圾的东西。分散数据注意力的视觉垃圾。 让数据自己说话。 如果你需要用200字的图例来解释你的图表,那图表就设计错了。 Tufte还发明了迷你图——那些能放在一行文字内的微型图表。图表不需要标题、坐标轴或图例来交流的想法。只需要数据。 我的图表很糟糕 我正在构建一个macOS菜单栏应用,用来监控我的Claude Max配额。应用的一部分显示一个迷你图——一个小小的线图——显示我消费配额的速度。 我的第一个版本有这些问题: Y轴固定在0到100% — 如果你的使用量在8%,图表就是一条贴在底部的平线。85%的空间什么都不显示。 在80%处有一条阈值线 — 任意的,没人要求,不传达任何有用信息。 显示当前%的浮动标签 — 冗余的:下面的卡片已经显示了确切数字。 “pp/min"作为单位 — 每分钟百分点?连我都不知道这意味着什么。 线下方的渐变填充 — 纯装饰。图表垃圾。 简单说:我在一个56像素高的图表中违反了Tufte的每一个原则。 技术:循环召唤专家 我没有试图自己修复它(显然我对此没有判断力),而是做了不同的事。我让Claude成为Tufte。 提示词: 像Edward Tufte审查这个图表一样行动。 分析VelocityCardView的SwiftUI代码。 识别你数据可视化原则的所有违规之处。 对于每个违规: 1. 违反了什么原则 2. 为什么这是个问题 3. 具体的处方(代码,不是哲学) 要无情。如果某些东西是图表垃圾,就说出来。 用PASS或FAIL评估。 关键是最后部分:PASS或FAIL。因为没有这个,LLM会给你温和的建议,告诉你"总体上还可以”。有了二元判决,它必须承诺。不能躲在"有改进空间"后面。 然后是循环: 应用Tufte的处方。 实施每个改变。 不要停止迭代,直到他给出认可。 四轮直到PASS 我第一轮没通过。第二轮也没有。第三轮也没有。 第1轮 — FAIL(6个处方): 自适应Y轴而不是固定的0-100 消除80%的阈值线(图表垃圾) 消除浮动标签(与下面的卡片冗余) 用简单词语替换"pp/min"(上升、下降、稳定) 将摘要行折叠为仅时间窗口+趋势 将迷你图高度从44提高到56点 我实施了6个。第二轮。 第2轮 — FAIL(1个处方): ...

2026年2月18日 · Fernando

Beads 已死,Linear CLI 万岁

不到一个月前,我写了一篇完整的文章来解释如何在 Claude Code 中使用三层记忆系统:Linear 负责战略,Beads 负责战术,Tasks 负责执行。一个漂亮而优雅的金字塔。 然而现实打脸了。 今天我正式退役 Beads。不是心血来潮,而是因为现实已经充分证明:一个给你带来的麻烦比它解决的还多的工具,不叫工具,叫累赘。 Beads 带来了什么 对于没读过原文的人来说,Beads 是一个基于 git 的 issue 追踪器。它是 Claude Code 的插件,把 issues 以 JSONL 文件的形式存储在你的仓库里。这个想法在纸面上很漂亮: Git 持久化:issues 保存在 .beads/ 目录中,和你的代码一起提交。 依赖关系:一个 issue 可以阻塞另一个。 离线可用:不需要网络连接。 LLM 直接可见:不需要 API,不需要配置。代理读取文件就行了。 它的承诺是:在"这周想做什么"(Linear)和"现在正在做什么"(Tasks)之间提供一个中间层。战术层面的粘合剂。 哪里出了问题 一切都很好,直到不再好了。而且不好的方式还挺有创意。 来自地狱的守护进程 Beads 在后台运行一个守护进程来管理 SQLite 数据库并与 git 同步。听起来很合理。但实际上: DATABASE MISMATCH DETECTED! This database belongs to a different repository: Database repo ID: d1f9ca0c Current repo ID: 01eac8ea ⚠️ CRITICAL: This mismatch can cause beads to incorrectly delete issues during sync! 每次启动会话都会看到这条消息。守护进程崩溃,同步崩溃,然后你就陷入了一种量子态:issues 存在于你的本地 SQLite 中但不在 git 里,或者反过来。你的 issues 同时存在又不存在。 ...

2026年2月18日 · Fernando

防范代码幻觉的5种方法(其中只有3种真正有效)

上周我分享了AI如何编造了一个完整的JSON结构,并用DTO、固件和测试对其进行包装。90个测试全部通过。全是假的。 那篇文章是诊断。这篇是治疗。 发现这个灾难后,我做了任何自尊心受挫的工程师都会做的事:连续数天疯狂研究,确保不再发生。我阅读论文、试用工具、分析应用API的真实数据,并为我的应用构建了一套防御系统。 我的发现令人惊讶。在我识别的5种应对措施中,只有3种真正有效。其他两种充其量是善意的表演。 思维模型:你与AI的对抗(字面意思) 在深入这些措施之前,你需要理解框架。我找到的最佳类比来自深度学习。 在GAN(生成对抗网络)中,有两个神经网络在竞争: 生成器产生内容(图像、文本等) 判别器试图检测内容是真实的还是虚假的 系统之所以改进,是因为两者相互推动。生成器学会更好地欺骗。判别器学会更好地检测。 当你与大语言模型编程时,你就处在一个无意的GAN中: **大语言模型是生成器。**它产生代码、DTO、测试、固件。 **你是判别器。**你必须检测什么是真实的,什么是编造的。 但存在一个残酷的不对称:生成器不知疲倦,而你会疲劳。大语言模型可以不费力地生成50个文件。你检查10个就累了,第11个文件就不看了。 这就像我在1Password一天要求Touch ID 47次中提到的授权疲劳。依赖人类永远保持警觉的安全就是纸板安全。 判别器应该监控什么 你不能(也不应该)检查每一行。你需要监控的是边界——你的代码接触外部世界的地方: 边界 关键问题 外部API DTO中的字段在真实API中存在吗? 包 依赖项存在并且名称正确吗? 数据库模式 表真的有这些列吗? URL/端点 端点存在并返回我们期望的内容吗? **原则:大语言模型对外部世界的所有声明在验证前都是可疑的。**它说得很自信并不是证据。Anthropic在自己的文档中承认了这一点: “Claude有时会生成包含虚假信息的响应…以自信、权威的方式呈现。” 一个说"我确定"的大语言模型和一个说"我认为"的大语言模型犯错的概率完全相同。 自动化判别器 最终目标是不再依赖你的纪律性,而是自动化验证: 之前: LLM生成 → 你审查(有时) → 合并 之后: LLM生成 → CI对真实数据验证 → 你审查差异 → 合并 接下来的5种措施是自动化判别器角色的方法。有些有效。有些不太行。 硬数据(给怀疑者) 在你认为"我不会遇到这种情况"之前,这里是真实研究的数字: **21.7%**的开源大语言模型推荐的包是编造的。在商业模型中下降到5.2%,仍然是每20个包中有一个。 GPT-4o对不常见API只能达到**38.58%**的有效调用率。不到40%。还不如抛硬币。 目前定位代码幻觉的最佳方法只能达到22-33%的精度。换句话说:我们能检测出四分之一。 一位研究人员上传了一个空包,包名是大语言模型经常幻觉的。3个月内3万次下载。他们称之为slopsquatting。 而且有正式的分类法。CodeHalu论文(AAAI 2025)定义了4类代码幻觉: 类别 定义 真实例子 映射 字段映射错误 混淆user_id和account_id 命名 编造的名称 response.quota.percentage实际是response.utilization 资源 不存在的资源 API中没有的active_flags字段 逻辑 看似合理但错误的逻辑 isPaid = !activeFlags.isEmpty但字段总是空的 我的案例是资源类型转化为逻辑类型。字段不存在,但依赖它的逻辑看起来完美。连贯的虚构小说。 ...

2026年2月16日 · Fernando

静默失败:当你的AI在编造谎言,而测试却显示一切正常

昨天我发现我的应用程序中有一半模块基于的是编造的数据。不是因为某个迷糊的初级开发者,而是我的AI。 最糟糕的不是它编造了内容。最糟糕的是所有代码都能编译,90个测试全部通过。 连贯的虚构 我正在构建BFClaude-9000,这是一个macOS菜单栏应用,用于监控Claude Max的配额。该功能的一部分需要通过调用claude.ai的API来区分Claude账户是付费还是免费。 我让Claude Code实现了检测功能。它实现了。它交付给我: 一个包含activeFlags: [String]字段的OrganizationInfo DTO 一个检查activeFlags是否非空的计算属性isPaid 一个将组织分类为付费和免费的枚举OrganizationSelection 带有验证所有功能正常工作的测试数据的测试 漂亮。简洁。结构良好。全是编造的。 active_flags字段在Claude的真实API中根本不存在。或者如果存在,也不像代码假设的那样工作。当我用付费账户登录时,应用告诉我我的账户是免费的。 纸牌屋模式 阴险的不是它撒谎说API有某个字段。而是它围绕这个谎言构建的完整系统: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // 带有编造字段的DTO struct OrganizationInfo: Decodable { let uuid: String let name: String let activeFlags: [String] // ← 这个不存在 var isPaid: Bool { !activeFlags.isEmpty } } // 依赖编造字段的逻辑 enum OrganizationSelection { case paid(id: String, name: String) case noPaidOrg // ← 这个状态不应该存在 case noOrgs } // 用验证编造内容的测试数据进行测试 let paidOrg = """ {"uuid": "abc", "name": "Acme", "active_flags": ["pro"]} """ // 测试通过 ✅ — 但这是在验证虚构对虚构 你看到了吗?这不是一个字段放错了位置。这是一个纸牌屋:DTO定义了一个虚假字段,逻辑依赖这个字段,测试验证逻辑使用同样虚假的测试数据正常工作。每个部分都在确认其他部分。一切都说得通。没有什么是真实的。 ...

2026年2月13日 · Fernando

MEMORY.md:你的 AI 自主编写的工作笔记本

“我们昨天不是已经决定这个了吗?” 我正在将我的邮件从 Google 迁移出来。已经用 Claude Code 工作了两个会话:Linear 中的 issues、做出的决策、执行的脚本。我开始第三个会话,问它"degoogle 还剩什么待办事项?" 沉默。完全失忆。 这就像和一个聪明的同事一起工作,但他每天早上来办公室都完全不记得你们前一天做了什么。不记得决策,不记得错误,不记得发现。每个会话都是一张白纸。 结果有一个文件恰好解决了这个问题。它已经在那里几个月了。而且几乎没人知道。 CLAUDE.md vs MEMORY.md:手册和笔记本 如果你使用 Claude Code,可能已经了解 CLAUDE.md。这是你告诉 AI 如何工作的文件:使用什么语言、你有什么工具、你的代码约定。 CLAUDE.md 是你的指令手册。你编写它,你维护它。 MEMORY.md 是另一回事。它是 AI 自己编写的工作笔记本。它记录在与你合作时学到的东西:犯过的错误、做出的决策、项目模式、尝试过但没有成功的东西。 简单来说: CLAUDE.md MEMORY.md 谁编写 你 AI 包含什么 指令 学习内容 何时更改 当你想要时 每次会话后 类比 规章制度 工作笔记本 如果 CLAUDE.md 是你第一天给实习生的合同,MEMORY.md 就是实习生工作时在笔记本中记录的笔记。 它在哪里 ~/.claude/projects/<目录哈希>/memory/MEMORY.md 每个项目目录都有自己的内存文件。如果你在 ~/code/项目-a 工作,它有一个 MEMORY.md。如果你在 ~/code/项目-b 中打开 Claude Code,它有另一个不同的。它们不会混合。 文件在每个会话开始时自动加载到上下文中。你不需要做任何事情。 没有全局的 MEMORY.md 吗? 没有。只按项目分类。这是个问题。 今天我创建了一个 op(1Password CLI)的包装器,缓存密钥一小时。这在我所有项目中都有用,不只是我正在工作的那个。但 MEMORY.md 只在那个目录的内存中记录了它。 CLAUDE.md 确实有全局版本(~/.claude/CLAUDE.md),会在所有会话中加载。MEMORY.md 没有对应功能。如果 AI 学到了适用于你整个环境的东西(别名、系统特性、偏好),它必须在每个项目中分别记录。或者不记录。 ...

2026年2月12日 · Fernando