先做个自我介绍:【如果咱们已经是老朋友了,这部分文字请直接跳过。】

我是一位20年经验的编程老师傅。做过创业公司的 CEO,也在上市企业担任过技术总监和首席专家。现在是中科院某重点实验室的高级工程师、研究组负责人。

一直在这个领域深耕,我也深刻感受到随着软件系统越来越庞大和复杂,如今大规模代码库的理解成为了一项每个程序员都要去面对的极具挑战性的任务。于是,我和团队一起,借助大语言模型等先进技术,打造了一款颇具创新性的开发者工具。

下面的内容和大家分享我们团队的探索成果——Eagle DevAgent,一款能帮你搞定大规模代码库分析的AI大模型。

全文共 6855 字,共包含 6 大部分。真诚地建议你能耐心看完,如果时间有限,也可跳到第六部分的总结。AI 的发展超乎所有人想象,此文作为抛砖引玉,希望与各位大拿们讨论。

纯干货,比较长,本文是我在AiDD上的大会演讲实录。


软件开发过程中,大规模代码库的分析一直是个难题。无论是从学生阶段面对毕业设计课题中的开源项目代码,还是到程序员职业生涯中的各个阶段,无论是接手新项目、担任架构师进行产品选型、还是带领团队管理开发进展等,都面临着理解和掌握大规模代码库的挑战

大量的代码在一起构建成一个庞大的项目,我们人类想要去搞清楚这个代码的各个部分感觉困难重重,耗精力、耗时间,对人的水平也有比较高的挑战

如果我们用 AI,能不能很好地去解决这个问题呢?AI 帮我们把代码看懂不就行了吗?现在不是有很多地方用 AI 去读代码嘛?但是,当你要想用 AI 去读懂整个项目代码的时候,会发现它仍然存在一些问题。我大概总结了一下,主要包括以下 6 种挑战吧(如有遗漏的,欢迎大家帮我补充):


项目级代码分析的 6 大难点

01 代码规模庞大

企业级项目代码规模庞大,可能达到几万行、 十万行甚至几百万行。对于这样的大规模代码,主流大语言模型的上下文窗口往往难以容纳。以 10 万行代码为例,大概相当于 100 万+个token。达到了现在主流大语言模型上下文窗口的 10 倍,甚至更高。

这给用大语言模型分析大规模代码库带来了巨大挑战,因为模型可能无法完整地处理这么庞大的代码量,从而影响对代码的理解和分析效果。


02 自然语言到代码匹配困难

自然语言描述的功能与实际代码实现之间常常存在匹配困难。代码是用特定的编程语言编写的,自然语言描述的功能可能无法直接在代码中找到对应的字词。然而,代码实际上表达的逻辑可能与自然语言描述的意思相同。例如,想要实现某个特定功能的自然语言描述,在代码中可能没有包含这些自然语言中的具体字词,但通过分析代码的逻辑可以发现它实现了该功能。

这种情况使得大语言模型在将自然语言与代码进行匹配时面临挑战,需要更加复杂的分析方法来确定代码是否实现了特定的自然语言描述的功能。


03 代码变化频繁

代码每天可能经历增删改等变化,这使得增量处理成为一个重大挑战。在大规模代码库中,代码的变化可能涉及多个文件和模块,大语言模型需要能快速识别这些变化,并对分析结果进行相应的调整,以确保分析结果的准确性和时效性。

如果每次变化都对分析结果进行全量更新,开销将非常大,如何跟踪这些变化并以最小的代价及时更新大语言模型对代码的分析结果是一个需要解决的难点问题。


04 跨项目、跨语言分析复杂

大规模代码库的分析往往涉及跨项目和跨语言的情况,这使得分析变得极其复杂。比如说前后端是不同的代码库和项目,多个微服务可能分布在不同的仓库中,而且代码库中可能还包含多种语言。

传统的代码解析技术在面对跨语言的项目时往往难以应对,比如,Python 和 Java 等不同语言的代码解析方式就不同,如果遇到跨语言的项目,就会出现问题。此外,语言的种类远超我们大多数人的想象,单说主流的编程语言就有几十种之多,这进一步增加了跨语言分析的难度。


