编程语言中蕴含着丰富的语义信息。与自然语言不同,这些信息通常以精确的图结构(如抽象语法树 AST、数据流图 DFG)的形式存在。传统代码大模型仅将代码视为文本处理,忽略了这些关键结构。我们创新性地通过图神经网络(GNN)与跨模态对齐技术,将这些代码结构信息在微调阶段以迁移学习的方式注入大语言模型,既提升了模型的代码理解能力,又不改变模型的原始架构,成为一种即插即用的代码大模型能力提升方式。
▍TLDR
我们通过多模态对齐技术将代码的图结构信息引入代码大模型的微调过程中,在不改变大模型推理方式的前提下有效提升大模型对代码的理解。
▍简介
本文源于蚂蚁集团与上海交通大学的校企合作项目,目前已被 ACL 2025 主会接收。ACL(Annual Meeting of the Association for Computational Linguistics)是自然语言处理(NLP)领域的顶级国际会议,也是自然语言处理领域唯一的 CCF-A 类会议。
- arXiv:https://arxiv.org/abs/2409.04183
- Github:https://github.com/codefuse-ai/GALLa
- Hugging Face:https://huggingface.co/datasets/codefuse-ai/GALLa
与自然语言不同,编程语言具有精确的语义。这些语义通过抽象语法树(AST)、数据流图(DFG)、控制流图(CFG)等图结构表示。可是,现有的代码大模型大都忽略了这些图结构,将代码直接作为文本处理(如 DeepSeek-Coder、Qwen-Coder)。仅有少部分工作将这些图结构通过各种方式注入模型中,大致可分为三类:
- 第一类将这些图结构线性化后作为文本 token 输入模型,如 SPT-Code、UniXcoder、SynCoBERT。
- 第二类工作将图中的每个结点视作一个 token 送入模型,并通过修改模型中的注意力掩码来表征不同结点间的连接关系,代表有 GraphCodeBERT、StructCoder。
- 第三类工作同样将图中的每个结点视作一个 token,但通过修改位置编码的方式来表征结点间的连接关系 [1,2]。
以上三类现有方法中,第一类并不能充分利用图的复杂结构,且只适用于语法树、依赖树等能够线性化的树状图,不适用于数据流、控制流等存在环的图。第二、三类方法的共同缺陷是修改了语言模型的原有架构,不仅损害模型预训练阶段获得的知识,同时也极大限制了这些方法的可扩展性。
与以上三类方法不同,GALLa 借鉴了 NLP 与计算机视觉中现有的多模态对齐技术,通过图模态编码器+适配器+大语言模型级联的方式将代码结构图引入大模型的微调过程中,既能处理复杂的带环图结构,又保持了大语言模型原有结构的完整性。此外,GALLa 仅在微调阶段引入图信息,在推理阶段和基座模型一样只接受原始代码文本作为输入,避免了额外的部署开销。在七个不同家族、参数量的模型以及五个下游任务上的实验结果表明:GALLa 能有效提升大模型对代码的理解能力,全面提升下游任务性能。
[1] Han Peng et al. Integrating tree path in transformer for code representation. NeurIPS 2021.
[2] Han Peng et al. Rethinking positional encoding in tree transformer for code representation. EMNLP 2022.
▍算法
图 1:GALLa 整体框架
🤖 模型架构
我们的模型架构如图 1 所示,由图神经网络(GNN)、适配器(Adapter)、大语言模型(LLM)三部分组成,且每一部分都可以单独选择具体实现方式,具有极大的灵活性。
GNN
GNN 可以选用任何能处理有向图的现有模型,如 DUPLEX 或 MagNet 等。该模块的输入为结点特征与边信息,其中为图中结点数,为结点特征维度,为边数。该模块的输出为,其中为 GNN 的维度。
在具体实现中,我们使用代码嵌入模型 CodeT5+ 编码每个结点所对应的代码片段来提取结点特征 。
适配器
适配器是连接 GNN 与 LLM 不同语义空间的桥梁。参考 Qwen-VL、LLaVA 等跨模态工作,适配器可以用注意力(Cross Attention)或多层感知机(MLP)。以注意力为例:
其中 GNN 输出的结点特征作为 k 与 v,而 q 则使用一组可学习的向量,其维度与所用 LLM 的嵌入维度保持一致,而数量则作为超参可以自行定义(如 128 或256)。
在经过适配器后,GNN 输出的结点特征被变换到大模型的输入空间中,成为一系列“图 token”,便能与其余文本 token 拼接在一起被大模型处理。
LLM
LLM 的输入为,其中为大模型的嵌入维度,为输入文本 token 数(详见下节训练方式),为输入图 tokne 数。若适配器使用注意力,则等于自定义的可学习 q 向量数量;若适配器使用 MLP,则。
🏋️♂️ 训练方式 GALLa 训练分为两阶段,如图 2 所示。
图 2:GALLa 训练流程
第一阶段
固定 LLM 的参数,仅更新随机初始化的 GNN 与适配器参数。此阶段训练任务为图生代码(Graph2Code),即根据代码图重构源代码。代码图在经过 GNN、适配器后形成图 token,与源代码拼接后送入 LLM。训练过程中损失函数仅在源代码对应 token 上进行计算。
第二阶段
解锁 LLM 参数,同时更新三个模块。此阶段混合三个训练任务:
- 图生代码(Graph2Code):同第一阶段。
- 图问答(GraphQA):根据代码图回答特定问题。此任务中 LLM 的输入由图 token、问题、答案三部分拼接而成,损失函数仅在答案上进行计算。具体问题包含边预测、父结点预测、子结点预测三类。
- 下游任务:如代码翻译、代码总结、漏洞检测等,由问题与答案两部分拼接而成,直接输入 LLM,不使用 GNN 与适配器。
推理
在训练完成后,GNN、适配器模块将不再被使用,而只有 LLM 被单独用于测试、部署。因此,GALLa 训练所得的模型使用方式与基座 LLM 或其他指令微调所得模型完全相同,可无缝适配 vllm 等主流推理框架。这个设计有两方面的考虑:
- 推理效率:若为每个请求实时构建代码图,推理延时将大幅度增加;
- 代码完整性:构建代码图需要完整且无语法错误的代码输入,但在实际应用中许多任务(如漏洞检测、代码修复)的输入代码存在问题,无法构建代码图。
▍实验
我们使用包括 Qwen2.5-Coder 14B、LLaMA3 8B 在内的 7 个不同家族与大小的模型,在代码翻译、克隆检测、漏洞检测、代码总结、代码修复 5 个下游任务上验证了 GALLa 的效果。实验结果表明 GALLa 能有效提高所有模型在代码相关下游任务上的性能:
在以上主实验中,我们使用一层注意力作为适配器、DUPLEX 作为 GNN 模块。以 Phi-1 基座为例,我们也尝试了使用 MLP 作为适配器或使用 MagNet 作为 GNN,实验表明同样能提高模型性能:
▍后续工作
在 GALLa 基础之上,我们团队开发了更加强大的代码图模型(Code Graph Model),首创性地在仓库级别融合图结构与语言模型,截止 2025 年 5 月在仓库问题修复数据集 SWE-bench Lite 和 SWE-Bench Verified 榜单基于开源模型的方法中排名第一。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。