如何构建一个生产级的AI平台(3)?

news2024/10/2 3:02:01

书接上回,继续往下讲,本节会说一下模型的路由和网关

模型的路由和网关

随着应用程序复杂性的增加和涉及的模型越来越多,

出现了两种类型的工具来帮助使用多个模型:路由和网关

1. 路由

应用程序可以使用不同的模型来响应不同类型的查询

为不同的查询使用不同的解决方案有几个好处。

首先,这允许您拥有专门的解决方案,

例如一个专门用于技术故障排除的模型和另一个专门用于订阅的模型。

专用模型的性能可能比通用模型更好。

其次,这可以帮助您节省成本。
可以将更简单的查询路由到更便宜的模型,

而不是将所有查询路由到昂贵的模型。

路由器通常由一个意向分类器组成,用于预测用户尝试做什么。

根据预测的意图,将查询路由到相应的解决方案。

例如,对于客户支持聊天机器人,如果目的是:

  • 重置密码 – >将此用户路由到有关密码重置的页面
  • 要更正计费错误 – >将此用户路由到人工操作员
  • 要排查技术问题 – >将此查询路由到为排查问题而优化的模型

意向分类器还可以帮助系统避免超出范围的对话。
例如,可以有一个目的分类器来预测查询是否超出范围。

如果认为查询不合适(例如,如果用户询问您会在即将到来的选举中投票给谁),

聊天机器人可以使用其中一个常用回答礼貌地拒绝参与而不会浪费 API 调用。:

作为聊天机器人,我没有投票的能力。

如果您对我们的产品有任何疑问,我很乐意提供帮助。

如果系统可以访问多个操作,则路由器可以涉及下一个操作预测器

以帮助系统决定下一步要执行的操作。

一个有效的操作是要求澄清查询是否不明确。

例如,在响应查询“冻结”时,

系统可能会问

“您是要冻结您的账户还是谈论天气”,

或者只是说“对不起。您能详细说明一下吗"?


意图分类器和下一步行动预测器可以是通用模型或专用分类模型。


专用分类模型通常比通用模型小得多、速度更快,

因此系统可以使用多个分类模型,而不会产生显著的额外延迟和成本。

2 网关

模型网关是一个中间层,允许以统一和安全的方式与不同的模型交互。

模型网关最基本的功能是使开发人员能够以相同的方式访问不同的模型,

无论是自托管模型还是 OpenAI 或 Google 等商业 API 背后的模型。

如果模型 API 发生更改,只需更新模型网关,而不必更新使用此模型 API 的所有应用程序。


在最简单的形式中,模型网关是一个统一的包装器,类似于下面的代码示例。

此示例并不意味着具有功能性,因为它不包含任何错误检查或优化:

import google.generativeai as genai
import openai

def openai_model(input_data, model_name, max_tokens):
    openai.api_key = os.environ["OPENAI_API_KEY"]
    response = openai.Completion.create(
        engine=model_name,
        prompt=input_data,
        max_tokens=max_tokens
    )
    return {"response": response.choices[0].text.strip()}

def gemini_model(input_data, model_name, max_tokens):
    genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
    model = genai.GenerativeModel(model_name=model_name)
    response = model.generate_content(input_data, max_tokens=max_tokens)
    return {"response": response["choices"][0]["message"]["content"]}

@app.route('/model', methods=['POST'])
def model_gateway():
    data = request.get_json()
    model_type = data.get("model_type")
    model_name = data.get("model_name")
    input_data = data.get("input_data")
    max_tokens = data.get("max_tokens")

    if model_type == "openai":
        result = openai_model(input_data, model_name, max_tokens)
    elif model_type == "gemini":
        result = gemini_model(input_data, model_name, max_tokens)
    return jsonify(result)

模型网关是访问控制和成本管理。

不需要向每个想要访问 OpenAI API 的人提供加密令牌(这很容易泄露),

而是只允许人们访问模型网关,从而创建一个集中且受控的访问点。

网关还可以实施精细的访问控制,指定哪个用户或应用程序应该有权访问哪个模型。


此外,网关可以监控和限制 API 调用的使用,防止滥用并有效管理成本。

模型网关还可用于实施回退策略以克服速率限制或 API 故障(不幸的是,后者很常见)。

当主 API 不可用时,网关可以将请求路由到替代模型,

