您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[极客传媒]:AI辅助编程真实测评与企业落地实践 - 发现报告

AI辅助编程真实测评与企业落地实践

信息技术2024-10-28蒋志伟极客传媒�***
AI智能总结
查看更多
AI辅助编程真实测评与企业落地实践

作者:蒋志伟 个人简要 蒋志伟 爱好技术的架构师参与OpenTelemetry开源社区 曾0-1搭建美团APP的推荐、搜索服务曾负责Qunar.com上亿用户机票搜索、低价推荐系统有旅游GDS(全球分销系统)的技术专利 开源项目 基于场景的AI编程测评集https://github.com/laziobird/CodeLLMTEval CONTENTS 01 AI辅助编程的背景与发展 AI在自然语言处理NLP上的里程碑 2017GoogleOpenAITransformer模 型在翻译任务上超过之 前最优秀的循环神经网络模型采 用Attention Layers重点解决多义词问题,基于此的GPT模型让AIGC极大发展 Code LLM(代码生成大语言模型)的发展 人工智能对自然语言的上下文推理、一词多义理解能力的加持。让场景契合的辅助编程领域有了快速的发展 辅助编程相关场景任务一般有三大类: •代码-代码:包含代码补全、代码修复•代码-文本:代码解释、代码优化、代码异常排查•文本-代码:通过高级提示词Prompt做代码生成(单元测试、API、SQL、数据建模等) Code LLM:代码生成大语言模型的发展 关键模型与项目 •2024.7 CodeGeeX4https://github.com/THUDM/CodeGeeX4•2024.6 DeepSeek-V2https://github.com/deepseek-ai/DeepSeek-V2 现有Code LLM测评数据集问题 模型测试训练、测试数据不足 现有的Code LLM测评工具通常使用有限的训练数据以HumanEval、MBPP代表代码模型评测数据几年没更新 评估标准单一 现有的Code LLM测评原理只关注代码结果的正确性,看不到代码的可读性、完整性、通用性等维度的信息 测评打分原理造假容易 各家公布自家测试结果,测评是黑盒的状态将测评集放到训练集中训练,好比拿着标准答案答考题,测评分数会虚高 Github上公布的测评结果明显有水分 代码大模型各家评测基数差异巨大 •同样大模型不同测评来源,评分不一样 •智谱CodeGeeX 4 •基本常识性错误 代码大模型评测集工作原理 最常用的测评:Human EvalOpenAI发布的一个评估大型语言模型在代码生成方面表现的基准测试。它包含164个设计的Python编 程任务,每个任务有多个单元测试,通过评估模型生成的代码是否能通过这些单元测试来评判模型的能力 根据测评文件编程任务给出prompt,调用大模型生成完整代码,保存到一个样本文件的completion字段中 代码大模型评测集工作原理 用程序读取样本文件,批量把任务生成中代码和任务的单元测试代码合并成一个完整的程序 批量动态执行每个任务程序,如果单元测试用例通过,返回passed,最后调用pass@k的算法测评打分 假设样本文件叫samples.jsonl,调用叫evaluate_functional_correctness函数完成1-4的步骤 简单来造个假 简单用测试集和问题集运行打分效果,pass@k分值0.16 02 基于场景功能的测评测试集 基于编程场景的测评 实际编程出发看到真正的价值 编程使用场景 从日常编程习惯,按频率和功能进行工具的对比测评,如代码补全、缺陷查找、代码调优、报错排查、代码解释等 提示词生成能力 提示词生成功能代码的能力,如API文档、单元测试、代码注释、参考模版编写新模块等能力的对比测评 业务建模能力 辅助编程能更多读懂我们的业务逻辑,参与框架设计,如数据库表设计、项目构建、根据数据模型生成Service代码 客观加主观判定 不能只局限程序对错简单打分,要加入更多判断标准:成熟度、完整度、易用性、语言特性等 代码补全提示 •上下文理解 从代码上下文补全的结果,对比其理解和输出的准确能力 •统一风格能力 基于已有的代码模版和示例,新的示例自动补全的准确性和代码风格的统一性能力 考虑国内的正常使用,测评基于国内辅助编程平台,同时参考Github Copliot。我认为的第一梯队产品去比较为了避嫌,暂且A、B、C表示。最后有测评总结报告,列出第一梯队和测评产品完整对比结果 代码补全提示 •统一风格能力 这是有关电商产品库的真实代码先设计好类目表LsCategory相关数据库操作模版示例 优秀、体验非常棒,内容风格一致 差、几乎没法用 参考LsCategory模版,对比辅助生成电商Spu实例效果 补全一般,代码注解不一致 代码补全提示 上下文理解能力 这是有关机票搜索的真实的代码,search方法根据入参搜索条件返回搜索结果 先输入文字注释,看看A、B、C各自代码补全效果: •B、C理解了注释的意图,拿了不存在的入参属性•A理解想表达意图同时,给出了代码库中正确方法,也秒懂打印日志的意图 测评维度 •不同项目案例逐行提示、多行提示测评•代码补全总的代码采纳率作为测评标准•长期统计,A代码采纳率略高,上下文能力一般,幻觉多 高频缺陷查找 •常见致命缺陷 导致CPU100%的死循环、各种严重的内存溢出、基本业务逻辑错误、线程并发死锁问题这类缺陷特点:常年高频发生、对业务影响大、往往花更多的精力进行线上排查和修复 高频缺陷查找 •举个例子 导致CPU100%的死循环 B C publicclassendlessLoop{publicstaticvoidmain(String[]args){intcount=0;while(count<10){if(count==3){continue;}System.out.println(count);count++;}}} A 左边是一个常见的死循环Case,A、B、C都没有发现这个致命问题,用ChatGPT明确告知会导致无限循环和修复建议。这种程序往往导致线上服务无法工作 高频缺陷查找 •测评维度 •综合打分:借鉴HumanEval打分思路,根据高频缺陷查找场景分析有没有缺陷正确与否进行•开源测评集:同时讲主观答案进行提示词模版优化转换成客观答案https://github.com/laziobird/CodeLLMTEval 提示词模版Demo:测评集用代码大模型生成结果的客观答案 检查<java></java>标签里的Java代码,有没有死循环的情况。返回XML标签格式结果,格式’<status></status>’ ,如果有,status返回1,没有status返回0,不知道status返回-1<java>..........</java> •测评初步结论 测评集20+,A、B在70%识别缺陷,C不到60% 报错排查的测评 产品体验 从产品角度看实用性编译错误阶段运行失败阶段 A、Github Copliot没有编译阶段报错排查的功能 报错排查的测评 •运行阶段的报错修复 多种典型场景测试和验证、排查多个运行失败的Case A、B、C插件在失败信息中异常排查的帮助链接 示例:配置错误的环境路径,找不到服务启动失败 Github Copliot插件并不支持这项功能A、C排查错误根因更高 辅助编程工具箱 编程过程中,常用到一些工具类过去本地实现,后来借助saas工具 •AI工具箱的集成,因为大模型具备自定义提示词能力,工具类更通用更有效率•C、A工具箱设计实用 03 AI生成能力的可行性测评 高级功能生成能力 *代码注释*版本控制提交注释生成风格统一、可读性高参考现有代码库模版*仿写实例的能力 零代码生成可运行的单元测试用例,考虑测试边界,保持风格、规范统一 几 乎 零 代 码 生 成 准 确 的API文档,文档可读性高、保持风格、规范统一 表设计和SQL生成低代码平台能力 API文档 单元测试 单元测试生成能力 •重要测评维度 •代码采纳率:可用性,普遍生成单元测试编译不过这个点比较不好评判,基于开销考虑,单元测试没有带上完备上下文 •更细粒度化的方法测试生成能力、测试边界能力产品上A有友好的方法粒度单元测试入口A、B生产代码有更丰富的边界测试Case,C比较简单 •仿写支持的能力:A支持选择仿写模版文件其它手动输入仿写文件的内容Token,非常不便利 单元测试生成能力 测评的维度 •API级别单元测试可用性:比如A产品生产基本可用的Postman测试模版,B和C生成模版不可用 生成API方法的Postman Collection 2的JSON文件模版其中指定了地址127.0.0.1和端口号8099参考表结构'create table ls_category....‘ A自动生成Postman API请求模版 API文档生成能力 •相同提示词,文档的风格差异大•不同用途性质的API文档,要清晰表达出来 •测评结果 选取5-6个项目的API服务 •API方法少,简单A、B、C很好的生成了文档•API方法多,入参出参复杂A、B较好完整文档,C入参、出参不完整 参考现有代码模块仿写新实例 提示词设计非常重要RAG检索代码库的上下文能力友好的产品交互方式 根据模版,生成类似的实例代码 数据建模能力 SQL生成 表设计 项目构建 低代码能力 根据业务需求,表结构基础架构上,生成可运行SQL的能力 建模后,理解业务逻辑,0-1构建、部署、启动项目的文档能力 通过业务系统描述数据库表字段、表结构关系的理解能力和准确度 根据技术需求,生成项目构建的能力 表设计和SQL •测评维度 •用技术语言输入提示词,生成表设计,包含表与表的关系,完整的SQL •多个实际项目,考验代码大模型业务场景理解能力和推理能力,同时考量正确率和完整度 电商系统产品库表设计 设计一个商品库表:里面有sku表、spu表、类目category表;spu和category关系:spu里面有一级、二级、三级类目信息spu和sku关系:一个spu对应多个sku,区别在于规格,规格多有个值,可以用JSON方式保存为一个字段。sku包含第三级类目的信息 •B在表设计、业务理解更完整:比如表字段描述、复杂字段业务示例 表设计和SQL •直接用业务语言输入提示词,看看对业务理解和代码更高要求的生成能力 视频教学系统产品需求文档 视频点播教学系统,设计表,产品需求如下:视频管理:视频列表、视频搜索、上下架视频、新增上传视频课程管理:课程列表、课程搜索、上下架课程、新增课程、课程关联视频、课程分类、一个课程会有一个或者多个视频分类管理:新增分类、新增一级分类、一级分类下新增二级分类、分类排序、删除分类视频数据记录表:每个用户观看视频最大时间,观看视频的完成比,记录每个用户的id、name视频统计信息表:每个视频观看人数、观看次数、观看完成比(每个用户观看视频95%表示视频观看完成)每个表都有如下的几个字段:`remarks`............返回结果:所有表所有字段和字段说明的SQL语句 项目构建和低代码能力思考 •系统差异、复杂程度很难统一测评 Python搭建授权系统 输出主观、考量维度多、往往不是看一次性输出,包括续写能力 •开源构建、低代码项目模版提示词•更细粒度维度观察:区分系统、区分语言、用途•开源项目,让专业领域的人给出细节的建议 用Python实现企业内部用户授权服务的完整代码 Java Maven项目搭建 借鉴低代码平台,从使用场景看实用性 一个Maven项目,希望将Mysql的表用mybatis +Springboot封装成Dao,mybatis plus版本3.5.5,Springboot版本3.1.7,Mysql驱动8.0.13,完成pom.xml,同时写Dao、Service、Controller示例 •提