Milvus×OPPO:如何构建更懂你的大模型助手

13802611ae27315b488a62285d2adca2.png

b7419b5447fceb081a473fb43c131010.png

01.

背景

AI业务快速增长下传统关系型数据库无法满足需求。

2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。

d63f4a268f8f8342c2613ada0ed2d21c.png 4914029cc2b6ac0e0eaf9963c07704c7.png

与传统的应用不同的是,在AI驱动的应用中,数据库面临的数据处理需求已经发生了根本性的变化。高维数据(如图像、文本和音频)的快速积累和使用场景的多样性,要求数据库不仅需要存储海量数据,还需要可以高效地进行复杂的数据检索。然而,传统关系型数据库由于其设计初衷是为结构化数据服务,因此在处理非结构化和高维数据时,逐渐暴露出其局限性。这直接导致它们在应对现代AI业务需求方面显得捉襟见肘,难以满足实时数据写入、大规模并发查询以及快速相似性搜索等要求。

02.

万物皆可Embedding

非结构化数据的种类和使用场景复杂,几乎无法定义,让计算机程序理解都非常困难,更不用说数据库了。为了能够统一处理和表达非结构化数据,业界通用的方法是使用Embedding。Embedding 是一种将高维稀疏数据转换为低维稠密向量的技术,广泛应用于自然语言处理(NLP)、图像处理、推荐系统等领域。通过 Embedding,复杂的输入数据可以被编码成固定长度的向量,使得这些数据可以在向量空间中进行高效计算和处理。

d77d24282295b83a48806af89062d58d.png

在Embedding的基础上,由非结构化数据引入的挑战演变为了如何对向量数据进行存储和检索的问题。

03.

OPPO对向量检索的探索

在业务初期,由于数据量较小、使用场景较为简单,数据存储使用本地文件,数据检索就是把全量数据加载在内存中完成。配合上HNSW, Faiss等开源库,可以很好解决问题。

但是当业务开始快速增长,上面这一条玩法很快就出现了问题:

  • 数据容量:单个服务节点的内存无法承载全量向量数据;

  • 查询性能:单机性能无法满足查询需求;

  • 数据持久化:数据从加载到内存,直到生命周期结束后释放,没有被很好的持久化;

  • 文件管理:数据、索引等文件难以被统一管理。

很自然的,向量检索开始从单机向分布式的方向进行演进,根据上面的问题提出的解决方法就是:

  • 数据分片:对向量数据根据某一规则切分后加载在不同的节点上;

  • 服务发现:能够对整个集群内的节点、数据进行统一管理。

基于上述思想,OPPO提出并实践了一套分布式向量检索服务:

e62e1ae2ef1a1ea5bb7c83bcf2c503df.png

整个系统在简化后可以被分为Master和ShardServer两个部分:其中Master负责整个集群的元数据管理和调度管理,存放集群的数据分布信息和整体的路由结构信息等;ShardServer负责具体的向量数据存储和检索服务。

  • 节点管理:Master本身是一个至少3节点的高可用组件,集群中的其他节点会向Master进行服务注册,由Master进行节点的管理;

  • 数据分片:数据分片在系统中是一个Shard的逻辑概念,其中每个Shard中会包含该数据分片的向量数据、标量数据等,其底层使用RocksDB进行数据持久化,并且通过Raft Group实现每个Shard的高可用。ShardServer是物理上承载Shard的角色,每个ShardServer会保存若干个Shard,不同的ShardServer之间完成Raft Group的数据交换。

04.

Why Milvus?

上述的分布式向量检索实际上已经把向量检索这一功能服务化了,但是这个系统中还是存在一些不足,例如数据和节点绑定在了一起,虽然对数据做了分片但是对集群的扩展不是那么丝滑。另外,对于向量检索结果的合并、检索过程中的失败处理等都是非常棘手的问题,所以,OPPO决定引入更加稳定的开源解决方案 — Milvus。

在对向量数据库做选型的时候,我们考虑的主要的点是:

  • 性能:Embedding在调用链中的耗时要求很高,业务对性能十分敏感;

  • 容量:业务增长快速,需要对未来很长一段时间的数据容量有保障;

  • 扩展性:支持的索引类型、是否支持标量过滤等,是否可以覆盖大部分业务场景;

  • 运维难度:作为一个较新的技术领域,我们需要考虑运维成本,以及关注弹性与故障自愈等特性;

  • 成本:向量数据常驻内存的特性会导致其成本相较于传统数据库更高,因此也需要考虑。

最后选择Milvus也是基于以上的考虑:

  • 性能优越:根据VectorBench的测试,Milvus的性能优于同类型向量数据库,尤其是大幅领先于插件式引擎;

  • 容量支持与水平扩容:Milvus支持水平扩容,能够处理十亿级别的数据量;

  • 扩展性:Milvus相比同类产品支持更多的向量索引类型,并且支持标量过滤,能够覆盖更多的业务场景;

  • 运维成本低:Milvus的云原生特性和存算分离的架构设计,大大减轻了运维成本;

  • 成本控制:通过DiskANN技术,对于一些非重点业务(如内部审计系统),可以大幅降低存储成本。

