生成式 AI 应用落地小结:高估的模型能力,低估的工程实施

虽然 ChatGPT 已经诞生了一周年,但是大量的人依旧对于生成式 AI 没有足够的认识。在研发领域,Thoughtworks 一直在与不同的大型企业合作,保持开放性的探索。

在我负责的 Thoughtworks 开源社区,我们与外部的几家大型企业一起探索和构建了 Unit Mesh 的诸多开源项目,作为开源 AI 研发体系的一部分。

325a5f7d4da23a31b10ffc5824bcb438.png

与生成式 AI 在其它领域落地不同的是,有大量的企业已经由小作坊的开发方式,转变为规范化、标准化的开发方式。在具备规范化的项目开发流程与验收流程,生成式 AI 可以更好地提升整体的效能。

而从我们观察的情况来看,人们总希望:微调后的模型能一次解决的所有问题。但是,这几乎是不可能的,不论是生成文本还是生成代码,都需要依赖于模型的能力与体验的设计。

应用能力:模型能力受限下的体验设计

2023 年年初,我们开始构建 AutoDev 这个插件时,由于响应速度是我们的主要弱项,毕竟 GitHub Copilot 可以做到 ~300ms 内的响应速度。所以,我们更多的探索是在:如何通过其他项来弥补模型的差距?

根据我们的算力,以及不同的模型场景,我们所能提供的也是不同的。

响应速度有限的 AI 增强编码:AutoDev

cb86d50c1a29d095c52955b91d56184d.png

在缺乏足够 GPU 资源的情况下,即在你不能提供足够快的模型响应速度,我们探索的一些合适的模式:

  • 强相关上下文,生成高质量代码。通过构建强相关的上下文,生成质量更高的上下文。Copilot 采用的是相似式搜索的上下文,因此在生成构建函数、测试等场景效果不好。于是 AutoDev 采用了静态代码分析的相关上下文,构建更好质量的上下文,以生成更高质量的代码和测试等。

  • 高价值点探索与赋能。如结合 CoUnit 作为扩展服务器,将内部的文档作为知识的一部分,与当前代码相关联。诸如可以生成特定内部框架下的代码。

  • 自定义 AI 动作与交互。IDE 中自带代码相关的上下文,以在团队认为的高价值场景上,借助 AI 来提效,诸如各类数据转换、遗留系统迁移等。

为此,我们相信在 IDE 中的体验可以带到其他软件研发场景,诸如于需求编写、测试用例等等。

AI 全方面增强创作体验:Studio B3

4156c7735fe2c24d3b12e852511d8493.png

在经过了 RLHF 之后,各个主要的模型,在写作这一件事上,并没有特别大的差异,只是 50 分和 100 分的区别。不过受限于语料的原因,有些模型写出来的内容还是一言难尽。所以在 Studio B3 中,我们探索的是,如何从零打造 AI 原生的工具:

  • AI 增强人类的交互体验。即探索人们是如何完成日常工作的,再结合 AI 来增强人类,让人类来做主要的决策。

  • 集成日常活动。诸如于资料检查、互联网搜索,工具集成。

  • 准一线、二线模型的探索。在 AI 应用开发上,我的观点一直是:优先使用最好的大模型探索可行性,再考虑结合开源模型运行微调。在有足够的数据、算力和人力时,可以结合已有语料进行基于基础模型的训练。

我们计划将 Studio B3 作为日常文档、需求文档、测试用例的编辑器,所以考虑的几乎是与 AutoDev 相似的背景下。

模型能力:一个够用,两个刚好,三个最佳

只要我们打开看开发人员、业务人员的日常活动,你会发现完成他的工作 —— 不论是编码,还是编写需求,都需要一系列的子任务支撑。

诸如 JetBrains 的《2023 开发者生态系统现状》中的:”您使用以下现有 AI 助手功能进行编码的频率如何?“一节所介绍的:

6a7bd583b2e1b1e40157e30239e30636.png

(PS:我相信由于 ChatGPT 在国外是免费注册的,由 GitHub Copilot 是需要收费的,也是一小小小部分原因)

考虑一下,为了完成上面的一系列子任务,我们需要几个模型?

工具分析:GitHub Copilot 与 JetBrains AI Assistant

9f5f33dde191db8f07f101e1e993483a.png

所以,要实现类似于 GitHub Copilot 这样的工具,需要用几个模型?答案是 2~3 个:

  • 代码补全:OpenAI Codex 模型。

  • 代码问答:OpenAI ChatGPT 3.5 / ChatGPT 4.0.

  • (不确定)Embedding 模型:没有证据,我猜应该是打包在 agent 中,否则在没有打包 TreeSitter 的情况下,体积可以达到 40~50 M。

