以下文章来源于微智斋记 ,作者编程老师傅李明宇
微智斋记.“微智”是Microwise的字面直译,Microwise就是李明宇,李明宇就是“编程老师傅”。这都是同一个人,公众号改名字规矩多,一些老名字改不了了,所以昵称搞得有点多。
作者李明宇——中科院计算所高级工程师、Eagle DevAgent作者
李老师是前深信服科技集团云计算首席专家。开源项目活跃开发者,20余年编程与软件开发经验,10余年云端系统研发与产业化工作经历。历任国家重点实验室研究组负责人,上市公司事业群技术总监、首席技术专家。
本文整理自李明宇老师在AIDD峰会深圳站上的演讲实录。AiDD全称“AI+研发数字峰会”,是具有专业性、专注性、全面性与前瞻性的顶级 AI 数字峰会,致力于协助企业利用AI技术深化计算机对现实世界的理解,推动研发进入智能化和数字化的新时代。
▼
软件开发过程中,大规模代码库的分析一直是个难题。无论是从学生阶段面对毕业设计课题中的开源项目代码,还是到程序员职业生涯中的各个阶段,无论是接手新项目、担任架构师进行产品选型、还是带领团队管理开发进展等,都面临着理解和掌握大规模代码库的挑战。大量的代码在一起构建成一个庞大的项目,我们人类想要去搞清楚这个代码的各个部分感觉困难重重,耗精力、耗时间,对人的水平也有比较高的挑战。如果我们用 AI,能不能很好地去解决这个问题呢?AI 帮我们把代码看懂不就行了吗?现在不是有很多地方用 AI 去读代码嘛?但是,当你要想用 AI 去读懂整个项目代码的时候,会发现它仍然存在一些问题。本文作者总结了 6 大挑战:企业级项目代码规模庞大,可能达到几万行、 十万行甚至几百万行。对于这样的大规模代码,主流大语言模型的上下文窗口往往难以容纳。以 10 万行代码为例,大概相当于 100 万+个token。达到了现在主流大语言模型上下文窗口的 10 倍,甚至更高。这给用大语言模型分析大规模代码库带来了巨大挑战,因为模型可能无法完整地处理这么庞大的代码量,从而影响对代码的理解和分析效果。2.自然语言到代码匹配困难
自然语言描述的功能与实际代码实现之间常常存在匹配困难。代码是用特定的编程语言编写的,自然语言描述的功能可能无法直接在代码中找到对应的字词。然而,代码实际上表达的逻辑可能与自然语言描述的意思相同。例如,想要实现某个特定功能的自然语言描述,在代码中可能没有包含这些自然语言中的具体字词,但通过分析代码的逻辑可以发现它实现了该功能。
这种情况使得大语言模型在将自然语言与代码进行匹配时面临挑战,需要更加复杂的分析方法来确定代码是否实现了特定的自然语言描述的功能。
3.代码变化频繁
代码每天可能经历增删改等变化,这使得增量处理成为一个重大挑战。在大规模代码库中,代码的变化可能涉及多个文件和模块,大语言模型需要能快速识别这些变化,并对分析结果进行相应的调整,以确保分析结果的准确性和时效性。
如果每次变化都对分析结果进行全量更新,开销将非常大,如何跟踪这些变化并以最小的代价及时更新大语言模型对代码的分析结果是一个需要解决的难点问题。
4.跨项目、跨语言分析复杂
大规模代码库的分析往往涉及跨项目和跨语言的情况,这使得分析变得极其复杂。比如说前后端是不同的代码库和项目,多个微服务可能分布在不同的仓库中,而且代码库中可能还包含多种语言。
传统的代码解析技术在面对跨语言的项目时往往难以应对,比如,Python 和 Java 等不同语言的代码解析方式就不同,如果遇到跨语言的项目,就会出现问题。此外,语言的种类远超我们大多数人的想象,单说主流的编程语言就有几十种之多,这进一步增加了跨语言分析的难度。
5.代码与文档的结合
代码和文档相结合,这也是企业内部经常会遇到的。在实际的软件开发过程中,代码和文档是相互关联的,理解代码的同时需要参考相关的文档,所以在让 AI 理解代码的过程中需要在适当的时候把相关文档也提供给大模型。
另一方面,保持代码和文档的一致性也是非常耗时的工作,尤其是文档中架构图、流程图或其他UML图的维护。然而,纯粹依靠现有的技术生成 UML 图可能得不到非常理想的结果。例如,传统工具生成的 UML 图仅表示了代码元素而缺少对代码语义的表达,难以实现对高层架构的表示以及处理跨项目的调用和架构关系。
6.指定版本分析
最后一个难点是,我们可能会需要分析指定版本的代码。在代码库中,不同版本的代码有多种体现方式,有 branch、release、tag、commit 等,这无疑给分析带来了困难。
在分析代码库时,需要能准确地指定版本,以便了解特定版本的代码是如何实现某个功能的。这对于决定软件的技术路径、推进二期开发等非常重要。然而,不同的版本体现方式却让分析过程变得复杂,需要大语言模型能够有效地识别和处理这些不同的版本标识,才能准确地分析指定版本的代码。
二、CodeGraphRAG,让 AI 理解项目级代码
1.基本结构
在解决大规模代码库分析难题时,我们提出了 CodeGraphRAG 这一方案。首先,这个图是由Eagle DevAgent 这个产品根据整个框架自己绘制的 UML 图。这个 Agent(智能体)底层的技术正是 CodeGraphRAG。首先,它有一个代码文件收集器,从这个代码库、代码仓里把代码取出来进行分析。这个收集器就像一只勤劳的小蜜蜂,不断地从代码的“花园”里采集代码文件,为后续的分析工作做准备。接着,分析的时候会经过两个解析器,一个是传统的静态解析器,另一个是基于大语言模型的解析器。传统静态解析器就像一位经验丰富的老匠人,虽然在某些方面依然有价值,但是在面对大规模代码库时,它的作用就逐渐被基于大语言模型的解析器给超越了。基于大语言模型的解析器现在已经成为了主解析器,它能更智能地理解代码的含义和逻辑,就像是一个聪明的智者,能快速洞察代码的本质。那个静态代码分析反而成为辅助的了。经过两个解析器的共同作用,代码的关系被构建成一个图的形式,存到图数据库里,支持我们的搜索和查询,方便 Eagle DevAgent 在需要的时候能快速找到想要的代码信息。图数据库中存储的节点(代码中的实体)和边(不同实体之间的调用、包含等关系)如下图所示:
具体的解析过程,要经过两次对代码库文件的遍历。第一次是单个文件遍历,就是每个文件去提取这样一些实体以及实体之间的关联。在这个过程中,就像是在研究一本书的内容,找到书中的关键人物和他们之间的关系。第二次遍历则是提取跨文件之间的关联,这就像是将不同的书联系起来,找出他们之间的共同主题和相互影响。通过这两次遍历,能够得到一个比较好的结果,为大规模代码库的分析提供有力支持。另外为了优化性能,CodeGraphRAG利用了一个缓存机制,让数据的查询和更新更顺畅。对于代码的修改、删除、增加新文件等情况,CodeGraphRAG 通过 commit 触发增量索引过程。这个过程就像是一个敏锐的哨兵,时刻关注代码库的变化。当有新的代码提交到库里的时候,就如同发出了一个信号,增量索引机制会立刻响应。它有一个递归机制,当发现有实体或者实体关联关系变更了,可能会影响到其他的文件、其他的实体时,它会递归找下去,就像在一个复杂的网络中,顺着线索不断地探索。直到递归终止,然后再回来处理其他的实体的和实体之间的关系。这样的机制确保了所有影响到的实体和关系得到更新,且不会对未变化的代码进行额外的计算。Lazy Indexing 是什么意思呢?就是当遇到一个新项目的时候,CodeGraphRAG 会快速解析最小集。这就像是在面对一个新的谜题,先从最关键的部分入手,快速了解问题的核心,再根据具体任务触发后续索引过程。例如,当用户问到的问题或者搜索的位置不在最小集中时,它会触发后续的构建索引的过程。这里有两个关键点,第一个就是初始化的一个最小的索引,它中间可能是用一些目录结构的辅助项目基本信息、main 的入口点等等。后面其实是在当我们如果要搜索的部分是没有在 index 索引里边的,它会触发后续的解析的这个过程。通过这种方式,CodeGraphRAG 能够对新接入的项目快速做出响应,再逐步完善对新项目的分析,为开发人员提供更加高效的代码分析服务,提升了用户体验。
在讲具体步骤之前,我先简单铺垫一下相关背景:我们演示的是让基于 CodeGraphRAG 的 Eagle DevAgent 解析OpenAI 开源的项目。Eagle DevAgent 是基于 CodeGraphRAG 开发的智能体。OpenAI最近开放了一个realtime API,这组 API 用起来比 OpenAI 以前的 API 都要复杂很多,所以 OpenAI 就给它封了一个 SDK,方便用户使用,又给了一个使用这个 SDK 的示例项目,SDK 和示例项目都是开源的。为了迅速掌握这个 SDK 的使用和其原理,我们用 Eagle DevAgent 来解析一下这两个项目。
1.根据代码库 URL 整体解析项目
首先让 Eagle 阅读这个示例项目,我把项目的 URL 丢给 Eagle以后,他开始对项目构建索引,然后给出了一段自然语言的描述。
2.回答用户关于代码库的具体问题
我现在问它一个更具体的问题,我问他是如何接收语音,并且生成回复返回给用户的整个这个过程。
他从中间搜到相应的代码,进行了非常详细的解析。
3.侧边栏目录树,查看代码文件无需切换
左侧有个目录树,可以直接查看。当我们想自己读一读代码再去问一些问题时,不用切换到代码库页面或者IDE。
4.跨项目代码分析
SDK 的 sample 例子是一个代码仓。那我现在是跟到那个 SDK 里边,刚才前面 Eagle 的输出中有个提示,他说里边调了一个library,在另外一个代码仓里边,我们可以实现跨项目的代码的解析。
左边目录树,也同步刷新成了第二个项目代码的目录树。
5.生成UML时序图
我们把跨两个项目的完整的调用过程让它生成一个 UML 图,从用户发起请求对输入语音到经过前端的那个项目到调那个SDK,然后再到调 open AI 的API,最终生成回复返回给用户整个画一个 UML 图。你可以注意到这个地方,它还提到了说整个过程可能随时中断,并且提供新的输入,所以它分析的还是比较全面的。那这个 UML 图就可以直接 control+c 到文档里边了。过去,画这种 UML 图,我相信基本上要花费一个架构师半天时间,甚至一天都可能画不明白,架构师的成本是很高的,但是现在用这个工具,只用了不到半小时就搞定。在演示过程中,对于它的回复当中我注意到一个东西叫 Relay Server。我在对话里让它仔细地讲一讲这个 Relay Server 到底干了啥?为什么要有这个东西?给我的答案是说,这里涉及到一些安全协议的一些考量跟一些自定义功能的实现。再回到这个 Eagle DevAgent 这个原理示意画的就比较简单了,其实跟通用的智能体的图没有太大的区别。我想强调的是,我们发现在对 code 代码解析做智能问答的这个场景下,纯粹做 GraphRAG 是不够的,还是需要有智能体去推动它执行。也就是说,Eagle DevAgent 并不是简单地把 RAG 结果返给用户,而是通过智能体推动一个分析过程,去解决较复杂的问题。包括刚才什么时候触发那个 Lazy Indexing 后续的索引,都和智能体的能力相关。有了功能比较完善和强大的智能体架构以后,你一定会好奇具体在企业级功能里如何体现和应用。不论是员工入职以后接触新项目,还是企业承接甲方二期开发任务,或者一个项目的后续工作跟进,Eagle 都能帮助开发者快速分析项目的代码结构和逻辑,减少阅读文档和梳理代码的时间,迅速融入新项目,实现高效的开发对接,降低工作中出错的几率。充分掌握开源代码,避免重复发明轮子,同时实现可控。在软件开发过程中,利用国外开源代码可以提高开发效率,但也存在一定风险。Eagle DevAgent能帮助开发团队充分掌握开源代码,实现自主可控。通过对国外开源代码库进行分析,可以了解代码的功能、结构和潜在问题。比如,对于基于开源软件进行军工方面软件开发的项目,大语言模型可以分析开源代码的安全性和可靠性,确保项目的质量和安全性。同时,大语言模型还可以提供对开源代码进行优化和改进建议,使其更符合项目需求。此外,企业版 Eagle DevAgent 还可以结合企业的开发文档,将开源代码与企业内部的代码库、图数据库和向量数据库相结合,为企业提供更全面的功能支持。评估代码质量、效率和进度,分析提交的 issue,提出修复建议。大语言模型可以在研发质量和进度管理方面发挥重要作用。通过对代码库的分析,Eagle DevAgent 可以评估代码的质量和效率,发现潜在的问题和优化点。在进度管理方面,Eagle 可以分析开发团队提交的 commit,了解代码的修改、删除和增加情况。通过对代码库的增量索引,大语言模型可以及时更新分析结果,为开发团队提供最新的信息。同时,大语言模型还可以分析测试团队提交的 issue,了解项目中存在的问题和风险。通过对 issue 的分析,大语言模型可以提出修复建议,帮助开发团队及时解决问题。帮助理解代码,发现亮点和问题,确保项目质量。在软件开发项目评审中,大语言模型可以作为一个强大的工具,帮助评审人员更好地理解代码,发现项目中的亮点和问题,确保项目质量。比如,在某个软件开发项目评审中,Eagle DevAgent 就帮助我快速地理解代码库,分析项目的架构和功能。对于答辩人一些没有讲清楚的亮点,Eagle 也通过对代码的分析,发现了这些亮点,并给出了详细的解释。同时,对于项目中存在的问题,如提交的代码中缺少核心模块等问题,也可以及时发现,并让开发团队进行补齐。根据项目技术栈和需求生成岗位职责描述、面试题和笔试题,填补研发团队与 HR 部门之间的 gap。大语言模型可以在招聘过程中为企业提供有力的支持。根据项目的技术栈,生成岗位职责描述、面试题和笔试题,帮助企业更好地招聘到适合项目的人才。
1.大语言模型为解决大规模复杂代码库理解问题带来了新的可能,但也面对诸多挑战。通过我们的探索,提出了创新的解决方案以解决所面对的挑战,并在实践中证明了其在代码分析、项目管理和团队协作等方面的巨大潜力。2.具体来说,CodeGraphRAG 能够应对代码规模庞大、自然语言到代码匹配困难、代码变化频繁、跨项目跨语言分析复杂以及结合代码与文档等挑战,有效地分析大规模代码库,提高代码分析的准确性和效率。3.基于 CodeGraphRAG 的 Eagle DevAgent 智能体提供一系列功能,包括:项目整体架构分析、逐模块分析、代码中潜在的优化点、复杂算法解释、代码安全性与鲁棒性分析、代码修改检查以及文档与注释补充等,为软件开发提供了全面的支持。4.在应用场景方面,Eagle DevAgent 可以帮助开发人员及管理者在新项目接手、国外开源代码的自主可控、研发质量和进度管理分析及风险预警、软件开发项目评审以及招聘辅助等方面提高工作效率和质量。5.未来,随着 Eagle Workspace 和 Eagle factory 等项目的发展, 我们将进一步推动软件开发的智能化和自动化,将开发者从繁琐的码代码工作中解放出来,专注于需求满足和设计,并为企业提供 AI 驱动的全自动软件生成平台,为软件开发带来新的变革。大语言模型为大规模代码库分析带来了新的机遇和挑战,我们更期待未来它在软件开发领域发挥着更加重要的作用。
由AiDD组委会联合多个社区发起的「2024软件研发应用大模型」调查结束了,报告已在11月8日AiDD峰会深圳站主会场Keynote重磅发布。扫描下方二维码即可免费下载调研报告!
伴随着人工智能(AI,特别是大语言模型)在众多行业领域的广泛应用及其带来的颠覆性变革,软件的开发模式、方式和实践都可能会发生巨大的变化。为助力更多企业在人工智能的浪潮中乘风破浪,“AI+研发数字峰会(AiDD)”应运而生,旨在帮助更多企业借助AI技术,使计算机能够更深入地认知现实世界,推动软件研发全面进入数字化时代。欢迎大家扫描下方二维码,了解更多!