Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (下)

news2024/11/12 21:00:47

6064f3135b8bdc2f0968117b50e463b9.png

8281c9f3aa7cbba75c61ef7ceb5c5d14.png

本系列文章介绍

在和社区小伙伴们交流的过程中,我们发现大家最关心的问题从来不是某个具体的功能如何使用,而是面对一个具体的实战场景时,如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中,我们会聚焦回答这一类问题,如 “在 AI 应用开发的不同阶段,向量数据库应该如何选型”,“如何正确的构建 RAG 多租系统” 等。虽然这个系列名为进阶,但内容同时适用于初级和进阶用户。我们希望通过这些内容的介绍,帮助大家在向量数据库应用的过程中少走弯路。

01.

背景回顾

上篇文章咱们聊了 to B 大型知识库系统向量数据库中台的多租设计。这篇文章继续这个主题,咱们来聊一聊 to C RAG 场景的向量数据库多用户设计。这类应用的基本特征是涉及个性化对话,如智能助理,情感陪伴,个性化推荐等。典型需求是为每个用户维护独立的对话上下文检索库,通过 RAG 提升对话的连贯性与深度。

这类 to C 的 RAG 多租设计主要需要解决这么几个关键问题:

极高的用户数量。典型的例子如 Character AI, 用户数量或创建的对话机器人实例数量都在千万这个量级。如何在向量数据库中维护千万量级的独立上下文内容是一个比较大的系统设计挑战。

系统持续扩容。考虑到每月巨大的新用户与对话上下文增量,如何完成平稳的系统扩容是第二项挑战。

成本优化。在 to C 的 RAG 应用中,一般活跃用户占比不会超过 10%。特别是对于运营时间较长的项目,由于总注册用户基数大,活跃用户比例在 5% 以内。如何更有效的将系统资源向活跃用户倾斜,并尽可能降低非活跃用户的数据维护成本,是第三项比较大的挑战。

02.

数据隔离粒度与多租支持数量

在深入这几个问题之前,我们先回顾一下向量数据库提供的几个数据隔离层级:

2a776f9a0a69eeb3da40631cfbaec3e1.jpeg

图1. Milvus 数据隔离层级

以 Milvus 为例,数据组织粒度从大到小一共有三种选择:Database,Collection,Partition Key/Partition。上文讲到的 to B 大型知识库系统中,我们一般为每个租户提供一到多个 Database,以满足数据规模及知识库构建灵活度的需要。对于 to C 对话上下文的数据隔离,一般会选择在 Colletion,或 Partition Key 这两层实现。

技术上讲,Collection 提供了更好的隔离性,是数据的表间隔离。而 Partition Key 是逻辑上的表内隔离。我们可以简单的把 Partition Key 理解为一个 Hash 分桶的过程:数据模型上我们将用户的 ID 或独立对话上下文的 ID 作为 Key。数据插入时,向量数据库系统内部会根据每条数据的 Key 进行 Hash,并插入对应的桶。查询时,我们需要在查询语句中将这个 ID 做为过滤条件,系统会找到对应的桶完成查询。

Collection 和 Partition Key 这两个粒度进行数据隔离各有优缺点,等下我们会逐步展开对比。一个快速的选型原则是:如果你的用户数量在几千或万这个量级,你可以考虑为每个用户分配一个 Collection;如果你的用户数量在几百万甚至上千万这个量级,你应该考虑为每个用户分配一个 Partition Key。

假设我们以 32 vCPU,128 GB Memory 的物理资源部署向量数据库。对于 Collection 方案,每个数据库实例大概可以支撑 5000 个用户(即一套系统支撑 5000 个 Collection),以及 1000 个活跃用户 (有读写行为)。平均可支撑的单用户向量数据条数在 5000-10000 (以768维向量估计)。对于这个实例上的所有用户,系统提供 200-1000 左右的总 QPS。考虑公有云常见机型,单用户在向量数据库的硬件成本每年每用户在 ¥3-10 这个区间。

