作者 | 张颖峰
导读:向量数据库的争议差不多一年了,但我们一直缺少一篇能透彻讲解向量数据库相关问题的文章,这导致在这个领域的讨论一直没有得到充分的澄清。在这篇文章中,我们将深入剖析向量数据库核心技术的争议点,解释其优势和局限性,为读者提供全面而清晰的了解。本文作者的原标题是《向量数据库路在何方?结合 RAG 的发展谈谈它的未来》。
数据库网红教授 Andy Pavlo 于 2024 年 1 月 4 日他的博客发表了 2023 年度数据库报告,正文开始就提到了向量数据库的兴起。对于所有数据库从业人员来说,都知道 2023 年是向量数据库的大年,这从 2023 年 3 月英伟达的黄仁勋在 GTC 大会上点名向量数据库开始,到 2023 年 4 月一系列向量数据库的巨额融资都可以感受出来。
截至 2023 第三季度,向量数据库的火热都是以它作为大语言模型的外挂记忆体作为场景定义而出现的,从 2023 年第四季度开始,这个场景的称谓,被更多的接纳为 RAG(Retrieval-Augmented Generation)——基于检索增强的内容生成, 并且 RAG 这个称谓逐渐流行,甚至已经有说法认为 2024 年是 RAG 元年。
因此在这里,我们结合 Andy 在博客中的观点,结合 2023 年以来 RAG 的出现和兴起,以及发展中出现的问题,给出我们对向量数据库未来发展的判断。
RAG 的兴起与向量数据库
RAG 一开始就致力于解决大语言模型(LLM)本身存在的一些问题。当 LLM 刚刚火热起来时,就涌现了对其如何处理个人或企业内部的私有数据进行回答的需求。如果一切都仅凭 LLM 本身,这会导致三个问题:
针对这些问题,RAG 的做法是:把私有数据先用工具切分好,然后通过一个 Embedding 模型转成为向量保存到向量数据库。回答问题的时候,先把问题也转化为一条向量,再用该向量去数据库内进行 Top K 相似度比对,然后把返回的结果拼接成提示词,交给 LLM 回答,就可以满足对私有数据提问的需求。
RAG 的工作流程如下图:
由于这种搭载向量数据库的做法直接解决了上面三个痛点,因此它一出现,就引起了众多注意,这就是 2023 年上半年向量数据库火热的主要缘起。
在这个生态中,核心组件包含三个部分:LLM 负责最后问题的摘要和润色;向量数据库保存数据;还有 LangChAIn 和 llama_index 这样的中间件负责其他的部分,主要包括:把文档切分好转化为向量,连接向量数据库和 LLM 以及拼接提示词。
由于单纯的向量搜索技术门槛有限,这一时刻也引发了对向量数据库的广泛讨论:
这些问题似是而非,而支持向量数据库的一方却只是围绕着“向量索引的性能”、“对大规模向量查询的支持能力”以及“向量数据库的易用程度”来进行辩护,却未真正提供强有力的观点。
另一方面,随着 RAG 在更多场景中的应用,一些问题逐渐显露出来:
因此,由于 RAG 在使用过程中的效果不佳,而导致这些不佳的原因又不是向量数据库自身能解决的,因此针对向量数据库的技术讨论,逐渐迷失在 RAG 本身的循环反复之中。
让我们抽丝剥茧,来探讨 RAG 究竟需要什么。先抛论点在前:在我们看来,RAG 本质上是企业搜索引擎在 LLM 时代的进化。
RAG 和搜索引擎
搜索引擎是最早的人工智能之一,站在使用者的角度,搜索引擎与 LLM 大模型类似:由爬虫抓取的互联网数据经过处理后建立倒排索引,对于企业搜索引擎来说,就是连接企业内部的数据源,对它们建立好索引。用户的查询请求会被转化为若干关键词,然后由倒排索引返回 Top K 个粗筛结果。这 Top K 个粗筛结果根据一些相对固定的因子进行排序,比如 Web 搜索引擎中的 PageRank 或者企业搜索引擎中的文档词频统计信息如 TF/IDF 等。粗筛之后还需要对返回结果作精排。精排通常需要基于机器学习模型,模型根据用户以往基于查询和返回结果的点击日志训练得到。对于个性化搜索来说,还要加上用户的以往点击和搜索偏好等。精排的结果仍然是原始数据,但由于它是经过多轮从粗筛到精排乃至重排序后的结果, 可以尽可能地把用户最希望看到的结果放到最前。
而 LLM 大模型是一种生成式模型,它返回的并不是 Top K 记录,而是根据用户的提问生成的最终答案。当用户的提问意图是问答类型时,LLM 返回的结果就可以类比为对搜索引擎返回的 Top K 个结果的总结,从而避免用户再回到原始数据中去发现,极大提升了搜索体验。
当然 LLM 还可以处理其他类型的用户提问,比如逻辑推理、代码生成,跨模态内容生成等,跟 RAG 密切相关的主要就是问答。如果把 LLM 直接应用到企业内搜索,一样需要解决传统企业搜索引擎已经解决过的问题:企业内部数据如何访问,企业最新实时数据如何访问,如何根据权限返回用户权限内的内容,等等。
基于以上 RAG 架构的 LLM 与搜索引擎在使用上非常相似,但是它们有两个核心区别:其一是向量数据库和倒排索引,其二是 RAG 的最后一步必须要由 LLM 来根据 Top K 个返回文本生成最终答案。
搜索引擎采用的倒排索引,是基于分词后的结果,倒排索引会根据文章内的不同词的统计信息建立词与包含这些词的文档间的映射关系。相应的查询则是通过把问题变为关键词,再从索引中获取结果。倒排索引天然具备精确的特点,但它仅仅是关键词的映射,很难具备强语义关系,这跟向量数据库正相反:利用向量可以很轻松的对一段话查询容易到语义接近的结果,因为这段话可以表征为一个或者多个向量,只需要找出与查询向量最接近的 Top K 即可。
再来看其二,搜索引擎通过倒排索引得到结果之后,经历了从粗筛到精排乃至重排序的过程,最后展现给用户的实际是经过排序后的 Top K 个原始文本,用户仍然需要从这些 Top K 个文本中获取真正的答案。LLM 则是直接给出最终答案。在 RAG 架构中,这些最终答案是根据包含了语义关系的向量搜索返回的 Top K 结果生成的。可以说,RAG 架构的 LLM 的核心能力是从用户的查询结果中生成摘要,通过限定输入的方式减少非 RAG 架构的 LLM 可能产生的幻觉现象。此时,查询返回的 Top K 个结果就成了参考文献,用户只需查看 LLM 生成的最终答案,如果不确定答案再到这 Top K 个结果中查看原文验证。
因此,RAG 架构的 LLM,更符合企业内部检索的需求,RAG 其实就是 LLM 时代由企业搜索引擎进化而来。我们来看几个例子:
根据我们对各行业 RAG 落地效果的总结,再结合其他不同行业的 RAG 实施经验,对如何提升 RAG 的效果,已经逐步形成体系。这些经验和体系,总结下来,可以归纳为三大核心需求:
这三大核心需求中除了第一点是在数据库以外完成,其余两点都可以在数据库内部完成,这本质上是综合了向量搜索和全文搜索的更高级搜索引擎——传统的数据库无法服务好 RAG ,是因为缺乏以下这些搜索引擎必备的组件:
举个例子,PostgreSQL 是一款 OLTP 数据库,OLTP 的核心设计目标是确保数据写入的 ACID,而这跟向量和全文搜索都不相关。尽管 PostgreSQL 有全文搜索的功能,而且已经存在十多年了,为何至今企业仍然采用 Elasticsearch 而不是 PostgreSQL 进行全文搜索呢?这是因为 PostgreSQL 的全文搜索只适合小数据规模的简易搜索,而一款能够服务好 RAG 的数据库需要胜任各种数据规模,进行可定制的相关度排序,尤其还需要与向量进行多路召回的融合排序,这些都是 PostgreSQL 没有办法胜任的。
所以,纯向量数据库固然无法满足 RAG 的要求,而实现了向量搜索能力的传统数据库,同样无法满足 RAG 的要求。
那么,用一个搜索引擎比如 Elasticsearch 来服务 RAG,是否就足够了呢?它有多路召回(同时提供全文检索和向量搜索),也有基于 RRF 算法的融合排序。然而,即便如此,这仍然不够。
在企业内部会面临各种数据源,我们设想这样一个简单的场景:根据权限来查找出符合要求的答案,然后将这些答案交给 LLM 返回。假定权限是在一张表中,我们需要把这个表的字段同步到 Elasticsearch 的 collection,这意味着三件事:
因此,一个良好的企业级 RAG 需要一个以完整功能的数据库为核心,辅助以各类工具,包括良好的文字切分和 embedding 模型,更好的融合排序模型特别是针对垂直业务或者不同企业内部的各种排序模型和查询扩展,才能达到满意的效果。
Elasticsearch 在十多年前就是企业搜索引擎,它相比数据库的一个显著区别是它没有执行引擎组件:收到搜索请求以后,直接从倒排索引获取数据后排序返回,所有工作都在一个线程中完成。而执行引擎的一条查询请求进来之后会被编译成计算图,然后以流水线的方式在计算图流转,引擎会根据可用资源的数量决定计算图每个节点使用的并行度。缺乏执行引擎在应用层面的表现就是无法为企业内的各类精确信息查找提供足够的访问能力。
RAG 的未来
前面提到的关于向量数据库本身的似是而非的问题,我们已经解答完毕。还有一些问题,虽然并不重要,但它们在一段时间内确实也影响了很多人的判断,在这里一并回答:
以上,也正是我们开发全新的 AI 原生数据库 Infinity 的初衷,它已于 2023 年冬至前开源(https://Github.com/infiniflow/infinity/),具备多路召回,融合排序,也提供结构化数据查询能力。
让我们再回到开始,回顾 Andy 的 2023 年数据库年报。在年报中,Andy 和 Weaviate 的 CTO 讨论了向量数据库未来可能朝两个方向发展。
方向一,向量数据库支持传统 DBMS 的功能,支撑运营性质的负载(operational workloads,通常即为在线负载);方向二,向量数据库充当一个索引数据库的角色,类似 Elastic 或者 Vespa ,它与主数据库协同工作。Infinity 其实是这两条路线的结合:相比传统数据库,它是一个更高级的搜索引擎,具备 RAG 所需要的一切能力;相比 Elasticsearch 这样的搜索引擎,它具备数据库的能力,拥有数据库必备的执行引擎,可以支撑企业内部对于在线业务的各类访问需求。
因此,我们把它看作是为 AI 配套的第三代数据库基础设施:
作者简介:
张颖峰,英飞流(InfiniFlow)创始人,连续创业者,先后负责 7 年搜索引擎内核研发,5 年数据库内核研发,10 年云计算基础架构和大数据架构研发,10 年人工智能核心算法研发,包括两代广告和推荐引擎,计算机视觉和自然语言处理。先后主导并参与三家大型企业数字化转型,支撑过日活千万,日均两亿搜索动态请求的 C 端互联网业务。