想象你走进一家新开的社区图书馆,书架上摆满几百本新书,却没有一本配有内容简介。想找一本烘焙入门书,只能一本本翻目录,一小时过去还是一头雾水。直到有一天,馆长请来一位经验丰富的图书管理员。她坐在角落,快速翻看每一本书的目录和章节标题,提起笔写下几十字的简介卡片,贴到书脊旁。从此,读者只需扫一眼卡片,就能知道该不该借这本书。 软件开发世界里的“图书馆”是代码库,那些函数和类就是书。一个老工程师离职后留下的核心模块,几千行代码没有注释,新同事打开只能逐行“翻阅全书”。代码摘要与文档生成技术,就是那位自动图书管理员:输入一段函数或类的源代码,输出一句自然语言描述,告诉你这段代码解决什么问题、输入输出是什么、核心逻辑怎么走的。有了它,理解陌生代码的时间从“几小时”压缩到“几秒钟”。而支撑这位“自动管理员”的,正是抽象语法树(AST)、结构化编码与预训练代码模型的层层接力。
掌握代码摘要与文档生成,是成为代码智能工程师的必修课——在 AI 辅助开发、自动化文档、代码审查等工业场景中,它直接决定了开发者理解与维护大型代码库的效率。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
摘要生成基础
想象你走进一家新开的社区图书馆,书架上摆满几百本新书,却没有一本配有内容简介。想找一本烘焙入门书,只能一本本翻目录,一小时过去还是一头雾水。直到有一天,馆长请来一位经验丰富的图书管理员。她坐在角落,快速翻看每一本书的目录和章节标题,提起笔写下几十字的简介卡片,贴到书脊旁。从此读者只需扫一眼卡片,就能知道该不该借这本书。
软件开发世界里的“图书馆”是代码库,那些函数和类就是书。一个老工程师离职后留下的核心模块,几千行代码没有注释,新同事打开只能逐行“翻阅全书”。代码摘要生成技术,就是那位自动图书管理员:输入一段函数或类的源代码,输出一句自然语言描述,告诉你这段代码解决什么问题、输入输出是什么、核心逻辑怎么走的。有了它,理解陌生代码的时间从“几小时”压缩到“几秒钟”。
这项技术属于代码智能(Code Intelligence)与程序合成领域,处于“代码理解与修复”链条的最上游——只有先读懂代码,才谈得上修改与修复。发展历程大致有三阶段:早期基于模板与检索,靠正则提取函数名、参数名和注释来拼装句子,遇到命名不规范、注释缺失的代码就失效;2015 年后转向序列到序列(Seq2Seq)模型,用循环神经网络把代码 token 翻译成文本;如今主流是基于 CodeBERT、CodeT5 等预训练代码模型,在海量代码上预训练后做微调,能捕捉更深层的语义关系。
这位管理员之所以写得又快又准,是因为她既有“拆书”的章法(把代码解析成结构),又有“博览群书”的底子(预训练模型)。接下来的章节,我们就跟着她的工作流程,一步步看代码是如何被拆解、编码、理解,最终落成一张漂亮的简介卡片。
- 源代码 $x$$x$ 指函数或类的完整源码,是摘要生成系统的输入,可以是一段文本,也可以先解析成抽象语法树。
- 摘要 $y$$y$ 是模型输出的自然语言句子,通常包含功能、输入输出和关键逻辑。
- 映射 $\mathrm{Summarize}$$\mathrm{Summarize}$ 表示从代码到摘要的映射函数,现代实现是预训练编码器—解码器模型。
代码表示方法
图书管理员给新书写简介前,不会一字一句从头读到尾,而是先翻开目录页,把书拆成“章—节—小节”的层级骨架。目录页就是她消化一本书的第一级工具——书读得再厚,骨架只有一张纸。
计算机读代码也一样。源代码对程序而言只是一串字符,像一本没有标点的手稿。要理解它,先要切词——词法分析把 def avg(values): 切成 def、avg、(、values、)、: 这些 token;再组装结构——语法分析把这些 token 按语法规则拼成一棵抽象语法树(AST)。AST 是源代码的树形骨架:整棵树代表一个函数定义,子节点分别是参数列表、函数体,函数体里又有 If、For、Return 等分支。
AST 忠实保留了“代码做了什么”的逻辑结构,同时丢弃了空格、换行、注释等纯格式噪声。一棵 AST 的根节点是函数定义(FunctionDef),往下是语句节点(Assign、Return、If)和表达式节点(BinOp、Name、Call)。工程上还常把 AST 扩展为包含符号表、类型信息和控制流的增强语法树,让模型能看见“变量是被赋值还是被读取”。数学上,一棵 AST 可以用节点集合和边集合来定义:
有了这棵“目录树”,管理员接下来要做的,是把树变成一套能快速检索的“路径笔记”——这就是下一节的结构化编码。
- 树 $T$$T$ 表示一棵抽象语法树,它是代码结构的层级化表示,也是后续所有编码操作的起点。
- 节点集合 $V$$V$ 是语法节点的集合,$v_1, v_2, \ldots, v_m$ 分别代表函数定义、返回语句、二元运算等语法成分。
- 边集合 $E$$E$ 是父子边的集合,一条 $(v_i, v_j)$ 边表示“$v_i$ 包含 $v_j$”,比如 Return 节点包含一个 BinOp 子节点。
AST结构化编码
管理员记性再好,也无法把整棵目录树默背下来。她的做法是画“路径笔记”:从封面(根)出发,经过哪些章节,才能到达某个小节,把这条路线记成一行短字。同理,神经网络也记不住整棵树——它在数学上只是一个向量计算器,只吃定长的向量。
AST 要先变成向量才能喂给模型。最常见的做法有三类:一是树遍历序列化,按深度优先序把节点铺平成序列,并用特殊分隔符标记层级;二是节点路径编码,只保留“目标节点到根”的路径;三是把节点序列和对应的 token 文本拼接,形成多模态输入。三者都经过嵌入层(Embedding)把离散的节点类型映射为连续向量。
实验表明,路径编码对长距离依赖尤其友好。例如 a + b 这个表达式,叶子节点 a 与 b 之间的路径要跨越 BinOp 节点,这条路径浓缩了整个表达式的运算语义。相比只读扁平 token 序列,路径编码让模型能直接“看到”两个远端节点在结构上的距离,从而避免在长代码中丢失关联。路径表示的向量化公式如下:
管理员手里的“路径笔记”写满了从根到每个知识点的路线。可是路线图只是符号——真正让这些符号产生意义的,是她多年练就的“阅读直觉”。这种直觉,对应到 AI 就是下一节的主角:预训练代码模型。
- 目标节点 $v$$v$ 是我们要编码的语法节点,例如表达式里的变量名节点。
- 路径向量 $p(v)$$p(v)$ 由根节点到 $v$ 的整条路径上所有节点的嵌入向量拼接而成,长度由路径长度 $L$ 决定。
- 嵌入函数 $\mathrm{Embed}$$\mathrm{Embed}$ 是一个可学习的查表操作,把离散节点(如 BinOp)映射到 $d$ 维实数向量。
预训练代码模型
为什么管理员看几条路径笔记就能判断一本书的水平?因为她入职前在总馆受过三年培训,经手过几百万册书,见过最规范的经典名著,也见过思路混乱的私人笔记。大量阅读练就了她对“书应该长什么样”的直觉。
预训练代码模型正是这样“读”出来的。CodeBERT、CodeT5 等模型先在 GitHub 等海量开源代码语料上做自监督学习,最核心的训练任务叫掩码语言建模(Masked Language Modeling, MLM):随机盖住代码中的部分 token,让模型根据上下文猜测被盖住的内容。比如遮住 return total / count 里的 count,模型要知道 total / 的右边是一个被除数才可能猜对。
在掩码预测过程中,模型被迫学会三类知识:语法(/ 两边需要数值)、语义(count 是被除数还是次数变量)、风格(命名习惯暗示用途)。CodeBERT 更进一步采用双模态结构,同时输入代码序列和对应的文档注释,训练模型区分“代码—正确注释”与“代码—错误注释”对,从而建立代码与自然语言之间的语义对齐。预训练完成后,再接上解码器并微调,就能完成摘要生成、注释生成甚至缺陷修复。训练目标如下:
训练有素的管理员站在书架前,目光扫过目录,心中已经浮现出整本书的轮廓。下一节,看她如何把“心中轮廓”落成笔下的简介卡片——也就是摘要生成的具体流程。
- 损失函数 $\mathcal{L}$$\mathcal{L}$ 是预训练要最小化的目标,值越小表示模型对每个被遮 token 的预测越准。
- 被掩码 token $t_k$$t_k$ 是第 $k$ 个被随机遮住的代码 token,模型要根据剩余上下文把它复原。
- 条件概率 $P(t_k \mid t_{\backslash k})$$t_{\backslash k}$ 表示遮住第 $k$ 个 token 后的序列,$P$ 是模型给出的恢复概率;取负对数后,正确概率越高损失越低。
摘要生成流程
写简介卡片时,管理员不会一口气写完,而是边想边落笔:先写下“本书介绍……”,再根据书的内容决定补充“适合入门读者”,结尾注明“含大量案例”。每写一个词,她都会回头看看书名和目录,确保没跑题。这种“边看边写”就是生成式摘要的逐词解码。
现代摘要生成采用编码器—解码器(Encoder-Decoder)架构。编码器先把代码(或其 AST 路径编码)加工成一组语义向量;解码器每次生成一个 token,每一步都综合“源码的语义向量”和“已经生成的词序列”来预测下一个词。
训练阶段,模型通过交叉熵损失最大化正确摘要的生成概率,整句概率等于每个词的条件概率连乘,公式如下。推理阶段常用束搜索(Beam Search)保留 Top-K 条候选句,避免每步只看最优词而走进死胡同。为了提升摘要的可读性,研究者还会用强化学习直接优化 BLEU、ROUGE 等指标,让模型生成的句子更贴近人类的表达习惯。质量评估则采用 BLEU(衡量 n-gram 重合度)与人工评分结合的方式。
管理员从“胸有成竹”到“笔下生花”。但真正的考验还在后头:图书馆的书会出修订版,如果简介卡片不跟着更新,读者就会被过时信息误导。这引出了文档自动化维护——让每张卡片都跟着书共同进化。
- 生成概率 $P(y \mid x)$给定源码 $x$ 时生成整个摘要词序列 $y$ 的概率,训练目标是让这个值尽量大。
- 连乘号 $\prod$整句概率拆成每一步条件概率的乘积,每一步“选对下一个词”的概率共同决定整句质量。
- 历史前缀 $y_{<t}$$y_{<t}$ 表示已经生成的 $t-1$ 个词,解码器每步都把它和源码上下文一起作为条件。
文档自动化维护
社区图书馆的科普区每季度都会进新版书。旧版书的内容简介卡片若继续贴着,读者顺着卡片找来的内容可能早已不同。好的管理员会建立“修订登记簿”:每本新书入库时,自动比对上一版的目录,只重写发生变化的章节,其余保持不动。
软件项目同样面临“文档过期”的顽疾。API 升级、参数改名、逻辑重构之后,手写文档常常忘记同步,最终与代码严重脱节。代码摘要技术让文档维护实现了自动化:当代码变更被提交,CI/CD 管道自动触发一次 AST diff,对发生变化的函数重新生成摘要,并同步更新 API 文档和知识库条目。
工业落地主要有三种形态。第一,API 文档生成:为开源 SDK 的每个函数生成参数说明、返回值描述和用法示例;第二,变更摘要:从 git diff 中提取改动函数,生成“本次提交做了什么”的要点清单,辅助 Code Review 快速对齐上下文;第三,知识库构建:把整个仓库的函数摘要汇总为可检索的代码知识库,新工程师入职后先读摘要再读源码,上手周期缩短一半。工程上有一条关键原则:只有当 AST 出现实质差异时才触发重新生成,避免每次提交都做全量重算——这正对应管理员“只重写变化的章节”的智慧。
图书馆的简介卡片因此永远“保鲜”。开发者的文档也从“写完就过期”的摆设,变成了跟随代码一起演进的活地图——这正是代码摘要技术在工业界最可感知的价值。
挑战与发展趋势
管理员再老练,也有犯难的时候:遇到字迹潦草的私人手稿,她看半天也写不出准确简介;遇到用生僻方言写作的地方史料,她的“阅读直觉”完全失灵。面对这些特殊书籍,她只能老老实实写上“内容待考”。
代码摘要技术同样存在边界。第一个挑战是数据质量:GitHub 上大量代码没有注释、命名随意,预训练语料噪声很大,模型对“坏味道”代码生成的摘要经常泛泛而谈。第二个挑战是可解释性:摘要是模型黑箱产出的,工程师无法确认它是依据哪段逻辑给出的结论,当摘要与代码行为不符时难以排查根因。
第三个挑战是多语言支持:Python、JavaScript 等主流语言语料充足,摘要质量高;而 Julia、Rust、领域 DSL 语料稀缺,模型表现断崖式下降。未来方向大致有四条:用大语言模型的少样本能力降低对标注数据的依赖;把 AST、数据流等结构化信息与大模型结合,增强推理深度;引入外部文档和类型系统约束生成内容;以及把“摘要生成”与“代码修复”串成闭环——先用摘要帮助模型理解代码,再基于理解自动修补缺陷。跨模态对齐与持续学习也是前沿热点。
尽管存在短板,这位“自动图书管理员”已经切切实实改变了人们找书、读书的方式。代码摘要技术同样在重塑工程师的工作习惯:它不会取代人的判断,但能把人从“逐行读懂代码”的苦役中解放出来,把精力留给更有创造力的设计、评审与决策。
AI 应用场景
IDE 智能注释与文档补全
阶段:开发辅助与代码理解
解决的问题:传统开发中,函数注释和文档字符串依赖开发者手动维护,代码频繁迭代时注释经常遗漏或过期,导致 IDE 悬停提示信息不可靠。AI 代码摘要模型实时分析当前函数结构,自动生成准确的注释建议,让开发者聚焦业务逻辑而非文档琐事。
具体案例:GitHub Copilot 与 CodeGeeX 等插件在 VS Code 中,当开发者把光标悬停在函数名上时,会基于函数签名与函数体自动生成一段自然语言说明,覆盖参数含义、返回值和典型用法;新版 IDE 还能在保存文件时自动补写 docstring 初稿,供开发者一键确认。
企业 SDK API 文档自动更新
阶段:文档自动化与知识管理
解决的问题:开源 SDK 的 API 文档人工更新滞后是行业通病——函数参数变了,文档却还停留在上一版,用户投诉率居高不下。利用 AST diff + 代码摘要管线,在每次合并请求触发时自动比对语法树,仅对变更函数重新生成摘要并更新在线文档,保证文档与代码始终同源。
具体案例:某大型 Python 数据分析库在 CI 管道中集成了 docgen 服务:每次 PR 合并后,系统自动提取变更函数的 AST,调用预训练模型生成新摘要,写入 readthedocs 对应页面;实测文档维护工时下降约 45%,且 API 文档的准确率显著提升。
代码变更摘要辅助 Code Review
阶段:代码审查与质量保障
解决的问题:大型代码评审中,评审者面对几百行 diff 往往难以下手。传统做法是逐个文件展开,费时且容易遗漏关键改动。代码摘要模型从 git diff 中提取被修改的函数,生成“本次提交做了什么”的要点列表,评审者先读摘要再决定深入哪些模块,大幅提升评审效率。
具体案例:某互联网大厂的内部代码评审平台在每一个 Merge Request 页面展示“AI 变更摘要”:例如“重构了用户鉴权逻辑,新增 token 过期校验,调整异常抛出时机”,评审者据此快速定位高风险文件,平均评审时间缩短 30%。
Python 演示
# -*- coding: utf-8 -*-"""基于AST的轻量代码摘要生成器"""import ast def extract_features(source): """解析源码, 提取函数结构特征""" tree = ast.parse(source) features = {} for node in ast.walk(tree): if isinstance(node, ast.FunctionDef): features["name"] = node.name features["args"] = [a.arg for a in node.args.args] features["has_return"] = any(isinstance(n, ast.Return) for n in ast.walk(node)) features["has_if"] = any(isinstance(n, ast.If) for n in ast.walk(node)) features["has_loop"] = any( isinstance(n, (ast.For, ast.While)) for n in ast.walk(node)) features["raise_error"] = any(isinstance(n, ast.Raise) for n in ast.walk(node)) features["docstring"] = ast.get_docstring(node) return features def make_summary(f): """根据结构特征拼装自然语言摘要""" parts = [] args_text = ", ".join(f["args"]) if f["args"] else "无" parts.append("函数 {} 接收参数 [{}]".format(f["name"], args_text)) if f["has_loop"]: parts.append("对输入进行循环遍历") if f["has_if"]: parts.append("内含条件分支处理") if f["raise_error"]: parts.append("遇非法输入抛出异常") if f["has_return"]: parts.append("最终返回计算结果") if f["docstring"]: parts.append("作者注释: " + f["docstring"]) return "; ".join(parts) if __name__ == "__main__": code = '''def avg_above_threshold(values, threshold=0): """计算列表中超过阈值的元素的平均值""" total = 0 count = 0 for v in values: if v > threshold: total += v count += 1 if count == 0: raise ValueError("No valid data") return total / count''' feat = extract_features(code) print("AST特征:", feat) print("生成摘要:", make_summary(feat))
tree = ast.parse(source)调用 Python 内置的 ast 模块,把源码解析成抽象语法树,相当于图书管理员翻开目录页。for node in ast.walk(tree)深度优先遍历整棵树,逐个访问语法节点,这是后续所有特征提取的基础。isinstance(node, ast.FunctionDef)判断当前节点是不是“函数定义”这一语法类型,只有函数定义才需要生成摘要。[a.arg for a in node.args.args]从参数列表节点中取出每个参数的名称,拼成参数名列表。any(isinstance(n, ast.Return) for n in ast.walk(node))在函数子树里扫描是否存在 Return 语句,用于判断“是否有返回值”。ast.get_docstring(node)提取函数顶部的文档字符串,作为辅助信息并入摘要,模拟预训练模型中“代码—注释对齐”的信号。features["has_loop"]记录循环结构是否存在,提示摘要应包含“遍历”“迭代”等关键词。
常见误区
误区我以为代码摘要就是正则提取 docstring 和注释,把它们拼成一段话。只要注释写得好,摘要自然准确;注释缺失就没办法了。
正解注释和 docstring 只是辅助信号。真正可靠的做法是解析 AST 理解代码结构,再交给预训练模型基于语义生成摘要。许多生产代码注释缺失或过时,模型仍能从代码本身提炼出功能描述——就像图书管理员不会因为书上没印简介就不读书,她会翻开目录自己做判断。
为何常见:人读代码时天然先看注释,容易把“注释可用”误当成“摘要可用”,低估了注释缺失场景下模型语义理解的价值。
误区AST 是从源码解析出来的,那直接把源码文本喂给模型不就行了?反正信息量一样,何必多此一举。
正解AST 丢弃了空格、换行、注释等格式噪声,保留了“谁包含谁”的树形结构。源码只是扁平字符流,模型要自己从零揣摩结构;AST 直接告诉模型 Return 是 BinOp 的父节点。这种显式的结构信息对长距离依赖建模至关重要,是纯文本输入难以替代的。
为何常见:人们习惯把程序看作一串字符,容易忽略“语法树”才是编译器真正消费的结构化表示——代码的语义藏在层级里,不在字符流里。
误区GPT 那么大,直接把源码塞进大模型写摘要,效果一定最好,AST 那些老技术已经过时了。
正解规模重要,但结构编码同样关键。多项工业实验表明,把 AST 路径作为额外输入注入大模型,能显著提升对结构敏感任务的准确率——比如输入输出绑定、分支逻辑描述。大模型给出的是“流畅可能”的文本,结构化编码约束它“贴合真实逻辑”,两者是互补关系而非替代关系。
为何常见:大模型在开放文本上表现出色,容易让人误以为代码只是另一种自然语言,忽略了代码强结构约束下“流畅”不等于“正确”。
误区有了自动摘要,开发团队就不需要再写任何文档和注释了,机器全包。
正解自动摘要擅长回答“这个函数做了什么”,但难以回答“这个函数为什么存在、为什么这么设计”。架构决策、业务背景、权衡记录仍需要人工沉淀。工业实践是把两者结合:自动生成初稿,人工审核补充设计意图——就像管理员写简介,但书的深度书评还得靠专业读者。
为何常见:追求自动化时容易高估工具范围,把“降低文档成本”误当成“消灭文档工作”,忽视了文档中大量非功能性信息无法从代码中推断。
面试题
Q1. 代码摘要生成任务的核心目标是什么?
- A.把源码翻译成自然语言描述← 正确答案
- B.把注释编译成可执行程序
- C.把测试用例转成运行日志
- D.把日志信息转成告警通知
答案:A。代码摘要是“代码到文本”的映射,输入是源代码,输出是描述功能、输入输出和核心逻辑的自然语言句子。B 是反向的“注释转程序”,C/D 分别属于测试与运维领域,方向完全不同。
Q2. 抽象语法树(AST)在代码摘要中的作用是什么?
- A.表示代码的层级语法结构← 正确答案
- B.存储编译产出的二进制码
- C.记录程序运行的实时状态
- D.加密源代码防止被破解
答案:A。AST 把源代码组织成树形结构,根是函数定义,子节点是语句与表达式,模型据此理解“谁包含谁”。B 是机器码,C 是运行时信息,D 是安全加密,都与语法结构无关。
Q3. 相比直接使用源码文本,使用 AST 编码的主要优势是什么?
- A.保留结构并过滤格式噪声← 正确答案
- B.让代码占用更小的内存
- C.省去模型训练的全部过程
- D.自动修复代码里的全部 Bug
答案:A。AST 丢弃空格换行等格式信息,同时显式保留语法层级与父子关系,让模型能直接“看见”结构距离。B 中 AST + 向量反而更占内存;C/D 完全不成立,AST 只是表示形式,不负责训练和修复。
Q4. 预训练代码模型的掩码语言建模任务是做什么的?
- A.预测被遮住位置的代码单元← 正确答案
- B.把代码翻译成其他编程语言
- C.对代码按功能分类打标签
- D.生成代码运行时的性能报告
答案:A。MLM 随机盖住部分 token,让模型根据上下文预测被遮内容,从而学会语法、语义与风格。B 是翻译任务,C 是分类任务,D 是性能分析任务,都不是自监督预训练的核心目标。
Q5. 摘要解码阶段使用“束搜索”的主要作用是什么?
- A.保留多条候选句避免局部最优← 正确答案
- B.压缩模型参数以加速推理
- C.生成更小的代码运行环境
- D.检测源码中的语法错误
答案:A。束搜索维护 Top-K 条部分候选句,每步只扩展最好的 K 条,最后选整体概率最高的一句,避免“每步选最优词”导致的局部最优。B 是模型压缩,C 是环境构建,D 是静态分析,都不属于解码策略。
Q6. 现代代码摘要系统常用的输入表示有哪些?
- A.Token 序列表示← 正确答案
- B.AST 路径编码← 正确答案
- C.机器码指令流
- D.数据流图信息← 正确答案
答案:ABD。Token 序列提供文本信息,AST 路径提供结构信息,数据流图补充变量传递与控制依赖,三者常被组合使用。C 机器码是编译产物,丢失了高层语法结构,不适合作为摘要生成输入。
Q7. 文档自动化维护的主要价值是什么?
- A.降低文档维护成本← 正确答案
- B.提升程序运行速度
- C.消除所有代码缺陷
- D.替代人工代码评审
答案:A。AST diff + 自动摘要在 CI 中自动更新 API 文档,把文档维护从人工同步变成自动迭代,实测可降低 30%-60% 成本。B 是运行时优化,C 过于绝对,D 中摘要只辅助评审而非完全替代。
Q8. 代码摘要质量评估常用的指标包括哪些?
- A.BLEU 指标← 正确答案
- B.ROUGE 指标← 正确答案
- C.FLOP 指标
- D.IOPS 指标
答案:AB。BLEU 衡量生成摘要与参考摘要的 n-gram 重合度,ROUGE 侧重召回与关键信息覆盖。C 是算力指标,D 是存储性能指标,两者都与文本生成质量无关。
Q9. 关于代码模型的可解释性,当前的局限是什么?
- A.摘要依据难以追溯到具体代码行← 正确答案
- B.摘要无法覆盖任何异常场景
- C.摘要模型无法在 GPU 上运行
- D.摘要在中文项目上完全失效
答案:A。模型是黑箱,工程师无法确知摘要基于哪段逻辑得出,当摘要与行为不符时难以定位。B 过于绝对,摘要可以覆盖异常处理;C 不符合事实;D 夸大了语言差异的影响。
Q10. AST 路径编码相对扁平 token 序列的优势有哪些?
- A.保留节点间结构距离← 正确答案
- B.捕获长距离的依赖← 正确答案
- C.缩小模型的词表规模← 正确答案
- D.免除模型的全部训练
答案:ABC。路径编码把“根到叶”的节点序列作为表示单元,显式编码结构距离,对长距离依赖更敏感,且路径由有限节点类型组合而成,词表比全标识符序列更紧凑。D 错误——路径编码后的模型仍需正常训练。