05 代码与文档的结合

代码和文档相结合,这也是企业内部经常会遇到的。在实际的软件开发过程中,代码和文档是相互关联的,理解代码的同时需要参考相关的文档,所以在让 AI 理解代码的过程中需要在适当的时候把相关文档也提供给大模型。

另一方面,保持代码和文档的一致性也是非常耗时的工作,尤其是文档中架构图、流程图或其他UML图的维护。然而,纯粹依靠现有的技术生成 UML 图可能得不到非常理想的结果。例如,传统工具生成的 UML 图仅表示了代码元素而缺少对代码语义的表达,难以实现对高层架构的表示以及处理跨项目的调用和架构关系。


06 指定版本分析

最后一个难点是,我们可能会需要分析指定版本的代码。在代码库中,不同版本的代码有多种体现方式,有 branch、release、tag、commit 等,这无疑给分析带来了困难。

在分析代码库时,需要能准确地指定版本,以便了解特定版本的代码是如何实现某个功能的。这对于决定软件的技术路径、推进二期开发等非常重要。然而,不同的版本体现方式却让分析过程变得复杂,需要大语言模型能够有效地识别和处理这些不同的版本标识,才能准确地分析指定版本的代码。


CodeGraphRAG,让 AI 理解项目级代码

01 基本结构

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_编程

在解决大规模代码库分析难题时,我们提出了 CodeGraphRAG 这一方案。

首先,这个图是由我们的 Eagle DevAgent 这个产品根据整个框架自己绘制的 UML 图。这个 Agent(智能体)底层的技术正是 CodeGraphRAG。

它是怎么完成的呢?我来简单说一下过程。

首先,它有一个代码文件收集器,从这个代码库、代码仓里把代码取出来进行分析。这个收集器就像一只勤劳的小蜜蜂,不断地从代码的“花园”里采集代码文件,为后续的分析工作做准备。

接着,分析的时候会经过两个解析器,一个是传统的静态解析器,另一个是基于大语言模型的解析器。传统静态解析器就像一位经验丰富的老匠人,虽然在某些方面依然有价值,但是在面对大规模代码库时,它的作用就逐渐被基于大语言模型的解析器给超越了。基于大语言模型的解析器现在已经成为了主解析器,它能更智能地理解代码的含义和逻辑,就像是一个聪明的智者,能快速洞察代码的本质。那个静态代码分析反而成为辅助的了。

经过两个解析器的共同作用,代码的关系被构建成一个图的形式,存到图数据库里,支持我们的搜索和查询,方便 Eagle DevAgent 在需要的时候能快速找到想要的代码信息。图数据库中存储的节点(代码中的实体)和边(不同实体之间的调用、包含等关系)如下图所示:

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_02

具体的解析过程,要经过两次对代码库文件的遍历。第一次是单个文件遍历,就是每个文件去提取这样一些实体以及实体之间的关联。在这个过程中,就像是在研究一本书的内容,找到书中的关键人物和他们之间的关系。第二次遍历则是提取跨文件之间的关联,这就像是将不同的书联系起来,找出他们之间的共同主题和相互影响。通过这两次遍历,能够得到一个比较好的结果,为大规模代码库的分析提供有力支持。

另外为了优化性能,CodeGraphRAG利用了一个缓存机制,让数据的查询和更新更顺畅。


02 增量索引

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_03

对于代码的修改、删除、增加新文件等情况,CodeGraphRAG 通过 commit 触发增量索引过程。这个过程就像是一个敏锐的哨兵,时刻关注代码库的变化。当有新的代码提交到库里的时候,就如同发出了一个信号,增量索引机制会立刻响应。

它有一个递归机制,当发现有实体或者实体关联关系变更了,可能会影响到其他的文件、其他的实体时,它会递归找下去,就像在一个复杂的网络中,顺着线索不断地探索。直到递归终止,然后再回来处理其他的实体的和实体之间的关系。这样的机制确保了所有影响到的实体和关系得到更新,且不会对未变化的代码进行额外的计算。