同样的物理资源,对于 Partition Key 方案,单系统可支撑的用户数量在十万级。假设平均每个用户的向量数据条数是 100,单实例可支撑约 30 万用户,其中活跃用户在 1万- 3万。系统提供的总 QPS 在 500 - 2000。单用户在向量数据库的年成本大致是 ¥0.1-0.4。

除了用户总量及单用户成本,每个用户的数据模型是否异构也是选型的重要考量。这里 "数据模型异构" 指的是不同用户的 Collection Schema 是否有差异。在绝大多数 to C 的 RAG 场景中,表的 Schema 都是在应用的业务侧进行设计,用户不会根据自己的应用需求进行自定义,因此是同构的。这样的情况,Collection 或 Partition Key 都可以适用。但如果你的应用中,不同用户的向量数据库表的 Schema 各不相同,就只能选用 Collection 进行数据隔离。因为在同一个 Collection 内,所有的 Partition Key 对应的 Schema 都需要保持一致(如图1中的示例)。

03.

系统持续扩容

像 Milvus 这样相对成熟的向量数据库系统都支持垂直和水平扩展。在项目的早期,我们一般只需要部署一套向量数据库系统实例,通过垂直和水平扩展支撑用户的增长。

119bd2f0389edee9be0606fa4c616c8c.jpeg

图2. 基于 partition key 方案的多租扩容

如果我们采用基于 partition key 的方案,单系统可支撑的用户数量在十万级,甚至超过百万。这时候我们需要在单个系统内通过 Collection 将用户分成若干个组,每个组的所有用户数据放到一个 Collection,用户间数据通过 partition key 机制进行隔离。

同时,我们也需要关注系统异常的爆炸半径。Milvus 提供了 Resource Group 能力,支持 Collection 到物理资源的映射。这样,我们可以将每个用户组所在的 Collection 映射到相互独立的物理查询节点。

随着用户持续增长,当前资源水位较高时,我们可以向系统内并入新的物理节点,并将其绑定至一个新的 Resource Group。这样,我们就扩展了一个新的池子。

d217eb731fe5bd59847d7e42ee837e6c.jpeg

图3. 基于 collection 方案的多租扩容

在项目的高速增长期,不管是出于用户规模的原因,或是进一步提高系统整体稳定性的考虑,我们都可以考虑部署多套向量数据库实例,进而将用户分到多个物理上完全隔离的用户池。在这个架构中,我们需要在应用层和向量数据库层之间增加 Routing 层,避免上下两层间的硬链接,提供统一服务访问地址,以及扩缩容、用户跨数据库调度的灵活性。

如果我们考虑通过 Collection 的方案进行用户间数据隔离,一般单系统实例可支撑的表数量存在上限,超过上限往往会导致系统性能下降或稳定性问题,因此当表的数量接近系统能力上限时,也需要考虑上述架构。

04.

成本优化

在成本优化方面,我们主要考虑利用数据的冷热性质、或用户的活跃性质进行优化。从技术上看,一方面我们希望将热数据/活跃用户数据放置在内存层,保证数据访问的低延迟和高吞吐;另一方面,我们希望将冷数据/非活跃用户数据放置在磁盘层(一般需要SSD),使这部分用户的数据维护成本接近存储成本。

2633fc07543eb064e985097b5c2c933b.jpeg

图4. partition key 的冷热存储

如果我们采用 partition key 方案进行数据隔离,Milvus 提供了 mmap 机制进行冷热数据向多层存储的映射。mmap 本身是操作系统层提供的文件到内存自动映射机制,由操作系统根据数据页的访问热度自动控制页面是否需要加载至内存,或替换到磁盘。

a193a6e24cb2f5034131c8b67940c001.jpeg

图5. collection 的冷热存储

如果我们采用 collection 方案进行数据隔离,同样可以开启 mmap 进行自动的冷热数据管理。与此同时,Milvus 还提供了逻辑层的显式数据加载/释放能力。我们可以通过 load/release 这对操作,在业务层控制是否将一个非活跃用户的 collection 在内存上释放,或将一个回归活跃的用户的 collection 从磁盘加载至内存。

