解密企业级 AI 平台架构:从零到一构建实战指南

文摘   2024-07-27 10:43   美国  

TLDR

构建生成式 AI 应用,平台是关键!本文将带你深入了解构建生成式 AI 平台的通用架构,从简单到复杂,逐步添加组件,涵盖上下文增强、安全护栏、模型路由、缓存优化、复杂逻辑和写入操作等核心要素,助你打造高效、安全、可扩展的 AI 应用。同时,我们还将探讨语义缓存的局限性,以及如何谨慎使用 AI 编排工具,助你避坑。

引言

近年来,生成式 AI 技术的飞速发展催生了众多令人惊叹的应用,从智能聊天机器人到代码自动生成,再到创意内容创作,生成式 AI 正在深刻地改变着我们的生活和工作方式。然而,对于想要利用这项技术构建强大应用程序的企业和开发者来说,构建一个高效、可靠的平台是至关重要的。

本文将以实战为导向,深入浅出地讲解如何构建生成式 AI 平台,涵盖从架构设计到组件实现的各个方面,并结合实际案例和代码示例,帮助你快速掌握构建生成式 AI 平台的核心技术。

一、生成式 AI 平台架构概述

构建生成式 AI 平台的第一步是理解其架构。一个典型的生成式 AI 平台包含多个相互协作的组件,这些组件共同构成了一个完整的系统,用于处理用户查询、生成响应并执行各种任务。

如上图所示,一个完整的生成式 AI 平台架构包括以下核心组件:

  • • 用户界面(UI): 允许用户与平台交互,提交查询并接收响应。

  • • 应用程序逻辑: 处理用户请求、调用模型 API 并管理整个应用程序流程。

  • • 模型路由器: 根据查询类型将请求路由到最合适的模型。

  • • 模型网关: 提供对模型 API 的统一访问入口,负责身份验证、授权、限流和监控等功能。

  • • 模型 API: 提供模型推理服务,接收输入并生成响应。

  • • 上下文增强: 为模型提供额外的上下文信息,例如相关文档、数据库记录或知识图谱。

  • • 安全护栏: 防止模型被滥用或生成有害内容,例如敏感信息泄露、仇恨言论等。

  • • 缓存: 存储模型响应、嵌入向量或检索结果,以减少重复计算,提高性能并降低成本。

  • • 复杂逻辑: 实现更复杂的应用程序逻辑,例如循环、条件判断和外部系统交互。

  • • 写入操作: 允许模型执行对外部系统的修改操作,例如发送电子邮件、更新数据库等。

  • • 可观察性: 提供对系统运行状态的监控和分析,例如日志记录、指标收集和跟踪。

二、从简单架构开始

为了更好地理解生成式 AI 平台的构建过程,我们将从一个简单的架构开始,逐步添加组件,最终构建出一个功能完备的平台。

最简单的生成式 AI 平台架构只包含三个核心组件:用户界面、应用程序逻辑和模型 API。用户界面接收用户查询并将其传递给应用程序逻辑,应用程序逻辑调用模型 API 生成响应,并将响应返回给用户界面。

例如,一个简单的聊天机器人可以采用这种架构。用户在聊天界面中输入问题,应用程序逻辑将问题发送到模型 API,模型 API 生成答案并返回给聊天界面,聊天界面将答案显示给用户。

三、增强上下文:为模型提供更多信息

仅仅依靠模型自身的知识储备,往往不足以生成令人满意的响应,尤其是在处理特定领域或需要访问外部信息的情况下。为了提升模型的表现,我们需要为其提供更丰富的上下文信息,就像为一位作家提供充足的素材,才能创作出精彩的作品。

3.1 RAG:检索增强生成

RAG (Retrieval-Augmented Generation,检索增强生成) 是一种强大的上下文增强技术,它允许模型从外部数据源中检索相关信息,并将其整合到生成过程中。

