
为什么 AI 系统需要设计模式?
GoF 包含的 23 种面向对象模式塑造了一代开发者设计软件的方式。在 2010 年代,云计算引入了发布-订阅(pub-sub)、微服务、事件驱动工作流和无服务器模型等模式,现在大多数基于云的分布式系统都是以它们为基础的。
同样,在当前 AI 热潮出现之前,机器学习社区已经发展出了“机器学习设计模式”。在构建和部署机器学习模型时,你会面临特定的挑战,像检查点、特征存储和版本控制这样的模式已经成为标准实践。
为什么应该关心这些模式?它们帮助你以标准化的方式解决已知的问题。你不用重新发明解决方案,而只要使用共享词汇。当你说“单例”、“发布-订阅”或“特征存储”时,你的团队立即就能理解你的方法。这加快了开发速度,减少了错误,并使你的系统更容易维护。
现代 AI 系统带来了新的挑战。无论是经典软件,还是传统的机器学习模式,都无法完全解决这些挑战。
例如,如何引导模型输出并防止误导性内容?如何构建用户体验,帮助用户理解、信任并有效使用 AI 应用?如何在多代理系统中管理代理交互?如何降低计算成本以使你的产品更可持续?

图 1:一个架构良好的现代 AI 系统
为了帮助开发如图 1 所示的良好的 AI 系统,行业中已经出现了许多 AI 模式。在这篇文章中,我不会发明新的设计模式。相反,我将向你展示如何将现有模式组合在一起。我将一些关键的新兴模式分成 5 个类别,当你扩展你的 AI 系统时,它们可以相互促进。
提示和上下文模式:用于设计有效的指令并提供相关上下文,以引导模型输出
负责任的 AI 模式:用于确保输出符合道德、公平和可信
用户体验模式:用于构建直观的交互
AI-Ops 模式:用于管理大规模 AI
优化模式:用于最大化效率和降低成本
特别地,本文涵盖了使用现有模型构建面向用户的 AI 应用的最佳实践,其中模型访问主要是通过 API 调用。虽然我在文中讨论的主要是基于文本的交互,但你也可以将这些模式应用于多模态应用。不过,我是故意没有涉及模型训练、定制、托管或模型优化,因为这些通常不包含在通过 API 使用 AI 模型的开发者的工作流里。我也没有涉及代理 AI 系统或多代理交互模式,因为这些主题需要专门讨论。
提示和上下文模式
在传统软件中,系统行为是由编码明确定义的。与传统软件不同,在现代 AI 系统中,行为严重依赖于你向大型语言模型(LLM)或大型多模态模型(LMM)提供的指令和上下文。为了创建有效的 AI 输出,你必须提供有效的引导,无论是通过设计精确的提示和/或直接在提示中提供相关上下文(或外部知识)。
乍一看,提示可能微不足道。毕竟,你只是向模型发送自由形式的文本,那会出什么问题呢?然而,提示的措辞以及你提供的上下文可以极大地改变模型的行为,而且没有编译器来捕获错误或标准库技术。创建可靠且总能产生预期行为的提示变得非常困难,特别是当任务变得更加复杂时。
如果你能有效地使用提示和上下文模式,你就可以提高模型的推理、准确性、一致性和指令遵从性。同样重要的是,你可以创建可重用的提示,将它们跨模型、任务和领域泛化。
让我们看下以下四种具体的提示模式。这些模式将帮助你标准化和完善你的方法:

