作者介绍
马阳阳
去哪儿旅行基础架构组资深研发工程师、云原生SIG成员,负责组件市场、测试环境治理平台Noah、代码瘦身平台等系统。
第七届Hackathon大赛金奖,第四届CR大赛第一名,曾在ArchSummit、QECon、SECon等大会做过技术分享。
本文介绍了一款面向全司研发人员的开发助手的设计与实现思路,普及了开发助手的功能和技巧,量化了落地后的效果数据。
首先,分析了市面上已有的AI产品Copilot和ChatGPT的局限性,然后提出了开发助手的设想,包括 集成在IDE、智能代码补全、问答能力、与代码的联动、公司内部知识等。
接着,详细介绍了开发助手解决的典型痛点和方案,包括自动/手动填充上下文、自定义Prompt模板、快速排查报错、对接公司内部系统和智能代码补全。
最后,分享了开发助手不同功能的效果测量思路及数据,并列出未来规划。
2022年11月,OpenAI发布了ChatGPT,一款基于大语言模型的人工智能问答产品。ChatGPT具备学习和理解人类语言的能力,能够进行对话互动交流,完成撰写文案、方案、代码、翻译等多种任务。这款产品在两个月内迅速获得上亿用户,成为史上用户增长速度最快的消费级应用程序,也成为了全球范围内的热门话题。ChatGPT展现出了解放人类生产力的巨大潜力,从工业界到学术界,从个人到企业,引起广泛关注。与传统的聊天机器人不同,ChatGPT知识渊博,能够满足人类各种需求,并且表现出了一定创造力,这对软件工程领域提供了新机会。
今年,基础平台组做了一款面向公司内全体研发人员的开发助手,开发助手不同于编程工具,会对多种研发活动进行提效,目前已取得不错的用户反馈,覆盖超过 80% 的开发者。
本文有两个目的,对外 分享开发助手的设计与实现思路;对内 普及开发助手功能及技巧。
一个开发助手应该具备哪些能力、以什么形式提供能力?可以从市面上已有产品进行调研,这里以背景中提到的 Copilot 和 ChatGPT 入手。
Copilot 的补全功能能够在用户编写代码时,自动分析已有代码、并在合适时机给出补全建议。开发者们只要开始写代码了,或者编写一段描述代码功能的注释,Copilot 就会开始工作。下图灰色部分即 Copilot 给出的代码提示:
ChatGPT 通过学习大量的公共文本数据来生成自然语言的回答,由于其预训练数据主要来自于互联网上的公共资源,ChatGPT 只具备公共知识,而不具备内部知识。内部知识通常指的是特定组织、企业或个人拥有的专有信息,例如公司的内部流程、机密数据或个人的私人信息等。
ChatGPT 回答质量与提问质量相关,在使用 GPT 时,经常遇到这种情况:某个问题用类似的提问内容,问多次t都没有得到预期结果。然后换了种问法就有了。
如何写好 Prompt、让 GPT 输出更好的答案?这件事并不容易,有一个专门的技术研究这块:Prompt 工程。指针对于 Prompt 进行结构、内容等维度进行优化的AI技术,它把大模型的输入限定在了一个特定的范围之中,进而更好地控制模型的输出。
不难发现 Prompt 存在门槛,对用户来说是个使用负担。如果有现成的 Prompt 模板,用户能直接使用,或者能从模板中学到好的 Prompt 写法,门槛就会有所降低。
(必传)选中函数入参、返回值的类文件:这类数据是显而易见的,必须放到上下文中
(必传)选中函数中,调用的其他函数信息(包含入参、返回值):对于下图这种情况,让开发助手实现 updateOriginChecklist 函数,显然要将 DemandDoc 类结构也放到上下文里
(可选)选中函数前面、后面的代码片段:当生成的函数实现中,需要调用函数附近的其他函数时,则要将附近函数也传给开发助手
(可选)相似片段:当要填充的函数和代码库中已有函数,写法类似时,将相似片段传给开发助手,会有更大概率得到高质量结果
(可选)当前类中 import 导入的类,源码文件
1、分步骤解释 2、避免逐行翻译代码,不重要的细节可忽略,对代码按逻辑进行适当聚合 3、针对代码中的特殊设计进行解释 要解释的代码是:${code} |
${code} 是用户填写的代码,模板中 ${} 的数量需要和参数列表的参数数量相同。
利用 Prompt 模板功能,可以顺畅地完成各种操作,下面演示两个具体案例,体验一下丝滑的感觉。
通过选中报错信息,利用 Alt+i 快捷键,快速将异常堆栈及信息复制到了提问框,然后选择 Prompt 列表中的“排查异常”模板,就快速完成对异常的分析和可能的解决方案。
从动画中可以看出,分析异常的过程顺畅且高效。后续我们计划在异常分析时结合工程源码,让开发助手分析完异常后根据工程信息直接给出修改方式,并支持一键将修改方式应用在工程源码中。有了这个功能后,从异常提交->异常分析->异常修复就都通了。
目前公司里的各种工具系统非常全面,但各系统的页面是独立的,这就导致开发者们在编码时经常要跳转到其他系统,如 配置中心、PMO 系统等,且有些系统的点击路径很长,导致编码流畅度和效率有降低。
为缓解这一问题,开发助手目前接入了 PMO 系统,可以通过开发助手的聊天框,以问答的交互形式获取到 PMO 信息。
效果演示
利用已提供的 Prompt 模板 ”获取用户今天排期的PMO信息“,可以方便的获取到 PMO 信息,不再需要切换浏览器到 PMO 系统上查询。
区别点 | 传统软件 | Agent |
交互方式 | 基于界面 | 自然语言的交互式 |
能力范围 | 解决“点”问题,每个功能一个实现 | 解决“面”问题,实现原子操作后,可由 AI 自由组合 |
扩展性 | 一般 | 好 |
价值 | 低成本的自动化商品 + 高成本的个性化商品 | 低成本的个性化商品 |
角色 | 作为工具,辅助人类 | 可替代人类工作 |
1、通过在 IDEA 插件里监听用户接受补全的代码事件,可以算出接受的代码总行数及具体代码,即开发助手生成的代码情况。
2、根据 git 提交记录可以分析出用户一段时间内编写的总代码行数,这样就可以计算出同一时间周期内(如 一个月),开发助手生成的总代码行 / 总提交代码行,即为开发助手在编码阶段带来的提效比例。
3、研发活动有很多种,包括 方案设计、编码、自测、解决问题等,编码只是其中一部分,因此计算总提效时,需要乘以编码活动时间占比,公式为:
开发助手支持操作指令,比如 ”获取排期的 PMO“。这部分的提效可以细化到每个操作指令,还是以获取排期 PMO 为例:
1、计算如果是手工获取排期的 PMO 需要花费多少时间,现在通过开发助手完成同样的操作需要多少时间,两者之差就是单次节约的时间成本。
2、乘以该功能的使用总次数,得出该指令的总节约时间。
3、将所有指令的节约时间求和,得出总节约时间,公式为:
节约总时间 = ∑ (特定指令单次节约时间 * 使用次数)
开发助手会持续更新,迭代周期是 1~2 周 1 个版本。最新版本的 IDEA 插件已经具备自动升级能力,大家无需手动升级插件了。
目前 AI 领域发展速度很快,临近完篇时,OpenAI 和微软发布了很多重磅功能,包含 更准确/支持更大 context 的 GPT-4 Turbo 大模型、自定义 ChatGPT 版本、Assistants API、Copilot Workspace,相关链接放在了文末。
未来,开发助手主要会在三个方向继续发展:
扩展开发助手知识边界,对接公司内部知识库平台,具备私有知识(开发中,待文章发布时大概率已经上线)
以代码为核心,提供特定场景的功能,如 代码可视化(提供业务流程图、链路图等)、代码导航(根据自然语言定位到代码片段,方便读代码)、代码智能优化、代码模板、异常修复
结合公司的研发流程,贯穿始终,提供顺畅的流程体验及交互式操作能力
OpenAI Prompt Engineering:
https://platform.openai.com/docs/guides/prompt-engineering
OpenAI DevDay, Opening Keynote:
https://www.youtube.com/watch?v=U9mJuUkhUzk
GitHub Universe 2023:
https://ke.segmentfault.com/course/1650000044354512
扫码添加技术小助手,加入「技术交流分享群」
获取最新技术分享资讯~