而在 JetBrains IDE 里,由于本身就是一个 IDE,所以存在的模型就更多了:

  • 本地向量化模型。即可以做 Search Everywhere 的增强,也可以做其他场景的使用。

  • OpenAI 问答模型。这就是为什么 AI Assistant 不能在国内使用的一个原因。

  • 本地单行代码补全模型。离线模型,以提供不同语言的 full-line 支持。

  • 云端代码补全模型。同上

  • 拼写检查模型。

所以,取决于不同的场景,我们需要结合多种 ML 模型来增强人类。

AI 工具模型:三个最好

fd0b25fc3374970544269be4c88961c4.png

而从我们的两个沉浸性编辑器(代码编辑器 + 文本编辑器)的探索和落地来看,在两个场景上,为了达到最好的效果,需要三个模型:

  • 高响应速度的补全大语言模型。我们需要在质量与速度之间,找到更好的平衡点,以实现速度优先。

  • 易于结合 RAG 的高质量大语言模型。使用质量最好的模型,以能结合 Prompt、RAG 等,实现与用户的对话。

  • 可选的本地向量化模型。本地意味着,使用 CPU 就能完成计算,以便直接与用户本地的语料相结合,从而相对减少数据风险。

对于开发人员的日常来说,理解代码也是工作的重要一项 —— 并非所有的代码都是自己写的。哪怕是自己写的,半年后也会忘记的 —— 比如我。

AI 原生应用工程化落地小结

现在,让我们回到正题上,结合上述的几个点,做一些小结。

观点 1 :别指望 AI 一次生成,生成式 AI 提供的是全面辅助

其实不论是文本生成,还是代码生成,都涉及到生成式 AI 的能力问题:

  1. 用户无法提供所有上下文给模型。既然能提供,提供的成本往往过高(大于 AI 生成的时间)

  2. 模型无法理解你提供的所有上下文。

两个因素的共同作用之下,常用的一个衡量指标是:AI 一次生成的内容用户能接受多少。而如果模型的能力不行时,则接受率会下降。而由于 AI 模型是需要持续反馈的,所以让更多的人使用 AI,会有限于反馈环的建立。

特别是,开源模型或者国内的模型在当前(2023 年年底),并不具备一线大语言模型(ChatGPT 3.5)的上下文理解能力

观点 2:多模型共同协助,解决不同子任务的问题

如果你也用过 GitHub Copilot 来编写文档里,你会发现:它在生成一些概念性的内容时非常有用。当然了,他在生成一些废话进也特别有用。但是,你不能指望 GitHub Copilot(补全模型)能生成一个有用的大纲,但是 Copilot X 就能辅助你生成这个可用的大纲。

所以,我们需要区分在不同场景下,到底需要的是什么模型。不同场景下,对于性价比等等的要求是不同的。

在早先,我会使用 OpenAI + AutoDev 来生成测试文件的第一个规范化的测试用例,然后 GitHub Copilot 就可以根据规范化的测试用例,以及我们的注释 prompt,生成后续的其它测试。

观点 3:与工具、上下文相结合,持续微调模型

我相信这一点大家都已经很了解了。但是,我们想再强调的一点的是,对于不同的技术方案而言,这并不是一件容易的事。

回到 AutoDev 的场景,AutoDev 是通过静态代码分析(Intellij IDE 插件)来构建上下文的,即通过绑定 IDE,来追求准确性。而其它的 AI 辅助工具则是,通过失去准确性,来构建跨编辑器通用架构(在 JetBrains、VS Code 等编辑器上)。

简单来说,在 AutoDev 生成测试时,是通过对一个 Controller 进行静态分析,将输入和输出作为上下文,以生成准确的 API 数据。而在其它通用编辑器里,则是通过相似上下文,这时往往拿不到输入和输出作为上下文,也就只能凭空捏造数据。

总结

生成式 AI 能提升个体的效率,但是它并不是银弹。我们不应期望 AI 一次生成所有内容,而是提供全方位的辅助。

1eba6145441870b33cbabcd8d09a50ca.png

(由 Microsoft Designer 根据标题生成)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/220599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8创新魔改教程(三)如何添加注意力机制注意力机制的用法与思考

注意力机制的用法与思考 好多同学问我加了CA注意力机制,CBAM注意力机制,都没有涨点,然后就在不停地换不同的注意力机制,其实并不是这样的。今天和大家讨论一下注意力机制的用法与思考。 (一)添加位置 大…

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像,会不好安装,镜像被魔改过了,适合真实物理机上的系统在PE里安装系统,建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…

vue3中手写一个日历,年部分,月部分,周部分,日部分

效果图 高度自定义,支持每天的统计展示,弹窗展示,详情操作 月部分: 默认展示当前月,支持前进和后退选择下一月 支持自定义每月的展示数据, 周部分: 分为上下午,可以列出要做的事项…