表 1:提示问题以及何时应用每种模式
少样本提示模式
少样本提示(Few-Shot Prompting )是最简单但最强大的提示方法之一。没有样本,模型可能会产生不一致的输出,难以处理任务模糊性,或无法满足你的具体要求。为了解决这个问题,你可以先在提示中向模型提供少量样本(输入-输出对),然后再提供实际的输入。基本上,你是在运行时提供训练数据。这样就可以实现模型泛化,而且无需重新训练或微调。
让我们看一个非常简单的例子(通过 OpenAI API 使用“GPT-4o-mini”;你可以使用 OLLAMA 或 Hugging Face Transformers 在本地运行类似的提示):
现如今比较先进的模型是否需要少量的样本才能正确地完成任务?不需要——它们在零样本学习方面的表现已经比较出色,不需要用喂饭式的样本来理解基本指令。
不过,你可以将少样本提示视为一个个性化工具,引导模型满足你的特定需求。你可以:
引导模型向你期望的输出格式、语气或复杂度靠拢。
在不进行微调的情况下,使模型适应你的新场景或专业任务。
通过锚定模型的输出来减少幻觉。
角色提示模式
在角色提示中,你指示模型扮演一个特定的角色或身份,这有助于为它的响应提供上下文。例如:“你是一位生物学教授。请详细回答这个问题”。
缺少引导的话,模型的风格或假设可能会不符合你的需求。角色提示可以引导模型输出风格(例如,“充当 JSON 格式化器”)、语气(例如,“假设你是作为一个愤怒的海盗来回应这个问题”)和/或内容边界(例如,“你是一位法律助理”)。你可以通过系统消息(在聊天模型中)或简单地在提示中包含一个角色声明来实现角色提示。就是这么简单——只需告诉模型它应该是谁,如下所示:
流行的 AI 助手普遍使用角色提示:
OpenAI的开发者角色(以前称为系统提示)允许你指定模型应该如何表现和响应。这个角色提示示例来自 OpenAI 提示工程指南:“你是一个乐于助人的助手,请以美国东南部南方美女的风格来回答编程问题”。
同样,Anthropic的开发指南明确建议,“使用系统提示来定义 Claude 的角色和个性。这可以为响应的一致性奠定坚实的基础”。
思维链(CoT)模式
如果你是一位软件开发人员,试图解决一个复杂的算法问题,或者是一位软件架构师,试图分析复杂的系统瓶颈和漏洞,你可能会与同事一起进行头脑风暴,探讨各种想法,了解它们的优缺点,将问题分解成更小的任务,然后逐步解决,而不是立即跳到解决方案。在思维链(CoT)提示中,你鼓励模型遵循一个非常相似的过程,将问题分解成一步一步的过程来完成思考。特别是在提示复杂任务时,CoT 可以防止模型过早地跳到预先学会的、往往不正确的模式上。
如果你使用的是如今最先进的或高级推理模型(例如Claude-3.7、OpenAI o1),在没有明确提示的情况下,你可能也会观察到逐步推理的过程。然而,明确指示这些模型“逐步思考”仍然是一个强大的方法,特别是当你使用较旧或较小的模型时。在他们的提示工程指南中,OpenAI和Anthropic推荐使用 CoT。
通过推动模型产生中间推理步骤,你可以:
提高模型的逻辑推理和决策能力。
使模型的输出更易于解释,并增加对其预测结果的信心。
诊断模型输出中的错误或偏见。
显著减少幻觉。
让我们看看下面的例子:
检索增强生成(RAG)模式
从初创公司到科技巨头,RAG已经成为整个 AI 行业的标准最佳实践。先进的模型从大量现实世界的数据中学习。问它们历史、科学或流行的事件,它们通常都能正确地回答。然而,这些模型也有局限性。它们的训练截止于特定的日期,它们的知识点是通用的而非专业的,它们无法获取最新的、专有的或动态变化的信息。
这正是 RAG 发挥作用的地方。RAG 结合了模型的推理能力与外部知识(如数据库、向量存储或文档)实时访问。因此,你可以得到两全其美的结果。
假如你要为自己的律师事务所构建一个聊天机器人。有了 RAG,当客户询问特定的法律问题时,你的聊天机器人就可以即时检索内部知识库中相关的法规和最近的案例摘要,创建一个准确、有良好证据支撑的响应。

图 2:检索增强生成
在构建 AI 系统时,在以下情况下,你应该考虑使用 RAG:
模型需要超出模型训练截止日期的最新信息。
系统依赖于特定领域中专有的或经常更新的数据。
准确性和透明度至关重要,必须减少幻觉或错误的输出。
希望在响应中引用或直接参考外部内容或知识库。
负责任的 AI 模式
迄今为止,我们讨论的提示和上下文模式可以通过提供更好的指令和有根据的上下文来减少歧义、不一致和幻觉。然而,你很快就会注意到,还需要额外的安全措施来处理道德、公平和安全问题。即使是准确的响应,也可能是有偏见的、有害的或不适当的。这就是负责任的 AI 模式发挥作用的地方。
作为构建负责任的 AI 系统的一部分,你必须减少幻觉,防止不适当或不允许的内容,减轻偏见,并确保 AI 决策的透明度。否则,你的 AI 输出可能会误导用户,传播错误信息,甚至造成责任问题。
像之前讨论的 RAG 这样的技术已经通过在外部上下文中定位输出来帮助减少幻觉。让我们看一些其它的模式,这些模式专注于安全、公平和道德合规,而不仅仅是准确性。