03 Lazy Indexing

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_开源_04

Lazy Indexing 是什么意思呢?就是当遇到一个新项目的时候,CodeGraphRAG 会快速解析最小集。这就像是在面对一个新的谜题,先从最关键的部分入手,快速了解问题的核心,再根据具体任务触发后续索引过程。例如,当用户问到的问题或者搜索的位置不在最小集中时,它会触发后续的构建索引的过程。

这里有两个关键点,第一个就是初始化的一个最小的索引,它中间可能是用一些目录结构的辅助项目基本信息、main 的入口点等等。后面其实是在当我们如果要搜索的部分是没有在 index 索引里边的,它会触发后续的解析的这个过程。通过这种方式,CodeGraphRAG 能够对新接入的项目快速做出响应,再逐步完善对新项目的分析,为开发人员提供更加高效的代码分析服务,提升了用户体验。


分析代码库的具体演示

在讲具体步骤之前,我先简单铺垫一下相关背景:我们演示的是让基于 CodeGraphRAG 的 Eagle DevAgent 解析OpenAI 开源的项目。Eagle DevAgent 是我们基于 CodeGraphRAG 开发的智能体,名称“Eagle”寓意助用户像雄鹰一样从高空俯瞰项目代码,掌控全局。OpenAI最近开放了一个realtime API,这组 API 用起来比 OpenAI 以前的 API 都要复杂很多,所以 OpenAI 就给它封了一个 SDK,方便用户使用,又给了一个使用这个 SDK 的示例项目,SDK 和示例项目都是开源的。为了迅速掌握这个 SDK 的使用和其原理,我们用 Eagle DevAgent 来解析一下这两个项目。


根据代码库 URL 整体解析项目

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_语言模型_05

首先让 Eagle 阅读这个示例项目,我把项目的 URL 丢给 Eagle以后,他开始对项目构建索引,然后给出了一段自然语言的描述。


回答用户关于代码库的具体问题

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_编程_06

我现在问它一个更具体的问题,我问他是如何接收语音,并且生成回复返回给用户的整个这个过程。

他从中间搜到相应的代码,进行了非常详细的解析。


侧边栏目录树,查看代码文件无需切换

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_语言模型_07

左侧有个目录树,可以直接查看。当我们想自己读一读代码再去问一些问题时,不用切换到代码库页面或者IDE。


跨项目代码分析

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_编程_08

SDK 的 sample 例子是一个代码仓。那我现在是跟到那个 SDK 里边,刚才前面 Eagle 的输出中有个提示,他说里边调了一个library,在另外一个代码仓里边,我们可以实现跨项目的代码的解析。

左边目录树,也同步刷新成了第二个项目代码的目录树。


生成UML时序图

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_开源_09

我们把跨两个项目的完整的调用过程让它生成一个 UML 图,从用户发起请求对输入语音到经过前端的那个项目到调那个SDK,然后再到调 open AI 的API,最终生成回复返回给用户整个画一个 UML 图。你可以注意到这个地方,它还提到了说整个过程可能随时中断,并且提供新的输入,所以它分析的还是比较全面的。

那这个 UML 图就可以直接 control+c 到文档里边了。过去,画这种 UML 图,我相信基本上要花费一个架构师半天时间,甚至一天都可能画不明白,架构师的成本是很高的,但是现在用这个工具,只用了不到半小时就搞定。


继续答疑,帮助开发者深度掌握项目代码

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_10

在演示过程中,对于它的回复当中我注意到一个东西叫 Relay Server。我在对话里让它仔细地讲一讲这个 Relay Server 到底干了啥?为什么要有这个东西?给我的答案是说,这里涉及到一些安全协议的一些考量跟一些自定义功能的实现。

这个是超出我以前认知的,是我知识的盲区,如果没有它的话我可能很难去理解,但有了 Eagle DevAgent 以后我就很快能发现这里面有些点是我以前没有考虑到的。如果我不知道这些东西,那么我在项目实施的时候可能就会忽略 Relay Server,有可能埋下一些安全性的隐患,也会影响未来的功能扩展。

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_语言模型_11

