导读随着深度学习广泛应用于多种场景,一切皆可embedding已成为行业共识,同时对embedding的产物——向量的检索需求也随之出现。然而,向量检索和传统结构化数据检索所面临的挑战并不完全相同。本文将介绍抖音在向量检索方面逐步迭代的工程实践经验。
主要内容包括以下方面:
1. 向量数据库产生的背景
2. 向量数据库的技术演进
3. 向量数据库的应用展望
分享嘉宾|杨涛 抖音 系统架构师编辑整理|王创峰内容校对|李瑶出品社区|DataFun01
向量数据库产生的背景
1. 非结构化数据检索问题结构化数据是指可以表示成二维表格的数据,它有明确固定的字段和类型。而非结构化数据是指不能表示成二维表格的数据,例如:文本、图片、视频。抖音集团的产品矩阵每天都会产生海量的数据,其中结构化数据只占一小部分,大部分数据都是非结构化数据,业界通常认为非结构化数据会占全部数据的80%,但是对于抖音集团的业务形态,非结构化数据的占比只会更高。如何利用好这些非结构化数据对我们产品功能的完善,业务效果的提升都至关重要。 对非结构化数据的检索,以文本检索为例,传统上使用倒排索引,结合BM25,TF-IDF算法进行。这种方法有一些问题:3. 从检索算法到向量数据库
把向量检索的这些功能整合起来,就形成了向量数据库。向量数据库的接口包括存储和检索向量。在功能划分上,包含存储、检索和分析。同时,作为在线服务,高可用、高性能和易用性都要具备。完成这些后,一个具备核心向量检索功能的向量数据库就诞生了。这是一个存算一体的向量数据库。 02向量数据库的技术演进1. 向量标量混合检索当向量数据库推向业务场景时,我们发现,向量数据通常与结构化数据配合使用。例如,在将文档表示为向量的同时,还需要存储文档所属的部门,以方便在检索时进行权限过滤。这类需求可以抽象为使用与向量相关的结构化数据进行过滤。
业界对于这种过滤需求通常有两种解决方案:
后过滤。将topK的结果扩大一定倍数,检索出更多的向量,然后用结构化数据做过滤,留下topK个。对于向量检索和DSL过滤结果的重合较少的情况,可能会出现召回结果不足topK的情况。因此,这种方法适用于结构化过滤掉的比例较低,向量召回结果比例较高的场景。
先过滤。先使用DSL过滤数据集,然后在结果中进行向量检索。这种方案适用于DSL过滤结果较少的场景;如果结果较大的话,性能会有明显的下降。
业界通常结合两种方案,对检索任务进行编排,通过分析数据分布,来决定使用哪种方案。但是,随着数据量的增加,仍然可能会出现两种检索链路性能都不好的情况。
抖音集团实践:为解决这一问题,技术团队研发了DSL定向引擎,支持在检索过程中同时进行向量检索和DSL过滤(结构化过滤)。该引擎具有以下特点:
高性能:因为在进行DSL过滤时,只需提取部分向量进行相似度计算,这会打断内存连续性,从而降低向量检索的性能。因此,DSL过滤判断的开销必须足够低,要求它远低于向量检索的开销,以确保在线检索性能。
逻辑完备:DSL语法可以支持根据场景和用户的不同定制相应的检索过滤条件,以支持业务在线检索。
按需终止:如果在向量检索和过滤过程中遍历了足够多的节点,可以保证检索效果,则应尽快退出该检索过程。
执行计划优化:根据DSL过滤结果预估结合向量分布情况,综合决策要执行的检索链路。
除了DSL定向引擎之外,我们还实现了子索引拆分、自适应精度调节和在线多路索引归并等多种定制化能力,打造了一整套向量检索工具库。
2. 存算一体升级为存算分离尽管功能逐渐完备,但我们向量数据库在初期是基于存算一体(存储和计算都在同一台机器上)的架构实现的,但在推广过程中,这种架构在使用上的一些问题也逐渐显现出来。比如在文档检索的场景中,一部分文档质量较高,需要高精度的召回,全局的文档作为补充,我们还需要区分部门内和部门外的文档列表来分开展示。这就要求在同一份向量数据上产生不同的可检索集、不同精度的索引以及不同的候选集。在存算一体框架下,为了避免影响线上检索流程,我们使用少量线程异步地完成索引的重建流程。为适配数据分布的变化,这个索引还要定期重建。另外,在有些业务场景中,需要使用不同候选、不同精度的检索策略。如果为每种策略都建立一套索引,这会进一步放大索引构建的资源消耗,导致索引构建效率低、还会影响在线服务稳定性。为此,我们逐步开展了存算分离的架构升级工作。我们的存算分离架构,主要分成三个部分:3. 流式更新
随着对时效性要求较高的业务接入,如何有效的提升新内容的检索效率,成为业务关注的重点。例如,在文档检索场景中,如果一篇文档刚写完,或者新授权了一个文档,用户需要等待半个小时才能检索到,这在业务上是无法接受的。为了解决这个问题,我们开发了流式更新能力。加入了流式更新能力的索引构建过程分为两个部分。4. 云原生转变
随着抖音集团产品矩阵中的产品越来越多接入向量数据库,为每个业务都搭建一套存算分离的框架的成本较高,包括部署成本、运维成本和硬件成本。为解决这一问题,我们对存算分离的框架进行了进一步迭代。多租户编排改造
自动化调度
用户接入时,通过我们的多语言SDK或http API写入自己的非结构化数据。然后,使用查询分析工具对数据进行管理和分析。进行简单配置后,即可自动化调度。从非结构化数据到向量生产的pipeline,都通过平台自动化调度实现。数据写入完成后,还支持在索引上线前进行自动调参,上线后进行流式更新,以及持续的自动调参以优化整体在线检索效果和资源成本。在在线检索阶段,支持整体服务的按需自适应弹性调度。从数据写入到在线检索的各个阶段,有全链路的监控和告警,以保证在线服务的稳定性。基于这套产品,我们预期会在大语言模型的智能问答、智能搜索、智能推荐广告、版权去重等场景下展开广泛应用。
这套云原生向量数据库有以下几个关键优势。
极致性能:内置多种火山引擎内部自研索引算法,支持内部多个百亿库,百亿级向量检索规模,检索性能在10ms内。
实时性:支持向量数据实时写入、实时更新,支持实时索引、自动索引。
稳定高效:存算分离架构,单数据多场景,节约计算资源,提高在线稳定性,保证高可用性。
多场景最佳实践:20+内部业务,多个百亿级别库检索实践,内部多个大模型场景的落地实践,例如:飞书问答,飞书文档,搜索中台、电商搜索等。
补充大模型长期记忆。对于多轮调校和个性化回答,把调校过程和用户的问答结果都通过文本编码写入向量数据库中,然后在用户提问的过程中,把问题转化为向量,在向量数据库中查找长期记忆去回顾历史,找到和当前问题最相近的历史调校结果和用户自己的问答,灌入大语言模型的context中优化整个回答的质量。
补充特定领域知识。可以在向量数据库中灌入领域知识。在用户提问的时候,提前把相关的文本信息检索出来,灌入大模型的context中,去优化大语言模型在专业领域的回答效果。
优化大模型的时效性问题。比如实时热点新闻,可以通过流式更新能力,把实时信息写入向量数据库中。在用户提问实时热点问题时,通过向量数据库把热点信息检索出来,放到大语言模型的上下文中去优化回答效果。
分享嘉宾
INTRODUCTION
杨涛
抖音
系统架构师
在抖音向量检索数据库团队负责向量检索引擎开发。
限时免费资料
往期优质文章推荐
往期推荐
火山引擎VeCDP:如何0-1构建与应用标签体系
纵腾湖仓全链路落地实践
知乎的缓存加速:Presto的进化实战(长文解读)
AI基础软件:如何自主构建大+小模型?
探索大模型技术在自智网络方向的应用前景(推荐收藏)
阿里巴巴数据模型设计与构建实践
B站数据质量保障体系建设与实践
轻松利用日志动态分析平台玩转Nginx运维管理
九章云极DataCanvas多模态大模型平台的实践和思考
开源数据库 MatrixOne 的 HTAP 分布式架构演进
关注我们获取更多信息......