BitWarden数据迁移以及邮箱SMTP配置

bitwarden 个人密码库,这是我玩nas之后最想推荐的一个东西,今天就来分享一下 之前使用bitwarden都是网上现成的文章照抄(能搜到的都是抄来抄去的简直离谱),导致邮箱无法使用、数据库也只是本地的sqlLite很不方便。 前…

人工智能对我们的生活影响有多大?

一、标题解析 本文标题为“人工智能对我们的生活影响有多大?”,这是一个典型的知乎风格SEO文案标题,既能够吸引读者,又能够体现文章的核心内容。 二、内容创作 1. 引言:在开头,我们可以简要介绍人工智能…

MySQL的时间与日期函数

1、日期格式 DATE_FORMAT("20231128", %Y-%m-%d) -- 2023-11-28 DATE_FORMAT("2023-11-28", %Y-%m-%d) -- 2023-11-28 DATE_FORMAT(2023-11-28 08:47:23, %H:%i:%s) -- 08:47:23 (24小时制) DATE_FORMAT(2023-11-28 08:47:23, %h:%i:%s) -- 08:47:23(12小…

九九乘法表-第11届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第13讲。 九九乘法表&#…

【机器学习】聚类(三):原型聚类:高斯混合聚类

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 全局调试变量2. 调试函数3. 高斯密度函数(phi)4. E步(getExpectation&#xff09…

class文件结构

文章目录 1. 常量池集合2. 访问标志3. 字段表集合4. 方法表集合5. 属性表集合 成员变量(非静态)的赋值过程:1. 默认初始化 2. 显示初始化/代码块中初始化 3. 构造器中初始化 4. 有了对象后对象。属性或者对象。方法的方式对成员变量进行赋值 …

JVM之四种引用类型(五)

JVM 系列吊打面试官:说一下 Java 的四种引用类型 四种引种类型 1.强引用 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是…

RPG项目01_UI面板Game

基于“RPG项目01_技能释放”,将UI包导入Unity场景中, 将图片放置 拖拽 取消勾选(隐藏攻击切片) 对技能添加蒙版 调节父子物体大小一致 将子类蒙版复制 执行5次 运行即可看到技能使用完的冷却条 在Scripts下创建UI文件夹 写代码&am…

设计模式——七大设计原则

设计模式——七大设计原则 1、单一职责原则(SRP)2、开放封闭原则(OCP)3、依赖倒转原则(DIP)4、里氏替换原则 (LSP)5、接口隔离原则 (ISP)6、合成/聚合复用原则 (CARP)7、迪米特法则 (LoD) 了解 设计模式 的…

使用C语言创建高性能网络爬虫IP池

目录 一、引言 二、IP池的设计 1、需求分析 2、架构设计 3、关键技术 三、IP池的实现 1、存储实现 2、调度实现 3、通信实现 4、异常处理实现 四、代码示例 五、性能优化 六、测试与分析 七、结论 一、引言 随着互联网的快速发展,网络爬虫成为了获取…

2-1、地址加法器CS:IP

语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[add…

高级搜索——伸展树Splay详解

文章目录 伸展树Splay伸展树Splay的定义局部性原理Splay的伸展操作逐层伸展双层伸展zig-zig/zag-zagzig-zag/zag-zigzig/zag双层伸展的效果与效率 伸展树的实现动态版本实现递增分配器节点定义Splay类及其接口定义伸展操作左单旋右单旋右左/左右双旋伸展 查找操作删除操作插入操…

Spring 保姆级带你认识,让你如何轻松应对面试官

Spring 保姆级带你认识,让你如何轻松应对面试官 1.Spring是什么?作用是什么? Spring是一个轻量级的JavaEE框架,它主要解决企业应用中的复杂性问题。Spring框架有三个核心部分:IoC容器、AOP和数据访问/集成层。Spring…

java--抽象类

1.什么是抽象类 ①在java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。 ②abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。 2.抽象类的注意事项、特点 ①抽…

Vue3-ElementPlus按需导入

1.安装 pnpm add element-plus 2.配置按需导入: 官方文档:快速开始 | Element Plus 按照官网按需导入中的自动导入步骤来进行 pnpm add -D unplugin-vue-components unplugin-auto-import 观察Vite代码与原vite文件的差别,将原vite文件中没…

[数据结构]-map和set

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

【数据结构】二叉树的实现

目录 1. 前言2. 二叉树的实现2.1 创建一棵树2.2 前序遍历2.2.1 分析2.2.2 代码实现2.2.3 递归展开图 2.3 中序遍历2.3.1 分析2.3.2 代码实现2.3.3 递归展开图 2.4 后序遍历2.4.1 分析2.4.2 代码实现2.4.3 递归展开图 2.5 求节点个数2.5.1 分析2.5.2 代码实现 2.6 求叶子节点个数…