图 3:序列图说明现代基于 AI 的系统中负责任的模式(点击查看大图)
输出防护栏模式
即使你什么都做对了,模型仍然可能产生错误、有偏见或有害的内容。你需要防护栏!它们是在模型生成输出后应用的规则、检查或干预措施。它们是作为你最后的防线,在内容到达用户之前修改或阻止内容。防护栏对于法律或医疗等敏感领域尤为重要。
根据领域和应用场景,你可以通过以下几种方式实施防护栏。例如,你可以:
使用既定的业务规则或领域指南验证输出的道德合规性、公平性和准确性。
通过轻量级分类器或公平性指标检测偏见。
使用 ML 模型检测和过滤有害的多模态 AI 内容。
使用像groundedness分数这样的指标来衡量响应在大多程度上依据输入或检索到的参考资料。
指示模型重新生成内容,并发出明确的警告以避免之前的错误。
许多模型提供商还将公平性和道德检查整合到他们自己的防护栏流程中。例如,Anthropic 的 Claude 模型就遵循一种宪法方法,根据预定义的道德原则修订输出。不过,拥有你自己的防护栏层将有助于你为用户提供一致的体验,无论使用哪个模型或提供商。
模型批评者模式
除了基本的防护栏之外,你可以使用专门的事实检查或“批评者”模型来验证主模型的输出。第二个模型可以是不同的模型,也可以是同一个模型,它扮演“批评者”或“裁判”的角色。它就像一位作者或编辑,审查并纠正草稿。即使第一次尝试包含幻觉,这个验证循环也能使模型检查其事实,减少最终输出中的虚假信息和偏见。
添加一个二级裁判或批评者有时会增加系统的复杂性、延迟或成本。然而,你绝对应该考虑将这种方法用于自动化 QA 测试。考虑这样一个场景,为了提高效率,你的生产系统需要使用一个更小的“迷你版”或“纳米版”LLM。在离线测试中,你可以使用更大的模型作为裁判,以验证准确性并确保生成负责任的输出。例如,Github Copilot就使用另一个 LLM 来评估其主模型。
用户体验(UX)模式
在使用适当的提示和防护栏稳定输出之后,下一个需要关注的重大问题是用户体验(UX)。AI 系统的行为不同于传统的软件系统,经常产生不可预测的开放式内容,有时可能是错误的,有时很慢或令人困惑。同样,用户对这些工具的期望也不同。例如,他们可能希望提出后续问题,完善 AI 的响应,或在 AI 不确定时能够看到免责声明。
这就是为什么明确定义的用户体验(UX)模式至关重要。它们帮助你和开发者以用户友好的方式处理这些新型互动,保持用户的参与度和满意度,并促进透明度。有许多技术可以用来简化这些复杂性,例如:
提供清晰的入门示例
明确发出不确定性信号
允许快速编辑生成的内容
支持迭代探索
向用户提供建议,帮助他们完成后续的提问
显式确认关键用户意图
让我们对照图片详细地看一些 UX 模式。
上下文引导模式
这似乎显而易见,但许多新推出的 AI 工具并没有提供适当的用户指导。通常,用户不知道如何与这些工具互动,或者了解它们的能力和限制。不要假设用户会立即知道如何使用你提供的工具。通过提供提示示例、上下文提示和快速功能概览来降低他们的学习曲线。在用户需要的时候,及时展示这些辅助工具。例如,在Notion中,在空白页面上按下空格键会触发写作建议(因为用户可能想要起草内容),而选择文本则会显示“改进写作”或“更改语调”等编辑选项,而且是与原始文本一起显示的,这样更便于比较。

