生成式 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 根据标题生成)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-python:图像像素类型转换与归一化

目录 1.图像像素类型转换 2. 图像像素转换适用情形 3.图像归一化 4.归一化方法支持 5.归一化函数 6.知识笔记 1.图像像素类型转换 图像像素类型转换是指将图像的像素值从一种类型转换为另一种类型。常见的像素类型包括无符号整数类型(如8位无符号整数、16位无符…

leetCode 37.解数独 + 回溯算法 + 图解

编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空…

c语言指针详解(上)

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…

SIT75176B:3.0~5.5V 供电,32 节点,10Mbps 半双工 RS485/RS422 收发器

SIT75176B 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、总 线耐压范围达到 15V 、半双工、低功耗,功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发器, 最多允许 32 个节点同时连接到总线。 SIT75176B 包…

使用 async/await 是必须避免的陷阱

使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs,那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲,这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质&a…

如何快速看懂市场行情?

一、看大盘指数 咱们平时所说的大盘其实指的就是上证指数,它是整个市场的晴雨表。大盘涨了,个股跟着上涨的概率就大,大盘跌了,个股被拖累下跌的概率也大。所以,要想在股市中尝到甜头,大盘分析是少不了滴&am…

python socket编程7 - 使用PyQt6 开发UI界面新增实现UDP server和client单机通讯的例子

在第五篇中,简单实现了命令行下的 TCP/UDP server和client的单机通讯。 在第六篇中,实现了PyQt6开发界面,TCP协议实现的单机server和client的通讯功能。 这一篇,在第六篇的基础上,增加了UDP server和client的单机通讯功…

【在英伟达nvidia的jetson-orin-nx上使用调试摄像头-同时开启多个摄像头-基础测试(2)】

【在英伟达nvidia的jetson-orin-nx上使用调试摄像头-同时开启多个摄像头-USB摄像头与Camera Conn.#0/#1接口-基础测试(2)】 1、概述2、实验环境3、 先前确认(1)USB摄像头,先确认可以单独打开(2)…

Leetcode题库(数据库合集)_ 难度:困难

目录 难度:困难1. 部门工资前三高的所有员工2. 行程和用户3. 体育馆的人流量4. 员工薪水的中位数5. 同一天的第一个电话和最后一个电话6. 查询员工的累计薪水7. 给定数字的频率查询中位数8. 学生地理信息报告9. Hopper 公司查询 ①10. 职员招聘人数11. 职员招聘人数…

MPC模型预测控制理论与实践

一、基本概念 最有控制的动机是在约束条件下达到最优的系统表现。 模型预测控制(MPC,Model Predictive Control)是通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,通常用离散型状态空间表…

python 堆与栈

【一】堆与栈 【 1 】简介 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top&a…

Java_ArrayList顺序表详解

目录 前言 顺序表 ​编辑 顺序表和数组 ArrayList简介 说明 ArrayList使用​编辑 ArrayList常见操作 ArrayList实现二维数组 ArrayList的遍历 ArrayList的扩容机制 总结 前言 一个高端的程序员,往往都是数据结构学的很好,判断一个程序的优劣也是看数据结构学的好与坏.…

原生video设置控制面板controls显示哪些控件

之前我们学习了如何使用原生video播放视频 今天来一个进阶版的——设置控制面板controls显示哪些控件 先看一下当我们使用原生video时,controls属性为true时,相关代码如下: 正常的控制面板默认显示的控件有:播放、时间线、音量调…

Android基础: 使用Java代码控制 Activity类页面相互之间进行跳转 Activity页面的的启动和结束

Android基础(Activity) Activity的启动和结束 我们主要看Java代码逻辑: 第一个页面的逻辑代码 public class StartActivity01 extends AppCompatActivity implements View.OnClickListener {Overrideprotected void onCreate(Bundle saved…

香港云服务器计算型和通用型的区别

在当今数字化时代,云服务器作为企业级应用的核心设备,其性能和类型对于企业的运营和数据处理至关重要。在常见的香港云服务器类型中,通用型和计算型是最为常见的两种。那么,这两种云服务器到底有什么区别呢? 设计目标和应用场景不…

HarmonyOS开发基础(一)

HarmonyOS开发基础(一) // :装饰器:用来装饰类结构、方法、变量 Entry // Entry:标记当前组件为入口组件 Component // Component:标记为自定义组件 // struct:自定义组件,可复用的…

【LeetCode】692. 前K个高频单词

692. 前K个高频单词 描述示例解题思路及事项思路一思路二 描述 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序 示例 示例1 输…

Python实现FA萤火虫优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

15.Servlet [一篇通]

文章目录 1.Servlet 是什么2.第一个 Servlet 程序2.1创建项目2.2引入依赖2.3创建目录2.4编写代码2.5打包程序2.6部署程序2.7验证程序 3.更方便的部署方式3.1安装 Smart Tomcat 插件3.2配置 Smart Tomcat 插件 4.访问出错怎么办?4.1出现 4044.2出现 4054.3出现 5004.4出现 &quo…

移动端APP测试方法

1 APP测试基本流程 1.1 测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.2 测试资源 测试任…