石家庄市住房城乡建设局网站,电商运营数据分析表格,做游戏直播什么游戏视频网站,抖音关注10元一单兼职01 背景
随着大型语言模型的迅猛增长#xff0c;各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面#xff0c;也出现了一系列贯穿全流程的提效和质量工具#xff0c;比如针对成本较高的Oncall#xff0c;首先出现了高质量的RAG助手#xff1b;在开…
01 背景
随着大型语言模型的迅猛增长各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面也出现了一系列贯穿全流程的提效和质量工具比如针对成本较高的Oncall首先出现了高质量的RAG助手在开发阶段的Copilot、Comate、Tabnine等辅助编程应工具在测试阶段也有缺陷检查、安全合规检查、智能Code Review等工具哪怕在交付阶段也有替代人工的自动化Agent…
当使用git commit提交代码时需要写繁杂的CommitMessage有时候写了后却不符合提交规范被hook有时候还被CodeReview的同学点评写不到点上…智能CommitMessage就是这样一个小助手帮你按照提交规范自动生成符合规范的CommitMessage。
以百度APP 的提交规范为例规范包括提交类别、产品版本、需求卡片、变更摘要等其中类别又包括功能、更新、优化、提测、上车、Merge、FixBug等手动抒写较为复杂。
按照CommitMessage的组合标准可以分为两个部分规范格式 变更摘要 CommitMessage组成部分
普通摘要类提交规范格式 变更摘要FixBug类提交规范格式 变更摘要包括bug原因、影响、修复方式等
其中运用大模型能力生成变更摘要部分而提交规范格式及其他标签由个性化插件定制即可对不同业务线/产品线可定制符合提交规范的CommitMessage。
智能CommitMessage的最终使用效果如下查看原文
git aicommit 用法示例
下面就以智能CommitMessage为例介绍下大模型效能工具开发流程主要包括
简单的功能设计应用指标和模型评估指标大模型数据处理过程模型性能优化的几种方式
02 功能与设计
用户入口一git aicommit
Git是高效便捷的版本控制系统虽然百度APP移动端已经多仓库化随着组件化进程的完善有至少有一半的需求不需要跨仓库提交而使用Git。
用户入口二mgit aicommit
MGit (https://github.com/baidu/m-git)是百度自研的一套开源的、基于Git的多仓库管理工具针对多仓库的应用场景安全地、高效的管理多个Git仓库在基础版本之上增加MGit插件即可扩展或者修改原命令。
对入口的基本要求
Git/MGit入口的使用不影响原有git/mgit commit功能的使用只是能力扩展保证Git和MGit的入口分离的同时保证功能统一低成本维护
处理方式抽象实现共用模块git-aicommit该模块由MGit插件和Git alias命令直接调用开发语言选型ruby便于 MGit 插件直接调用。
git-aicommit模块提取所有提交仓库中Git暂存区内的变更内容请求模型服务生成Commit Message。 MGit/Git入口即用户使用入口对于MGit插件可以参考MGit如何扩展(https://github.com/baidu/m-git)Git Alias按如下配置即可
# 给 git 添加 Aliasgit aicommit
$ git config --global alias.aicommit !f() { ruby -e require git-aicommit; MGit::GitAICommit.run(ARGV); -- $; }; f个性化插件提交规范的格式定制任何不同的提交规范均可定制为独立的插件详细参考下面自定义提交规范章节。模型服务接受git-aicommit模块的请求调用LLM生成CommitMessage摘要内容加载对应的个性化插件生成最终的CommitMessage。
03 评估指标 管理学之父彼得·德鲁克说过“If you can’t measure it, you can’t manage it.”。 度量指标对于模型选择、后续Prompt调优以及SFT都至关重要因为它决定了优化的标准。
生成CommitMessage时既需要理解变更的代码也需要生成对应的摘要、评估影响等生成式大模型适合此类任务当前生成式大模型在市面上也百花齐放经过综合评估使用成本包括数据管理、部署运维、性能调优、Prompt和模型评估、生成质量、安全风险等方面的考虑我们选择了百度智能云千帆平台的ERNIE4文心4。
针对此类摘要任务常用的度量指标有BLEU Score、ROUGE Score、BERT Score、PPL、MSE等结合生成CommitMessage的任务特性最终确定模型和产品的核心指标
模型性能指标MSEMean Squared Error均方误差用于衡量生成的文本序列与参考CommitMessage的文本序列之间的语义相似度用户使用指标ARAcceptance Rate直接采纳率也叫用户直接满足度针对模型服务生成的CommitMessage用户直接采纳的次数相对于总的使用次数的占比
均方误差MSEMean Squared Error
参考CommitMessage的文本序列指高质量的、简洁的、准确的、标准的CommitMessage客观标准是至少包括为什么修改Why、改了什么What、影响面可选主观标准是人工筛选并提取。
根据定义计算MSE即计算两段文本的语义相似度差值简单的分为如下三个步骤
1.文本Embedding向量化
将两段文本转换为向量表示。大模型时代Embedding的方式太多太多了这里依然直接选用了千帆的Embedding方式。
2.向量差异计算
计算两段文本的向量表示间的差异或距离时我们选择使用余弦相似度尽管欧几里得距离和马氏距离也是常用的方法但针对CommitMessage这种长度不一致的向量时余弦相似度表现更为准确。
3.均方误差计算
将差异或距离平方然后计算平均值以得到均方误差。其中xi 和 yi 是两段文本在第 i 个维度上的表示n 是维度数量。 本文多次提交两个概念 参考CommitMessage可以是RD生成已提交入库的也可以由大模型生成、经过人工标注的保证质量的CommitMessage作为评估的标准yi 生成CommitMessage由大模型生成的CommitMessage评估输入的判定项xi 直接采纳率ARAdoption Rate
总的使用次数包括3个结果
直接采纳数 CA编辑采纳数 CE拒绝数 CR 04 数据处理
大模型应用开发为了更好的性能包括生成质量、效率、准确度、采纳率数据处理的成本投入较高通常占据整个应用开发投入的相当大的比例有时甚至可能超过模型训练和调优的工作量。总之有效和高效的数据处理是提升模型性能的关键因素因此在项目计划和资源分配中应给予足够的重视和投入。
数据处理的目标就是管理增删改/标查好数据集产物是各类数据集数据集的最终应用场景是模型的性能优化模型选择、Prompt优化、SFT也就是说如果不做性能优化就可以不用做数据处理。
数据集与性能优化的关系如下
评估集模型选择、Prompt调优、SFT后都需要评估集对本次调优进行评估是否比之前的好是否达到调优的效果训练集指用于SFT的标注数据根据特征从总数据集中筛选验证集验证集是用来调整模型超参数避免过拟合或欠拟合测试集SFT后测试是否达到SFT的目的比如针对某个异常case评估其泛化能力异常集标注环节明确的低质量的CommitMessage数据特别是大模型生成未被直接采纳的数据 这里介绍下大体的过程及其作用细节不做展开
定义数据结构模型数据需求/bug卡片标题、变更数据、参考CommitMessage、类别数据是否bug、变更行、仓库数、辅助分析数据产品线、平台、作者、Topic等数据采集来源于①线上模型服务生成的CommitMessage②存量RD已提交入库的CommitMessage③其他开源数据集数据清洗去噪、去重等处理确保数据的质量和可用性标注与注释标注本条数据作为参考CommitMessage的质量其他辅助分析信息分类与管理抽样配比、过滤筛选、查看等
根据我们当前的数据体量选择了Pandas(https://pandas.pydata.org/)作为数据处理工具它对小规模数据和单机环境提供了够用的数据处理和分析功能。然而随着数据体量的逐步增大Spark(https://spark.apache.org/)将是一个不错的选择。
05 性能优化
性能优化的目标是提升性能指标包括核心指标均方误差MSE和生成效率进而提升用户直接采纳率AR手段包括如下三种
停止标记Stop Token可提升生成效率Prompt优化可优化MSE指标和提升生成效率SFT可优化MSE指标
5.1 停止标记
当模型对Prompt理解不完全时容易生成多余的解释或注意事项等无效内容生成更多的Token导致生成效率降低生成效率与生成的Token长度直接相关而所有Transformer模型中都设计有停止标记比如智能CommitMessage里调用模型的输出是一个Markdown的json以“%STOP%”结尾可指定停止标识为“%STOP%”以提高生成效率。
5.2 Prompt优化
简单说Prompt优化就是设计和优化输入Prompts以获得期望的输出。看似一个简单的NLP任务却又叫Prompt工程因为需要让大模型更好的理解期望的需求确实涉及多学科的知识比如融合语言学、心理学、计算机科学、数据科学也包括整套工程方法系统设计、实验设计、质量控制、项目管理等等方面。智能CommitMessage里涉及的两个优化点
限制输出内容明确要求
CommitMessage调用模型的输出要求是Markdown的json如果模型输出不是正常的json将导致解析异常此时在Prompt中明确要求『请仅输出内容不要做任何解释』可避免生成无效内容提高生成效率和准确性。
Few-shot
Prompt优化里有个优化在限制输出样式的情况下非常有效 --Few-shot以示例让大模型理解并限制输出样式要求输出一个Markdown 的多行的 json 数据样例
按以下格式输出CommitMessage只是一个markdown的代码片段包含在json 和 内『请仅输出内容不要做任何解释』:
json
{summary: string // 少于30字的中文简洁的、准确的描述Git Commit Messagereason: string // 分析修复方式详细描述这个bug出现的具体原因可以引用代码少于60字fixup: string // 分析修复方式简洁、准确的描述修复方式可以引用代码少于30字
}这里的样例不是一个标准的json格式多行换行时缺少“,”大模型可能按照该格式输出也可能按照正确的json格式输出所以存在一个异常问题的不确定性可通过完善该Few-shot完全避免该问题
按以下格式输出CommitMessage只是一个markdown的代码片段包含在json 和 内『请仅输出内容不要做任何解释』:
json
{summary: string, // 少于30字的中文简洁的、准确的描述Git Commit Messagereason: string, // 分析修复方式详细描述这个bug出现的具体原因可以引用代码少于60字fixup: string // 分析修复方式简洁、准确的描述修复方式可以引用代码少于30字
}这里有个类似的概念Prompt TuningFew-shot 和 Prompt Tuning都是优化和调整大型语言模型输入提示的方法但有着本质上的区别 附上智能CommitMessage的部分Prompt持续优化中
通俗易懂的角色描述基于需求描述和实现该需求的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%5.3 SFT
因为文心4的模型能力已经有非常出色的生成能力在这种大模型上做SFT成本非常高所以一般会采用ERNIE-lite版本或者ERNIE-Speed版本但是性能稍逊一筹那如何保证在ERNIE-Speed版本中SFT后既能不降低整体性能又能优化低质量case
这里可以采用MoEMixture of Experts的策略用一个分类器来结合ERNIE4 ERNIE-Speed SFT各自的优势即请求优先经过一个分类器根据请求的特征进行分类请求ERNIE4或者经过SFT后的ERNIE-Speed模型如下图示例 部署前记得SFT评估数据集的全量评估MSE优于线上保证本次SFT后的ERNIE-Speed模型比上次的更好。
SFT的全过程应该包含四个步骤
确定目标优化某个/某类低质量的数据case微调后达到评估多少分值数据准备基于该case提取低质量case的特征向数据集里筛选出训练集、验证集和测试集SFT过程如上图所示评估部署根据抽样配比的评估集进行全量评估保证本次SFT后的ERNIE-Speed模型比上次的更好
06 自定义提交规范
由于大模型只生成核心的变更摘要或者Fixbug的相关信息而最终需要组合成各式各样的提交规范格式所以可以将变化抽象为接口可扩展python package实现接口达成自定义符合提交规范的CommitMessage按需动态加载实现的插件。
抽象接口如下
from abc import ABC, abstractmethodclass IPluginHook(ABC):插件实现的接口定义abstractmethoddef hook_prepare(self, ctx):准备abstractmethoddef hook_is_fix_bug(self, ctx) - bool:是否fixbug的提交类型默认falseabstractmethoddef hook_language(self, ctx) - Language:生成语言默认中文abstractmethoddef hook_generate_variables(self, ctx):生成模板的变量abstractmethoddef hook_generate_message(self, ctx) - str:根据模板和变量生成CommitMessagewarning: 该方法插件必须实现否则将报出异常加载某个插件的某个版本时根据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, forceTrue)def __load_module(pkg_name: str, force: bool False):加载modulemodule_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 mreturn loaded_modulem importlib.import_module(module_name)importlib.reload(pkg_resources)return m07 未来
大模型对各类语言的代码理解上展现了卓越的能力但对专有词汇、特定配置、固定格式等的理解依然存在不足都需要合适的数据集来逐步优化并且git diff获取的变更内容有限受限于模型Token的限制理解时缺少代码的上下文、依赖关系的关联导致生成质量存在瓶颈结合RAG或许是一个较好的方式使用入口的交互性、自定义提交规范都可以更AI总之AI Native 尚未成功同志仍须努力。
——————END——————
参考资料
[1] LangChainhttps://www.langchain.com/
[2] githttps://git-scm.com/book/en/v2/Git-Basics-Git-Aliases
[3] pandashttps://pandas.pydata.org/
[4] Sparkhttps://spark.apache.org/
[5] 百度千帆https://console.bce.baidu.com/qianfan/overview
[6] Prompt工程 大模型的应用与实践https://zhuanlan.zhihu.com/p/668200325
推荐阅读
基于afx透明视频的视觉增强前端方案
百度一站式数据自助分析平台TDA建设
浅析如何加速商业业务实时化
登录系统演进、便捷登录设计与实现
一文带你完整了解Go语言IO基础库