Press "Enter" to skip to content

如何在六周内利用人工智能为Cassandra添加向量搜索功能

由于生成式人工智能应用程序所需的矢量搜索功能的巨大需求,DataStax在Apache Cassandra和我们构建在Cassandra上的托管服务Astra DB中设定了一个非常雄心勃勃的目标,即添加这一功能。

四月份的时候,当我问我们的产品高级副总裁谁会来构建它时,他说:“为什么不让你来做呢?”

我和另外两个工程师一起在6月7日开始着手开发一个新的矢量搜索实现,仅用了六周的时间。

新的AI编码工具能帮助我们实现这个目标吗?一些工程师自信地声称,AI会犯下很多错误,对生产力是一种净负面影响。在这个关键项目中尝试过这些工具后,我确信这些工具实际上极大地提高了生产力。事实上,我再也不会回去手写所有代码了。下面是我使用ChatGPT、GitHub Copilot和其他AI工具的经验。

Copilot

Copilot很简单:它是增强的自动补全工具。大多数情况下,它会为你补全一行代码,或者根据上下文匹配几行代码的补全。这里,我写了一条注释,然后开始了一行代码neighbors。Copilot会正确地补全剩下的代码(第二行以“neighbors”开头的文本):

这是一个稍微复杂一些的例子,来自测试代码,我最初将循环写成了mapToLong,但后来改变了数据结构,使得使用forEach调用一个方法更加简洁。Copilot帮了我一个忙:

偶尔(这更多是个例外而不是规则),它会惊喜地提供完整的方法补全:

Copilot有用但有限,有两个原因。首先,它被调整为(正确地)谨慎行事。它仍然会出现幻觉,但很少见;当它认为不知道该怎么做时,它就不会提供补全。其次,它受到要求足够快以便与人类打字时的短暂暂停无缝集成的限制,这就暂时排除了使用像GPT-4这样的重型模型。

(参见Max Krieger在推特上的“Copilot极致主义”观点。)

ChatGPT

你可以尝试让Copilot根据注释生成代码,但在这种情况下,你几乎总是能从通过付费使用ChatGPT或API访问的GPT-4中获得更好的结果。

如果你还没有尝试过GPT-4,你绝对应该尝试一下。它确实有时会产生幻觉,但比GPT-3.5或Claude要少得多。确实有时它无法解决简单的问题(在这里,我正在努力让它理解一个简单的二分查找)。但在其他时候,它几乎令人惊讶地好,比如这一次它在第一次尝试中就找出了我的竞争条件。即使它不是很好,拥有一个能够以可接受的智能模拟进行回应的橡皮鸭调试伙伴对于保持专注和保持动力是非常宝贵的。

而且你可以将它用于一切。或者至少可以用文本来描述的任何事情,在编程环境中尤其如此。

这里有一些我使用GPT-4的场景:

  • 关于API的随机问题,我本来需要深入研究才能找到答案。这是最有可能产生幻觉的类别,我在这种情况下主要转向了Phind(见下文)。
  • 微优化。它类似于Copilot,但是可以匹配Stack Overflow上的所有内容,因为它的训练数据包括了部分Stack Overflow。
  • 我使用了Stream流水线,因为我还不太擅长将脑海中的逻辑转化为一系列功能链式调用的代码。有时候,就像这个例子一样,最终结果比我们开始的时候更糟糕,但在编程中这种情况经常发生。与其一次敲击一个键来进行探索,不如用GPT来加速。而且,使得从时间到结果的循环更快,会更有可能尝试新的想法,因为实验的成本更低。
  • 当然,GPT也知道git,但也许你没有意识到它在使用git构建自定义工具方面有多么出色。就像列表中的其他项目一样,这是我以前可以手动完成的任务,但是有了GPT的加速,现在我会创建这样的工具(在此之前,我通常会选择次优解决方案,而不是花一个小时来编写一个一次性的脚本)。

这是我与GPT-4最喜欢的合作项目。我需要编写一个自定义类来避免使用ConcurrentHashMap<Integer, Integer>的天真方法导致的盒子/取消盒子循环的垃圾收集开销,并且这是为了Lucene而编写的,Lucene有严格的无外部依赖政策,所以我不能像Trivago的fastutil-concurrent-wrapper那样替换为并发原语映射。

