当我们对《流浪地球2》中人工智能MOSS产生无尽的科幻联想之际,GPT已经通过大规模数据预训练,拥有了理解、生成文本的能力,并在多个行业引发了巨大冲击,从客户服务到市场营销,从医疗健康到教育,都带来了颠覆性的变革,AI元年悄然而至。
在软件研发领域,它能够帮助我们提高开发效率、改善代码质量、代码自动生成吗?本文依托于一个老项目数据库重构的背景,和大家一起探讨下GPT在研发重构过程中的应用实践。
已服役十余年的项目,应客户要求去除商业数据库中间件,使用postgreSQL替换Oracle,经过十余年的业务加载和迭代,启动重构存在很大的考验与风险:
综合来看,这是一项具有挑战性的任务,技术上没有瓶颈,但实施上困难重重:
为了提升效率,引入了chatGPT作为研发小助手,并按使用场景给它分了三个角色,看看它具体可以帮我们做什么:
下面让我们通过重构中java代码处理的一个典型场景示例,带大家一起感受一下它的魅力:
第一步:准备好需要处理的java代码段,和指令。
第二步:问答交互式协助,就如同使用钉钉、微信聊天一样,输入上面的代码段+指令,让它帮我们处理。
最后:AI的响应结果符合预期,并且给出了详细的汇总分析。由此可见,只要指令够准确,它就可以快速完成代码段的分析、改造和总结,效率很高,整体耗时不会超过10秒钟。
使用过程中发现chatGPT在高度经验化、重复化的任务处理中表现不俗,研发一个以它为底座的重构工具势在必行。细心的你,会发现上面的截图并不是来自需要科学上网的chatGPT,而是源自我们做的接入GPT API的重构小工具。
用内置扫描器来替代人工走查,当前工具预置扫描器已支持java代码、DDL、xml扫描,精确的按任务文件维度,处理一个超大文件,在保证上下文完整的情形下,拆解成符合AI token要求的较小任务单元(代码段)。
对扫描拆解的代码段,按照预置场景下的命中策略,判断是否需要送AI处理,打标识生成真正的待办任务。
这样不再依赖于人工走查和人员经验,既节约了时间,又减少了疏漏,同时一定程度上提升任务转化效率及准确率。
传统的数据库重构项目研发管理,代码走查完成后,由研发经理分配到人,现在不需要了。工具提供项目维度的管理,将AI交互使用场景分类,进行场景化管理,场景扫描生成任务后,自动均匀分配给项目研发人员。
例如,Oracle2PostgreSQL的重构项目,包含的两种场景:
提供任务可视化及闭环管理,项目管理者在监控界面上对场景任务的分配情况一目了然。
数据库替换重构项目中,需要研发经理做好技术背调,并输出任务清单,然后对研发团队进行赋能和分配任务,接下来研发人员按包路径维度,结合背调知识库,逐个修改。这样做的缺点是容易代入个人编码习惯,无法标准化,可能会带来不必要的BUG,对业务产生影响。
工具自动化后,研发人员只需要关注分配的任务,按照任务清单对代码段审核,就可以一键送AI处理,AI会响应输出结果代码段或SQL,然后针对预处理后的AI返回结果,进行人工校准,就可以一键复写生成java类和SQL。
人机交互模式,将高度经验化、重复化的部分研发工作,交由AI处理,研发人员做好审核和校验,充分利用了AI编码能力,节约了工作量,同时提升了准确率和代码质量。
text-davinci-003是基于GPT-3的模型,适用于广泛的自然语言处理任务,包括对话生成、问题回答、文本摘要和翻译等。它功能强大但相对较慢,适合复杂和深入的文本处理,不要求实时性。
gpt-3.5-turbo是基于GPT-3.5的模型,具有高性能、低延迟的特点。它适用于快速生成文本的场景,如在线聊天机器人、客户支持自动化和内容创作辅助。在对话和短文本方面表现出色,响应速度快。
两种模型对于每分钟调用频次、交互token均有限制。开始我们倾向于选择token大和调用频次高的达芬奇模型,但试验后发现,在转换速率和准确率上gpt-3.5-turbo要远优于达芬奇,可是基于chatgpt更高的时效和性能要求,OpenAI对它做了更多的限流控制。
综上,gpt-3.5-turbo模型更加适合用于高效率、高质量的生成型任务,在算力性能和实时性方面优势很大,选择接入它没错。
turbo的限流控制很让人头疼,于是工具研发中引入了令牌桶算法,支持接入多个apikey,完美解决了限流问题。
令牌桶算法(Token Bucket Algorithm)是一种流量控制算法,用于控制资源访问速率。它是一种经典的算法,常用于网络传输、API限流、请求调度的场景。
提炼出java、xml、DDL文件不同的特征,通过预置的Java类扫描器和文本类扫描器,保障上下文完整性,以及符合交互的token限制。
openai是收费的,内测中免费账户流量很快就耗费殆尽。如何筛选命中有效内容,把实际需要处理的内容交给它很关键。
基于这些考虑,抽象出了场景的概念,在场景下预置不同的正则表达式策略,并提取符合策略规则的内容/代码段,提交给AI处理。
让我们再接着思考:在特定使用场景下如何设置合理角色和prompt?又怎么固定返回我们想要的结果?
初版设计思路为:扫描->AI处理->回写,验证后发现存在着准确性、及时率的一些问题,于是我们考虑使用半自动-人机交互模式来解决这些问题,流程优化为:扫描->任务审核->AI处理->任务校准->回写,并且提供差异比对和异常重送的功能,以提升交互准确率。
随着AI的不断发展和应用,其强大的自然语言预处理机制和大数据的魅力,在各个领域展现出巨大的潜力。在代码解释分析、代码生成、知识库检索等方面也拥有无限可能,未来,我们可以期待它作为研发的好帮手,发挥更重要的作用。