斯坦福大学、耶鲁大学、南加州大学等研究人员联合开源了,专用于代码定位的智能体LocAgent。
在软件开发和维护领域,代码定位是开发者日常工作中的核心任务之一,需要开发者根据问题描述,例如,错误报告、功能请求或性能问题等,快速、准确地找到需要修改的代码片段。
但传统代码定位方法在处理复杂代码库时,面临复杂代码库导航困难,问题描述与代码实体之间的语义鸿沟,多跳推理的困难等。而LocAgent可以有效解决这些难题,能自动、快速精准定、遍历代码。

开源地址:https://github.com/gersteinlab/LocAgent?tab=readme-ov-file
LocAgent的核心在于其“图基代码”表示,能将代码库解析为一个有向异构图,从而捕捉代码的层次结构和依赖关系。
在这个图中,节点代表代码库中的实体,包括文件、类、函数等,而边则表示这些实体之间的关系,例如文件之间的导入关系、函数之间的调用关系以及类之间的继承关系,还能够揭示出隐藏在代码中的复杂依赖关系。

LocAgent首先会解析代码库中的每个文件,识别出其中的类、函数等代码元素,并将它们作为节点加入到图中。随后,会分析这些代码元素之间的关系,并将这些关系作为边添加到图中。
例如,如果一个函数调用了另一个函数,那么在图中就会有一条从调用函数指向被调用函数的边。通过这种方式,LocAgent能够构建出一个全面且详细的代码库图表示,为后续的代码定位任务提供了坚实的基础。
LocAgent还通过稀疏层次实体索引来增强其搜索能力。这种索引机制为图中的每个节点创建了多个索引,包括基于实体ID的索引、基于实体名称的索引以及基于BM25算法的倒排索引。
这些索引能帮助LocAgent在几秒钟内快速定位到与问题描述相关的代码实体,即使在大型代码库中也能保持高效的性能。
在构建了图基代码表示之后,LocAgent框架的下一步是如何利用这一结构化索引进行高效的代码搜索。为此,LocAgent引入了基于Agent的代码搜索,可以通过一系列工具来探索代码库,并找到与问题描述相关的代码片段。
LocAgent为Agent提供了三种主要的工具,这些工具共同支持Agent在代码库中的高效搜索和推理。首先是SearchEntity工具,允许Agent通过关键词搜索代码库中的相关实体。

当Agent接收到一个自然语言描述的问题时,它会首先提取出问题中的关键词,然后利用SearchEntity工具在代码库的索引中查找与这些关键词相关的代码实体。这不仅能够处理精确匹配的关键词搜索,还能通过模糊搜索找到与输入关键词相关的代码片段,从而为Agent提供更广泛的搜索范围。
第二个工具是TraverseGraph,允许Agent从一个给定的实体出发,沿着图中的关系进行多跳遍历。这一工具的设计灵感来自于代码库中复杂的依赖关系,很多时候,问题的根源可能隐藏在与问题描述中提到的代码片段相隔数层的其他代码中。
通过TraverseGraph工具,Agent可以沿着调用链、继承链等关系逐步深入代码库,探索问题的潜在源头。TraverseGraph工具支持自定义遍历方向和跳数,使得Agent能够灵活地探索代码库中的复杂依赖关系,从而更全面地理解问题的上下文。
第三个工具是RetrieveEntity,用于检索指定实体的完整属性。当Agent通过SearchEntity和TraverseGraph工具定位到可能相关的代码实体后,需要获取这些实体的详细信息,以便进一步分析和判断。RetrieveEntity能够提供实体的完整代码内容、文件路径、行号等关键信息,为Agent的推理提供了充分的依据。
(文:AIGC开放社区)