当前位置: 首页 > news >正文

Prompt 驱动架构设计:探索复杂 AIGC 应用的设计之道?

你是否曾经想过,当你在 Intellij IDEA 中输入一个段代码时,GitHub 是如何给你返回相关的结果的?其实,这背后的秘密就是围绕 Prompt 生成而构建的架构设计。

Prompt 是一个输入的文本段落或短语,用于引导 AI 生成模型执行特定的任务或生成特定类型的输出。不同的 Prompt 会导致不同的搜索结果,因为它们会影响模型对信息的处理方式。而通过巧妙构建Prompt,我们可以让模型在广泛的任务中执行特定的操作,从而提高搜索效率和用户满意度。

Prompt 的设计不仅影响 AIGC 模型的行为和输出,还影响软件架构的设计和优化。那么,Prompt 和软件架构之间有什么关系呢?为什么 Prompt 对软件架构如此重要呢?

在本文中,我们将探讨这一关系,并基于我们对一些卓越的人工智能生成代码(AIGC)相关应用的研究,以及一些内部 AIGC 应用的观察,这些应用都是基于 LLM 优先理念下来构建和设计软件架构的。这些应用包括:

  • GitHub Copilot:一个基于 OpenAI Codex/Codex 2 模型的代码生成器,它可以根据用户提供的注释或代码片段来生成完整的代码。

  • JetBrains AI Assistant:一个围绕开发人员日常活动构建的伴随性 AI 辅助的 IDE 插件。

  • Bloop:一个根据用户提供的自然语言描述或问题,来生成对应答案或者代码的工具。

而究其背后的原因,我想只有围绕 LLM 优先来考虑架构,才有可能对应这种复杂性。

PS:本文讨论的背景是复杂的 AIGC 应用,诸如于 Copliot 型、Agent 型应用,普通的 AIGC 不具备这种复杂性。

AIGC 优先应用的架构特征(初步)

在我们先前的文章《上下文工程:基于 Github Copilot 的实时能力分析与思考》里,介绍了 Copilot 如何结合用户行为,以及当前代码上下文,光标位置(行内、块间、块外)来生成三种不同类型的代码。其基本特质便是围绕用户的潜在意图来设计对应的生成内容。并结合当前的代码文件,来调整生成的内容,以符合对应语言的基本语法。

而 Bloop 则是围绕于检索增强生成(RAG)来推测用户的潜在意图,诸如通过查询扩展的方式,来更好地匹配潜在的代码。并通过输出更多的上下文交互过程,以让用户来调整自己的问题,获得更准确的答案。

再结合 JetBrains AI Assistant 的语言上下文模块化架构,我们简单将复杂 AIGC 应用总结了三个核心特征(未来还将继续优化这个版本):

  1. 感知用户意图,以构建清晰的指令: 这一特征涉及捕获和分析用户的操作,以全面理解用户的目标和偏好。应用程序需要能够识别用户的需求,提供相应的内容生成方案,从而建立清晰的指令。这可以包括收集和解释用户输入,行为分析,以及利用历史数据来更好地了解用户需求。通过这个特征,AIGC 应用可以更好地满足用户的期望。

  2. 围绕用户意图地交互设计,以让用户输出更多上下文: 这个特征旨在创建友好和灵活的用户界面,鼓励用户提供更多上下文信息。用户通常通过输入和修改内容生成的参数和条件来表达他们的需求。此外,AIGC 应用还可以隐式地获取用户的上下文信息,例如 v0.dev、数据智能和流式交互。这些信息可以包括用户的操作历史、上下文语言信息、位置信息等,以提供更个性化和智能化的内容生成服务,从而增强用户体验。

  3. 基于数据的反馈改进与模型优化: 这一特征通过不断收集和分析用户对生成内容的反馈,如评分、评论、分享等,以实现内容生成模型和算法的不断调整和优化。通过利用这些反馈数据,AIGC 应用可以提高生成内容的质量和多样性,确保用户满意度不断提高。

而对于这些应用来说,并不是需要复杂的 prompt 技巧。技巧性、复杂的 Prompt 在工程化面前都是灾难性的

复杂 AIGC 应用的基本 Prompt 策略