再回到这个 Eagle DevAgent 这个原理示意画的就比较简单了,其实跟通用的智能体的图没有太大的区别。

我想强调的是,我们发现在对 code 代码解析做智能问答的这个场景下,纯粹做 GraphRAG 是不够的,还是需要有智能体去推动它执行。

也就是说,Eagle DevAgent 并不是简单地把 RAG 结果返给用户,而是通过智能体推动一个分析过程,去解决较复杂的问题。

包括刚才什么时候触发那个 Lazy Indexing 后续的索引,都和智能体的能力相关。

说到这里,我再总结一下 Eagle DevAgen 的重要功能——
1、十万到百万行量级的全项目和跨项目程序代码理解
2、支持多语种自然语言对代码库进行快速检索和答疑
3、从代码一键生成架构图、类图、流程图、思维导图
4、深度解读 GitHub 项目,掌握开源项目不再困难
5、广泛适用几十种主流编程语言,跨编程语言项目解读无障碍

有了功能比较完善和强大的智能体架构以后,你一定会好奇具体在企业级功能里如何体现和应用。


已落地五大典型应用场景

01 新项目接手

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_代码库_12

不论是员工入职以后接触新项目,还是企业承接甲方二期开发任务,或者一个项目的后续工作跟进,Eagle 都能帮助开发者快速分析项目的代码结构和逻辑,减少阅读文档和梳理代码的时间,迅速融入新项目,实现高效的开发对接,降低工作中出错的几率。


02 国外开源代码自主可控

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_代码库_13

充分掌握开源代码,避免重复发明轮子,同时实现可控。在软件开发过程中,利用国外开源代码可以提高开发效率,但也存在一定风险。Eagle DevAgent能帮助开发团队充分掌握开源代码,实现自主可控。

通过对国外开源代码库进行分析,可以了解代码的功能、结构和潜在问题。比如,对于基于开源软件进行军工方面软件开发的项目,大语言模型可以分析开源代码的安全性和可靠性,确保项目的质量和安全性。同时,大语言模型还可以提供对开源代码进行优化和改进建议,使其更符合项目需求。

此外,企业版 Eagle DevAgent 还可以结合企业的开发文档,将开源代码与企业内部的代码库、图数据库和向量数据库相结合,为企业提供更全面的功能支持。


03 研发质量把控和进度管理及风险预警

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_14

评估代码质量、效率和进度,分析提交的 issue,提出修复建议。大语言模型可以在研发质量和进度管理方面发挥重要作用。通过对代码库的分析,Eagle DevAgent 可以评估代码的质量和效率,发现潜在的问题和优化点。

在进度管理方面,Eagle 可以分析开发团队提交的 commit,了解代码的修改、删除和增加情况。通过对代码库的增量索引,大语言模型可以及时更新分析结果,为开发团队提供最新的信息。同时,大语言模型还可以分析测试团队提交的 issue,了解项目中存在的问题和风险。通过对 issue 的分析,大语言模型可以提出修复建议,帮助开发团队及时解决问题。


04 软件开发项目评审

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_开源_15

帮助理解代码,发现亮点和问题,确保项目质量。在软件开发项目评审中,大语言模型可以作为一个强大的工具,帮助评审人员更好地理解代码,发现项目中的亮点和问题,确保项目质量。

比如,在某个软件开发项目评审中,Eagle DevAgent 就帮助我快速地理解代码库,分析项目的架构和功能。对于答辩人一些没有讲清楚的亮点,Eagle 也通过对代码的分析,发现了这些亮点,并给出了详细的解释。同时,对于项目中存在的问题,如提交的代码中缺少核心模块等问题,也可以及时发现,并让开发团队进行补齐。


05 招聘辅助

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_16

根据项目技术栈和需求生成岗位职责描述、面试题和笔试题,填补研发团队与 HR 部门之间的 gap。大语言模型可以在招聘过程中为企业提供有力的支持。根据项目的技术栈,生成岗位职责描述、面试题和笔试题,帮助企业更好地招聘到适合项目的人才。