我与GPT反复沟通几次,改进了它的解决方案。这次对话展示了我认为是GPT的几个最佳实践(截至2023年中期):

  1. 在编写代码时,GPT最擅长处理封装良好的问题。相比之下,我一直未能成功地让它执行涉及类的多个部分(即使是一个小类)的重构。
  2. 将短语建议转化为问题。“是否更高效地……?” GPT(甚至更甚)不愿直接反驳其用户。给它留出不同意的空间,否则您可能会无意中迫使它开始产生幻觉。
  3. 不要试图在大型语言模型(LLM)中处理所有事情。这次对话的最终输出仍需要一些微调,但已接近我想要的结果,所以手动完成比试图让GPT完全正确更容易、更快。
  4. 通常情况下,我不相信神奇的提示——最好使用直接的提示,如果GPT偏离了正确方向,就进行纠正。但有些地方确实有正确的提示可以帮助很多。Java中的并发编程就是其中之一。GPT首选的解决方案是在所有地方都使用synchronized,然后算完成了。我发现让它以并发专家Cliff Click的风格思考会有很大帮助。最近,我还切换到了使用Jeremy Howard的系统提示的轻度编辑版本。

看到这个列表,令人惊讶的是它与“人工智能就像有无限实习生可供利用”的经验法则非常契合。实习生在处理封闭问题时表现最佳,往往不愿违背他们的团队领导,并且通常,完成工作自己完成比解释清楚实习生如何完成更容易。 (虽然我建议不要在真实实习生身上尝试这样做,但在GPT身上,这并不重要。)

高级数据分析

高级数据分析,之前称为Code Interpreter,也是ChatGPT的一部分,是更高级的功能,我希望它早在昨天就能用于Java。它将GPT-4生成的Python代码封装到一个Juypter或类似Jupyter的沙箱中,并将其放在一个循环中以纠正自己的错误。以下是我在调试索引代码构建分区图时的一个示例。

主要要注意的问题是,ADA倾向于通过删除冒犯性的代码行来“解决”意外输入的问题,而这通常不是您想要的。一旦您告诉它要寻找什么,它将将其添加到“迭代直到成功”的循环中,您就不必重复自己了。

还值得一提的是:传闻称ADA现在运行的是比普通GPT-4更先进的模型,具有(至少)更长的上下文窗口。我现在默认情况下都使用ADA,并且它似乎是一种改进;唯一的缺点是有时我想要Java时它会开始为我编写Python。

Claude

Claude是Anthropic开发的OpenAI GPT的竞争对手。Claude大约处于GPT 3.5的水平,用于编写代码时明显不如GPT-4。

但是Claude的上下文窗口有10万个令牌,是GPT-4的十倍以上。(OpenAI刚刚宣布的Enterprise ChatGPT将GPT-4的上下文窗口增加到32,000个令牌,仍然只有Claude的三分之一。)

我使用Claude进行了以下三个方面的工作:

  1. 粘贴整个Cassandra代码类以帮助弄清楚它们的作用。
  2. 上传研究论文并提出问题。
  3. 同时进行这两个方面的工作:这是一篇研究论文;这是我用Java实现的。它们有什么不同?在给定约束X和Y的情况下,这些差异有意义吗?

必应和Phind

当Bing Chat在今年年初推出时,引起了很多关注,它仍然是一个免费的GPT-4(选择“创意”设置)的良好来源,但仅此而已。我几乎完全停止使用它了。微软对Bing的GPT-4版本做了一些改动,使其在编写代码方面比ChatGPT中的版本要糟糕得多。

相反,当我想要进行AI风格的搜索时,我使用Phind。这就是Bing应该成为的东西,但出于某种原因,一家小型初创公司在其旗舰项目中胜过了微软。对于我在Java、Python、git等方面的“如何做X”类型的问题,Phind已经完全取代了谷歌。以下是一个使用陌生库解决问题的很好的例子。在这种类型的查询中,Phind几乎总能解决问题,而且还会提供相关的来源。相比之下,Bing几乎总是会引用至少一种与其实际情况不同的来源。

Bard

到目前为止,我还没有发现Bard擅长的领域。它不具备GPT-4编写代码的能力,也没有Claude的大背景窗口。与此同时,它的幻觉比两者都多。

提高编码效率和乐趣

Cassandra是一个庞大而成熟的代码库,对于想要添加功能的新人来说可能会令人生畏,即使对我这样的人来说,在管理方面度过了十年的时间。如果AI要帮助我们中的任何人更快地前进,这就是方法。ChatGPT和相关的AI工具在解决明确定义的问题时编写代码很好,无论是作为人类工程师设计的较大项目的一部分,还是用于一次性的工具。它们还可用于调试、草绘原型和探索陌生代码。

简而言之,ChatGPT和Copilot对于满足我们的最后期限至关重要。拥有这些工具使我在任务上的工作效率提高了50%至100%,具体取决于任务的性质。它们有一些限制,但在反复迭代较小任务方面表现出色,并通过充当不知疲倦、不抱怨的合作伙伴来帮助其人类主管保持专注。即使您有多年的编程经验,您也需要这样做。

最后,即使没有提高生产力方面的因素,与帮助处理重复部分的AI一起编码也更有趣。它给了我第二次机会,让我对构建酷炫的东西充满了新的激情。我期待着使用更高级的这些工具版本,因为它们不断发展和成熟。

Leave a Reply

Your email address will not be published. Required fields are marked *