1. 为什么我会让DeepSeek来总结chDB的开发历程
熟悉我的朋友知道,chDB这个项目我断断续续维护了挺长时间。它本质上是把ClickHouse包装成一个SQLite兼容的嵌入式数据库,让开发者可以用SQLite那套熟悉的API,直接享受到ClickHouse的列式存储和分析性能。这个定位听起来简单,但真正把SQLite的C接口语义、ClickHouse的执行引擎、内存管理、数据文件格式这几层东西缝在一起,中间踩过的坑能写满一本手册。
项目做到后期,我面临一个很现实的问题:代码仓库里的commit信息非常零散,有些决策当时只是在PR讨论里提了一嘴,有些架构调整的动机埋在一封邮件或者一个issue回复里。新的贡献者来问“为什么这里有这个限制”“为什么当初不用SQLite而选ClickHouse”,我需要花大量时间翻聊天记录。更麻烦的是,我自己时隔几个月回看某段代码时,也会忘记当初为什么要绕这么一圈。
后来我开始尝试用DeepSeek来做这件事:把git历史、PR描述、issue讨论、关键邮件等素材全部导出来,用精心设计的提示词让DeepSeek去梳理时间线、提炼决策背景、总结技术难点。这个方案听起来没有多玄乎,但真正做下来效果出乎意料地好,而且有几个细节值得单独拿出来说。这篇文章我就完整记录一下这条路是怎么走通的,包括素材准备、提示词设计、结果校验,以及一些我之前没在别处提过的教训。
如果你是独立开发者、开源项目维护者,或者只是希望把自己过去半年、一年的工作记录整理成一篇像样的复盘报告,这整套流程都直接可以复用到你的项目上。并不需要什么特别的工具,一台电脑、一个仓库、一个DeepSeek账号就够了。
2. 先把材料备齐:从仓库里捞出“开发历程”的原始素材
2.1 别指望AI凭空知道你的项目
很多人用AI写总结,上来就问“帮我总结一下chDB的开发历程”,然后期待AI输出一篇完美的技术复盘。但DeepSeek的训练数据里可能有ClickHouse的知识,绝对不可能有你仓库里那些具体的commit和讨论细节。想让AI输出真实、有深度的项目历程,第一步永远是喂素材。
我在实际操作中会导出三类原始数据,缺一不可:
- Git提交历史:包括commit的哈希、日期、作者、完整提交说明。这里我强调“完整提交说明”,因为很多项目只保留第一行subject,但真正的决策信息往往在body里。
- PR与Issue记录:Pull Request的描述、Review评论、Issue里的讨论串。这些是开发过程中讨论最集中的地方,包含大量“为什么这么做”“为什么不那么做”的一手信息。
- 版本发布记录与内部文档:CHANGELOG、docs目录下的设计文档、周报、甚至你个人博客里写过的某篇开发笔记。
导出Git提交历史我常用两种方式,取决于素材量大小。如果提交数量不大,直接git log --all --date=short --pretty=format:"%h|%ad|%an|%s%n%b%n---"输出到文本文件即可。如果历史很长,比如几百上千条commit,我建议还是拆成几个阶段分别导出,避免一份文件过大导致AI处理时上下文溢出或者注意力分散。
这里有一个非常重要的小技巧:清洗素材时保留尽量多的原始上下文,但把无关噪音去掉。比如提交说明里的Co-Authored-By、Signed-off-by这些尾部信息可以删掉,但讨论串里“用户说这个API在Windows上不可用”这种看似不起眼的信息,反而是后续总结技术约束的关键素材,千万不要为了“干净”而删掉。
2.2 素材的组织顺序:按时间还是按模块?
这个问题我纠结过好几个版本。按时间排序是开发历程最自然的组织方式,但我后来发现,单纯的按时间排序会让AI迷失在琐碎的提交细节里,因为它分不清哪些提交是里程碑级别的架构调整,哪些只是修了个typo。
现在我的做法是:先把素材按“阶段”分组,再做时间排序。比如chDB我大致分成“原型验证”“SQLite兼容层设计”“执行引擎优化”“稳定性和发布”这几个阶段。每个阶段给AI一小段背景说明,再附带该阶段对应的commit、PR、issue日志。
这样做的理由很朴素:开发历程不只是时间线,而是“几个关键阶段里的关键决策”。如果AI能在每个阶段的最开始就知道这个阶段的整体目标,它生成的结构化总结就会更有逻辑。比如原型阶段,AI会特别关注“为什么选择了ClickHouse而不是DuckDB”;兼容层设计阶段,它会关注“如何处理事务语义差异”;优化阶段,它会关注“哪些查询模式暴露了性能问题”。
给一个我实际用过的素材组织模板:
01_prototype/:README、最初的实验代码说明、两三条关键commit02_compat_layer/:SQLite C API相关PR描述、兼容性测试报告03_optimization/:性能分析文档、Benchmark结果、优化相关commit04_release/:CHANGELOG、发布公告、用户反馈issue摘录
每个阶段文件夹里放一个context.md,用三五句话描述这个阶段的目标和最终产出。让AI在读具体素材之前先读这个上下文说明,总结质量会明显上一个台阶。
3. 提示词设计:让DeepSeek不只是总结,而是“复盘”
3.1 提示词拆解:角色、任务、约束、产出格式
直接给DeepSeek扔一堆素材然后问“总结一下”,生成结果通常中规中矩:能列出时间线和几件事,但缺乏洞察。如果想让AI真正像一位资深开发者那样复盘,提示词里必须显式设置四个组件:角色、任务、约束、产出格式。
我实际使用的一个比较有效的提示词框架是这样的:
你是一位拥有多年经验的嵌入式数据库开发者,同时也是这个项目的维护者。 请基于我提供的素材,完成以下任务: 1. 梳理chDB从立项到当前版本的整体开发时间线。 2. 提取每个阶段的关键技术决策,并分析决策背后的原因。 3. 指出每个阶段遇到的主要技术难点和最终解决方案。 4. 总结这个过程中走弯路的地方,如果能从素材中推断出 “如果重来一次会怎么做”,请单独说明。 约束条件: - 所有结论必须从素材中推导,不得补充素材之外的技术事实。 - 如果素材中有冲突信息,请指出冲突并说明你采用了哪一方。 - 不要输出泛泛而谈的内容,每个结论尽量关联具体的commit哈希或PR编号。 - 语气要像一位工程师在写项目复盘报告,避免营销和夸大措辞。 产出格式要求: - 第一部分:开发阶段总览(用表格列出阶段、时间范围、核心目标) - 第二部分:按阶段展开的关键决策记录 - 第三部分:难点与解决过程 - 第四部分:经验与教训(如果素材中有据可查)这个提示词看起来长,但它每个部分都有明确目的。设置“嵌入式数据库开发者”角色,是让AI自动切换到技术专家的语料体系,减少泛泛的措辞。强调“从素材中推导”和“关联commit哈希”,是为了抑制AI幻觉,让它老老实实基于事实工作。要求表格和分部分结构,则是为了让生成结果直接可用于文档沉淀,省去二次整理。
3.2 迭代式对话:先框架后细节
一次对话就拿到完美总结的情况很少见,我现在的习惯是多轮迭代。第一轮只让DeepSeek产出一个阶段总览和大纲,确认结构合理后再逐段深入。这样做的原因是,开发历程里的因果关系经常是隐性的——某个阶段的设计决策可能要到很久以后才显示出影响,AI如果一开始就把细节全部展开,很容易只见树木不见森林。
我第二轮通常这样追问:“第一阶段里你提到了兼容层设计,这部分的commit记录里有哪些反复重构?请聚焦在SQLite事务语义和ClickHouse复制表的冲突上,看看当时的解决思路是否经历了两轮以上调整。”这种带具体焦点的追问,会让AI回到素材中寻找更深层的关联,而不是复述已有结论。
另外一个好用的追问方向是:“请尝试用一个新贡献者的视角重新描述这个阶段。”这个要求会让AI主动补充“背景知识”和“入坑指引”,输出内容反而更像一篇对社区有用的技术日志。开发历程总结给谁看,直接决定了内容深浅。维护者自己看,要的是决策回忆;新贡献者看,要的是背景和约定;外部用户看,要的是能力和边界。这个视角切换,DeepSeek做得比我预期的好很多。
3.3 让AI区分“事实”和“观点”
这是我在反复迭代中总结出来的一个实用设计。开发历程总结里,“事实”和“观点”必须清楚分开,否则很容易把当时的情绪或者不成熟的判断,当成经过验证的经验写进文档。
我会在提示词里加一条:“如果素材中出现评价性语言,比如‘这个方案更优雅’‘性能提升明显需要量化’,请标注为主观描述并尽量寻找量化证据,找不到就注明‘仅为主观观点’。”比如chDB里有一个关于内存映射文件的决策,当时团队内部争论过“映射整个文件”和“按需分页加载”两种方案。提交记录里既有性能测试的数字,也有“后者实现更清爽”这样的个人偏好。AI如果能把数字和评价性语言分开呈现,这个决策的参考价值就完全不同。
这个约束并不复杂,但效果很明显。生成出来的总结不会变成一篇“所有事情都很顺利”的流水账,而是能让人看出哪些判断经过了验证、哪些还停留在直觉层面。
4. 全流程实操:从一堆散乱素材到一篇可发布的开发历程
4.1 分步操作实录
这里我记录一次比较典型的完整流程,你可以直接照着走。
第一步,导出原始素材。在chDB仓库根目录执行:
mkdir -p /tmp/chdb_history/logs git log --all --date=short --pretty=format:"%h|%ad|%an|%s%n%b%n---" > /tmp/chdb_history/logs/commits.txt然后把PR和issue从GitHub页面导出或复制下来,按阶段放入对应文件夹。这一步粗糙一点没关系,关键是保证内容完整。我自己甚至会把某些特别有代表性的评论单独存成一份highlights.md,方便后续重点投喂。
第二步,编写阶段上下文文件。比如context.md里我会写:
阶段:原型验证(时间范围:起始到某次commit) 目标:验证ClickHouse能否作为嵌入式引擎嵌入SQLite兼容层 核心问题: 1. ClickHouse的列式存储是否支持进程内嵌入 2. SQLite的字节码执行模型能否桥接到ClickHouse的向量化执行 3. 最小可行产品的边界在哪里 最终产出:一个可以在内存中运行简单查询的原型实例这个文件不需要长,但它给AI提供了理解散乱commit的“结构性锚点”。
第三步,分阶段投喂并生成框架。按“阶段一、阶段二……”的顺序,把每个阶段的context.md和对应日志依次发送给DeepSeek,每次都要求它输出“本阶段目标、关键commit、技术决策、主要难点”四块内容。全部阶段处理完后,再让AI合并成整体开发时间线。
第四步,追问和校验。对每个阶段逐条提问,比如“你提到这个阶段引入了预聚合方案,对应的commit是哪几条?当时的验收标准是什么?”通过这种方式逼迫AI回到素材里找证据,把每个结论钉死在具体记录上。
4.2 从粗糙时间线到高质量博文的三轮打磨
第一轮AI生成的东西,通常是一份“能看但不够深入”的草稿。真正让它变成一篇可以发布的长文,需要三轮打磨。
第一轮打磨:补全因果链。我要求AI对每个阶段回答三个问题:当时的约束是什么?做了哪个选择?后来因为什么而调整?这一步会把流水账变成有逻辑的叙事。比如早期chDB支持的是固定列数超过一定阈值就回退到全表扫描,这个限制在后来的版本中通过谓词下推给绕过了。如果没有因果链,这段经历看起来就是“先受限,再优化”;补全因果之后,就是“因为存储引擎的块迭代器不支持可中断操作,早期只能全表扫;后来给迭代器加了中断标志位,才让过滤条件下推到数据块级别”。后者才是有价值的开发经验。
第二轮打磨:压缩同质内容,放大高光细节。AI生成的总结有一个毛病,就是每个阶段篇幅差不多,显得平铺直叙。我会手动指示它:“这个阶段的内容压缩为30%,那个阶段的技术难点展开并补充细节。”比如chDB里兼容层的事务语义处理是极难的一件事,AI第一版可能只给了两句话,但实际开发中我们花了几个星期跟SQLite的锁模型打交道。这时候我会给它真正相关的commit和讨论内容,让它围绕这一件事写足、写透。
第三轮打磨:加入人的视角。AI产出的文本即使逻辑再顺,也缺少那种“我当时其实很担心这样会不会出问题”的真实感。第三轮我会让AI帮我保留技术骨架,然后自己动手补几条带情绪的批注。这不是为了文采,而是让阅读者知道这份记录是活人写的,是带着不确定性和真实权衡写出来的。
5. 避坑清单与常见问题排查
5.1 提示词与上下文相关的问题及对策
- AI编造commit哈希怎么办。这是最容易出现的幻觉。解决方案是在提示词里反复强调“所有结论必须关联你实际收到的commit列表中的条目,不许自己生成哈希,找不到就写‘素材未提供’”。另外,生成结果里的引用要抽查,手动对照一下原始提交记录,确认前后的描述和真实commit信息吻合。
- AI把不同版本的方案混在一起。我会要求它“先按时间顺序确认方案A存在于某时刻,方案B存在于某时刻,然后对比”。如果素材时间跨度很大,最好明确告诉AI各位commit的先后关系,避免它把早期的废弃方案跟后来的定稿方案并列讨论。
- 上下文太长导致AI开始忘事。一次性塞几十万字素材不现实,DeepSeek上下文有限,内容过长会导致中间素材被忽略或者总结质量下降。最有效的办法是先按阶段分批处理,再让AI合并。合并的时候不要把所有细节再次粘贴,而是把每阶段的总结文本汇总,并对有衔接关系的地方做局部追问。
5.2 提示词之外的工程性问题
除了AI本身的问题,还有几个工程层面的细节值得说一说。
- 素材命名混乱。如果一份文件里既有commit日志又有PR描述,日期还不统一,AI梳理时间线时会很痛苦。我最后选择在每个阶段文件夹里统一使用
YYYY-MM-DD_描述.txt的命名方式,并且每条记录都带原始日期。这一步看似琐碎,却直接决定了后续总结的时间线准确性。 - 不要忽视Review评论。Review评论里通常藏着“这个代码为什么不能这么写”的硬约束,这些信息在commit里往往没有。我在chDB的兼容层阶段就有一条重要的约束——“SQLite的游标必须能回滚,但ClickHouse的block流不支持任意位置seek”,这句话最初是在一次PR Review的十几条评论里逐渐浮出来的,单看任何一条commit都看不到全貌。所以素材准备阶段,PR Review评论一定要完整导出。
- 权限与隐私。如果项目不在公开仓库,注意不要直接把内部讨论记录完整发给任何外部工具,做好脱敏处理。涉及用户隐私、未公开的商业决策等信息要先行剔除,只保留技术相关内容。开发历程总结要的是技术见解和经验教训,不需要原样传抄那些敏感的完整讨论。
5.3 一些零碎的实战心得
用DeepSeek做chDB开发历程总结,我前后尝试了三个版本,期间也总结出一些零碎但很管用的心得。
不要每次都从零开始发提示词。我会维护一个prompt_template.md文件,把角色设定、任务描述、约束条件和输出格式都存下来,每次只替换项目和阶段名称。这样一致性好,生成质量也更稳定。
给AI一个“没有素材就直说”的许可。开发历程肯定是残缺的,总有那么几周没有写commit消息,有些决策找不到记录。允许AI坦诚地标注“此阶段资料缺失,无法推断具体过程”,比让它硬着头皮编一段靠谱得多。最终生成的总结里,明确标注了缺失信息的部分反而显得更真实可信。
同一个总结任务,变换几次问法,结果能带来很多新灵感。比如请AI“以新贡献者视角”“以用户视角”“以竞品开发者视角”各跑一遍,不同视角下的侧重完全不同。新贡献者视角会想知道代码该往哪个模块加、哪些代码是核心路径;用户视角更关心边界行为和限制约束;竞品开发者视角则可能会直接问“你们为什么要选这条技术路线,你们的妥协在哪里”。把这些不同视角的产物叠在一起,能自动发现很多之前没有意识到的盲点。
6. 从“留档”到“传播”:开发历程的下一步利用
开发历程总结完成之后,我推荐做三件事:回流文档、生成社区版本、持续迭代。
回流文档是最直接的收益。把AI生成的开发历程里“关键决策记录”“技术难点过程”这两部分,整理后并入项目的docs/development.md或者ARCHITECTURE.md。新维护者装机、写代码前先读这份文档,遇到“为什么这里有这个兼容层”“为什么这个接口不能并发调用”之类的问题时,至少有一个自查的入口,而不是每次发issue或者私信找维护者问。
生成社区版本则是一个很有意思的场景。面向社区发布的开发历程,不需要内部版的全部细节,反而要更侧重“这个项目解决了什么问题”和“这个项目怎么使用”。我让DeepSeek基于完整总结,生成一版适合公开发布的文字,删掉比较敏感的早期争论细节,把篇幅重心放在对外可见的功能演进和约束说明上。社区反馈的每一条“你们为什么不做X”的issue,我都可以从开发历程里找到当时的决策背景来回复,省去了很多重复解释的成本。
这个开发历程总结不是一次性工作。代码库每周都有新commit,新决策每两个月就有一轮。比较好的做法是设定一个固定节奏,比如每个重要版本发布之后,把新增的commit、PR、issue喂给之前的总结结果,让AI做增量更新。因为基础框架已经有了,增量更新比从头写一遍要快得多,质量也更稳定。
从我自身的体验来看,让DeepSeek来总结chDB开发历程,真正价值并不是“省了写文档的时间”,而是它提供了一种外部的、结构清晰的眼睛,能看到我自己因为太熟悉项目而忽略的关联和模式。开发者在写总结时很容易陷入“凡走过的都是必经之路”的惯性叙事,AI则会根据素材里的冲突、反复和缺漏,把那些被我遗忘的弯路重新摆到桌面上来。这也让整个项目的发展路径变得比记忆中的版本更立体、更接近它本来的样子。