RAG 的工作原理如下:

  1. 1. 接收用户查询: 用户提交查询后,RAG 系统首先对其进行分析,提取关键词或生成表示其语义的向量。

  2. 2. 检索相关信息: 使用关键词或向量搜索外部数据源,例如数据库、知识库或互联网,找到与查询相关的文档或信息片段。

  3. 3. 整合上下文信息: 将检索到的信息与用户查询一起输入到模型中,模型利用这些额外的上下文信息生成更准确、更全面的响应。

RAG 中常用的检索方法包括:

  • • 基于关键词的检索: 例如,根据用户查询中的关键词,检索包含这些关键词的文档。这种方法简单直接,但可能无法捕捉到查询和文档之间更深层的语义关联。

  • • 基于嵌入的检索: 将文档和查询转换为向量表示,然后通过计算向量之间的相似度来检索相关文档。这种方法能够捕捉到更深层的语义关联,但计算量较大。

3.2 处理表格数据

除了非结构化文本数据,表格数据也是企业中常见的宝贵信息来源。为了让模型能够理解和利用表格数据,我们需要引入一些专门的处理机制。

一种常见的方法是使用文本到 SQL 的技术,将用户的自然语言查询转换为 SQL 查询语句,然后从数据库中检索相关数据。这种方法可以让模型直接访问和利用结构化的表格数据,而无需进行复杂的转换。

例如,用户询问 "上个月哪个销售员的业绩最好?",系统可以使用文本到 SQL 技术将其转换为 "SELECT 销售员 FROM 订单 WHERE 订单日期 BETWEEN '2024-07-01' AND '2024-07-31' GROUP BY 销售员 ORDER BY SUM(订单金额) DESC LIMIT 1",然后执行该 SQL 查询,并将结果返回给模型。

3.3 代理 RAG

互联网是信息的海洋,为了让模型能够充分利用这些信息,我们可以引入代理 RAG (Agentic RAG) 的概念。代理 RAG 允许模型与外部工具 (例如搜索引擎) 进行交互,从而获取更广泛的信息。

例如,当用户询问 "今天的天气怎么样?" 时,模型可以调用天气 API 获取实时天气信息,并将其整合到回复中。

代理 RAG 还可以与其他外部工具交互,例如计算器、日历、地图等,从而扩展模型的功能,使其能够处理更复杂的任务。

3.4 查询重写

用户的查询有时会比较简略或模糊,为了确保检索到最相关的信息,我们需要对查询进行重写,使其更清晰、更具体。

例如,当用户询问 "Emily Doe 的情况呢?" 时,如果模型能够根据上下文将其重写为 "Emily Doe 什么时候最后一次从我们这里购买东西?",就能更准确地理解用户的意图。

查询重写可以使用规则、机器学习模型或两者结合的方式来实现。

四、设置安全护栏:保护用户和系统

生成式 AI 模型就像一个充满创造力的孩子,我们需要为其设置安全护栏,防止其做出不当的行为,例如泄露敏感信息、生成有害内容等。

安全护栏可以分为输入安全护栏和输出安全护栏两种。

4.1 输入安全护栏

输入安全护栏主要用于防止用户输入的恶意或不当信息对模型或系统造成损害。

例如,可以使用敏感信息检测工具,识别用户输入中是否包含敏感信息 (例如身份证号码、银行卡号等),并对其进行屏蔽或删除,防止敏感信息被模型学习或泄露。

此外,还可以设置主题限制,防止模型生成与某些敏感主题相关的内容,例如政治、宗教等。

4.1.1 防止敏感信息泄露

在将用户数据发送给第三方模型 API 时,务必采取措施防止敏感信息泄露。例如,可以使用数据脱敏技术,将用户数据中的敏感信息替换为占位符,然后再将脱敏后的数据发送给模型 API。

例如,可以使用正则表达式将电话号码替换为 "[PHONE_NUMBER]",将电子邮件地址替换为 "[EMAIL_ADDRESS]",等等。

import re