在短暂等待后重试,或以其他正常方式处理故障。

这可确保应用程序能够平稳运行而不会中断。

由于请求和响应已经流经网关,因此它是实现其他功能(如负载均衡、日志记录和分析)的好地方。

一些网关服务甚至提供缓存和安全机制。

(这里插一句,后端的研发同学应该很熟悉,基本上跟微服务体系里业务网关一样的作用)


鉴于网关的实现相对简单,因此有许多现成的网关。

包括 Portkey 的网关、MLflow AI 网关、

WealthSimple 的 llm-gateway、TrueFoundry、Kong 和 Cloudflare。

与 scoring 一样,routing 也在 model gateway 中。

与用于评分的模型一样,用于路由的模型通常比用于生成的模型小。




使用缓存减少延迟

缓存可能是 AI 平台中最被低估的组件。

因为缓存可以显著降低应用程序的延迟和成本。

缓存技术也可以在训练期间使用,不过这篇的重点介绍用于推理的缓存。

一些常见的推理缓存技术包括提示缓存、精确缓存和语义缓存。

提示缓存通常由您使用的推理 API 实现。在评估推理库时,了解它支持的缓存机制会很有帮助。

1 Prompt cache

应用程序中的许多提示词都有重叠的文本段。

例如,所有查询都可以共享相同的系统提示符。

提示词缓存会存储这些重叠的区段以供重复使用,因此只需处理一次。

不同提示中常见的重叠文本段是系统提示符。

如果没有 prompt cache,模型需要处理每个查询的系统提示。

使用 prompt cache,它只需要为第一个查询处理一次系统提示。


对于系统提示较长的应用程序,提示缓存可以显著降低延迟和成本。

如果系统提示符是 1000 个令牌,并且应用程序今天生成了 100 万个模型 API 调用,

那么 prompt 缓存将使每天免于处理大约 10 亿个重复输入令牌!


但是,这并非完全免费,

与 KV 缓存一样,prompt 缓存大小可能相当大,并且需要大量的工程工作。

提示缓存对于涉及长文档的查询也很有用。

例如,如果许多用户查询与同一长文档(例如书籍或代码库)相关,

则可以缓存此长文档以跨查询重复使用。

自 2023 年 11 月 Gim 等人引入以来,提示缓存已被纳入模型 API 中。

谷歌宣布 Gemini API 将于 2024 年 6 月以上下文缓存的名义提供此功能。

与常规输入令牌相比,缓存的输入令牌可享受 75% 的折扣,

但必须为缓存存储支付额外费用(截至撰写本文时,每小时 1.00 美元/100 万个令牌)。


鉴于 prompt cache 的明显好处,如果它变得像 KV cache 一样流行,我不会感到惊讶。

虽然 llama.cpp 也有提示缓存,但它似乎只缓存整个提示并适用于同一聊天会话中的查询。

它的文档是有限的,但我通过阅读代码猜测,在长时间的对话中,它会缓存以前的消息,只处理最新的消息。


2 精准缓存

如果 prompt 缓存和 KV 缓存对于基础模型是唯一的,

那么精确缓存则更通用、更直接。

系统存储已处理的项目,以便稍后在请求确切的项目时重复使用。

例如,如果用户要求模型汇总产品,则系统会检查缓存以查看是否缓存了该产品的摘要。

如果是,请获取此摘要。

如果没有,请汇总产品并缓存摘要。

精确缓存还用于基于嵌入的检索,以避免冗余的向量搜索

如果传入查询已在向量搜索缓存中,请获取缓存的搜索结果。

如果没有,请对此查询执行向量搜索并缓存结果。


缓存对于需要多个步骤(例如思维链)和/

或耗时操作(例如检索、SQL 执行或 Web 搜索)的查询特别有吸引力。

可以使用内存中存储实现精确缓存,以便快速检索。

但是,由于内存中存储有限,因此也可以使用 PostgreSQL、Redis
等数据库或分层存储来实现缓存,以平衡速度和存储容量。

拥有逐出策略对于管理缓存大小和保持性能至关重要。

常见的驱逐策略包括最近最少使用 (LRU)、最不常用 (LFU) 和先进先出 (FIFO)。

缓存查询的时间取决于再次调用此查询的可能性。