mmap 和 load/release 机制可以结合使用,在这种情况下,一个被 load 到内存的 collection 中如果包含非活跃访问的数据页,也将会被操作系统自动从内存中移除。需要注意的是,在 mmap 机制中,数据从磁盘到内存的移动过程应用侧是不感知的,而 load/release 在应用侧必须感知。向量数据库不能对一个在 release 状态的 collection 进行查询。因此,在考虑使用 load/release 进行 collection 的显式加载/释放时,需要在业务侧设计 collection 的 load/release 触发策略。例如在用户登录时触发 load 进行预加载,或一周无任何访问行为,触发release 释放内存资源。此外,对于较大的 collection,需要考虑 load 操作的数据加载延迟,如果 load 耗时超过秒级,一般在业务侧用户会有感知。

作者介绍

b80007b8ae31d44ca31b78ef7b28c059.jpeg

郭人通,Zilliz 合伙人和产品总监,CCF 分布式计算与系统专委会执行委员。专注于开发面向 AI 的高效并可扩展的数据分析系统。郭人通拥有华中科技大学计算机软件与理论博士学位。

推荐阅读

b8f4435a7235024ac131515530a5b82f.png

22d17aa19f49dcffe643c9ef23d8a500.png76f7aa84b11f50ee2a5f42cafbb71d32.png

81da5ec1180d0c9aa893d8b8aaaa52e3.png

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

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

相关文章

Python将两个Excel文件按相同字段合并到一起

在工作中我们需要将两个有关联的数据文件合并成一个Excel 1. 创建两个excel文件 test1 test2 2. 使用Pandas 数据分析工具进行合并 Pandas 一个强大的分析结构化数据的工具集,提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据&#x…

Linux操作系统软件管理

一.软件安装包类型 1.常见软件安装包格式 源码软件 .tar.gz,.tar.bz2 优点:从功能使用的角度来讲,比rpm软件安装包更加灵活, 比如 在使用源码软件安装包的时候,可以自行选择安装软件的目录,这样操作便…

TypeScript与vue

