在上一篇放手AI结果最后只能含泪手动填坑之外,还有一次给AI沉淀长期记忆的尝试,让我沮丧不已。
故事的起因应该要从spec-driven说起,过年前公司就开始大力推广SDD(规范驱动编程),甚至上升到公司价值观层面。拿开源的openspec举例,流程大概是:
- proposal:你先跟AI发起一个需求的提议,沟通说清楚需求的背景痛点、要实现的目标;
- spec:然后讨论明确出这项开发工作的规范或者说边界,要做什么、不做什么、可以做什么、不可以做什么;
- design:AI提出技术方案,架构设计、接口设计等等,类似于常见产出的plan文档;
- task:把技术方案分解成一个个小任务,方便逐项进行、做完就打勾勾;
第一次走流程感觉比较惊喜,感觉给AI铺设了轨道,成功把不着边际横冲乱撞的它,驯化为沿铁轨稳稳行驶到站点的列车。
然而年后回来又走了几遍openspec的全流程后,发现自己心里说不清楚地难受。细细探索原因发现:
1. 过程中步骤和产出的文档太多,一遍遍人肉复核增添了很多额外的认知负担。中途如果改主意了,好几个文档都得一齐改、又得挨个审一遍。这我想说些文档真的都有存在的必要吗?proposal、spec、design不应该合并为一个plan就好了吗?
2. spec文档是会被归档沉淀为“长期记忆”的部分,其他就直接收进历史的大抽屉,未来谁有事再自己去翻。但我感觉spec的哲学,本质是用“规范/边界”来定义和描述功能架构。这种感觉就像是用“围墙”来定义“房子”:它只告诉你哪些位置有围墙、你不能从这横穿过去,却没跟你解释为什么这里要设立一堵墙?建筑师的设计美学是什么?当前房间的功能分区、动线布局是否合理等等。
它给出的是对当下表象的描述,而不是建筑师脑海里的设计思想和蓝图,无法用于未来房子的改造维护、甚至修建更多更好地新房子。
我看公司论坛里也有人分享技术文章表达了相似的共鸣,他选择的是利用openspec提供的机制,重建一套schema(就是前面各阶段的设定与划分)。我则打算先针对长期记忆沉淀这里,打造一个explore-while-doc的skill:
让AI每次对于代码库的探索学习都留下笔记,这样以后遇到相同领域的任务就可以减少重复探索,迅速补全context所需知识,保留关键设计思路的长期记忆。不用每次开新会话清空上下文后,AI就重新失忆变成傻子;也不用每次都重新读取一边所有代码,浪费大量token。
理想很美好,现实很骨感。
我问AI一个好的技术文档应该包含哪些内容,于是像模像样地写了个大纲模板给skill用作参考,结构包含:一句话总结xx模块的功能、架构设计、目录结构、核心功能的调用链、核心算法原理等等。还贴心地要求文档要按模块进行拆分,然后有个项目的总文档只记录每个模块和它对应的文档链接。这样能够“渐进式披露”给AI,相当于给它个目录,任务需要哪部分知识再去仔细读哪篇文档。
有了这个“神器”,我就在上个故事里吭哧吭哧开始干。一边放心让AI总结文档、一边放手让AI进行代码开发。
在痛苦的复盘中我发现了一个盲区,除了指挥官本人的缺位外,还有另一个重要失败原因是上游产出质量不佳,导致下游彻底瘫痪。正所谓:garbage in,garbage out。
上游是一个AI负责沉淀长期记忆、产出技术文档,这技术文档看起来挺专业的、好像方方面面都点到了,但信息比较碎片、对我来说是一个个孤立的点、串不起来整个逻辑,反正我确实无法仅仅通过一份文档彻底弄懂代码的实现细节,只存有一个模糊印象。
下游是另一个AI直接看技术文档、设计新功能的技术方案。它拿着一份云里雾里的草图,企图建造一座大厦。
最后我得出了一个震惊、羞耻、又不得不承认的结论:由于我的不懈努力,不仅没给AI帮上忙,还帮了半天倒忙!实实在在一个猪队友,对不起了AI大神,orz。
这两件事严重打击了我的自信,我感觉我还是什么都别做了,skill也删了吧,别给人家AI添乱了。没有我,它表现得更好。
后来我看到了另一个观点,大受启发。要记住沉淀下来的文档是面向AI的,不是面向人类的。
像我之前写的那种,是面向人类给人看的,那叫“学习笔记”。而给AI看的应该叫“路标”。比如一段代码,对于人类要理解代码每行的含义、功能作用,对于AI则只需要理解在什么情况下可以调用这个函数。至于具体算法嘛,AI看一眼就知道了,这个速度太快了、token消耗其实也可以忽略不计,所以它根本不需要用文档来记住这件事,文档反而还容易过期失效,最新的代码才是唯一truth。
对于AI来说,什么才是真正的“高价值信息”?我看到对方划分了不同级别:
不知道就一定会犯错
不知道就一定走弯路
由此看来,“架构设计、约束禁止、模块职责边界”这些都是有重要价值的,能帮助AI做出更准确的设计判断。像是“用户明确表达过的偏好、高频踩坑经验”,这些也是有意义的,能帮助AI更好地与人类协作、减少反复犯错的无用功尝试。而“模块的目录结构、函数调用链、核心算法原理”属于低价值信息,因为AI都可以通过再次阅读立马了解。
正好那段时间Claude Code源码泄露,我也稍微看了下它的Auto Memory、Auto Dream机制,对于memory会筛选以下4种类别:
- user:用户角色、偏好、知识背景
- feedback:用户的纠正和潜在的认可
- project:进行中的工作、截止日期、决策
- reference:外部引用的代码库依赖
看起来也有点怪啊,感觉user可以归入用户级别的CLAUED.md、project和reference也可以放到项目级别的CLAUDE.md。看来对于长期记忆筛选确实有点难度,大家都在各自尝试,还没有特别突出公认的成熟方案。
我后来根据“高价值信息判断准则”又迭代了一版沉淀记忆的skill,但测试总结出的几条记忆感觉还是和理想中的不太符合。等以后磨合磨合再继续尝试吧~
夜雨聆风