这个已经在我们团队有了成功的应用。我为团队招人时让 Eagle DevAgent 根据分析自己的代码库和技术栈,写出了非常准确的岗位职责。不仅如此,还把面试题、笔试题也写了出来,还帮我完成了简历评估、笔试评估,考察应聘者的技术能力和知识水平。通过这种方式,填补了我们业务团队、研发团队与 HR 部门之间的 gap,提高了招聘的效率和质量。


展望颇具科幻色彩的未来

Eagle Workspace 让人人都成为开发者

目前在一些公司里,运营和销售的同事已经开始使用提示 AI 去进行编程的方式帮助他们分析销售数据或者分析运营数据。

比如,在我们公司,运营和销售同事不用学习代码编程,只要知道利用 AI 能够生成代码并处理数据即可。随着 AI 技术的演进,Eagle Workspace 能做的事情覆盖的面越来越广,这意味着手工编写代码的“程序员”可能会越来越少,但“开发者”反而会越来越多。大语言模型正在以强大的自然语言处理能力为基础,不断拓展到认知智能的更多领域,为人人成为开发者提供了可能。未来,Eagle Workspace 将在更多领域发挥作用,让更多人能够利用 AI 技术进行开发。

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_17


Eagle Factory 为软件开发带来新变革

未来我们还会开发 Eagle Factory,为企业提供像如今的汽车生产线一样的自动化软件生产基础设施,为软件开发带来新的变革。将程序员从码代码的劳动中解放出来,让他们专注于需求满足和设计,像汽车工程师一样思考工程问题。让程序员不再是廉价的打字员,而是成为真正的软件工程师。

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_Eagle_18


一个思考

AI 如此强大,会不会代替程序员?

我的观点和 GitHub CEO 的分享一致,程序员(手动编写代码的人员)会越来越少,但是开发者会越来越多。AI 不会导致软件开发者失业,反而由于开发越来越便捷,创造价值的效率越来越高,所以企业也会更愿意往这个方向投入。现在或者可预见的未来程序员(或开发者)在职业生涯中被淘汰原因,和过去30年并没有太大区别。


总结

1

大语言模型为解决大规模复杂代码库理解问题带来了新的可能,但也面对诸多挑战。通过我们的探索,提出了创新的解决方案以解决所面对的挑战,并在实践中证明了其在代码分析、项目管理和团队协作等方面的巨大潜力。


2

具体来说,我们提出的 CodeGraphRAG 能够应对代码规模庞大、自然语言到代码匹配困难、代码变化频繁、跨项目跨语言分析复杂以及结合代码与文档等挑战,有效地分析大规模代码库,提高代码分析的准确性和效率。


3

基于 CodeGraphRAG 的 Eagle DevAgent 智能体提供一系列功能,包括:项目整体架构分析、逐模块分析、代码中潜在的优化点、复杂算法解释、代码安全性与鲁棒性分析、代码修改检查以及文档与注释补充等,为软件开发提供了全面的支持。名称“Eagle”寓意助用户像雄鹰一样从高空俯瞰项目代码,掌控全局。


4

在应用场景方面,Eagle DevAgent 可以帮助开发人员及管理者在新项目接手、国外开源代码的自主可控、研发质量和进度管理分析及风险预警、软件开发项目评审以及招聘辅助等方面提高工作效率和质量。


5

未来,随着 Eagle Workspace 和 Eagle factory 等项目的发展, 我们将进一步推动软件开发的智能化和自动化,将开发者从繁琐的码代码工作中解放出来,专注于需求满足和设计,并为企业提供 AI 驱动的全自动软件生成平台,为软件开发带来新的变革。大语言模型为大规模代码库分析带来了新的机遇和挑战,我们更期待未来它在软件开发领域发挥着更加重要的作用。


大语言模型为大规模代码库分析带来了新的机遇和挑战,我们更期待未来它在软件开发领域发挥着更加重要的作用。

用 AI 助力大规模代码库分析,一文详解我们团队的探索成果_开源_19

代码问题,就问Eagle!

我们的网址:eagle.capitalren.com