当前位置: 首页 > news >正文

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

相关文章:

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

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…...

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…...

LeetCode Hot100 31~40

链表 31. K个一组翻转链表 题目不难理解 主要是怎么写出清晰易懂的代码 可以先分成K组 再排序 class Solution { public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* dummyHead new ListNode();dummyHead->next head;// 首先查看需要翻转几次int count…...

C语言(分支练习)

1.输⼊你的⾝⾼和体重,测试你的健康状况。 计算bmi的值, bmi (体重(kg)/⾝⾼(m)的平⽅) 如果bmi ⼩于18.5, 则显⽰“偏瘦,注意加强营 养” 如果bmi 在18.5和23.9之间&a…...

指针(上)

目录 内存和地址 指针变量和地址 取地址(&) 解引用(*) 大小 类型 意义 const修饰 修饰变量 修饰指针 指针运算 指针- 整数 指针-指针 指针的关系运算 野指针 概念 成因 避免 assert断言 指针的使用 strl…...

(笔记)vue3使用Element Plus全局引入icons

如果你想要在项目中直接使用 Element Plus 的图标 icons,而不需要在每次使用的时候都要引入,那么你可以参考本文。 1、图标下载 在使用 Element Plus 的图标前,需要先下载图标库。 npm $ npm install element-plus/icons-vue yarn $ ya…...

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展,精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统(GPS)和惯性导航系统(INS)在导航应用中各具优势:GPS提供全球定位信息,而INS…...

大学阶段matlab期末考试所有一定会考的函数及其基本格式

1.矩阵操作相关函数 zeros函数 基本功能:创建全零矩阵。基本格式:A zeros(m,n),其中m和n分别表示矩阵的行数和列数,例如创建一个3X4的全零矩阵A,可以写为A zeros(3,4)。 ones函数 基本功能:创建全 1 矩…...

【linux】(23)对象存储服务-MinIo

MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 API。 Docker安装MinIo 前提条件 确保您的系统已经安装了 Docker。如果还没有安装 Docker,可以参考 Docker 官方文档进行安装。 1. 拉取 MinIO Docker 镜像 首先,从 Docker Hub 拉取 Mi…...

Nginx学习-安装以及基本的使用

一、背景 Nginx是一个很强大的高性能Web和反向代理服务,也是一种轻量级的Web服务器,可以作为独立的服务器部署网站,应用非常广泛,特别是现在前后端分离的情况下。而在开发过程中,我们常常需要在window系统下使用Nginx…...

前端:localstorage, session

学习帖子 —总结— 要快速掌握 localStorage 和 sessionStorage 的核心知识,以下是最重要的20%,这将帮助你理解和操作80%的功能: 基本概念: localStorage 和 sessionStorage 是 Web Storage API 的一部分,用于在客户端…...

剖析一下自己的简历第二条

剖析一下自己的简历第二条 背景前置说明可能会被问到的问题 背景 剖析一下自己简历, 增加对一些专业知识的掌握. 我的简历第二条是这样写的: “2. 熟悉JVM、JMM,包括内存模型,垃圾回收机制,了解其基本调优技巧并具备线上调优经验。”. 前置…...

利用Docker一键发布Nginx-Tomcat-MySQL应用集群

Docker简介,可以看上一篇文章: 为什么互联网公司离不开Docker容器化,它到底解决了什么问题?-CSDN博客 Docker体系结构 docker核心就是镜像和容器: 镜像就是应用程序的安装文件,包含了所有需要的资源&…...

九,[极客大挑战 2019]LoveSQL1

进入靶场 随便输输 试试字符 报错了 根据以上4张图知是单引号闭合 还以为这是flag呢,白激动一场,,,,,,,,自闭了 有个搞笑的点,其实可以用sqlmap 不过咱不用哈…...

17 go语言(golang) - 错误处理

错误处理 错误处理是编程中用于识别、响应和恢复程序运行时出现的错误和异常情况的过程。其目的是确保程序的鲁棒性(一个系统、模型或函数在面对错误输入、工作压力、意外情况或故意攻击时仍能保持稳定性和可靠性的能力),即使在出现错误的情…...

前端跳转路由的时候,清掉缓存

清除路由缓存的方法 ‌使用 $router.push() 方法‌:在跳转路由时,可以通过传递一个包含 replace: true 属性的对象来实现清除路由缓存。例如: this.$router.push({ path: "/new-route", replace: true }); ‌使用 $router.replace…...

CentOS使用chrony服务进行时间同步源设置脚本

CentOS使用chrony服务进行时间同步源设置脚本 #!/bin/bash# Created: 2024-11-26 # Function: Check and Set OS time sync source to 10.0.11.100 # FileName: centos_set_time_source_to_ad.sh # Creator: Anster # Usage: # curl http://webserver-ip/scripts/centos_set…...

AI RPA 影刀基础教程:开启自动化之旅

RPA 是什么 RPA 就是机器人流程自动化,就是将重复的工作交给机器人来执行。只要是标准化的、重复的、有逻辑行的操作,都可以用 RPA 提效 准备 安装并注册影刀 影刀RPA - 影刀官网 安装 Chrome 浏览器 下载链接:Google Chrome 网络浏览器 …...

深入解析Java集合框架:List集合及其实现类的应用与原理

|| 持续分享系列教程,关注一下不迷路 || || B站视频教程:墨轩大楼 || || 知识星球:墨轩编程自习室 || Java集合框架是Java编程语言中一个非常重要的组成部分&#xff0c…...

MySQL需掌握到何种程度?才能胜任工作

大家好,我是袁庭新。星友问:MySQL需要学到什么程度?才能胜任日常的软件开发工作呢!以下是一些建议的学习目标和程度,这些目标旨在帮助你在工作中高效地使用MySQL。 数据库的基本概念、MySQL的安装及配置、SQL的概念、S…...

如何使用brew安装phpredis扩展?

如何使用brew安装phpredis扩展? phpredis扩展是一个用于PHP语言的Redis客户端扩展,它提供了一组PHP函数,用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…...

力扣hot100道【贪心算法后续解题方法心得】(三)

力扣hot100道【贪心算法后续解题方法心得】 十四、贪心算法关键解题思路1、买卖股票的最佳时机2、跳跃游戏3、跳跃游戏 | |4、划分字母区间 十五、动态规划什么是动态规划?关键解题思路和步骤1、打家劫舍2、01背包问题3、完全平方式4、零钱兑换5、单词拆分6、最长递…...

时间同步服务器--Linux中

时间同步服务器 1. 时间同步服务 时间同步:多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等,利用NTP(Network Time Protocol )协议使网络中的各…...

银河麒麟V10-SP1设置redis开机自启

前言: redis安装请看:银河麒麟V10-SP1离线安装redis5.0.1_银河麒麟v10 redis5.0-CSDN博客 一、编辑自启文件 vim /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecS…...

JVM 之垃圾回收器

一、GC 的分类 1.1 串行 VS 并行 串行回收:指在同一时间段内只允许有一个 CPU 用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾回收结束 在单 CPU 处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的超过并…...

基于Java Springboot宠物咖微信小程序

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信开发者工具 数…...

求助——AssertionError: Attribute pipeline is missing from configuration.json.

我在本地运行Sunsimiao大模型的时候遇到了“AssertionError: Attribute pipeline is missing from configuration.json.”的问题。在网上找了很多问题都没有解决,求助一下广大网友。有什么好的解决方法吗? 本地环境如上所示,不知是哪里出…...

LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)

