cover_image

大模型驱动的应用设计范式

严选技术 严选技术产品团队
2023年07月17日 02:22

图片



图片



通过阅读了多篇围绕大模型应用、提示词工程等等的文章,结合之前的工程经验,对于如何围绕大模型来进行应用设计有了些新的理解,整理成这篇文章。



1. 引言
这篇文章的灵感来自于a16z的《Emerging Architectures for LLM Applications》。a16z是一家知名投资机构,他们采访了行业内很多家围绕大模型创业的公司,对它们当前采用的系统架构进行了总结,最后提炼出了上面这篇文章。
除了上面这篇文章以外,最近还阅读了很多篇围绕大模型应用、提示词工程等等的文章,结合之前的工程经验,对于如何围绕大模型来进行应用设计有了些新的理解,想要借这篇文章来进行整理。
2. 提示词工程
在ChatGPT出现之后,我们发现只要通过提示词,就可以让大模型为我们做那么多的事情。
于是,就有一派人开始宣扬 “未来50%的工作将是提示词工程师” ... “未来世界将不再需要程序员” 之类的言论。
我们刚刚准备开始点头认可,就又有另一派人开始嚷嚷,“人工智能的发展一定也会同时消灭提示词工程师” ... 好像说的也对。
在我们决定站队之前,让我们先来定义一下,到底什么是提示词工程,什么是提示词工程师?

看到这里,你一定会觉得所谓“提示词工程师”,不就是写提示词的工程师嘛,可以跟ChatGPT对话,让人工智能解决我的需求,我就是提示词工程师了。 


没那么简单。

提示词工程实际上包含两个词语,即提示词工程
2.1 提示词

提示词简单了说,就是通过给大模型输入自然语言命令来让大模型做事(可以认为这是一种写代码的方式),我们可以通过DeepLearning提示词课程[1]来让我们写更好的提示词。

但当需要进行生产环境的部署并给用户稳定的结果输出时,我们就需要对大模型的推理能力有清楚的理解,就需要考虑让大模型能够按照诸如思维链、思维树等方式思考,防止大模型产生幻觉,防止大模型被注入攻击等等问题。进一步,如何对提示词进行测试,确认提示词能够达到生产环境可用,而不仅仅是偶尔能够产出正确答案 ……

这些内容在这个网站[2]进行了广泛讨论,同时可以参考这个网站的论文部分[3],该领域在学界也正处于研究井喷的时间。

2.2 工程

而工程的概念就更加复杂了,未来一定会有很多的大模型服务提供商,提供了不同种类的大模型,也必然会出现层出不穷的开源模型。选择什么模型来给用户提供服务,是否要考虑多种模型同时提供服务以节约成本。

如何对提示词的好坏进行评估;如何搭建提示词的测试流程,上线流程;如何检测用户输入部分的提示词是否安全;如何对提示词的结果进行缓存;如何对整个围绕大模型的使用情况进行日志监控等(这里可以看看这家创业公司[4]这家创业公司[5])……

2.3 提示词工程
而所谓提示词工程师,至少指的是理解了上面所说的和提示词相关的所有方方面面,进而能够通过提示词来完成用户需求的人(当然更进一步,可能还需要对工程的部分有所了解)。

实际上,我认为未来每个公司都会围绕着大模型的应用,提供一系列开发平台,诸如现在已经有的围绕着软件开发的平台一样。大家可以看看这家公司[6],也是朝着这个方向的一种探索。

3. AI工程师
基于上面的讨论,我们可以提出AI工程师的概念(参考这篇文章[7])。
作者的主要观点是:
  • 当我们现在说到AI工程师的时候,很多时候指的是ML工程师,但长期来看,机器学习会进一步基础设施化。因此会出现一个单独的工种,即AI工程师,就像SRE这个工种一样。
  • 魔鬼隐藏在细节之中,要开发基于大模型的应用,需要解决上面提出的种种提示词相关问题,工程相关问题,而这会催生产生一个新的工种,即AI工程师。
  • AI工程师会采用围绕大模型的种种能力栈来开发未来的应用,作者定义这是软件开发的3.0时代,即基于有推理能力的大模型,来对 [之前不能编码的] 更大的物理世界进行编码。
4. 领域驱动的视角

我有一个视角来看待未来由大模型驱动的应用(或者说是应用的一部分由大模型驱动),即从领域驱动设计(DDD)的角度。

现阶段我们会以DDD的思路进行领域建模,将业务拆分为核心域、支撑域、通用域等等。原则上,我们会用最主要的精力来实现核心域,而对于支撑域和通用域,则倾向于用成熟的组件来实现。

当前做好核心域最重要的事情是对业务进行分析和抽象,进而让各方用统一语言来对核心域的实体、聚合、领域事件等等达成一致,最后通过代码来实现。

但在实践中我们发现,想要做好业务抽象,并非一件容易的事情:有时候很难对复杂的业务进行抽象,有时候很难对快速变化的业务进行及时抽象,更有些时候根本无法对抽象好的业务进行代码实现。

举例来说,一个简单的问题,判断用户的一条留言到底是表扬还是批评,是有意义的还是无意义的,是应该优先展示还是应该屏蔽的,我们能够通过用户的留言提炼出什么有用信息等等问题……对于传统的软件开发来说就不是一件容易的事情,但对于大模型却是一个简单问题。

还有更多的例子可以证明,我们想要对生活中、工作中、物理世界中一些问题进行建模,让计算机协助我们来解决问题,传统的方法很困难甚至不可能,但是大模型却轻而易举,而且会越来越好。

