人工智能 频道

如何将人工智能的“幻觉”隔绝于代码之外

  人工智能编码助手无疑是提升生产力的利器,但驾驭这一工具的人依然是核心与关键。以下是八种有效方法,助你防止人工智能的“幻觉”潜入你的代码之中。

  事实证明,机器人也会“做梦”,而且它们的梦往往离奇古怪。在生成式人工智能发展的初期,我们曾见识过八根手指的人手、用胶水制作的披萨酱食谱等荒诞产物。如今,使用人工智能辅助编码工具的开发人员也发现,代码中有时也会混入这种“人工智能幻觉”。

  微软高级工程师Mithilesh Ramaswamy解释道:“编码工具中的人工智能幻觉源于人工智能模型的概率特性。这些模型是基于统计可能性,而非确定逻辑来生成输出的。”就像那个用胶水做披萨酱的食谱一样,有时这些幻觉会逃脱束缚,混入我们的代码中。

  人工智能编码助手日益普及,使用量也在持续增长。在2024年5月的Stack Overflow开发人员调查中,62%的受访者表示他们正在使用人工智能编码工具。那么,如何防止人工智能的“幻觉”破坏你的代码呢?我们向有使用人工智能编码助手经验的开发人员和技术领导者请教了他们的独门技巧。

  人工智能幻觉如何潜入代码及应对策略

  微软的Ramaswamy每天使用人工智能工具,他列出了常遇到的人工智能幻觉问题:“生成的代码无法编译;代码过度复杂或效率低下;函数或算法自相矛盾或行为模糊。”此外,他还提到,“人工智能幻觉有时会虚构不存在的函数”,以及“生成的代码可能引用文档,但描述的行为与代码实际功能不符。”

  HeraHaven.ai的创始人Komninos Chatzipapas举了一个具体例子。他说:“在我们的JavaScript后端中,有一个功能是根据用户ID扣除用户积分。该函数期望接收一个包含ID值的对象作为参数,但编码助手却直接将ID作为参数传递。”在JavaScript等弱类型语言中,这类问题更容易通过语言解析器。Chatzipapas遇到的这个错误“破坏了我们的测试环境,幸好在推送到生产环境之前被发现了。”

  这样的代码是如何险些进入生产环境的呢?Salesforce人工智能平台组织的负责人Monojit Banerjee将许多人工智能助手生成的代码描述为“看似合理但实际上不正确或无法工作”。SAS的杰出软件开发人员Brett Smith指出,经验不足的开发人员特别容易被人工智能工具的自信表现所误导,“从而导致代码存在缺陷”。

  有缺陷的人工智能代码可能带来严重后果。安全漏洞和合规问题是许多软件公司的首要考量,但还有一些问题不那么明显。人工智能生成的代码故障增加了整体技术债务,并可能降低了代码助手本应提高的效率。微软的Ramaswamy表示:“幻码通常会导致设计低效或需要打补丁,从而增加长期维护成本。”

  幸运的是,我们采访的开发人员对于如何确保人工智能生成的代码正确且安全提供了许多建议。这些建议主要分为两类:如何尽量减少代码幻觉的机会,以及如何事后发现幻觉。

  减少代码中的人工智能幻觉

  理想情况下,我们当然希望永远不会遇到人工智能的幻觉。虽然这在当前技术状态下不太可能完全实现,但以下预防措施可以帮助减少人工智能生成代码中的问题。

  1. 写出清晰详细的提示

  “垃圾进,垃圾出”这句格言在计算机科学领域同样适用,尤其是当你通过提示而不是使用自动完成助手生成代码时。许多专家敦促开发人员要精心构思他们的提示。Confluent技术战略主管Andrew Sellers表示:“最好提出具体的问题,并批判性地检查结果。”“这些工具的使用数据表明,对于范围较小的问题,输出往往更准确。大多数开发人员通过经常检查小代码块来更好地发现错误。”

  2. 索取参考资料

  像ChatGPT这样的模型因在学校论文和法律简报中编造引文而臭名昭著。但在特定代码生成方面,工具已经取得了显著进步。Salesforce的Banerjee说:“许多模型都支持引用或API参考功能。”“开发人员应尽可能要求提供引用或API参考,以尽量减少幻觉。”

  3. 确保人工智能工具已接受过最新软件的培训

  大多数生成式人工智能聊天机器人无法告诉你昨晚谁赢得了你主队的棒球比赛,它们在软件工具和更新方面也存在限制。Dreamix首席执行官兼Citizens应用程序联合创始人Stoyan Mitov表示:“预测工具是否会产生幻觉或提供有偏见的输出的一种方法是检查其知识截止日期。”“如果你打算使用该工具不知道的最新库或框架,输出存在缺陷的可能性很高。”

  4. 训练你的模型按照你的方式做事

  创新解决方案的首席技术官Travis Rehl表示,生成式人工智能工具需要“上下文、上下文、还是上下文”才能正常工作。他说,你需要提供一个很好的例子,说明你想要什么以及你想如何完成它。“你应该告诉LLM(大型语言模型)保持某种模式,或者提醒它使用一致的方法,这样它就不会创造新的或不同的东西。”如果你不这样做,你可能会遇到一种微妙的幻觉,它将反模式注入你的代码中。他说:“也许你总是以特定方式进行API调用,但LLM会选择不同的方法。”“虽然技术上是正确的,但它没有遵循你的模式,因此偏离了规范。”

  将这一想法推向其逻辑结论的一个概念是检索增强生成(RAG),其中模型使用一个或多个指定的“真实来源”,这些来源包含特定于用户或由用户审查的代码。Mitov说:“将人工智能的输出与可靠的数据源进行比较,从而降低了产生虚假信息的可能性。”他表示,RAG是“最有效的接地方法之一”。“它通过实时利用来自外部来源、内部代码库或API引用的数据来改善LLM输出。”

  许多可用的编码助手已经集成了RAG功能,例如,Cursor中的@codebase功能。如果你想为LLM创建自己的内部代码库,你需要将其存储在矢量数据库中;Banerjee指出Chroma是最受欢迎的选项之一。

  在代码中捕捉人工智能幻觉

  即使采取了所有这些保护措施,人工智能编码助手有时也会犯错误。好消息是,在代码中,幻觉通常比在LLM编写纯文本的应用程序中更容易发现。因为代码是可执行的,并且可以测试。正如Innovative Solutions的Rehl所指出的:“编码不是主观的。”“代码要么工作,要么根本不工作。”专家们提供了几种发现生成代码错误的方法。

  1. 使用人工智能来评估人工智能生成的代码

  信不信由你,人工智能助手可以评估其他人工智能生成的幻觉代码——通常效果良好。例如,Empathy First Media的首席执行官Daniel Lynch建议“编写代码支持文档,以便你可以让人工智能在新实例中评估提供的代码,并确定它是否满足预期用例的要求。”

  HeraHaven的Chatzipapas认为,人工智能工具在判断其他工具的输出方面可以做得更多。他解释说:“开放式测试时间计算解决了一个问题,即对于相同的输入,LLM可以生成各种响应,所有响应都具有不同的质量水平。”“有很多方法可以让它发挥作用,但最简单的方法是多次查询LLM,然后使用较小的‘验证器’人工智能模型来选择哪个答案更适合向最终用户展示。还有更复杂的方法,你可以将得到的不同答案分组,并从最大的集群中选择一个(因为该集群获得了更多的隐含‘投票’)。”

  2. 保持人的参与和专业知识

  即使有机器辅助,我们采访的大多数人也认为人类是对抗人工智能幻觉的最后一道防线。大多数人认为,在可预见的未来,人类参与对编码过程仍然至关重要。微软的Ramaswamy说:“始终将人工智能作为指南,而不是真理的来源。”“将人工智能生成的代码视为一种建议,而不是人类专业知识的替代品。”

  这种专业知识不应该仅仅围绕一般的编程;你应该密切熟悉为应用程序提供动力的代码。Rehl说:“如果你不熟悉代码库,有时很难发现幻觉。”例如,在代码库中拥有实践经验对于发现特定方法或整体代码模式的偏差至关重要。

  3. 测试并审查你的代码

  幸运的是,从IDE工具到单元测试,大多数经营良好的开发团队用来捕捉人为错误的工具和技术也可以捕捉人工智能幻觉。Confluent的Sellers说:“团队应该继续进行拉取请求和代码审查,就像代码是由人类编写的一样。”“对于开发人员来说,使用这些工具来实现持续交付的自动化是诱人的。虽然值得赞扬,但对开发人员来说,在提高自动化时优先考虑QA控制非常重要。”

  SAS的Smith说:“在整个开发周期内,我怎么强调使用良好的代码审查工具和SAST(静态应用安全测试)扫描仪的必要性都不为过。”“IDE插件、集成到CI(持续集成)和拉取请求是确保幻觉不会进入生产的最起码要求。”

  Salesforce的Banerjee补充说:“一个成熟的DevOps管道至关重要,每行代码都将在开发生命周期内进行单元测试。”“只有在测试和构建通过后,管道才会将代码提升到暂存和生产环境。此外,持续部署对于尽快回滚代码至关重要,以避免任何中断的漫长尾巴。”

  4. 突出显示人工智能生成的代码

  亚马逊网络服务的机器学习工程师Devansh Agarwal推荐了一种他称之为“我的小实验”的技术:在代码审查界面中标记人工智能生成的代码部分。“我经常看到数百行单元测试代码在审查员没有任何评论的情况下被批准,”他说,“这些单元测试是我和其他人经常使用人工智能的用例之一。一旦你标记这些是人工智能生成的,那么人们就会花更多时间来审查它们。”

  他说,这不仅仅有助于捕捉幻觉。“这对团队中的每个人来说都是一个很好的学习机会。有时它做得很好,作为人类,我们想要复制它!”

  让开发人员掌握主导权

  生成式人工智能终究只是一种工具,和其他工具一样,它也有其特性。虽然使用人工智能改变了编程的某些方面,并使个人程序员的工作效率更高,但它的幻觉倾向意味着在可预见的未来,人类开发人员必须保持主导权。Rehl说:“我发现编码将慢慢成为一项繁重的QA和产品定义工作。”作为一名开发人员,“你的目标是了解模式,了解测试方法,并能够阐明你希望代码实现的业务目标。”

0
相关文章