发布于 2026-01-05 9 阅读
0

是否建立索引:应该选择哪种编码代理?

是否建立索引:应该选择哪种编码代理?

TL;DR:索引代理的速度提高了 22%,直到过时的嵌入导致登月舱崩溃。

我使用两个人工智能代理对阿波罗11号的实际飞行代码进行了测试,以检验代码索引是否会产生影响。主要发现:

索引搜索速度提升了 22%,API 调用次数减少了 35%。
两者都完美地完成了所有 8 项挑战。
索引代理在登月期间的同步问题揭示了保持嵌入内容最新的隐藏复杂性
。速度的提升是以可靠性和安全性的权衡为代价的,这可能会影响生产力。

阿波罗11号

🚀试试 AI Shell

您的智能编码助手,可无缝集成到您的工作流程中。

登录 Forge →

阿波罗11号任务的背景故事

三十八秒!

在将驾驶舱交还给尼尔·阿姆斯特朗和巴兹·奥尔德林之前,小小的阿波罗制导计算机(AGC)只能抽出这么短的时间来完成速度控制任务。1969年7月20日的这38秒里,“鹰号”飞船以每秒两米的速度向月球坠落,与指令舱内的迈克尔·柯林斯之间的距离越来越远,其交会雷达不断向中央处理器发送大量无意义的数据,而DSKY屏幕上则不停地闪烁着“1202”警报。

然而,在登月舱内部,一台鞋盒大小的计算机,拥有约 4 KB 的 RAM(总共 72 KB 的 ROM) ¹,比智能手机上的一个联系人条目还要小。它重启了自身,卸载了低优先级任务,并重新获得了对前往静海基地的导航控制权。

那次救援并非运气使然,而是软件工程的功劳。

几个月前,在马萨诸塞州沃尔瑟姆一间僻静的工坊里,女裁缝们参与开发了一项非常重要的任务所需的软件。她们小心翼翼地将电线穿过被称为“磁芯”的小型磁环。

鹰已着陆

运作方式如下:

为了表示二进制代码中的“1”,他们将一根导线穿过一个磁芯。
为了表示“0”,他们将导线绕着磁芯布线。
他们每缝一针,就生成一行计算机代码。他们总共编织了大约4000行这种特殊的“汇编”代码,创造了一个永久的、不可更改的存储器。

阿波罗制导计算机绳记忆


阿波罗制导计算机绳状存储器的特写,展示了穿过磁芯的复杂手工编织导线。每条导线路径代表二进制代码——穿过磁芯代表“1”,绕过磁芯代表“0”。图片:雷神公司/麻省理工学院

这份手工制作的记忆文件包含了重要的程序:

  • 程序 63-67 是航天器的下降程序。
  • 程序 70-71 是用于从月球起飞的。该系统以 20 毫秒的极小时间间隔来管理计算机的所有任务。其关键特性是“重启保护”,这项功能使计算机能够在崩溃后恢复,而不会丢失之前正在执行的操作。

代码的一小步……

当尘埃落定,阿姆斯特朗用无线电报告说:“休斯顿,这里是静海基地。鹰号已着陆。” 他也向一个看不见的团队致敬:由玛格丽特·汉密尔顿领导的程序员们,他们将 36 千字的绳状 ROM 变成了第一个被送出地球的容错实时操作系统。

玛格丽特·汉密尔顿与阿波罗制导计算机代码



玛格丽特·汉密尔顿站在阿波罗制导计算机源代码打印件旁,约摄于1969年。照片:NASA/MIT(公共领域)

从 20 世纪 60 年代的汇编语言到现代人工智能

AGC面临的根本挑战与我们今天处理遗留代码库时遇到的挑战相同:如何在浩瀚的代码海洋中快速找到相关信息?Apollo程序员通过细致的文档、标准化的命名规范和精心设计的模块解决了这个问题。但是,当我们用现代人工智能来解决同样的问题时,会发生什么呢?

与其花费数月时间学习 20 世纪 60 年代的汇编语言来亲自操作阿波罗 11 号的代码库,我决定做一个实验:让两个现代人工智能代理来应对挑战,并比较它们的效率。这两个代理都运行在完全相同的语言模型 Claude 4 Sonnet 上,因此唯一的变量是它们的信息检索方法。

这并非仅仅是一项学术研究。了解代码索引是否真的能提升人工智能的性能,对于我们如何构建开发工具、文档系统和代码分析平台具有切实的意义。如今,市面上充斥着数百种代码分析代理,它们都声称通过专有的“上下文引擎”和向量搜索技术拥有卓越的代码理解能力,这让开发者陷入了分析瘫痪的困境。本实验旨在通过检验驱动大多数此类工具的核心假设——即索引能够从根本上提升人工智能代理的性能——来拨开营销迷雾。

我故意隐去具体的产品名称,这篇文章的重点在于技术本身,而非抨击厂商。因此,在文章的其余部分,我将用通用术语来指代这些工具:

  1. 索引代理:构建整个代码库的索引,并使用向量搜索为模型提供相关的代码片段。
  2. 无索引代理:依靠迭代推理循环,没有任何预先构建的索引。

