微信扫码
与创始人交个朋友
我要投稿
一. 背景
git aicommit 用法示例
下面就以智能CommitMessage为例,介绍下大模型效能工具开发流程,主要包括:
简单的功能设计
应用指标和模型评估指标
大模型数据处理过程
模型性能优化的几种方式
二.功能与设计
Git是高效便捷的版本控制系统,虽然百度APP移动端已经多仓库化,随着组件化进程的完善,有至少有一半的需求不需要跨仓库提交而使用Git。
MGit (https://github.com/baidu/m-git)是百度自研的一套开源的、基于Git的多仓库管理工具,针对多仓库的应用场景安全地、高效的管理多个Git仓库,在基础版本之上增加MGit插件即可扩展或者修改原命令。
保证Git和MGit的入口分离的同时,保证功能统一,低成本维护
处理方式:抽象实现共用模块git-aicommit,该模块由MGit插件和Git alias命令直接调用,开发语言选型ruby,便于 MGit 插件直接调用。
# 给 git 添加 Alias:git aicommit$ git config --global alias.aicommit '!f() { ruby -e '\''require "git-aicommit"; MGit::GitAICommit.run(ARGV);'\'' -- "$@"; }; f'
三. 评估指标
管理学之父彼得·德鲁克说过:“If you can't measure it, you can't manage it.”。
度量指标对于模型选择、后续Prompt调优以及SFT都至关重要,因为它决定了优化的标准。
生成CommitMessage时,既需要理解变更的代码,也需要生成对应的摘要、评估影响等,生成式大模型适合此类任务,当前生成式大模型在市面上也百花齐放,经过综合评估使用成本(包括数据管理、部署运维、性能调优、Prompt和模型评估)、生成质量、安全风险等方面的考虑,我们选择了百度智能云千帆平台的ERNIE4(文心4)。
模型性能指标:MSE(Mean Squared Error,均方误差),用于衡量生成的文本序列与参考CommitMessage的文本序列之间的语义相似度;
用户使用指标:AR(Acceptance Rate,直接采纳率),也叫用户直接满足度,针对模型服务生成的CommitMessage,用户直接采纳的次数相对于总的使用次数的占比
参考CommitMessage的文本序列,指高质量的、简洁的、准确的、标准的CommitMessage,客观标准是至少包括:为什么修改(Why)、改了什么(What)、影响面(可选),主观标准是人工筛选并提取。
文本Embedding向量化:
将两段文本转换为向量表示。大模型时代Embedding的方式太多太多了,这里依然直接选用了千帆的Embedding方式。
向量差异计算:
计算两段文本的向量表示间的差异或距离时,我们选择使用余弦相似度;尽管欧几里得距离和马氏距离也是常用的方法,但针对CommitMessage这种长度不一致的向量时,余弦相似度表现更为准确。
均方误差计算:
将差异或距离平方,然后计算平均值以得到均方误差。
本文多次提交两个概念:
参考CommitMessage:可以是RD生成已提交入库的,也可以由大模型生成、经过人工标注的保证质量的CommitMessage,作为评估的标准yi
生成CommitMessage:由大模型生成的CommitMessage,评估输入的判定项xi
直接采纳数 CA
编辑采纳数 CE
四. 数据处理
数据集与性能优化的关系如下:
评估集,模型选择、Prompt调优、SFT后都需要评估集对本次调优进行评估,是否比之前的好,是否达到调优的效果
训练集,指用于SFT的标注数据,根据特征从总数据集中筛选
测试集,SFT后测试是否达到SFT的目的,比如针对某个异常case评估其泛化能力
定义数据结构:模型数据(需求/bug卡片标题、变更数据)、参考CommitMessage、类别数据(是否bug、变更行、仓库数)、辅助分析数据(产品线、平台、作者、Topic)等
数据采集:来源于:①线上模型服务生成的CommitMessage;②存量RD已提交入库的CommitMessage;③其他开源数据集
数据清洗:去噪、去重等处理,确保数据的质量和可用性
标注与注释:标注本条数据作为参考CommitMessage的质量,其他辅助分析信息
五. 性能优化
性能优化的目标是提升性能指标,包括核心指标均方误差MSE和生成效率,进而提升用户直接采纳率AR,手段包括如下三种:
停止标记(Stop Token),可提升生成效率
Prompt优化,可优化MSE指标和提升生成效率
1. 限制输出内容,明确要求
2. Few-shot
按以下格式输出CommitMessage,只是一个markdown的代码片段,包含在"```json" 和 "```"内,『请仅输出内容,不要做任何解释』:```json{"summary": string// 少于30字的中文,简洁的、准确的描述Git Commit Message"reason": string// 分析修复方式,详细描述这个bug出现的具体原因,可以引用代码,少于60字"fixup": string// 分析修复方式,简洁、准确的描述修复方式,可以引用代码,少于30字}```
按以下格式输出CommitMessage,只是一个markdown的代码片段,包含在"```json" 和 "```"内,『请仅输出内容,不要做任何解释』:```json{"summary": string,// 少于30字的中文,简洁的、准确的描述Git Commit Message"reason": string,// 分析修复方式,详细描述这个bug出现的具体原因,可以引用代码,少于60字"fixup": string// 分析修复方式,简洁、准确的描述修复方式,可以引用代码,少于30字}```
侧重 | 方法 | 应用 | |
Prompt Few-shot | 局部,当次 | 自我训练和微调 | 个性化的需求 |
Prompt Tuning | 全局 | Prompt示例 | 个性化的需求 |
角色名称:Git Commit Message Generator
通俗易懂的角色描述:基于需求描述和实现该需求的git diff变更代码,自动生成规范的git提交信息。
需求描述的标题如下:{{%title}}
git diff变更代码如下:
(DIFF-START)
{{%git_diff}}
(DIFF-END)
任务拆解
1. 解析需求标题:
提取关键信息,如功能点、问题点等。
对文本进行清洗,去除无关字符和格式。
2. 分析git diff变更代码:
识别变更的文件和代码块。
分析代码变更的类型(如新增、修改、删除等)。
3. 生成Commit Message:
结合需求标题以及代码变更分析,编写Commit Message。
确保提取的内容符合对应项的要求,如“summary: 少于30字的中文,简洁的、准确的描述Git Commit Message”等。
4. 验证Commit Message:
检查Commit Message是否清晰、准确。
5. 按以下格式输出CommitMessage,只是一个markdown的代码片段,包含在"```json" 和 "```"内,『请仅输出内容,不要做任何解释』:
```json
{
"summary": string// 少于30字的中文,简洁的、准确的描述Git Commit Message
}
```%STOP%
六. 自定义提交规范
由于大模型只生成核心的变更摘要或者Fixbug的相关信息,而最终需要组合成各式各样的提交规范格式,所以可以将变化抽象为接口,可扩展python package实现接口达成自定义符合提交规范的CommitMessage,按需动态加载实现的插件。
抽象接口如下:
from abc import ABC, abstractmethod
class IPluginHook(ABC):
"""插件实现的接口定义"""
def hook_prepare(self, ctx):
"""准备"""
def hook_is_fix_bug(self, ctx) -> bool:
"""是否fixbug的提交类型,默认false"""
def hook_language(self, ctx) -> Language:
"""生成语言,默认中文"""
def hook_generate_variables(self, ctx):
"""生成模板的变量"""
def hook_generate_message(self, ctx) -> str:
"""根据模板和变量,生成CommitMessage
@warning: 该方法插件必须实现,否则将报出异常
"""
加载某个插件的某个版本时,根据pkg_resources判定是已加载,然后配合 importlib进行import_module或者reload即可实现动态加载插件
def __install_plugin(pkg_name: str, version: str):
"""安装插件"""
subprocess.check_call([sys.executable, '-m', 'pip', 'install', f"{pkg_name}=={version}"])
return __load_module(pkg_name, force=True)
def __load_module(pkg_name: str, force: bool = False):
"""加载module"""
module_name = __module_name(pkg_name)
loaded_module = sys.modules.get(module_name)
if loaded_module is not None:
if force:
m = importlib.reload(loaded_module)
importlib.reload(pkg_resources)
return m
return loaded_module
m = importlib.import_module(module_name)
importlib.reload(pkg_resources)
return m
七. 未来
大模型对各类语言的代码理解上展现了卓越的能力,但对专有词汇、特定配置、固定格式等的理解依然存在不足,都需要合适的数据集来逐步优化;并且git diff获取的变更内容有限,受限于模型Token的限制,理解时缺少代码的上下文、依赖关系的关联导致生成质量存在瓶颈,结合RAG或许是一个较好的方式;使用入口的交互性、自定义提交规范都可以更AI,总之:AI Native 尚未成功,同志仍须努力。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-22
ChatGPT Mac桌面端重磅更新!与VS Code、终端完美联动!工作效率起飞!
2024-11-22
用AI提升使用电脑幸福感的小例子
2024-11-13
吴恩达:如何在人工智能领域建立你的职业生涯
2024-11-12
AI知识泛滥的年代,“脑图+AI”=“埃迪+毒液”:未来工作流的黄金组合,你掌握了吗?
2024-11-08
在未来,这种人或许会沦为AI的奴隶
2024-11-05
未来5年,AI将使全球职场技能变革进程从50%加速到70%
2024-10-30
用AI工具完成部门职责和岗位分解,1天干完1个月的活
2024-10-27
鹅厂,悄咪咪上线了个 AI 智能工作台
2024-07-07
2024-06-24
2024-06-06
2024-04-02
2024-04-27
2024-04-02
2024-05-08
2024-05-04
2024-04-19
2024-05-15