光照 glm::vec3 lightColor(0.0f, 1.0f, 0.0f); glm::vec3 toyColor(1.0f, 0.5f, 0.31f); glm::vec3 result lightColor * toyColor; // (0.0f, 0.5f, 0.0f); 说明:当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。 创建…...

vulnhub靶场【哈利波特】三部曲之Aragog

前言 使用virtual box虚拟机 靶机:Aragog : 192.168.1.101 攻击:kali : 192.168.1.16 主机发现 使用arp-scan -l扫描,在同一虚拟网卡下 信息收集 使用nmap扫描 发现22端口SSH服务,openssh 80端口HTTP服务,Apach…...

【开发语言】层次状态机(HSM)介绍

层次状态机(Hierarchical State Machine, HSM),从基本原理、结构设计、实现方法以及如何结合 Qt 进行具体实现等方面进行分析。 1. 层次状态机的基本原理 层次状态机是一种用于管理复杂系统行为的状态机模型,它通过将状态组织成…...

Midjourney Imagine API 申请及使用

Midjourney Imagine API 申请及使用 Midjourney 是一款非常强大的 AI 绘图工具,只要输入关键字,就能在短短一两分钟生成十分精美的图像。Midjourney 以其出色的绘图能力在业界独树一帜,如今,Midjourney 早已在各个行业和领域广泛…...

Function Arguments and Function Parameters (函数的实参和函数的形参)

Function Arguments and Function Parameters {函数的实参和函数的形参} 1. Object-Oriented Programming Using C2. Function Arguments and Function ParametersReferences 1. Object-Oriented Programming Using C https://icarus.cs.weber.edu/~dab/cs1410/textbook/index…...

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中,递归的实现会占用内存栈(Call Stack),每次递归调用都会在栈上分配一个新的 “栈帧(Stack Frame)”,用于存储本次调用的函数局部变量、返回地…...

六、文本搜索工具(grep)和正则表达式

一、grep工具的使用 1、概念 grep: 是 linux 系统中的一个强大的文本搜索工具,可以按照 正则表达式 搜索文本,并把匹配到的行打印出来(匹配到的内容标红)。 2、语法 grep [options]…… pattern [file]…… 工作方式…...

