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

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:精短地指令,精准上下文

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

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

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

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

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

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

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

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

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

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

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

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

  1. 意图:xx (子公司)去年营收?

  2. 观察:...

  3. 思考:请选择查询的数据子项?

  4. 操作:选择 xx 领域。

  5. ….

  6. 最终输出:图表(柱状图等)

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

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

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

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

语言插件化架构

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

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

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

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

发散-收敛式上下文

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

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

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

而这部分内容本身是作为策略的一部分存在的,它可以作为基础设施的一部分,诸如 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 应用的需求。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
谈谈电商库存系统架构设计与实践在“设计之都” 上海,遇见面向未来的十大趋势|WDCC世界设计之都大会OpenAI 开放 GPT-3.5 Turbo 微调,网友:将prompt减少90%才实惠设计无界 造化万象!2023世界设计之都大会将于9月26日开幕,活动亮点抢先看→一张图搞懂微服务架构设计Diving Controversy Prompts Sports Fandom Criticism从创立事务所后的第一个作品看贝聿铭的设计之路:自然与文化的空间艺术各类基金架构设计与财税处理问题,终于有人讲清楚了【聚焦】2023世界设计之都大会有哪些新亮点?社会大众如何参与?上海如何以一流设计赋能高质量发展?这场发布会详解“VOGUE时尚之力盛会”开幕夜:当世界看向中国的设计之力心焦一文讲透阿里商旅账单系统架构设计实践传百度向华为订购 AI 芯片;特斯拉上调 Model 3/Y 长续航版售价;字节旗下 PICO 启动架构调整 | 极客早知道创新生活存算成本各降低 50%+:网易游戏大数据平台上云架构设计参数量仅为1/700,性能超越GPT-3.5!CMU+清华开源Prompt2Model框架AIGC,驱动架构与业务的新动力 | 9月16日 TF线下活动报名迈特芯黄瀚韬:自研立方脉动架构,已开发三款X-Edge芯片并实现大模型高效能并行存算丨GACS 20232023世界设计之都大会在沪开幕——打造世界级设计前沿风向标、创新策源地、新品首秀场AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则网易互娱出海之旅:大数据平台上云架构设计与实践OpenAI祭出绘画神器,Midjourney一夜下台!DALL·E 3联手ChatGPT,无需prompt一笔成神从单体到微服务的系统改造:采用事件驱动架构优化会员系统老爸坎坷的一生火星乐园第三部《灰界》第四十五章 联络客户AI时代的设计:让技术更人性日流量200亿,携程网关的架构设计《原神》冰箱贴:神子&宵宫&申鹤&甘雨&刻晴&优菈&莫娜7位角色!马斯克第二款AI产品PromptIDE公布,Grok的开发离不开它亚马逊 CTO 20 年架构经验之道:俭约架构师的七大黄金法则!微服务 vs. 事件驱动架构:重新开始理解差异进迭时空CPU设计总监费晓龙:高性能RISC-V核X100的架构设计与虚拟化实现|公开课预告一段乱码,竟让ChatGPT越狱!乱序prompt让LLM火速生成勒索软件,Jim Fan惊了儿子画的小狗聊聊 消息推送 架构设计
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。