回到主页Meilisearch 的标志
返回文章
2025年4月30日

为什么不应该为 RAG 使用向量数据库

关于构建更好检索增强生成系统的逆向思考。

Thomas Payet
Thomas PayetMeilisearch 联合创始人兼首席运营官@totolapaille
Why you shouldn't use vector databases for RAG

什么是 RAG,以及你为什么要关心它?

每天,数百万人与 ChatGPT、Claude 和其他大型语言模型互动,从根本上改变了我们与计算机互动的方式。其吸引力显而易见:用户无需学习特定的界面,只需用自然语言进行交流即可。机器适应人类,而非人类适应机器。

这一转变促使组织争相使用自己的数据创建类似的体验。无论是构建能理解产品文档的支持聊天机器人,还是打造能撰写个性化电子邮件的助手,抑或开发帮助员工访问公司知识的内部工具,它们都需要相同的基础:让大型语言模型能够访问专有信息。

检索增强生成(RAG)应运而生,其概念看似简单,实则不然。

  1. 用户提出问题
  2. 系统根据该问题检索相关文档
  3. 大型语言模型利用这些检索到的文档作为上下文生成答案

如果实施得当,RAG 可以提供更准确、更及时的响应,同时减少幻觉。但大多数工程师都在这里犯了错误:他们默认使用向量数据库,却没有考虑这是否是最佳方法。

工程师的捷径:向量数据库

典型的 RAG 实现看起来是这样的:

User Question → Convert to Embedding → Query Vector DB → Retrieve Similar Documents → Generate Answer

这在直觉上是合理的。向量嵌入捕获语义意义,因此相似的概念在向量空间中会聚集在一起。通过将问题和文档转换为相同的嵌入空间,即使确切的关键词不匹配,你也能找到相关信息。

工程师们喜欢这种方法,因为它看起来很优雅。你不需要复杂的查询解析或关键词匹配——只需将所有内容转换为向量,然后让相似性算法完成工作。

但这种捷径会产生两个严重问题,显著降低结果的质量。

问题1:未经优化的查询导致不相关结果

第一个主要问题发生在初始步骤:我们直接将原始用户查询转换为嵌入,并用它来检索文档。

想想你使用 Google 时会发生什么。你并非总是用实际的问题进行搜索——你会将其提炼成更有可能产生相关结果的关键术语。如果你想知道“在大型项目中组织 React 组件的最佳方法是什么?”,你可能会搜索“React 组件组织最佳实践 大型应用”。

大型语言模型擅长这种查询优化,但在标准的向量数据库方法中,我们跳过了这个关键步骤。嵌入捕获了原始问题的语义意义,但这并不总是与最佳搜索查询保持一致。

问题2:向量搜索为了召回率而牺牲精确度

第二个问题更具根本性:与传统的全文搜索相比,向量相似性搜索在召回率方面表现出色,但在精确度方面往往较弱。

向量搜索擅长查找概念上相关的内容(召回率)——即使它们使用不同的术语,也能找到讨论相似主题的文档。然而,它在精确定位你所需内容(精确度)方面效果较差。

另一方面,全文搜索优先考虑精确度。当存在精确的关键词匹配时,它们通常高度相关。但其缺点是,全文搜索可能会遗漏使用不同术语但概念上相似的内容。

这解释了为什么许多完全依赖向量数据库的 RAG 系统在初始检索后会实施额外的重排序步骤。这也是为什么向量数据库越来越多地增加全文检索功能——它们认识到纯向量搜索的固有局限性。

更人性化的 RAG 方法

既然我们试图构建模仿人类智能的系统,难道我们不应该将 RAG 管道的结构设计成反映人类实际搜索信息的方式吗?

当人们需要查找信息时,他们会:

  1. 将问题重新表述为有效的搜索词
  2. 使用为检索相关信息而优化的搜索引擎
  3. 扫描结果以识别最有用内容

更好的 RAG 设计将遵循以下模式:

User Question → LLM Refines Into Search Query → Hybrid Search (Combining Full-text and Semantic) → Retrieve Relevant Documents → LLM Generates Answer

这种方法解决了这两个问题:

  1. 大型语言模型将用户的原始问题提炼成优化的搜索查询
  2. 混合搜索结合了全文搜索的精确度和语义搜索的召回率

解决方案:使用搜索引擎实现更简单(更优)的 RAG

我的逆向思考是:与其直接为 RAG 跳到向量数据库,不如从一个结合了全文和语义功能的高质量搜索引擎开始。

Meilisearch 等现代搜索引擎提供混合搜索功能,其整体相关性优于纯向量检索。它们还具有以下优点:

  • 更易于部署和维护
  • 针对大规模快速查询进行了优化
  • 以相关性为主要目标进行设计
  • 更直观地调试搜索结果

对于大多数 RAG 应用程序来说,工作流程变得更加简单:

  1. 用户提交一个问题
  2. 大型语言模型将该问题转换为有效的搜索查询
  3. 搜索引擎使用混合搜索检索相关文档
  4. 大型语言模型利用这些文档作为上下文生成响应

这种方法与人类实际搜索信息的方式保持一致,利用了大型语言模型和搜索技术的优势,同时避免了不必要的复杂性。

RAG 中的简单性力量:回归搜索基础

向量数据库在机器学习生态系统中确实有其地位,但它们并非总是 RAG 系统的最佳基础。通过退一步思考人类如何搜索信息,我们可以构建更有效、更简单的 RAG 架构。

下次你设计 RAG 系统时,考虑一下一个好的搜索引擎是否是更好的选择。你的用户(以及未来维护系统的你)会感谢你。

立即构建更好的 RAG 系统

无需向量数据库的复杂性,使用 Meilisearch 的混合搜索功能,即可在几分钟内为你的 RAG 应用程序部署生产就绪的搜索。

How to build a search engine in PHP: Step-by-step guide

如何在 PHP 中构建搜索引擎:分步指南

通过这份可操作的分步教程,了解如何在 PHP 中轻松构建搜索引擎。

Ilia Markov
Ilia Markov2025年6月5日
Building a JavaScript Search Engine: Tutorial, Examples & More

构建 JavaScript 搜索引擎:教程、示例及更多

通过这份可操作的分步教程,了解如何在 JavaScript 中轻松构建搜索引擎。

Ilia Markov
Ilia Markov2025年6月3日
How to Make a Search Engine in Python: Step-by-Step Tutorial

如何用 Python 制作搜索引擎:分步教程

通过这份详细的分步教程,了解如何轻松地用 Python 制作搜索引擎。

Ilia Markov
Ilia Markov2025年5月29日