1、代码大模型改进的双引擎:数据增强和知识增强肖仰华上海市数据科学重点实验室复旦大学知识工场实验室认识代码大模型-从语言模型到代码模型存在怎样的理论与技术鸿沟?2代码语言的本质 代码语言介于形式语言与自然语言之间 形式语言(Formal language)是人为设计的用精确的数学或机器可处理的公式定义的语言(Wikipedia)形式文法、正则表达式、自动机等 自然语言(Natural language)通常是指一种自然地随文化演化的语言。(wikipedia)代码语言包含了可执行代码、注释和日志信息等 可执行代码形式语言 注释自然语言 日志信息半形式语言形式语言代码语言n 形式语言与自然语言之间的
2、差异是训练代码大模型主要考虑代码有着苛刻的正确性要求 形式化语言对于语法与语义正确性有着极为严格的要求形式化语言必须有严格的规范和标准形式化语言必须有清晰和完整的定义和描述修改很小的地方会导致编译错误执行器只能接受精确指令指令:“抓起水杯”YESNOn 与自然语言不同,代码主要关心正确与否,没有流畅与否;代码追求精确、语言天然模糊生成式大模型的幻觉难以满足代码的严格性要求生成一个找1000以内质数的代码生成式大模型的幻觉问题大模型的先天能力不足训练数据规模、质量有缺陷训练不充分实际任务复杂指令复杂、输入有噪音大模型的知识匮乏!#$%$&()*+,-./01!23456789:;?AB大模型本质
3、上是统计模型,幻觉是其创造性所付出的必要代价,创造性与真实性之间的矛盾难以从大模型自身角度完全解决代码依赖复杂 真实代码项目中往往有数百个包的依赖 函数依赖 版本依赖 调用关系 数据依赖 语法依赖 逻辑约束.!#$%&$&()*+,-./0123#45677789:;6?94ABC6D函数调用图1https:/monorepo.tools/#what-is-a-monorepo代码的预训练机制应充分考虑代码之间的复杂依赖关系全局依赖仍是当前大模型学习的难点,要努力突破全局约束、长程约束的学习机制代码结构复杂 自然语言的大模型仍然难以理解代码中的复杂结构 复杂结构理解能力是指语言模型能够处理和表
4、示输入序列中的复杂结构 例如嵌套、递归、循环、条件等 代码往往具有复杂的控制流和数据流,以及多种数据类型和数据结构ABAB条件选择(alternation)条件/分支顺序(sequencing)TrueFalseA条件TrueFalse循环(iteration)迭代n 能否习得代码中所蕴含的语义结构是代码大模型预训练的关键n 要在文本预训练基础上,结合代码结构(图)预训练程序控制语句代码评估标准不同于自然语言 编译通过(语法)、通过测试用例(语义、业务逻辑)是代码评测黄金标准 编译和测试用例是更严格的评估,大部分模型结果只有极低的通过率,区分度低Textbooks Are All You Ne
5、ed,preprint arXiv:2306Large Language Models are State-of-the-Art Evaluators of Code Generation,preprint arXiv:2304不同指标对代码评估结果与人工评估的相关系数n BLUE、ROUGE很高的结果与人工评估结果相去甚远,无法满足代码评估需要n 代码大模型需要建立全新的评价评估体系软件工程是个系统工程 软件工程涉及众多环节 分析、设计、实现、测试、运维 代码大模型不仅需要支撑编码,还需胜任其他角色 分析师、程序员、架构师、测试员1 Textbooks Are All You Need,pr
6、eprint arXiv:2306软件工程中的各角色需要的能力不同情感与情绪情感与情绪分析任务分析任务情感分类情感生成情感融合语义关系任语义关系任务务相似性判定关联性判定比较与类比文本生成任文本生成任务务故事生成对话生成诗歌生成创意性文本生成篇章级任务篇章级任务文本摘要文本连贯性分析文本衔接与连结逻辑推理与问逻辑推理与问题解决任务题解决任务推理判断问题求解逻辑谜题信息抽取与分信息抽取与分类任务类任务命名实体识别关键词抽取文本分类机器翻译任务机器翻译任务中英互译多语种翻译实用应用任实用应用任务务语音识别内容整理文本纠错问答系统时态与时空时态与时空关系任务关系任务时态转换时间线构建时空关系分析语言