图 4:上下文引导模式示例
可编辑输出模式
使用 GenAI 模型,在许多场景中都没有唯一的正确答案。最佳输出取决于上下文、应用程序和用户偏好。认识到这一点,你就应该考虑让用户修改或重写生成的内容。这可以提升人与 AI 协作的体验。你提供的工具将不再是一个黑盒子,要让用户控制它们的最终输出。有时,这是一个显而易见的功能(如GitHub Copilot允许用户直接在他们的 IDE 中编辑建议的代码)。在其他情况下,这是一个深思熟虑的设计选择(例如ChatGPT canvas)。

图 5:可编辑输出模式示例
迭代探索模式
永远不要假设第一次输出就能满足用户的需求。要提供“重新生成”或“再试一次”按钮,以便用户可以快速迭代。对于图像生成,同时显示多个选项。在聊天机器人中,允许用户细化或跟进响应。这种反馈循环可以帮助用户找出最佳输出,而又不会感到困难。微软的研究表明,当用户尝试了许多提示时,新输入的有时会表现得比早输入的更差——因此让用户能够回退到以前的输出(或组合来自不同生成的部分内容)可以显著提高他们的体验。

图 6:允许迭代探索的 AI 视频编辑工具示例(点击查看大图)
AI-Ops 模式
当开始将 AI 软件投入生产应用时,你将面临传统软件没有的全新运营挑战。你仍然需要版本控制、监控和回滚,但现在你的核心“逻辑”存在于提示、模型配置和生成式管道中。此外,GenAI 的输出可能是不可预测的,需要新的测试和评估方法。
将 AI-Ops 视为专门针对现代 AI 系统的 DevOps。你不仅仅是部署代码;你是在传递嵌入在提示-模型-配置组合中的 AI“知识”,这些组合可能每周都会变化。你必须管理性能和成本,跟踪用户互动,识别回归,并保证系统的可靠性和可用性。
你可以采用许多为人熟知的传统软件运营策略,以及以前从未有过需求的一整套特定于 AI 的方法。让我们详细看几个特定于 AI 的模式(尽管这只是整个工作流程的一小部分),以便了解 AI-Ops 的细微差别。
指标驱动的 AI-Ops 模式
在将更改投入生产时,务必要做好跟踪:延迟、令牌使用、用户接受率和单次调用成本。定义对你的业务而言最重要的成功指标。那可能是用户反馈的每日接受分数,或者是通过LLM-judge管道测量的“幻觉率”。设置指标下降预警。这种数据驱动的方法让你能够快速检测到新模型或提示版本有损质量的情况。然后,你可以回滚或运行 A/B 测试进行确认。将指标视为你在不可预测环境中的安全网。
提示-模型-配置版本控制模式
如果你的 AI 系统存在不受控制的提示更改、配置调整或临时模型交换,那么它可能就会失败。如果你将每个(提示、模型、配置)组合视为一个“发布”,那么你就可以像管理其他任何软件构建一样管理它。为确保不出现回归,你必须用版本标签、QA 测试和黄金数据集对其进行标记。当你更新提示、修改配置设置或从一个模型切换到另一个模型时,自动化管道可以运行这些测试查询。如果根据你的指标,输出质量有所下降,你就会回退。这种行为准则可以防止破坏 UX 的“隐形更改”。
除了 AI 特有的实践外,你还应该继续遵循传统软件开发的标准运营最佳实践,例如:
严格的质量保证检查:在部署更改之前确保进行彻底的测试。
回归测试:定期运行测试以验证新更改没有引入问题。
金丝雀部署:在广泛发布之前,逐步向比较小的用户群体开放新功能。
回滚策略:建立清晰简单的流程,以便在指标下降时快速撤销更改。
备份和备用系统:在主模型不可用时,可提供备份模型或版本。
以下是一个典型的 AI-Ops 工作流示例:

