您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。 [2024年中国DevOps社区上海峰会]:徐磊-解决企业个性化代码生成准确率的核心实践 - 发现报告

徐磊-解决企业个性化代码生成准确率的核心实践

报告封面

中国DevOps社区峰会2024·上海 解决企业个性化代码生成准确率的核心实践 徐磊英捷创软首席架构师 徐磊 oAISE首架构师/产品经理o微软最有价值专家MVP,微软区域技术总监Regional DirectoroGitHub Star / GitHubCopilot中国区授权服务资深顾问o开放原子开源项目SmartIDE创始人/核心贡献者o华为云MVPo资深软件工程/敏捷/精益/DevOps专家,EXIN认证DevOpsMaster/Professional/认证讲师o书籍作者和译者《专业SCRUM基于Azure DevOps的敏捷实践》,《云原生应用开发实践》,《基础设施即代码-模式与实践》 公众号:数字共生与数字世界共生进化 公众号:DevOps企业数字化转型实践 AISE-企业落地AI大模型的端到端解决方案 -AISE方法论提供体系化理论支撑-AISE产品组合提供最佳实践落地的平台和工具-微软AzureOpenAI完整支持-GithHubCopilot扩展支持-AISE已经完整适配国产NPU、通用硬件、操作系统和中间件-华为晟腾910/310提供端到端性能和优化-推理服务全栈支持:TGI、VLLM、MindIE(华为)-DeepSeekAPI完整支持-体系化实施、培训和咨询服务,为企业落地AI提供端到端保驾护航 案例:汇丰科技 •2023.6项目启动•2023.8.9完成AISE v0.3版本内部部署•2023.8.20全球CIO访华期间完成产品演示,受到认可,准许推广•2023.9完成AISE v0.4版本内部部署•2023.10月底推广到个人银行事业部中国区3500人使用,•2023.10完成模型访问安全性提升和多实例负载均衡改造•2023.11效能仪表盘上线、提供代码生成和接受率指标•2023.12提示词库v2(多模型混合调度)和RAG能力上线 案例:博时基金 -定制版插件-最早适配910B算力-K8s集群部署-协助推广,培训-内部运营 目录 代码生成中的提示工程原理1企业真的需要私有化代码训练吗?2面向开发人员的提示工程技巧3从智能副驾到智能体–代码生成技术路线4Q&A5 解构一段真实的代码补全的提示词 解构目标:通过了解构建提示词的过程,优化我们使用SmartCode的方式,以便获得最佳的代码生成效果。 PROMPT-PREFIX FIM提示词格式-前文 -后文 //Path:src/main/java/org/example/corebanking/BankAccount.java\r\n 关键元素:-当前文件名和完整相对路径 src/main/java/org/example/corebanking/BankAccountController.java:\r\n// package org.example.corebanking;\r\n//\r\n// importorg.springframework.web.bind.annotation.RestController;\r\n//importjava.util.HashMap;\r\n// import java.util.Map;\r\n//\r\n// @RestController\r\n// public class BankAccountController{\r\n//\r\n// }\r\n//\r\npackageorg.example.corebanking;\n\npublic class BankAccount -相关文件名和完整相对路径、相关文件中的代码片段-当前文件内容-光标前的内容-光标后的内容 什么是FIM? PROMPT-SUFFIX Input: 白日依山尽欲穷千里目Output: ??? GitHubCopiolt源码浏览器(反编译版本–仅供学习研究)https://thakkarparth007.github.io/copilot-explorer/posts/copilot-internals.html 目录 代码生成中的提示工程原理1企业真的需要私有化代码训练吗?2面向开发人员的提示工程技巧3从智能副驾到智能体–代码生成技术路线4Q&A5 //SE4AI//企业进行模型训练的6个可行性前提 案例:微软O产品团队基于GPT 3.5模型微调支持个性化代码生成 扫码阅读详细分析 ❑团队规模巨大:即便只有几个百分点的准确度提升,放大到几千人规模的开发团队上,产生的效能提升和节省的成本/资源也是非常巨大的。 ❑单一代码库:几千人规模的O产品开发团队全部都在一种开发语言和非常类似的代码库上进行工作,因为任何的模型只要进行了再次训练,就只能针对某一种开发语言提供服务,再次训练虽然会增强模型在O产品代码库上的能力,同时也会降低这个模型实例对其他编程语言的处理性能。这一点上,O产品团队符合要求。 ❑代码足够特殊:特殊到GPT3.5Tubro模型在训练的时候完全没有见过类似的代码。基于前面分析的,虽然是C/C++语言,但是因为语言本身的高度灵活性和这个单一产品本身的规模,其代码库中代码是GPT完全没有见过的。 ❑代码规模巨大:要通过训练对基座模型产生影响,至少需要几百万行规模的高质量单一语言代码。面对一个几十/上百亿参数量的模型,如果训练数据不够,则不足以影响模型的行为。即便采用非常高效的微调方式,也需要原有数据的1%左右规模的数据才能发挥作用。 ❑容忍训练失败:即使在类似GPT这样高质量的模型上进行再次训练并且由非常有经验的工程师来操作,如果参数控制不到位也容易出现失败的情况。加上每次训练所需要的算力和时间消耗,这是一个非常高风险的投入。 ❑足够的不可变基础代码:模型训练会让模型产生非常强的偏好,要修改这个偏好就必须要重新训练,因此用来训练的代码必须是那些在很⻓时间内(至少几年)中不会发生变化的代码。如果私有代码组件已经发生了改变,而模型还在一直生成老的代码,反而会对工程师的工作效率产生负面影响。O产品因为有大量自行研发的可重用的基础组件代码,也符合要求。 //SE4AI//大模型应用工程能力建设之1-2-3 1个目标 从应用场景出发,使用客观可度量的验证标准,确保应用场景的性能,质量和用户体验。 2个维度 •上下文优化:为模型补充数据和知识•行为优化:为模型提供更多行为示例 3个方法 •提示词工程:经济、高效的应用优化路径;快速验证场景可行性,提供初期应用原型验证•RAG:提高模型对私域数据的额认知能力。•模型微调:提高模型响应的规范性和标准化,提供可靠的应用输出性能。 //SE4AI//提示工程、RAG和微调–如何选择 ➢提示工程可以同时解决知识和行为的问题,但是会受限于模型数据窗口大小并引发响应缓慢➢RAG能解决知识补充问题但是不擅⻓改变模型行为➢微调可以改变模型行为但是不适合为模型补充知识 这个维度主要关注模型的行为,是教会模型去按照我们希望方式做事,包括:输出内容的格式、语气、偏好;甚至生成固定格式的请求以便调用其他服务。这个维度主要解决模型输出形式上的稳定性。 //SE4AI//大模型应用的持续交付 建立系统化的大模型应用改进路径,用工程化方法提升内容相关性和输出稳定性 数字化是智能化的基础设施没有完善的DevOps工具和实践体系AI赋能软件研发提效只能是空中楼阁 目录 代码生成中的提示工程原理1企业真的需要私有化代码训练吗?2面向开发人员的提示工程技巧3从智能副驾到智能体–代码生成技术路线4Q&A5 提示工程核心原则–4S 提示工程的目标是:制作清晰的指令,以指导AI系统根据项目的特定需求生成符合上下文的代码。确保代码在语法、功能和上下文方面都正确。 高效提示词=单一具体的意图+足够的上下文越短越好(不要过渡词、不要连接词、不需要客套、不需要解释),直接表达意图 4S原则–反模式和模式示例 4S原则–反模式和模式示例 给出更加丰富的上下文(Surround),可以让SmartCode完成更加复杂的任务以下右侧示例中:我们给出了更加明确的step by step指令确保SmartCode按照我们的要求完成生成任务 反模式 模式 # write a simple flask app that returns a list even number from a list of number,you need to create a function that take a list of numbers and this functionshould return the even values. Please start by create a sample list with numbers,then create a list of even numbers from the sample list. Finally, you need toreturn the list of even numbers 动手实验:使用SmartCode开发自动推荐系统 作为一名资深的开发人员,你刚刚接手了这个叫做自动推荐系统(auto-suggestion)的项目。这个项目的特性是通过存储一个大量单词的词库,实现快速搜索与给定前缀匹配的字词,以提供自动完成功能。另外,这个项目还支持对拼写错误的单词实施拼写建议。 你已经拿到了一个使用字典树(trie)数据结构的现有代码库,该结构是一种基于树的数据结构,对于前缀匹配和自动完成非常有用。你需要快速熟悉这个代码库并对其进行扩展才能满足项目组对于自动推荐系统的需求。 动手实验:使用SmartCode开发销售报表系统 处理数据是大多数商业应用中最重要的部分,数据往往代表某种特定的业务对象,比如:用户,产品,订单,销售额。商业应用中的业务逻辑也和数据直接相关。SmartCode理解和处理数据的能力直接关系到生成式AI在业务开发场景中的实战价值。 在本示例中,我们将以销售报表系统为例,利用SmartCode完成数据结构建模,样例数据生成,数据统计和数据展示这几个环节的代码生成。通过这个示例,开发者可以了解使用SmartCode处理业务数据和业务逻辑的关键实践和技巧。我们将在不同的关节中使用代码补全和Chat能力来完成不同的代码生成任务, 最终构建一份清晰可读的销售报表 示例很重要 使用示例,包括代码风格,注释语言,数据结构等给出示例可以非常直接的引导SmartCode生成我们需要的内容 利用示例为SmartCode提供更准确的上下文。 示例数据非常有效 比如:直接给出一个数字列表比用语言描述这个列表可以更加准确的引导AI识别它需要处理的数据。当这个数据非常复杂的时候,更加有用。 示例很重要–零样本和多样本学习Zero-shot vs. Few-shot 通过场景化示例将业务规则和边界条件进行完整描述 通过类似代码片段引导SmartCode按我们的编码风格生成代码 利用示例为SmartCode提供更准 确的上下文。 利用“多个”示例完整展示不同的输入/输出场景 给与AI足够的逻辑路径上下文。 RAG很重要–相关代码文件的引入和识别可以大幅提升准确率 SmartCode可以自动收集最多20个相邻文件的代码上下文作为当前代码生成的参考 利用RAG为SmartCode提供更准确的上下文。 代码是最好的示例 将与当前文件相关的代码打开,A自动参考这些代码完成当前文件的代码生成。利用AST作为RAG检索逻辑,引入 相关文件 RAG很重要–构建代码和文本的双向向量索引 预构建智能体利用RAG,向量数据库和为代码库,数据库,需求列表等特殊结构优化过的索引引擎 •项目级/产品级问答•特性级代码分析和解决方案生成•面向产品,项目经理,架构师等非