05.

Milvus实践 — 小布助手

OPPO的小布助手是一个非常典型的使用Milvus的应用。

d83a0cdeb3a3016d20dbf45961aeb05f.png ce06b8de083db44f9310e63f52af326b.png

如图所示,小布助手会记录多轮对话中的信息,并且在后续的聊天中使用。这就是小布助手的「基础记忆」能力。为了实现以上能力,小布助手需要存储海量的向量数据,而且为了保证小布助手的反馈效率,还需要保证向量检索的效率。

为了服务小布助手,我们搭建了一个包含上百个QueryNode节点的集群,通过划分资源组的方式,实现对不同优先级的表隔离管理。另外,在基础记忆的业务场景中数据都是和用户相关联的,根据用户ID进行分表,再根据数据写入时间区分Partition,来减少单次数据检索的范围。

截止目前,基础记忆相关业务已经在Milvus中存储了上亿条向量数据,内存空间到达TB级别。

06.

写在最后

向量数据库是一个DB For AI的场景,传统的数据库无法满足AI业务的需求从而诞生了向量数据库。但是我们在这个过程中也越来越看到AI For DB的可能性。

  • 传统的数据库开始推出例如PgVector, MySQL Vector Type来适应新的变化;

  • Milvus的云原生架构给我们对数据库未来演进的方向提供了参考;

  • AI开始在数据库的故障排查、数据治理中起到越来越重要的角色;

...

从RDBMS, NoSQL, NewSQL到现在的Unstructured Data,我们看到数据库在AI浪潮下扮演的重要角色,也看到了数据库更多的可能性。最后我想起参加完Zilliz的Meetup后的感想:从向量数据库到AI的每次接触都能感受到其潜力和魅力。谢谢!

作者介绍

a4143bf6880572fda5873af0d95c021e.png

efebe96c9ba17e393ee221383b865bfb.png

推荐阅读

35ce7976a8a38021f72619a8069fb442.png

4e524651b7226bb22c6caf3a14affc8b.png

c9ac44db40abcc74ae31ea3629f9fe2f.png

456bccaaead074c0db008245d1f294bc.png

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

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

相关文章

DICOM MPPS详细介绍

文章目录 前言一、常规检查业务流程二、MPPS的作用三、MPPS的原理1、MPPS与MWL2、MPPS服务过程 四、MPPS的实现步骤1、创建实例2、传递状态 五、总结 前言 医院中现有的DICOM MWL(Modality Worklist)已开始逐渐得到应用,借助它可以实现病人信息的自动录入&#xff0…

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树? AVL树是一种自平衡的二叉搜索树,其发明者是Adelson-Velsky和Landis,因此得名“AVL”。AVL树是首个自平衡二叉搜索树,通过对树的平衡因子进行控制,确保任何节点的左右子树高度差最多为1&…

Css动画:旋转相册动画效果实现

​🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…

ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈20241204

💡 ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈 📚 引言 随着业务规模的不断扩大,传统关系型数据库在处理 亿级大表 时,性能瓶颈愈加凸显。关键词检索、模糊查询、多条件筛选等需求逐步升级&#xff…

解决stable-diffusion-webui时的问题:No module ‘xformers‘. Proceeding without it

p.s 被另一篇文章坑了,装个xformers把我原先的pytorch降智了&%$^# 注意:!!!xformers非强制安装;可优化显存,提高性能和出图速率,对于GPU能力有限的用户很有用;安装过…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中,外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂(Customized Cheats),它不仅复杂且隐蔽,更能针对性地绕过传统的反作弊系统,对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 权限管理:用户分类、权限解读与常见问题剖析

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 💯L…

LeetCode 力扣 热题 100道(十四)二叉树的中序遍历(C++)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 如下为代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

运费微服务和redis存热点数据

目录 运费模板微服务 接收前端发送的模板实体类 插入数据时使用的entity类对象 BaseEntity类 查询运费模板服务 新增和修改运费模块 整体流程 代码实现 运费计算 整体流程 总的代码 查找运费模板方法 计算重量方法 Redis存入热点数据 1.从nacos导入共享redis配置…

【C++】—— set 与 multiset

【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…

Jupyter Notebook认识、安装和启动以及使用

Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用一、认识Jupyter Notebook1.1 Jupyter Notebook概述1.2 Jupyter Notebook 重要特性(1)交互式代码执行(2)支持多种编程语言(3)富文本编辑(4)代码高…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时,同时使用两个指针(变量,常用来指向数组、链表等数据结构中的元素位置&am…

【后端面试总结】golang channel深入理解

在Go语言中,Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据,使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作,以及相关的使…

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735,目前主流的版本都适用(V1R5~V2R1的就不在列了,版本太老了,界面完全不一样,这里调试线接的console口,电脑的网络接在ETH口) 「模拟器、工具合集」复制整段内…

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后,在IDEA中创建的项目中建立一个lib目录,然后把刚刚下载好的jar包拷贝进去,然后右键刚刚添加的jar包,点击‘添…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题(Proposition):是一个陈述句,它要么是真的(true),要么是假的(false),但不能同时为真和假。例如…