对于复杂 AIGC 应用来说,难点是在于 Prompt 的策略,也就是如何构建自动的上下文收集?。通常来说,其设计过程要考虑:

  • 鲁棒性:Prompt 的设计应该能够处理各种输入情况,并在不同任务和领域中表现良好。它们应该是通用的,而不仅仅适用于特定任务。

  • 评估和反馈循环:Prompt 设计的成功与否通常需要不断的迭代和反馈。开发者可能需要花时间来调整Prompt以提高模型的性能,这也可能影响软件架构。

鲁棒性也意味着,复杂的 Prompt 会变成一种灾难,因为作为一个生成模型,它无法考虑到你的每个 MUST/HAVE TO/必须,以及你交给他的,你不应该 xxx。太长的 prompt,不仅显得 LLM 很愚蠢,也间接地让你觉得自己很愚蠢。你应该将长 prompt 分为多个 stage(人及 GPT 会在阅读很长的文本之后,忽略这句要求),即复杂问题应该先进行拆解 —— 参考领域驱动设计的方式。

在 AIGC 工具里,我们可以将 Prompt 分为多种类型,强指令型,强结果型。

Prompt 策略 1:精短地指令,精准上下文

4c4cc030f4fe3aa8d5352fce4ab8f12f.png

在非聊天的场景下,诸如于编写文档、编写报告等等,工具中的指令往往都非常简洁: Write documentation ,而为了让 LLM 生成更精准的结果,我们还需要进行更多的上下文补充,诸如于:

Write documentation for given method ,它结合着不同的语言的语法形式(类声明、方法声明等)。