目标是衡量在分析大型、不熟悉的代码库时,代码索引是否能提高答案质量、缩短响应时间并降低令牌成本,仅此而已。

👨‍🚀从登月任务到你的代码库,

让你的专属编码助手助你完成下一个软件任务。👉

访问你的 Forge 控制面板

阿波罗11号挑战套件

为了公平地测试这两个智能体,我设置了八项难度各异的挑战,从简单的事实查找到复杂的代码分析。前七项是事实查找,第八项是编程练习。每项挑战都需要深入研究AGC代码库才能正确解答。

系好安全带;下一阶段将围绕一个堪称登月之作的代码库展开。

挑战一:任务优先级分析

AGC调度系统中,任务可以分配的最高优先级是多少(八进制,两位数)?(提示:查看优先级位模式和NOVAC调用)

挑战2:键盘控制

控制宇航员与计算机之间所有用户界面操作的文件,它的名字真是妙不可言!

挑战 3:内存架构

AGC 中每个可擦除存储器的大小是多少(以十进制字表示)?

挑战 4:俯仰、滚转、偏航

AGC的姿态控制系统每100毫秒发出三个控制回路,分别控制俯仰角(Q)、横滚角(P)和偏航角(R)。它们的执行顺序是什么?请用括号按字母顺序标明任何同时执行的回路。

挑战五:雷达的局限性

会合雷达能够可靠跟踪目标的最大距离是多少海里?结果四舍五入到百位。

挑战 6:处理器时序

AGC处理器的基本机器周期时间是多少微秒?(这决定了所有操作的基本时序)

挑战7:发动机节流

下降推进系统在动力下降过程中能够保持的最小油门设置(以百分比表示)是多少?

挑战 8:让登月舱着陆!

终极考验。阿波罗制导计算机拥有多种月球着陆模式。尼尔·阿姆斯特朗使用 P66(手动制导)成功将飞船降落在月球上。你的任务:在助手的帮助下,使用 P65(全自动制导)进行着陆。

完成以下步骤:

  1. 将 P65 制导算法转换为 Python 或 Javascript 格式
  2. 使用提供的 test_descent.py 或 test_descent.test.js 文件测试功能。
  3. 使用提供的 simulator.py 或 simulator.js 文件,运行你的算法并成功登陆月球。
  4. 请提交 simulator.py 或 simulator.js 的输出结果,即最终位置坐标。

结果:速度与同步之间的权衡

在对两个代理进行所有八项挑战后,结果揭示了一些重要的东西:两种方法都成功完成了每一项挑战,但它们暴露了索引方法中一个很少被讨论的关键弱点:同步漂移。

以下是它们的排名:

绩效指标

他们的表现如下:

指标 指数代理 无索引代理 改进
平均响应时间 49.04秒 62.89秒 指数加快 22%。
API 调用总数 54次通话 83通电话 指数下降 35%
准确率 8/8 正确 8/8 正确 相同的

Index Agent 在大多数挑战中表现更佳,但这种速度优势也伴随着隐性成本:同步复杂性可能会将生产力的提升转化为调试会话。

逐项挑战分析

挑战 回答 指数代理 无索引代理
1:任务优先级分析 37 18.2秒,3次通话 耗时55.46秒,共拨打13个电话
2:键盘控制 弹珠游戏按钮和灯光.agc 20.7秒,5次通话 耗时 25.29 秒,共 8 次通话
3:内存架构 256 22.1秒,5次通话 24.2秒,7次通话
4:俯仰、横滚、偏航 P(QR) 36.61秒,4次通话 71.30秒,4次通话
5:雷达的局限性 400 28.9秒,2次通话 耗时 82.63 秒,共 14 次通话
6:处理器时序 11.7 30.87秒,7次通话 51.41秒,10次通话
7:发动机节气门 10 23.68秒,3次通话 36.05秒,9次通话
8:着陆登月舱 [28.7, -21.5, 0.2] ✅ 已着陆 耗时 211.27 秒,共 25 次呼叫 ⚠️ 耗时 156.77 秒,共调用 18 次 ✅

注意:索引代理的登月失败表明了快照为何会带来反噬:它提取了旧的嵌入,引用了不再存在的文件,并且仅在运行时失败,浪费的时间比节省的时间还要多。

速度的隐性成本:当指数背叛你时

剧情出现了转折:两个代理都成功登月,但索引代理的登月路径却暴露出一些根本性问题,而这些问题在大多数关于代码索引的讨论中要么被忽略,要么被轻描淡写地提及。性能提升固然可喜,但同时也带来了同步和安全方面的代价,这些问题可能会严重影响生产力。

主要问题:同步:代码索引就像是冻结在某个时间点的快照。一旦你的代码库发生变化(而代码库一直在变化),你的索引就会逐渐变得不准确。与可能返回过时结果的传统搜索不同,使用过时索引的 AI 代理会自信地使用不存在的 API 生成代码,引用已删除的函数,并推荐上周有效但今天失效的模式。