特定于用户的查询(例如“What’s the status of my recent order”

(我的最近订单的状态如何)不太可能被其他用户重复使用,因此不应缓存。

同样,缓存时间敏感的查询(例如“How’s the weather?”

(天气怎么样?一些团队训练一个小型分类器来预测是否应该缓存查询。)

3.语义缓存

与精准缓存不同,语义缓存不要求传入查询与任何缓存的查询相同。

语义缓存允许重用类似的查询。

假设一个用户问“What’s the capital of Vietnam”,模型生成答案“河内”。

后来,另一个用户问“What’s the capital city of Vietnam?”,

这是同一个问题,但多了个词“city”。

语义缓存的思想是系统可以重用答案 “Hanoi” 而不是从头开始计算新的查询。

语义缓存仅在可靠的方法来确定两个查询在语义上是否相似时才有效。

一种常见的方法是基于 embedding 的相似性,其工作原理如下:

  1. 对于每个查询,使用 embedding 模型生成其嵌入。
  2. 使用向量搜索查找最接近当前查询嵌入的缓存嵌入。假设此相似性分数为 X。
  3. 如果 X 大于设置的相似性阈值,则认为缓存的查询与当前查询相同,并返回缓存的结果。

    如果没有,请处理此当前查询并将其与其嵌入和结果一起缓存。

此方法需要向量数据库来存储缓存查询的嵌入。
与其他缓存技术相比,语义缓存的价值更加可疑,因为它的许多组件都容易出现故障。

它的成功依赖于高质量的嵌入、函数向量搜索和值得信赖的相似性指标。

设置正确的相似度阈值也可能很棘手,需要大量的试验和错误。

如果系统将传入的查询误认为与另一个查询相似,则从缓存中获取的返回响应将不正确。

此外,语义缓存可能非常耗时且计算密集,因为它涉及向量搜索。

此向量搜索的速度和成本取决于缓存 embedding 向量数据库的大小。


如果缓存命中率很高,语义缓存可能仍然值得,

这意味着可以通过利用缓存结果有效地回答很大一部分查询。

但是,在整合语义缓存的复杂性之前,请确保评估与之相关的效率、成本和性能风险。
添加缓存系统后,平台如下所示。

KV 缓存和提示缓存通常由模型 API 提供程序实现,因此它们不会显示在此图中。
如果我必须可视化它们,我会将它们放在 Model API 框中。

后续的内容咱们会讲一下:

  • 添加复杂逻辑和写入操作
  • AI 应用平台的可观察性
  • AI 应用 Pipeline 构建

原文链接:https://huyenchip.com/2024/07/25/genai-platform.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平衡二叉搜索树删除的实现

前言 上期讲了平衡二叉搜索树的插入,这一期我们来讲讲删除。同时,二叉搜索树的简介不会出现在本篇博客之中,如有需要可以查看上一篇博客《平衡二叉搜索树插入的实现》。 平衡二叉搜索树插入的实现-CSDN博客文章浏览阅读659次,点赞…

三、I/O控制器

1.主要功能 接受和识别CPU发出的命令(要有控制寄存器) 向CPU报告设备的状态(要有状态寄存器) 数据交换(要有数据寄存器,暂存输入/输出的数据) 地址识别(由I/0逻辑实现) 2.组成 CPU与控制器之间的接口(实现控制器与CPU之间的通信) I/0逻辑(负责识别CPU发出的命…

鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

自定义注解加 AOP 实现服务接口鉴权以及内部认证

注解 何谓注解? 在Java中,注解(Annotation)是一种特殊的语法,用符号开头,是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信…

中英翻译神器!轻松搞定跨文化沟通

大家好!今天咱们来聊聊那些你生活中不可或缺的翻译小助手;不论你是个英语小白,还是希望更快地了解外国文献、掌握外媒信息,或者是从事需要大量翻译工作的小伙伴,总有一款翻译工具能帮你省时省力,让你的生活…

DBCP数据库连接池以及在Tomcat中配置JNDI数据源

前言 数据库连接 数据库连接是指在计算机系统中建立起应用程序与数据库之间的连接通道,用于进行数据的读取和写入操作。通过数据库连接,应用程序可以与数据库进行交互,执行各种数据库操作,如查询数据、插入数据、更新数据和删除数…

算法题总结(四)——螺旋矩阵

螺旋矩阵 59、螺旋矩阵二 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输…

2.点位管理开发(续)及设计思路——帝可得后台管理系统

目录 前言一、页面原型二、修改1、页面展示2、新增 3 、总结思路 前言 提示&#xff1a;本篇继续点位管理的改造 一、页面原型 页面展示新增 二、修改 1、页面展示 页面修改&#xff1a;修改标签换行、顺序顺序、地址过长时换行问题&#xff1b; <el-table v-loading…

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)

七&#xff0c;MyBatis-Plus 扩展功能&#xff1a;乐观锁&#xff0c;代码生成器&#xff0c;执行SQL分析打印&#xff08;实操详细使用&#xff09; 文章目录 七&#xff0c;MyBatis-Plus 扩展功能&#xff1a;乐观锁&#xff0c;代码生成器&#xff0c;执行SQL分析打印&#…

愿祖国富强!肌肉水凝胶的奥秘,自协调与光驱动,运动模式大揭秘

大家好&#xff0c;在这个国庆佳节&#xff0c;我们一同感受科技的魅力。今天来了解一种特殊的肌肉样水凝胶&#xff0c;它通过自协调形状变化和摩擦调节&#xff0c;能在光的引导下实现多样运动。这一成果为软机器人发展带来新契机——《Light-steered locomotion of muscle-l…

基于ScriptableObject设计游戏数据表

前言 本篇文章是针对之前对于ScriptableObject概念讲解的实际应用之一&#xff0c;在游戏开发中&#xff0c;我们可以使用该类来设计编辑器时的可读写数据表或者运行时的只读数据表。本文将针对运行时的只读数据表的应用进行探索&#xff0c;并且结合自定义的本地持久化存储方式…

一级建造师备考攻略及一建各科老师推荐(各科四大金刚)

吐血整理:真正的实战派一建名师推荐! 考过的同学一定都知道推荐的老师YYDS! 一级建造师各科老师推荐: 《法规》名师:王欣、王竹梅、陈印、关涛 其他老师:房超、蔡恒、刘丹、武海峰、陈洁、安国庆、桂林 《管理》名师:宿吉南、龙炎飞、李向国、朱俊文 其他老师:缴广才、陈晨…

跟《经济学人》学英文:2024年09月28日这期 The curse of the Michelin star

The curse of the Michelin star Restaurants awarded the honour are more likely to close, research finds 原文&#xff1a; The twelve new restaurants added to the New York Michelin Guide this month, serving up cuisine ranging from “haute French” to “eco…

9.数据结构与算法-单链表,循环链表和双向链表的比较////顺序表和链表的比较

单链表&#xff0c;循环链表和双向链表的时间效率比较 顺序表和链表的区别 存储密度

HarmonyOS Next应用开发——自定义组件的使用

自定义组件的使用 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与…

达梦数据库开启归档模式

目录 一、什么是归档模式&#xff1f; 二、开启归档模式的步骤 1、创建归档目录 2、进入dm数据库bin目录 3、登录数据库 4、关闭数据库 5、启动数据库到Mount状态 6、增加本地归档日志文件 7、开启归档 8、启动数据库 9、验证是否开启成功 三、开启归档模式的优…

Lj视频下载器 1.1.37 简洁高效的视频下载工具

Lj视频下载器是一个功能强大的视频下载器&#xff0c;支持直接添加视频地址或 m3u8 资源地址&#xff0c;可以从网页中自动提取视频进行下载。支持多种视频格式&#xff0c;包括 m3u8&#xff0c;并能自动检测并移除广告片段。 大小&#xff1a;19M 百度网盘&#xff1a;https…

Linux CentsOS定时删除一个目录下(包含子目录)的改动时间大于12小时的文件

Shell脚本 文件目录如下图 ** 查找/ai/img/目录下的所有文件** find /ai/img/ -type f查找/ai/img/目录下的所有上次改动时间大于720分钟(12小时)的文件 12 小时&#xff0c;也就是 720 分钟。所以&#xff0c;我们可以使用 -mmin 720 来查找修改时间超过 720 分钟&#xff08;…

uniapp 微信小程序 微信支付

本章的内容我尽量描述的细致一些&#xff0c;哪里看不懂给我评论就可以&#xff0c;我看到进行回复 微信支付大致分为4步&#xff0c;具体看后端设计 1. 获取code 2. 根据code获取openid 3. 根据openid&#xff0c;以及部分订单相关数据&#xff0c;生成prepayId (预支付交易会…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…