图 7:AI-Ops 工作流程图,用于管理、测试和部署 AI 系统更改(点击查看大图)
优化模式
随着 AI 应用的增长,你将面临运营瓶颈。API 速率限制、延迟增加和推理成本迅速上升可能很快就会成为一项重大的挑战。你那给领导留下深刻印象的原型在生产中突然变得不可持续。
这些问题很常见,但如果你始终遵循一些最佳实践,它们就是可控的。例如,不要自动选择最大、最强大的模型。问问自己,你的任务是否可以更快,成本是否可以更低,或者输出是否可以重用。同样,你必须做出明智的系统优化选择,无论是将流量从不必要的强大模型重定向,缓存可预测的响应,实时批处理查询,还是开发更小的专用模型。
接下来,我们将深入探讨三种你可以在 AI 工作流程中直接实施的强大优化模式。
提示缓存模式
最快、最便宜的 LLM 调用就是不调用。如果你的系统经常使用相同或类似的提示,则可以考虑缓存和重用响应。对于文档助手、客户支持机器人或内部聊天工具,这特别有效,因为用户的问题经常会重复。
更有效的方法是缓存前缀,你可以缓存提示中成本比较高的部分,如系统指令或少量样本。Amazon Bedrock(和许多其他)服务原生支持此功能,而且根据报告,对于大型提示,这减少了高达 85%的延迟。
持续动态批处理模式
如果你管理着一个高容量的 AI 系统,那么对于最小化成本和有效扩展而言,最大化 GPU 利用率和系统吞吐量至关重要。如果你顺序地处理每个查询,就会降低计算资源的使用效率,增加成本,并且可能更快地达到 API 限制。
与其在每个请求到达时立即处理,不如考虑等待片刻,可能是几十到几百毫秒,这取决于应用程序的延迟容忍度,再动态地对传入请求进行批处理。然后,你可以通过推理服务器和 LLM 处理这些批次。这种方法可以帮助你增加系统的吞吐量,并确保 GPU 以接近最佳的利用率运行。
虽然你可以在定制系统中实现自定义排队和批处理逻辑,但生产就绪的工具,如vLLM、NVIDIA Triton推理服务器和AWS Bedrock,为大多数用例提供了强大的、现成的解决方案。
智能模型路由模式
实施智能模型路由,而不是不加选择地将每个请求都发送到最大、最昂贵的模型。这个想法很简单,但也很强大。在入口点引入一个轻量级的初始模型,类似于传统微服务中的反向代理或 API 网关。像反向代理一样,这个模型可以帮助实现模型之间的负载均衡,缓存频繁使用的响应,并优雅地处理回退。它还充当 API 网关,根据每个请求的复杂性或上下文,智能地将查询路由到适当的下游模型。
对于常见或重复的查询,路由模型可以直接从缓存或预读中提取,完全避免模型推理。对于需要适度推理或特定领域知识的查询,则路由到专门的、成本效益高的模型。你应该只将最复杂的查询或模糊查询路由到最大的通用模型。
智能模型路由模式特别适用于可以处理多样化查询的通用系统。这种模式可以平衡成本效益和模型准确性,确保每个查询都可以精确地使用它所需的计算资源。
高级模式
本文探讨了可以帮助你将最佳实践纳入 AI 软件开发不同阶段的基础模式。有一些高级领域我们故意没有涉及。不过,有三个关键的主题我想简要地介绍下,其中包含许多新兴的模式和最佳实践,它们在现代 AI 系统中已经变得至关重要。
微调和自定义模型:有时,现成的模型不足以满足你的特定用例,太贵,或者需要你在本地网络或设备上运行。在这些情况下,微调、定制和优化大型基础模型就派上用场了。常见的方法包括领域特定微调、知识蒸馏、低秩适配(LoRA)、专家混合(MoE)和量化。像 Hugging Face、VertexAI 和 AWS Bedrock 这样的平台使你能够轻松地自定义和微调模型。
多代理协同:当任务变得过于复杂,无法由单一模型完成时,可以考虑使用多个专门的 AI 代理协同工作。你会遇到的一些常见的模式,包括以LLM为裁判、基于角色的多代理协作、反思循环和工具使用代理。
代理 AI 和自主系统:可以说,当今最热门的领域之一是构建自主 AI 代理。代理系统涉及能够独立动态规划、推理和执行复杂任务的模型,通常使用外部工具和 API。代理 AI 是一个引人入胜且迅速发展的领域,有自己新兴的最佳实践。这个话题值得进行专门的探索,但已经超出了我们这里的讨论范围。
这些高级概念超出了我们这里的讨论范围。认识到它们的重要性是跟上现代 AI 系统发展潮流的关键。关注不断增长的创新型 AI 模式集,不断地将它们添加到你的武器库中,这样你就可以解锁更强大、更专业的应用!
声明:本文为 InfoQ 翻译,未经许可禁止转载。
原文链接:https://www.infoq.com/articles/practical-design-patterns-modern-ai-systems/
评论