defmask_sensitive_data(text):
"""使用正则表达式屏蔽敏感信息。"""

  text = re.sub(r'\d{3}-\d{3}-\d{4}','[PHONE_NUMBER]', text)
  text = re.sub(r'[\w.-]+@[\w.-]+','[EMAIL_ADDRESS]', text)
return text

# 示例用法
text ="我的电话号码是 123-456-7890,电子邮件地址是 test@example.com。"
masked_text = mask_sensitive_data(text)
print(f"脱敏后的文本: {masked_text}")

输出:

脱敏后的文本: 我的电话号码是 [PHONE_NUMBER],电子邮件地址是 [EMAIL_ADDRESS]。

4.1.2 防止模型越狱

模型越狱是指攻击者通过精心构造输入,诱导模型执行 unintended 的行为。为了防止模型越狱,需要对用户输入进行严格的验证和过滤,例如:

  • • 限制输入长度: 过长的输入可能会导致模型性能下降,甚至导致模型崩溃。

  • • 过滤特殊字符: 一些特殊字符可能会被模型解释为代码,从而导致安全漏洞。

  • • 检测并阻止恶意输入: 使用规则、机器学习模型或人工审核来检测并阻止包含恶意代码、攻击性语言或其他有害内容的输入。

4.2 输出安全护栏

输出安全护栏主要用于检测和过滤模型生成的潜在有害或不当内容,例如:

  • • 空响应: 模型没有生成任何内容。

  • • 格式错误的响应: 模型生成的响应不符合预期的格式。

  • • 包含敏感信息的响应: 模型生成的响应包含不应该被泄露的敏感信息。

  • • 有害或不当的响应: 模型生成的响应包含仇恨言论、歧视性言论、暴力言论等不当内容。

为了实现输出安全护栏,我们可以使用多种方法,例如:

  1. 1. 输出质量评估: 使用规则、机器学习模型或人工审核来评估模型输出的质量,识别潜在问题。例如,可以使用毒性检测工具来识别包含仇恨言论或攻击性语言的输出。

  2. 2. 故障管理: 制定策略来处理不同类型的故障,例如重试、回退到人工或向用户提供预定义的响应。例如,如果模型生成空响应,可以尝试重试几次,或者回退到人工客服。

4.3 安全护栏的权衡

设置安全护栏可能会增加系统的延迟,因此需要在安全性和性能之间进行权衡。一些团队可能认为延迟更重要,因此选择不实施安全护栏。然而,大多数团队认为安全风险的代价远高于延迟增加带来的损失,因此更倾向于实施安全护栏。

五、模型路由器和网关:管理多个模型

随着应用程序的复杂性增加,我们可能需要使用多个模型来处理不同类型的查询,例如一个模型专门处理技术问题,另一个模型专门处理订单问题。

为了有效管理这些模型,我们需要引入模型路由器和网关的概念。

5.1 模型路由器

模型路由器负责根据用户查询的类型,将其路由到最合适的模型进行处理。路由器中通常包含一个意图分类器,用于预测用户的意图,并根据预测结果将查询路由到相应的模型或服务。

例如,对于一个客户服务聊天机器人,如果意图分类器预测用户的意图是重置密码,则可以将该用户路由到关于密码重置的页面;如果预测用户的意图是纠正账单错误,则可以将该用户路由到人工客服;如果预测用户的意图是解决技术问题,则可以将该查询路由到专门用于解决技术问题的模型。

5.2 模型网关

模型网关是所有模型访问的统一入口,它可以提供以下功能:

  • • 访问控制和成本管理: 网关可以控制哪些用户或应用程序可以访问哪些模型,还可以监控和限制 API 调用的使用,以防止滥用和有效管理成本。

  • • 故障转移和容错: 当主 API 不可用时,网关可以将请求路由到备用模型,在短时间后重试,或以其他方式优雅地处理故障。这可以确保应用程序平稳运行,避免中断。

  • • 日志记录和分析: 网关可以记录所有请求和响应,并提供分析工具来帮助开发人员了解模型的使用情况和性能。