在挑战 8 中,这一点表现得尤为明显:索引代理从之前的测试运行中检索函数签名的嵌入,并使用这些签名生成语法正确的 Python 代码,只有在代码执行时才会发现不匹配之处。而无索引代理虽然速度较慢,但​​始终能够处理当前代码库的状态,并且永远不会生成调用不存在方法的代码。

同步出错时:

  • 幽灵依赖:AI 建议导入已移除的模块
  • API 偏移:生成的代码使用了已更改的旧函数签名。
  • 已弃用的模式:索引返回您的团队已弃用的反模式示例。
  • 死代码建议:AI 建议调用索引中存在但已从实际代码库中删除的函数。

次要问题:安全性权衡:大多数第三方索引服务需要将您的整个代码库发送到他们的基础设施才能构建速度极快的向量搜索。这会带来额外的考虑因素:

  • 代码泄露:您的专有算法可能会被第三方看到。
  • 合规性要求:许多行业(金融、医疗保健、国防)禁止外部代码共享。
  • 知识产权风险:竞争对手理论上可能从中了解您的实施方案。

自托管索引可以解决安全问题,但会带来运维复杂性:需要维护向量数据库、嵌入模型和刷新机制。它是一种兼顾速度和安全性的折中方案,但需要大量的 DevOps 投入。

开发者体验:你花费数小时调试,最终却发现人工智能的判断完全错误,因为它使用的是昨天的代码库。更快的响应速度毫无意义,因为它会将你引向基于过时信息的死胡同。如果你身处监管严格的环境,即使第三方索引服务的同步质量再好,你也可能无法使用它们。

无索引方法的优势:虽然速度较慢且 API 调用成本较高,但无索引方法完全避免了同步和安全问题。它始终指向代码的当前状态,不会受到上周重构缓存嵌入的影响,所有处理都在本地进行,并且在遇到真正的问题时会快速失败,而不是基于过时的上下文错误地给出解决方案。

这表明真正的选择不仅仅是速度与成本之间的权衡,而是在性能、可靠性和安全性之间的三方权衡。

实际应用:索引代理在大多数挑战中表现更佳,平均响应速度提升 22%,API 调用次数减少 35%。两种代理在静态场景下准确率相当,但关键区别体现在动态场景下,即自索引构建以来代码状态发生变化的情况下。

开发人员与同步:索引代理确实能提高效率,但同时也牺牲了可靠性,这在快速变化的代码库中可能是灾难性的。一旦同步失败,额外的调试时间往往会抵消最初的速度优势。

结论:平衡性能、可靠性和安全性

阿波罗11号的制导计算机从不使用过时的数据,所有决策都基于实时传感器读数。现代人工智能编码代理也面临着同样的根本挑战,但略有不同:索引代理无疑具有成本效益,响应速度提升22%,API调用次数减少35%。然而,问题在于:远程代码索引可能会导致同步问题,使生产力的提升变成调试的噩梦。

研究结果揭示了性能、可靠性和安全性之间的三重权衡。虽然索引方法在速度和成本效益方面表现出色,但它们也引入了同步风险,当索引滞后于实际情况时,可能会严重影响生产力。我们观察到的“登月效应”(即过时的嵌入导致虚假 API 调用)说明了为什么不同步的索引比没有索引更危险。

未来的发展方向是什么?选择一个能够快速索引(最好是本地索引)的代理,并确保索引永远不会出现不同步的情况。这意味着要寻找能够提供以下功能的解决方案:

  • 实时索引更新,即时跟踪代码更改
  • 本地处理,以避免将专有代码发送给第三方所带来的安全风险。
  • 过时检测功能会在指数置信度下降时发出警告
  • 当同步不确定时,采用混合回退机制切换到直接代码分析。

阿波罗11号的制导计算机之所以成功,是因为它从不使用过时的数据,也从不将关键算法暴露给外部机构。它的所有决策都基于最新的传感器读数,并完全依靠内部团队实时计算得出。现代人工智能开发工具也需要同样重视数据的新鲜度和安全性,否则就有可能让我们误入歧途,采用过时的解决方案,甚至泄露我们最宝贵的代码。

社区实验

想亲自测试一下吗?完整的阿波罗11号挑战套件可在以下网址获取:https://github.com/forrestbrazeal/apollo-11-workshop

如果你想让我在你的代码库上运行这个实验,请在评论区留下链接。我特别想在规模更大、更现代的代码库上测试这个实验,看看这些模式是否具有可扩展性,以及“登月效应”是否会出现在其他领域。

您是否进行过类似的实验来比较不同的人工智能方法?我很想了解您的研究结果。

鸣谢

这项实验的灵感来源于@forrestbrazeal在 2025 年人工智能工程师世界博览会上的精彩演讲。本文探讨的具体挑战均来自该演讲。

AGC代码本身堪称软件工程史上最杰出的成就之一,它证明了在最极端的限制条件下,精心的规划、严格的测试和精妙的设计能够取得怎样的成就。所有AGC源代码均属于公共领域。

文章来源:https://dev.to/forgecode/to-index-or-not-to-index-which-coding-agent-to-choose-27pb