Context-Augmented Code Generation Using Programming Knowledge Graphs
本文提出了一种编程知识图谱(PKG)方法,通过实现细粒度的语义检索与重排序来增强代码生成,从而减轻幻觉并提高解决复杂问题的准确性,在 HumanEval 和 MBPP 基准测试上取得了显著的性能提升。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你正在尝试编写一段复杂的软件,比如一个用来帮你分拣衣服的机器人。你向一个非常聪明、博学多才的 AI 助手(即大语言模型,简称 LLM)寻求代码编写的帮助。
问题在于,虽然这个 AI 在语法和通用逻辑方面表现出色,但它有时会忘记特定的规则,比如“不要把红袜子和白衬衫混在一起”或者“这台特定的洗衣机需要一个特殊的按钮”。它还可能会编造事实(幻觉),因为它太想表现得自信了。
为了解决这个问题,开发者通常使用一种叫做 RAG(检索增强生成)的系统。你可以把它想象成给 AI 一张图书馆借书证。在写代码之前,它会去图书馆查找相关的书籍,看看其他人是如何解决类似问题的。
然而,这篇论文指出,目前使用这个“图书馆”的方式是有缺陷的。这就像是递给 AI 一部百科全书,而它其实只需要其中一个特定的段落。AI 会被无关信息淹没、搞混,或者被那些看起来相似但实际主题错误的图书所干扰。
解决方案:编程知识图谱 (PKG)
作者们提出了一种组织这个图书馆的新方法,他们称之为 编程知识图谱 (Programming Knowledge Graph, PKG)。
类比:有序的工作室 vs. 一堆垃圾
想象一下,目前的图书馆就像地上的一大堆乱七八糟的纸张。你想要一把“螺丝刀”,AI 就会抓起一叠可能提到“螺丝刀”这个词的纸。其中一些是关于真正的工具,但另一些可能是关于“拧紧灯泡”(隐喻)或“搞砸项目”(英文原意为 screw up)。AI 就会因此感到困惑。
PKG 则像是一个拥有标签化抽屉和地图的高度有序的工作室。
- 以代码为中心的 PKG(工具抽屉): 系统不再将代码视为平铺的文本块,而是将其分解为自然的组成部分,就像一棵树。它将整个“函数”(整个工具)与其特定的“模块”(单个螺丝、齿轮和手柄)区分开来。
- 益处: 如果你需要一个特定的齿轮,系统可以只取出那个齿轮,而不是整个工具箱。这可以防止 AI 被无关的代码部分分散注意力。
- 以文本为中心的 PKG(说明手册): 对于教程和文档,系统不仅仅是抓取整个页面。它将文本分解为一个结构化的地图(类似于 JSON 树),将标题、解释和示例代码分开。
- 益处: AI 可以找到精确的“如何做”步骤,而无需阅读整本手册的历史。
“修剪树枝”的小技巧
即使有了好的地图,有时 AI 还是会抓取一个过大的分支,或者带有枯叶(无关信息)的分支。作者们使用了一种叫做 树剪枝 (Tree Pruning) 的技术。
类比: 想象你要求园丁找一根带有特定红花的树枝。园丁找到了正确的树,但带回来的却是一根带着绿叶和刺的巨大树枝。剪枝步骤就像是一个聪明的助手,他会迅速剪掉绿叶和刺,只把那根带有红花的树枝递给你。这能保持 AI 的“办公桌”整洁且专注。
“品味测试”(重排序)
有时候,即使有了最好的图书馆,AI 仍然可能会写出几种不同版本的代码,而且其中一些可能是错误的。
类比: 想象 AI 是一位厨师,根据你的要求做了三份不同版本的汤:
- 版本 1:使用了图书馆的信息,但盐放多了。
- 版本 2:忽略了图书馆的信息,但味道完美。
- 版本 3:完美地使用了图书馆的信息。
作者们添加了一个 重排序器 (Re-Ranker)。这就像是一位美食评论家,品尝完这三碗汤后,选出真正符合你订单的那一碗。论文发现,这种“品味测试”至关重要。它允许系统生成多个选项,然后选出最好的一个,从而有效地忽略掉图书馆可能意外引入的“糟糕”建议。
他们发现了什么?
研究人员在两个著名的编程测试(HumanEval 和 MBPP)上测试了这个系统。结果如下:
- 更高的准确率: 当他们使用有序的“工作室”(PKG)而不是乱七八糟的“一堆纸张”时,AI 在标准测试中的正确率提升了高达 20%,在更难的测试中提升了 34%。
- 更少的困惑: AI 犯错的情况减少了,例如使用错误的变量名或忘记检查条件的情况。
- 局限性: 它并非对每种类型的问题都完美。例如,在处理复杂的字符串操作(如重新排列字母)时,额外的辅助信息有时反而会让 AI 感到困惑。
- 最终赢家: 有序图谱 (PKG) + 剪枝(去除噪音)+ 重排序(挑选最佳结果)的组合是最强大的组合。
核心结论
论文得出结论:仅仅给 AI 提供更多信息是不够的;你必须以正确的格式提供正确的信息。
可以这样理解:如果你想盖房子,你并不想要一卡车随机的砖块、木头和钉子被倾倒在你的车道上。你想要的是一份蓝图(图谱),它能准确显示每一块砖的位置;还需要一位监工(剪枝)来移除损坏的部分;以及一位质量检测员(重排序)从几个设计方案中选出最好的一个。
通过为代码和文本构建这种结构化的“蓝图”,作者们展示了我们可以帮助 AI 编写更好、更可靠的软件,而不至于让它迷失在噪音之中。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。