六、使用缓存优化性能

缓存是提升系统性能的常用手段之一。在生成式 AI 平台中,我们可以使用缓存来存储模型的响应结果、嵌入向量、检索结果等,从而减少重复计算,降低延迟和成本。

6.1 提示缓存

提示缓存可以存储模型已经处理过的提示信息,例如系统提示、用户查询等。当模型接收到新的查询时,如果该查询的提示信息已经存在于缓存中,则可以直接使用缓存中的结果,而无需重新计算。

对于包含长系统提示的应用程序,提示缓存可以显著降低延迟和成本。例如,如果你的系统提示是 1000 个 token,并且你的应用程序每天生成 100 万个模型 API 调用,那么提示缓存每天可以为你节省大约 10 亿个重复输入 token 的处理时间!

6.2 精确缓存

精确缓存可以存储模型对特定输入的响应结果。当模型接收到相同的输入时,可以直接使用缓存中的结果,而无需重新计算。

精确缓存也用于基于嵌入的检索,以避免冗余的向量搜索。如果传入的查询已经在向量搜索缓存中,则获取缓存的搜索结果;如果没有,则对该查询执行向量搜索并将结果缓存起来。

6.3 语义缓存:效果待考证

与精确缓存不同,语义缓存不要求输入完全一致,只要输入的语义相似,就可以使用缓存中的结果。

例如,当模型已经回答了 "越南的首都是哪里?" 这个问题后,如果用户再次询问 "越南的首都在哪个城市?",语义缓存就可以直接使用之前的答案 "河内",而无需重新计算。

然而,语义缓存的效果尚不明确,因为它依赖于高质量的嵌入、有效的向量搜索和可靠的相似性度量,而这些组件都容易出现故障。

七、添加复杂逻辑和写入操作

为了实现更复杂的业务逻辑,我们需要为生成式 AI 平台添加循环、条件判断等复杂逻辑,并赋予模型执行写入操作的能力。

7.1 复杂逻辑

传统的生成式 AI 应用通常只包含简单的请求-响应流程,但随着应用场景的复杂化,我们需要引入更复杂的逻辑来处理多轮对话、条件分支和外部系统交互等问题。

例如,在一个电商客服聊天机器人中,用户可能会询问商品信息、下单、查询物流等一系列操作,这就需要系统能够根据用户的不同意图和当前对话状态,执行不同的操作逻辑。

7.2 写入操作:赋予 AI 行动能力

写入操作允许模型对外部系统进行修改,例如发送电子邮件、更新数据库、调用 API 等。

例如,在一个会议安排系统中,模型可以根据用户的指令自动查询日历、发送会议邀请、预订会议室等操作。

赋予 AI 写入操作的能力可以极大地扩展其应用范围,但同时也带来了安全风险,因此需要谨慎使用。在实现写入操作时,需要进行充分的安全评估,并采取相应的安全措施,例如身份验证、授权和审计等。

八、可观察性:洞察系统运行状态

可观察性是指通过收集和分析系统数据,来了解系统运行状态的能力。在生成式 AI 平台中,可观察性对于监控系统健康状况、识别潜在问题和优化性能至关重要。

8.1 指标

指标是用于衡量系统性能的关键数据,例如延迟、吞吐量、错误率等。

在生成式 AI 平台中,我们需要跟踪各种指标,包括模型指标和系统指标。系统指标用于告诉我们整个系统的状态,例如吞吐量、内存使用情况、硬件利用率和服务可用性/正常运行时间。模型指标用于评估模型的性能,例如准确性、毒性和幻觉率。

除了这些指标之外,我们还需要跟踪与长度相关的指标(例如查询、上下文和响应长度)、延迟指标以及成本指标。

8.2 日志

日志是记录系统事件的重要信息来源,例如用户查询、模型响应、系统错误等。