一、为组件的props标注类型 - 在没有使用TS之前,是这样接受props: - 在TS环境中,是这样接受props: - 对于props的可选项如何限制呢? 1、类型限制 类型限制在接收的时候就已经定义好了 2、可选属性(必填限制…

华媒舍:8个为什么要选择国外纳斯达克大屏推广的原因

1.纳斯达克大屏的知名度和美誉度纳斯达克大屏是全球有名气的金融业信息表明平台之一,它在全球金融体系有着广泛的知名度和美誉度。以在纳斯达克大屏中进行推广,能够让更多人关注与掌握推广具体内容,从而增加品牌曝光率。 2.纳斯达克大屏高客流…

代码随想录Day 31|leetcode题目:56.合并区间、738.单调递增的数字、968.监控二叉树

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 贪心算法Part05题目题目一:56. 合并区间解题思路 题目二:738.单调递增的数字解题思路:暴力解法:结果超时贪心算法 题目三: 968.监控二叉…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月1日,星期日

每天一分钟,知晓天下事! 2024年9月1日 星期日 农历七月廿九 1、 未来一周,四川东部、重庆等地持续高温天气,最高气温可达40~42℃。 2、 山西明确:今日起,职工医保个人账户家庭共济范围由直系亲…

QNN:基于QNN+example重构之后的yolov8det部署

QNN是高通发布的神经网络推理引擎,是SNPE的升级版,其主要功能是: 完成从Pytorch/TensorFlow/Keras/Onnx等神经网络框架到高通计算平台的模型转换; 完成模型的低比特量化(int8),使其能够运行在高…

干货分享|分享一款实用的网盘图标删除器 Drive Icon Manager v2.2

问题:在Windows平台“此电脑”及“资源管理器侧边栏”中会出现各种第三方图标,如百度网盘、WPS网盘、迅雷下载。 Drive Icon Manager 下载方法 1.打开下面网址--选择最新版本进行下载GitHub - Return-Log/Drive-Icon-Manager: 可以轻松删除‘此电脑’及‘…

基于SSM+小程序的宿舍管理系统(宿舍1)(源码+sql脚本+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 本宿舍管理系统小程序有管理员和学生两个角色。 1、管理员功能有个人中心,公告信息管理,班级管理,学生管理,宿舍信息管理,宿舍…

算法——支持向量机(support vector machines,SVM)

简介:个人学习分享,如有错误,欢迎批评指正 支持向量机(Support Vector Machine, SVM)是一种监督学习算法,广泛用于分类任务,也可以用于回归和异常检测等问题。SVM的核心思想是通过在特征空间中找…

单片机内存区域划分

目录 一、C 语言内存分区1、栈区2、堆区3、全局区(静态区)4、常量区5、代码区6、总结 二、单片机存储分配1、存储器1.1 RAM1.2 ROM1.3 Flash Memory1.4 不同数据的存放位置 2、程序占用内存大小 一、C 语言内存分区 C 语言在内存中一共分为如下几个区域…

高效达人必备!Simple Sticky Notes让灵感与任务不再遗漏!

前言 阿尔伯特爱因斯坦所言:“我们不能用制造问题时的同一水平思维来解决它。”这句话深刻地揭示了创新与突破的必要性。正是基于这样的理念,Simple Sticky Notes这款桌面便签软件以其独特的创新视角和实用性,在众多同类软件中脱颖而出。 它…

【原型设计工具评测】Axure、Figma、Sketch三强争霸

在当今的数字化设计领域,选择合适的原型设计工具对于项目的成功至关重要。Axure、Figma 和 Sketch 是目前市场上最受欢迎的三款原型设计工具,它们各具特色,满足了不同用户的需求。本文将对这三款工具进行详细的对比评测,帮助设计师…

Fine-Grained Egocentric Hand-Object(中文翻译)

精细化自我中心手-物体分割: 数据集、模型(model)与应用 灵芝张1, 盛昊周1, 西蒙斯滕特 $ {}^{2} $, 和健博石 $ {}^{1} $ 摘要。 自我中心视频提供了高保真度建模人类行为的细粒度信息。手和交互对象是理解观众行为和意图的一个关键方面。…

Pandas 10-绘制饼图

1. 准备数据 首先,需要准备一个DataFrame。 import pandas as pd# 创建一个DataFrame data {Category: [A, B, C, D],Value: [15, 30, 45, 10] }df pd.DataFrame(data) print(df)输出: Category Value 0 A 15 1 B 30 2 …

职称评审汇报ppt模板_副教授教学科研型职称答辩ppt制作案例

副教授教学科研型职称答辩ppt制作案例 专业技术职务评聘述职报告PPT制作案例 PPT项目概要: 项目名称:专业技术职务评聘述职报告PPT 项目单位:浙江X大学 制作需求:PPTX 制作方式:线上沟通 专业技术职务聘任申报人汇…

【战术数据链】Link 22 - 已准备好投入使用

Link 22,又称北约改进型 Link Eleven (NILE),是一种战术数据链通信标准。新标准计划在中期内取代广泛使用的 Link 11,并将与 Link 16 同时使用。 就数字海军通信而言,战术数据链尤为重要。北约和盟国海军使用 Link 11 协议&#…

初始MYSQL数据库(1)——创建、删除数据库和数据表的相关操作

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 数据库的概念 数据库的相关操作 常用的数据类型 数值型 字符串类型 日期类型 数据表的相关操作 练习 数据库的概念 数…

C++20中lambda表达式新增加支持的features

1.弃用通过[]隐式捕获this&#xff0c;应使用[,this]或[,*this]显示捕获&#xff1a; namespace { struct Foo {int x{ 1 };void print(){//auto change1 [] { // badauto change1 [, this] { // good, this: referencethis->x 11;};change1();std::cout << "…

【进程间通信】匿名管道

1.进程间通信的介绍 是什么 为什么 怎么做 匿名管道 原理 特征 管道的四种情况可以写代码自己看看 管道接口 编码实现 父进程进行读&#xff0c;子进程进行写 里面有snprintf的使用 #include<iostream> #include<unistd.h> #include<stdlib.h> #i…