spaCy 入门与实战:强大的自然语言处理库

spaCy 入门与实战:强大的自然语言处理库 spaCy 是一个现代化、工业级的自然语言处理(NLP)库,以高效、易用和功能丰富著称。它被广泛应用于文本处理、信息提取和机器学习任务中。本文将介绍 spaCy 的核心功能,并通过一…...

嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压

引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…...

常用排查工具使用

1.spy++ Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。 在vs的工具中默认安装,还可以监控到隐层窗口,通过查看窗口的属性可以获得更多信息,包括规格、窗口、类、进程等信息,可以帮助排查相关窗口的问题。 2…...

用三维模型的顶点法向量计算法线贴图

法线贴图的核心概念是在不增加额外多边形数目的情况下,通过模拟细节来改善光照效果。具体流程包括: 法线的计算与存储:通过法线映射将三维法线向量转化为法线贴图的 RGB 值。渲染中的使用:在片段着色器中使用法线贴图来替代原有的…...

基于Matlab高速动车组转臂定位橡胶节点刚度对车辆动力学影响仿真研究

本研究针对高速动车组转臂定位系统中橡胶节点的刚度对车辆动力学性能的影响进行仿真研究。随着高速铁路的发展,动车组的运行稳定性和舒适性成为设计和运营的核心问题,其中,转臂定位系统作为动车组悬挂系统的重要组成部分,其性能对…...

PostgreSQL认证培训需要什么条件

PostgreSQL认证培训通常没有严格的前置条件,但以下几点可以帮助你更好地准备和通过认证考试: 1、基础知识:具备基本的数据库知识和经验,特别是对SQL有一定的了解。如果你Oracle、MySQL等基础知识,对对你学习PostgreSQ…...

Rust 图形界面开发——使用 GTK 创建跨平台 GUI

第五章 图形界面开发 第一节 使用 GTK 创建跨平台 GUI GTK(GIMP Toolkit)是一个流行的开源跨平台图形用户界面库,适用于创建桌面应用程序。结合 Rust 的 gtk-rs 库,开发者能够高效地构建现代化 GUI 应用。本节将详细探讨 GTK 的…...

Spring中每次访问数据库都要创建SqlSession吗?

一、SqlSession是什么二、源码分析1)mybatis获取Mapper流程2)Spring创建Mapper接口的代理对象流程3)MapperFactoryBean#getObject调用时机4)SqlSessionTemplate创建流程5)SqlSessionInterceptor拦截逻辑6)开…...

【数据分析】布朗运动(维纳过程)

文章目录 一、概述二、数学布朗运动2.1 数学定义2.2 布朗运动的数学模型2.21 标准布朗运动2.22 布朗运动的路径2.23 布朗运动的方程 三、布朗运动在金融学中的应用四、数学构造(以傅里叶级数为例)4.1 傅里叶级数的基本思想4.2 构造布朗运动 一、概述 布…...

静态页面 和 动态页面(Java Web开发)

1. 静态页面 1.1 什么是静态页面? 静态页面是指 HTML 文件直接存放在服务器上,不依赖后端逻辑处理而生成内容。客户端浏览器请求静态页面时,服务器直接将文件发送到客户端,浏览器负责渲染页面。 特点: 固定内容&am…...

linux模拟试题

Linux 基础阶段考试笔试模拟试卷 审核人:王旺旺 一.填空题(每题 1 分,共 30 分) 1.验证 httpd 服务是否启动的命令是_______ 答:systemctl status httpd 或 netstat -anptl 或 ss -anpt 2.将目录 xxhf 下所有文件的所属组改为 user1 的命令是_______ 答:chown -R ,user1 …...

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类,用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2(api8)之后新增的一个,该类为…...

典型的1553B网络

典型的1553B网络 1553B总线BUS A和BUS B是互为冗余的、完全对等、物理隔离的两个网络。每一个节点设备也配置有互为冗余的A、B两个1553B接口,分别接入BUS A和BUS B。系统完成初始化配置后,首先采用BUS A来通讯。工作过程中,如果发现BUS A的工…...

【C++】内存管理

【C】内存管理 一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1、new 和 delete 操作内置类型2、new 和 delete 操作自定义类型 四、operator new 和 operator delete 函数五、new 和 delete 的实现原理1、内置类型2、自定义类型3、new和delete不匹配的报错 六、…...

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我,能不能做个文档加密功能,就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了,那必须可以。 需求:将 pdf 文档经过加密处理,客户下载pdf文档,打开文档需…...

常见排序算法总结 (三) - 归并排序与归并分治

归并排序 算法思想 将数组元素不断地拆分,直到每一组中只包含一个元素,单个元素天然有序。之后用归并的方式收集跨组的元素,最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的,拆分数组时会自然地将元素分成有先后…...