随后,还需要考虑不同的文档工具,诸如于 write PHPDoc 。而使用 Python 语言时,则又需要使用 """ 来作为文档的起始标志。而为了编写更规范的文档,还需要结合 use @param tag 来进行示例,告诉 LLM 应该写什么样的文档。

那么,问题就来了,要让 AIGC 构建出这个上下文,我们需要:

  • 获取语言相关的信息,诸如版本信息等

  • 配置或者获取该语言的文档工具

  • 获取待写文档的代码信息

  • 如果是方法的话,需要提醒 method has return type 。

  • 根据不同的语言配置基本的规范。如 Python 到底是用 Tab 还是用空格。

指令本身很简单,但是要构建精准的上下文,则是要回到工程化问题上来。

Prompt 策略 2:围绕结果设计交互,获取用户的上下文

f5b325f9f0daba8710c4186ba665012b.png

在非编码场景的其他 RAG 场景之下,通常我们会围绕于:感知-分析-执行 来分析用户的意图,进而根据用户的意图来生成更多的上下文。先看个数据问答的示例:

意图:xx (子公司)去年营收?
观察:...
思考:请选择查询的数据子项?
操作:选择 xx 领域。
….
最终输出:图表(柱状图等)

这里就存在一个问题,用户最终要的是图表,还是文字信息?我们要不要帮用户做这个决定?如果要做这个决定,那么我们是不是需要根据用户以往的历史经验?

所以,在这个场景里,在进入解决方案之前,我们一直在围绕用户的问题进行澄清。

围绕 Prompt 策略的架构设计示例

现在,再回到架构设计上,让我们看看对应的示例。

语言插件化架构

我们在理解了 JetBrains 的 AI 工具的架构设计上,参考(复制)了相似的设计。在 JetBrains 的 IDE 里,不同的语言后缀会调用不同的 IDE 插件功能来实现对应的重构等等的方式。所以,在设计对应的功能时,也是将不同的语言划分到不同的模块,以借由其实现其动态加载。

dea6671df1d2988755fa46e049db0c0e.png

举个例子:为了生成测试代码的准确性,我们需要获取被测试代码、测试框架等信息,因此需要语言上下文、技术栈上下文、相关上下文、以其它上下文。

所以,仔细拆解下来,我们就需要围绕于插件化架构来构建 IDE 插件,即在 Core 模块里定义 Prompt 和我们的抽象接口,在不同语言模块里,实现对应的上下文获取方式。

而如果我们只是一个简单的聊天功能,就不需要这么复杂的架构,只是生成内容的精准性会下降。

发散-收敛式上下文

而在诸如于 Bloop 这一类以 RAG(检索增强生成) 为主的应用设计里,更重要的则是如何从不同渠道丰富用户的上下文,其难点主要在于如何匹配最相似的答案。

e27e975e9824ff21ac049a4686189a40.png

发散。其使用方式有多种多样的,诸如于分析用户的意图,使之能进行内容检索 —— 代码检索、文档检索、网络检索等等。

收敛。结合发散的结果,对检索到的内容进行处理,进而做最后的过程呈现与内容的总结。

而这部分内容本身是作为策略的一部分存在的,它可以作为基础设施的一部分,诸如 LLM SDK,又或者是代码服务。

其它场景

而在其他一些场景中,诸如于 Code Review,我们会结合提交信息中的 story id、代码变更、业务信息,三部分来进行最后的总结。与语义化代码搜索的场景相似,但是与普通的 Code Review 相比,为了达成更精准的上下文,则花费的成本更高。

平衡 Prompt 策略与架构演进路线

尽管 AIGC 能显著地加速我们编写代码的时间,但是花费更多的时间在上下文架构上,则意味着架构的复杂度。我们是否应该花费如此多的时间在构建 prompt 上,它带来的 ROI 是否合理,就需要根据不同的场景去考虑。

除此,我们还需要围绕于 Prompt 演进策略,来构建架构的演进路线。诸如于,对于一个 Code Review 工具,我们应该如何去规划?

  • 实现基本的 code review 接口调用与 comments 调用?

  • 结合提交信息,来 review 代码,分析两者是否一致?

  • 从提交信息中获取业务上下文,来分析代码是否与业务一致?

  • ……

随后,则是根据我们能获取到的数据,来设计最终的 prompt,并以此作为版本来规划架构演进路线。

小结

由 ChatGPT 生成:

本文讨论了复杂 AIGC 应用中的 Prompt 和架构设计的关键性。Prompt 是引导 AI 生成的文本段落,其设计直接影响AIGC应用的性能。

复杂 AIGC 应用具有三核心特征:感知用户意图、设计用户交互以获取更多上下文和基于数据反馈的模型优化。两种 Prompt 策略包括精简指令和围绕结果的设计,有助于构建更有效的Prompt。示例架构设计采用语言插件化,可根据不同语言后缀实现不同功能,提高 AIGC 应用的多语言支持。

文章突出强调 Prompt 的重要性,指出 Prompt 和架构设计在提高生成内容质量和用户满意度方面至关重要。在实践中,需要平衡 Prompt 策略和架构设计,以满足不同 AIGC 应用的需求。

相关文章:

Prompt 驱动架构设计:探索复杂 AIGC 应用的设计之道?

你是否曾经想过,当你在 Intellij IDEA 中输入一个段代码时,GitHub 是如何给你返回相关的结果的?其实,这背后的秘密就是围绕 Prompt 生成而构建的架构设计。 Prompt 是一个输入的文本段落或短语,用于引导 AI 生成模型执…...

【代码随想录】算法训练营 第三天 第二章 链表 Part 1

目录 链表基础 链表的定义 203. 移除链表元素 题目 思路 代码 直接删除法 虚拟头结点辅助法 707. 设计链表 题目 思路 代码 206. 反转链表 题目 思路 代码 双指针法 递归法 链表基础 链表是一种通过指针串在一起的线性结构,每个节点都由数据域和指…...

winform开发经验(1)——调用Invoke更新UI时程序卡死原因以及解决办法

1、问题代码如下: private void Form1_Load(object sender, EventArgs e){this.Invoke(new Action(()...

JNI 的数据类型以及和Java层之间的数据转换

JNI的数据类型和类型签名 数据类型 JNI的数据类型包含两种:基本类型和引用类型。 基本类型主要有jboolean、jchar、jint等,它们和Java中的数据类型的对应关系如下表所示。 JNI中的引用类型主要有类、对象和数组,它们和Java中的引用类型的对…...

EFLK与logstash过滤

目录 一、Filebeat工作原理: 二、为什么要使用Filebeat: 三、Filebeat和Logstash的区别: 四、logstash 的过滤插件: 五、FilebeatELK 部署: 1. 安装filebeat: 2. 设置 filebeat 的主配置文件&#xff1…...

docker jenkins

mkdir jenkins_home chown -R 1000:1000 /root/jenkins_home/docker run -d --name myjenkins -v /root/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restarton-failure jenkins/jenkins:lts-jdk17参考 Official Jenkins Docker imageDocker 搭建 Jenkins …...

单例模式之「双重校验锁」

单例模式之「双重校验锁」 单例模式 单例即单实例,只实例出来一个对象。一般在创建一些管理器类、工具类的时候,需要用到单例模式,比如JDBCUtil 类,我们只需要一个实例即可(多个实例也可以实现功能,但是增…...

2023年中国商业版服务器操作系统市场发展规模分析:未来将保持稳定增长[图]

服务器操作系统一般指的是安装在大型计算机上的操作系统,比如Web服务器、应用服务器和数据库服务器等,是企业IT系统的基础架构平台,也是按应用领域划分的三类操作系统之一。同时服务器操作系统也可以安装在个人电脑上。 服务器操作系统分类 …...

BIM如何通过3D开发工具HOOPS实现WEB轻量化?

随着建筑行业的数字化转型和信息建模技术的不断发展,建筑信息模型(BIM)已经成为设计、建造和管理建筑项目的标准。然而,BIM模型通常包含大量的数据,导致在Web上的传输和查看效率低下。为了解决这一挑战,HOO…...

Unity 3D基础——通过四元数控制对象旋转

在这个例子中,通过键盘的左右方向来控制场景中的球体 Sphere 的横向运动,而 Cube 立方体则会一直朝着球体旋转。 1.在场景中新建一个 Cube 立方体和一个 Sphere 球体,在 Inspector 视图中设置 Cube 立方体的坐标为(3,0…...

python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True

代码 print(3 and 4 and 5) # 5 print(5 and 6 or 7) # 6 4 > 3 and print(‘hello world’) # 输出hello world 注释: 在逻辑运算中,不一定逻辑运算符的两边都是纯表达式。也可以是数值类型的数据。 Python把0、空字符串和None看成 False&#xff…...

《算法通关村第一关——链表青铜挑战笔记》

《算法通关村第一关——链表青铜挑战笔记》 Java如何构造出链表 概念 如何构造出链表,首先必须了解什么是链表! 单向链表就像一个铁链一样,元素之间相互链接,包含多个节点,每个节点有一个指向后继元素的next指针。…...

【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. RNN与梯度裁剪 2. LSTM模型 3. 训练函数 a. train_epoch b. train 4. 文本预测 5. GPU判断函数 6. 训练与测试 7. 代码整合 经验是智慧之父,记忆…...

IOS课程笔记[1-3] 第一个IOS应用

安装开发环境 安装Xcode软件 历史版本查找 https://developer.apple.com/download/all/?qdebug 创建Object-C项目 启动过程 步骤 1.加载Main中定义的storyBoard 2.加载Main控制器 3.加载控制器下的View组件显示 获取控件的两种方式 定义属性连线:property (…...

Flink的基于两阶段提交协议的事务数据汇实现

背景 在flink中可以通过使用事务性数据汇实现精准一次的保证,本文基于Kakfa的事务处理来看一下在Flink 内部如何实现基于两阶段提交协议的事务性数据汇. flink kafka事务性数据汇的实现 1。首先在开始进行快照的时候也就是收到checkpoint通知的时候,在…...

树模型(三)决策树

决策树是什么?决策树(decision tree)是一种基本的分类与回归方法。 长方形代表判断模块 (decision block),椭圆形成代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作为分支(branch)…...

vueday01——使用属性绑定+ref属性定位获取id

1.属性绑定&#xff08;Attribute 绑定&#xff09; 第一种写法 <div v-bind:id"refValue"> content </div> 第二种写法&#xff08;省略掉v-bind&#xff09; <div :id"refValue"> content </div> 2.代码展示 <template…...

LeetCode 260. 只出现一次的数字 III:异或

【LetMeFly】260.只出现一次的数字 III 力扣题目链接&#xff1a;https://leetcode.cn/problems/single-number-iii/ 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返…...

使用PyTorch解决多分类问题:构建、训练和评估深度学习模型

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

基于nodejs+vue网课学习平台

各功能简要描述如下: 1个人信息管理:包括对学生用户、老师和管理员的信息进行录入、修改&#xff0c;以及老师信息的审核等 2在库课程查询:用于学生用户查询相关课程的功能 3在库老师查询:用于学生用户查询相关老师教学的所有课程的功能。 4在库学校查询:用于学生用户查询相关学…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...