该项目最初尝试复制Jeff Dean暗示的、用于查询30亿向量的高效向量搜索解决方案。目标是找到约1000个查询向量与30亿个文档向量数据集之间的相似度(点积),这些向量存储为.npy文件。
最初的简单实现速度很慢(查询3000个向量近2秒)。使用NumPy向量化点积计算显著提高了性能至约0.01秒,并进一步使用`np.float32`优化将其降低至约0.0045秒。然而,扩展到300万个向量需要12.8秒,推算到完整30亿个向量将需要约3216分钟,这不切实际。
一个主要障碍出现了:内存不足(OOM)错误。存储30亿个768维的float32向量大约需要8.6 TB的RAM。潜在的解决方案包括使用生成器、批量操作、内存映射或使用Rust/C等语言编写优化代码。
至关重要的是,作者意识到最初的问题陈述缺乏对关键需求(查询模式:单次查询与多次查询、Top-k检索,数据处理:内存中与基于磁盘,硬件限制:GPU、机器规格,可接受的精度权衡:压缩)的明确说明。核心结论是,定义精确的需求通常比实现技术解决方案本身更具挑战性。
## 创新的双刃剑
纵观历史,旨在减轻苦难或实现和平的发明,常常被扭向破坏性的用途。理查德·加特林在1861年认为他的速射枪会*减少*军队数量,从而降低战争的代价。同样,20世纪20、30年代的早期火箭先驱,如奥伯特和VfR,梦想着太空探索,但他们的工作最终被韦尔纳·冯·布劳恩领导下的纳粹军方利用,最终导致了二战中的V-2火箭。
这种模式在其他创新中也得以延续。桑托斯-杜蒙设想飞机用于和平,但它们很快变成了战争工具。阿尔弗雷德·诺贝尔发明炸药,希望其巨大的威力能够*阻止*冲突,但它既推动了建设,也带来了破坏,使他内心备受煎熬。甚至原子弹,源于对纳粹德国的恐惧,也促使像西拉德这样的科学家警告说,一场毁灭性的军备竞赛即将到来,并呼吁进行国际控制——但这些警告不幸被忽视了。
就连AK-47的发明者米哈伊尔·卡拉什尼科夫,也一直在为他的创造所带来的道德影响而苦恼,尽管他本意是为他的国家提供防御,但他仍然质疑自己的罪责。这些故事揭示了一个反复出现的悖论:追求进步可能会无意中释放出具有不可预见且常常是毁灭性后果的力量,凸显了创新、意图和人类冲突之间复杂的关系。
## LLM 与正确性的错觉:数据库案例研究
最近的实验揭示了一个鲜明对比:在 SQLite 中对 100 行数据进行主键查找耗时 0.09 毫秒,而 LLM 生成的 Rust 重写版本却高达 1,815 毫秒——慢了 20,171 倍。尽管该重写版本可以编译、通过测试并正确处理 SQLite 文件格式,但它在基本操作上却彻底失败。
这并非编码错误,而是 LLM 优先考虑 *合理性* 而非 *正确性* 的体现。这段代码是对数据库的 576,000 行代码的重新实现,*看起来* 像一个数据库,但缺少关键的性能优化。具体来说,它未能识别 `INTEGER PRIMARY KEY` 列,导致进行全表扫描,而不是高效的 B 树搜索。
作者强调了一个更广泛的问题:LLM 擅长生成 *看起来* 可用的代码,但通常缺乏通过多年性能分析和优化获得的细致理解。研究证实了这一点,表明 AI 辅助开发会导致代码复制增加和稳定性降低。
关键要点?LLM 是强大的工具,但需要用户在代码生成 *之前* **定义明确的验收标准** 并严格验证输出。 否则,你可能会构建复杂、看似正确的系统,但实际上存在根本性缺陷。正确性不仅仅是关于通过测试;它还关于可证明的性能和对底层原理的深刻理解。