为了更好地利用日志信息,我们需要对日志进行结构化处理,并使用标签和 ID 来标记日志的来源。此外,还可以使用 AI 驱动的工具来自动化日志分析和异常检测。

8.3 追踪

追踪是指记录单个请求在系统中的完整执行路径,包括每个步骤的执行时间、输入输出等信息。

通过追踪,我们可以清晰地了解每个查询在系统中的处理过程,从而更容易地识别和解决问题。

九、AI 管道编排:简化复杂应用构建

AI 管道编排工具可以帮助我们定义、管理和执行复杂的 AI 工作流程。这些工具通常提供可视化界面,让我们可以轻松地将不同的组件(例如数据加载、预处理、模型训练、评估等)连接起来,构建完整的 AI 应用。

目前市面上有很多 AI 管道编排工具,例如 LangChain、LlamaIndex、Flowise 等。每个工具都有自己的 API 和特点,因此在选择工具之前,我们需要仔细评估其功能、易用性、性能和可扩展性。

虽然 AI 编排工具可以简化 AI 应用的构建过程,但过早使用 AI 编排工具可能会增加系统的复杂性,并导致难以理解和调试系统。建议在应用程序开发的后期阶段再考虑使用 AI 编排工具,以便更好地控制系统的复杂性和可维护性。

十、语义缓存:效果待考证

语义缓存是一种比较新颖的缓存技术,它可以缓存语义相似的查询结果,即使查询的字面不完全一致。例如,如果用户之前查询过 "北京的天气怎么样?",那么当用户再次查询 "北京今天的气温是多少?" 时,语义缓存就可以直接返回之前缓存的结果,而无需再次调用模型 API。

语义缓存的实现依赖于语义匹配技术,例如 Sentence Transformers。Sentence Transformers 可以将句子转换为向量表示,并计算向量之间的相似度,从而判断两个句子是否语义相似。

虽然语义缓存听起来很有吸引力,但其效果在实际应用中还有待考证。这是因为:

  • • 语义匹配本身就是一个比较困难的任务,目前的语义匹配技术还无法做到完全准确,因此语义缓存可能会返回不准确的结果。

  • • 语义缓存的管理比较复杂,需要考虑缓存更新、缓存失效等问题。

十一、AI 编排工具:谨慎使用

AI 编排工具可以帮助我们简化 AI 应用的构建和管理,但过早或不恰当地使用 AI 编排工具可能会适得其反。

在项目初期,建议先不要使用 AI 编排工具,而是手动构建和管理 AI 工作流程,以便更好地理解每个组件的功能和作用,以及它们之间的依赖关系。当项目规模逐渐扩大,并且团队成员对 AI 工作流程有了更深入的了解之后,再考虑引入 AI 编排工具来简化管理。

选择 AI 编排工具时,需要考虑以下因素:

  • • 易用性: 工具是否易于学习和使用?

  • • 灵活性: 工具是否支持自定义组件和工作流程?

  • • 可扩展性: 工具是否能够随着项目规模的扩大而扩展?

  • • 生态系统: 工具是否有活跃的社区和丰富的文档?

十二、总结

构建生成式 AI 平台是一个复杂的过程,需要考虑多个方面的因素,例如性能、安全、可扩展性等。本文介绍了一些常用的组件和技术,希望能够帮助你打造属于自己的生成式 AI 应用。

十三、参考链接

  • • Building A Generative AI Platform: https://huyenchip.com/2024/07/25/genai-platform.html

  • • LangChain: https://github.com/langchain-ai/langchain

  • • LlamaIndex: https://github.com/run-llama/llama_index

  • • Flowise: https://github.com/FlowiseAI/Flowise

  • • Langflow: https://github.com/langflow-ai/langflow

  • • Haystack: https://github.com/deepset-ai/haystack

子非AI
子非AI,焉知AI之乐:分享AI的有趣应用和创新案例,让你了解AI的乐趣。
 最新文章