近日,在全球软件开发大会上暨智能软件开发生态展上,来自 Baidu Comate 的资深研发工程师分享了精彩的专题演讲,小编整理了演讲精华,和大家一起玩转“大模型+软件研发”。
今天带来——吴玮琦《智能代码助手 Baidu Comate 的核心能力揭秘》,一起解锁 Baidu Comate 硬核能力。
AI 如何助推软件生产领域代际变革
在过去的几十年里,软件发展经历了几个重要时代。借鉴行业和学术界的一些思考,我们可以做以下大致划分:
首先是上世纪五六十年代,随着软件复杂度和体积的急剧膨胀,人们发现软件领域出现所谓的“软件危机”,软件的质量问题暴露出来。先驱们开始把建筑、水利等“工程手段”,引入软件的开发和维护过程中,来解决上述问题,这是软件工程的开始。随着计算能力的大幅度提升,同时受到互联网以及开源软件运动的影响,进入到第二个阶段,我们称之为现代软件工程。
来到当下,以 LLM 为代表的人工智能以及相关技术的推动,整个软件研发的生命周期和 AI 深度融合,我们姑且称为“未来软件工程”,也可以叫“AI 原生的软件工程”,其特点就是从需求定义到研发、测试、运维的整个流程里,工程师可以通过 Prompt 等技术手段让 LLM 协助我们工作,大幅提升研发工作的效率和产能。
百度如何应用 Baidu Comate 推动 AI 原生研发范式落地
Baidu Comate 是百度基于文心大模型研发的智能代码助手,以插件的形式深度集成在 IDE 中,借助文心大模型强大的文本理解与生成能力,为每一个工程师提供一个7*24小时的 AI 编码助手。Comate 的能力覆盖工程师开发工作的全流程,从代码生成到技术问答、生成单测等,一应俱全。我们简称为“三帮”:帮你想、帮你写、帮你改——需求开始阶段,帮我们解释已有代码,做一些疑难问题的回答;在编写阶段,结合上下文帮助我们续写代码,为代码生成注释;最后,还可以帮你改,比如 code review 时结合相应的编码规范做智能评审,在流水线上根据 Error 信息提供修复建议等等。
Baidu Comate 有哪些核心能力?
1、专业的代码领域大模型
在编码这个垂直领域,需要强化大模型在编程领域的相关知识,通用 LLM 能做,但是做不好。所以需要从模型训练数据收集阶段,开始针对代码领域做定向增强。我们从开源代码和百度内部编程现场大数据,用多种手段精确筛选出高质量、高代表性,覆盖知识面、应用面广泛的代码数据,以提升信噪比。
当然这些已经是同类产品的基本能力,Comate 有哪些特殊之处呢?
首先是 Comate 在文心大模型、PaddlePaddle 框架和应用层的三层架构组合优化后,端到端响应速度可以保持在600ms 以下。当然这也是我们在实践过程中找到的一个平衡:在保证代码生成质量的前提下,还可以尽量提升输出速度,做到代码生成速度跟上用户编写的状态。
其次是位代码编写昌吉给你定制的模型能力。Comate 在公司内部大规模落地过程中,我们深入到一线工程师的实际使用中去做调研,发现大家一半以上的时间不是编写新代码,而是在反复编辑与优化已有的代码。比如:在原有代码上添加和修改业务逻辑、为变量重新命名、为函数补充注释。但是以 GPT-3为代表的 decoder-based 的模型,只能根据上文来输出下文,无法感知下文。所以同时感知上文和下文,做所谓的“填空题”,即 Fill in the middle,这样的能力才是编码领域模型提升生成质量最核心的能力。为此我们重构了模型,来支持这种 FIM 的场景。
模型的灵魂是数据。有句数据领域的老话,Garbage in, garbage out。怎么教模型,模型就怎样生成。要想有高质量的生成结果,就要有高质量的精调数据。为了获取高质量的精调数据,我们邀请各技术委员会的语言专家分析、整理、优化训练和评估数据,确保数据能符合真实的使用场景,并借助公司内的 iDataset、iEValue 等工具有效的管理和迭代。
2、Prompt 工程,让模型更懂“你”
Prompt 工程第一个实践,是应用代码分析技术。我们观察用户的使用习惯,从研发现场去收集关键信息,得出这样一个结论:我们认为最近打开的文件和当前文件的引用是信噪比最高的信息。
首先,因为设计良好的工程中肯定有很多公共模块被重复引用,这些模块往往不在当前文件中被定义,但是对模型来说,这些被引用的模块的定义又非常关键,只有知晓某些函数或者类的定义,才能准确的推理出他的使用方法。其次,如果工程师在某几个文件之间反复编辑,我们认为这几个文件内容是和工程师当前作业联系最紧密的,也是信息量最高的。
所以 Comate 在推理过程前,通过检索相关文件、使用 LSP 分析结果等手段,摘取一些关键信息送给模型,以生成更符合用户编码现场的代码。
Prompt 工程的另一方面尝试,是关联工程和模型外的私域知识,让 Comate 更懂你。
说到关联外部知识,其实有不少方法,比较常见的就是 PT、SFT 和 RAG。首先 PT、SFT 成本高昂,假如我是一个个人开发者,肯定没有那么多资源来做模型精调。其次,开发相关的数据比如代码、三方库更新都很频繁,PT 和 SFT 有明显的滞后性。为了让用户更丝滑地接入外部知识,我们选择了用 RAG 做 Prompt 工程的另一部分实践。常见的外挂知识大多是自然语言,但是编程语言拥有严格的结构、逻辑和语法,需要定制化的数据处理逻辑,我们详细聊下 RAG 如何结合代码数据检索。
首先,代码作为结构化语言,有明确的 scope 和关联关系,通过定制的算法处理保证切分后也拥有完整的信息,提升代码文本的召回质量。代码块的划分就是根据不同语言的特点,解析代码的语法树并将代码文件切分为类、块、函数、行等不同级别的块(chunk)。
其次,Comate 的思考过程采用了与 TOT 和 Agent 的有效结合,形成了一种连续且多步骤的反馈机制。在这个过程中,Teacher Agent 负责对 Agent 的执行结果进行评估,并提供"整改策略"。根据这些策略,Agent 决定下一步的行动,无论是继续执行还是回溯并重新执行某个步骤。这样的机制保证了我们的模型不断调整并优化输出结果,直至满足预定标准,从而显著提升了模型输出的质量和准确率。
3、更智能、更易用
Comate 还在极致产品力上做了进一步探索,让 Comate 更智能,更易用。
首先是更智能。无论你是一位开发者,还是项目经理,我们都知道写代码是一项复杂且需要高度专注的任务。现在,你可以通过 Comate 创新的 AutoWork 功能实现从需求到编码的全流程智能化,包括需求理解确认、复杂代码库分析、多编码任务分解等。
在技术层面,Autowork 结合了文心大模型思维链(COT)技术,使其具有了人类级别的思考能力,这意味着它可以像人类一样听懂和理解用户的需求,然后按照逻辑顺序,逐步完成一系列复杂的编码任务。另外,借助先进的 RAG 代码智能检索技术,这使得它能够将掌握的知识库信息完美地融入到大语言模型中。当用户提出问题时,它将利用这些知识库信息,让生成的回答更准确,更具价值。
另一方面是更易用。“Comate+”即开放平台,是指把 Comate 的能力开放给第三方开发者,支持知识扩展与能力扩展,第三方服务可以将能力连接到编程现场,并打造自己的定制化能力,建设更适合自己团队的研发助手。
“Comate+”开放平台核心主张是通过开放性,可以更好的让 Comate 来适应不同组织和个人,取得更贴合具体需求的智能化效果。
通过 Comate 插件这一使用形态,可以让平台能力直接触达开发人员第一工作现场,无需重复建设即可快速应用大模型能力,无限扩充平台场景,让 Comate 更适配团队的业务知识、团队规范、固化团队流程等。
——————END——————
推荐阅读
基于afx透明视频的视觉增强前端方案
百度一站式数据自助分析平台(TDA)建设
浅析如何加速商业业务实时化
登录系统演进、便捷登录设计与实现
一文带你完整了解Go语言IO基础库