因此从领域设计的角度来说,未来在实现核心域的过程中,一定会采用多种方式:

  • 纯粹使用编程语言来实现;

  • 纯粹使用提示词工程的方式来实现;

  • 结合编程语言和提示词工程的方式来实现;

显然,第三种将会是趋势。

而在DDD概念中的领域,映射到大模型应用的开发中,其实正是Agent的概念。

5. 大模型驱动的Agent框架
LangChain对于Agent的定义如下:

An agent has access to a suite of tools, and determines which ones to use depending on the user input.   


Agents can use multiple tools, and use the output of one tool as the input to the next. 


注意:映射为DDD中的概念,Agent就是一个核心域,而这些tools其实都是支撑域,Agent根据核心域的逻辑来determine该如何使用各种tools完成任务。

在文章《LLM Powered Autonomous Agents》[8]中,作者提出了 "LLM Powered Autonomous Agents" 的概念,如下图所示:

图片

围绕着大模型提供的最核心的Reasoning的能力,我们可以:
  • 围绕领域模型,通过In-Context Learning或者Fine-Tuning的方式让Agent具有领域的专业能力;
  • 在接收到任务/请求之后,通过Prompt Engineering,让Agent对问题进行Planning,即进行问题拆解;
  • 根据问题拆解的步骤,在需要的时候调用各种tools,来驱动解决问题;
  • 在过程中,一定还会用到短期或者长期记忆;
更进一步,在Emerging Architectures for LLM Applications》[9]中,作者直接提出了一个基于大模型的应用架构栈,更全面地介绍了搭建一个大模型应用的方方面面:

图片

这里说明几点:
  • 从产品的角度来说,很多应用最终是需要提供一个类似PlayGround的功能的,好让用户可以对自己的提示词进行简单的测试;
  • 长期来看,大模型应用的成本会一直是一个问题(这里的成本包括API成本、调用耗时等等),解决办法就是通过层层的缓存、本地小模型等方式来解决;
  • 应用需要解决围绕着大模型的日志、监控等等问题(这一点在产品上可以参考这家公司[6]的做法);
6. 再谈谈提示词
上面已经说过,我们有两种方式(In-Context Learning/Fine-Tuning)来基于大模型训练一个小模型。两种方式对比,接下来的很长时间,我们都还是会采用In-Context Learning的方式来实现大模型应用(Fine-Tuning的方式成本更高、需要的数据更大、难度更大)。
而如何做好In-Context Learning,本质上就是如何做好提示词工程了。而这里可能涉及到超级多的问题,例如:
  • 如何写好提示词,让大模型可以采用链式思考、树状思考甚至未来可能出现的“跳跃思考”方式解决问题,如何让大模型一步一步思考,如何剪枝,如何总结,如何进行思考迭代等等问题。
  • 如何根据不同的问题,让大模型采用不同的思考方式,亦或者大模型某一天就可以进化成自己选择最合适的思考方式。
  • 如果提示词更新了,要如何验证更新之后的提示词有更好的效果?
  • 提示词中需要准备示例,如何知道这些示例是完备的,恰当的?
  • ……
这里有好多好多问题,但在现阶段的实践中,我们其实只关注 “我已经用提示词在召唤大模型的能力了” 而完全没有关注 “我正在用正确的方式在召唤大模型的能力”,更别提把这套能力很好的工程化了。
当然,这确实还是一个在快速演进的领域(最近有很多论文发表出来),未来一定会出现很多这方面的最佳实践。
7. 写在最后
我们可以有一个视角:认为大模型是一个编译器、是一台虚拟机,而提示词是一种代码。
围绕大模型的推理能力,我们可以通过提示词工程的方式做更多的事情,我们可以开发由大模型驱动的应用。但这样的应用需要一整套工程化的方法、工具与之配套。
这篇文章旨在列出一些我们在开发大模型应用时可能需要考虑的方方面面的内容,希望大家之后再想到大模型应用的时候,不简简单单认为就是利用提示词,调调大模型。
Happy Hacking !
8. 参考文献
  • [1]提示词课程:https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/
  • [2]网站:https://www.promptingguide.ai/zh
  • [3]论文部分:https://www.promptingguide.ai/papers
  • [4]https://www.helicone.ai/

  • [5]https://promptlayer.com/

  • [6]https://dify.ai/

  • [7]The Rise of the AI Engineer:https://www.latent.space/p/ai-engineer
  • [8]LLM Powered Autonomous Agents:https://lilianweng.github.io/posts/2023-06-23-agent/
  • [9]Emerging Architectures for LLM Applications:https://a16z.com/2023/06/20/emerging-architectures-for-llm-applications/
  • ReAct (Reason+Act) prompting in OpenAI GPT and LangChain:https://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain/
  • All You Need to Know to Build Your First LLM App:https://towardsdatascience.com/all-you-need-to-know-to-build-your-first-llm-app-eb982c78ffac
  • Building LLM applications for production:https://huyenchip.com/2023/04/11/llm-engineering.html
  • AI Canon:https://a16z.com/2023/05/25/ai-canon/
  • OpenAI CookBook:https://github.com/openai/openai-cookbook/tree/main
  • AI Glossary by a16z:https://a16z.com/ai-glossary/
  • Prompt Engineering Guide:https://www.promptingguide.ai/
  • Understand ReAct and How It Works in Three Minutes:https://generativeai.pub/understand-react-and-how-it-works-in-three-minutes-f5f57a404a82


本文由作者授权严选技术团队发布


图片


图片

继续滑动看下一个
严选技术产品团队
向上滑动看下一个