ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大模型技术全景(二十二):RAG 数据入库与向量数据库

大模型技术全景(二十二):RAG 数据入库与向量数据库


📚 本文收录于「流浪」的系列专栏

🐧Linux系统⚙️C++
📊数据结构与算法🐍Python
🔗LangChain & LangGraph🗄️MySQL 数据库
🌿Git 工具🌐计算机网络
🤖LLM💯大厂面试、八股
📚学习筑基专栏

🏠 博客主页:流浪 | 📝 原创首发于 CSDN


上一篇我们把嵌入这件事讲透了:文本被转成一列数字,语义相近的对象在向量空间里靠得更近,相似度用什么距离算、模型怎么选,都是那一篇的事。向量算出来之后还面临一个很现实的问题——它得有地方放。放内存里进程一重启就没了,放普通数据库里又查不动,因为「找出最相似的十条」这种问题,传统数据库的索引结构根本答不上来。本篇接着讲知识库构建的最后一环:数据入库,也就是向量存到哪、一条记录里到底要存哪些东西。


一、数据库与数据库管理系统

1.1 数据库是存放数据的仓库,DBMS 是管理这个仓库的软件

  • 数据库(Database)是存放数据的仓库,它的存储空间很大,可以存放百万条、千万条、上亿条数据,但这些数据并不是随意堆放的,存放得有规则,否则查询效率会很低。
  • 数据库管理系统(DBMS)是用于管理数据库的软件,通过接口或者 SQL 这类语言来实现数据的增删改查(CRUD)。
  • 两者的关系可以拿手机通讯录来对照:通讯录里实际保存的所有联系人信息(姓名、电话、地址),就像一本写满了记录的本子,这就是数据库;而手机上那个用来管理通讯录的软件(iOS 的通讯录 App 或者 Android 的联系人应用),就是 DBMS。
  • 增删改查对应的就是通过这个 App 对通讯录做的四种操作:新建联系人是增,删掉过时联系人是删,把张三的号码改成新号码是改,搜索「张三」找到他的电话是查。

数据库管的是数据本身,DBMS 管的是怎么存取这些数据,两者是「仓库」和「仓库管理系统」的关系。

1.2 传统数据库擅长精确匹配,回答不了语义相似

  • 传统数据库擅长的是精确匹配和范围查询,比如找出 id 等于 123 的那条记录、找出价格低于 50 的商品,支撑这些查询的是 B 树、哈希这类索引结构。
  • 但「找出跟这个向量最相似的十条记录」这类问题它回答不了:语义相似没有精确边界,只能算出距离再排序,而 B 树、哈希索引不是为这种查询设计的。
  • 普通数据库当然也能把向量存进去,问题在于存进去之后没法高效地做近似最近邻搜索,数据量一大就只能遍历全表算距离。

数据库擅长的是「等于」「大于」这类确定性判断,而检索要的是「最像谁」这个排序问题,两者压根不是同一类查询。


二、向量数据库是什么

2.1 向量数据库专为高维向量的存储、索引和查询而设计

  • 向量数据库是一种专为高效存储、索引和查询高维向量数据而设计的数据库系统,它通过将非结构化数据(文本、图像、音频、视频)转化为数值向量,实现基于语义相似性的快速查找,而非传统的关键字匹配。
  • 简单说,它就是存放向量的数据库,是支撑大模型和语义搜索的核心基础设施。
  • 它和传统数据库的差别不在「能不能存」,而在「能不能查得动」:向量数据库内置了专门面向向量的索引结构,这是普通数据库没有的东西。

向量数据库的专用性体现在索引上,能不能在千万、亿级向量里毫秒级返回 Top-K,全看这层索引。


三、向量数据入库

3.1 入库是把向量连同原文和元数据一起存进向量库

  • 向量数据入库,指的是把非结构化数据(文本、图像等)转化成的固定长度浮点数数组,连同原始数据、元数据一起存储到向量数据库中。
  • 注意这里存的不只是向量:向量是给机器算距离用的,人要看和大模型要读的是原始文本,两者必须一起落库。

入库不是把一堆数字塞进去,是把「可计算的向量」和「可读的原文」绑成一条记录存下来。

3.2 入库首先解决的是检索效率问题

  • 高效检索是最直接的原因:普通数据库无法对向量做近似最近邻搜索,而向量数据库内置了 HNSW、IVF 这类专门的索引,能在百万、亿级向量中快速找到最相似的 Top-K 个结果。
  • 这个差别可以拿一件具体的事来看:警察局有一张模糊的嫌疑人照片,需要从全市 1000 万人的身份证照片库里找出最相似的 10 张脸。
  • 如果这些人脸数据放在表格里,用「眼睛颜色=棕色」「鼻子高度=2.5cm」这种字段去匹配,那么另外一些长得像、但字段不完全对上的脸根本匹配不出来,因为你没法把「像」写成一条等值条件。
  • 向量数据库提前把每张人脸照片转换成一个几百个数字的特征向量,输入模糊照片时也转成向量,就能在秒级内找出最相似的 Top-10,即使库里有上千万张也很快。

结构化字段只能回答「是不是」,向量才能回答「像不像」,人脸比对、语义召回这类模糊匹配天生就是向量的活。

3.3 入库还解决持久化与重复计算的问题

  • 持久化管理是第二个理由:入库之后数据被持久化保存,避免每次查询都重新对所有文档做一遍 Embedding,同时还能支持增删改查和版本管理。
  • 这一点可以拿手机相册来对照:照片拍完只要不删除,它就一直在,下次打开相册直接就能看,不用重新拍一遍。
  • 反过来说,如果不入库,每次提问都要把整个知识库重新算一遍向量,算力成本和响应延迟都扛不住,重复 embedding 是 RAG 里最典型的浪费之一。

入库把「一次算好的向量」固化成资产,之后每次检索只需要给查询算一次向量,而不是给整个库重算。


四、入库时的典型数据结构

4.1 一条入库记录包含四个部分

一条典型的入库数据包含下面四类内容:

字段说明示例
唯一 ID用于快速定位和更新记录的标识符doc_12345_chunk_3
向量Embedding 模型输出的数值数组(如 768 维或 1536 维 float 列表)[0.01015, -0.06574, -0.01490, -0.06823, …]
原始文本块向量对应的原文片段,最终送给大模型生成答案向量数据库是一种专门存储向量并支持相似性搜索的数据库
元数据来源文件、页码、时间戳、作者等,用于过滤或展示file 为 RAG 指南,page 为 42,author 为张三,timestamp 为 2025-03-20

4.2 四个字段各管一件事,少一个都会出问题

  • 唯一 ID 管定位:没有它,要更新或者删除某一条就变成全表扫描,检索结果也没法稳定地对回原文档的某一块。
  • 向量管检索:它是唯一参与相似度计算的部分,维度和度量方式必须和查询侧用的是同一套,否则算出来的分数没有意义。
  • 原始文本块管生成:向量本身不可读,最终要喂给大模型的是原文,检索命中的是向量、真正用到的却是这段文本。
  • 元数据管过滤和溯源:按部门、按时间、按文档类型缩小检索范围靠它,回答时给出处、告诉用户这条来自哪份文件第几页也靠它。

四段里向量决定能不能被检索到,原文决定能不能生成答案,元数据决定检索范围能不能收窄,缺哪一段这条记录都不完整。


五、常见的向量数据库

5.1 十款常见向量数据库一览

数据库简介官网
Milvus为大规模相似性搜索设计的云原生向量数据库,支持 CPU/GPU 异构计算,可扩展至数十亿向量,是生产级应用的热门选择milvus.io
腾讯云向量数据库(Tencent Cloud VectorDB)腾讯自研的企业级分布式向量数据库服务,可处理十亿级向量,满足毫秒级实时更新,并提供全套 AI 集成方案腾讯云
火山引擎向量数据库(VikingDB)字节跳动旗下的高性能向量数据库,支持多模态向量化存储与检索,可实现百亿级向量的毫秒级检索火山引擎
向量检索服务 DashVector基于阿里自研引擎 Proxima 的全托管云原生向量数据库,专为大模型、多模态检索等场景设计,可与通义千问等 AI 服务无缝集成阿里云
向量检索服务 Milvus 版全托管、兼容开源 Milvus 的云服务,在开源版基础上增强了稳定性和可扩展性,方便自建集群迁移上云阿里云
Zilliz Cloud由 Milvus 原厂打造的全托管 SaaS 及 BYOC 服务,提供开箱即用、深度优化的 Milvus 体验,并具备智能运维能力Zilliz
Pinecone全托管的无服务器向量数据库,以易用性、高性能和自动扩展能力著称,是快速上线生产应用的流行选择Pinecone
Elasticsearch老牌分布式搜索引擎,通过插件支持向量检索,可实现「关键词 + 语义」的混合搜索Elastic
PGVectorPostgreSQL 的开源扩展,使其原生支持向量数据类型和相似性搜索,适合希望统一操作型数据和向量数据的团队GitHub
Redis通过 RediSearch 模块支持向量检索,可利用其内存存储实现亚毫秒级低延迟搜索,适合高吞吐、实时性要求高的场景Redis

5.2 选型看的是数据规模、运维方式与既有技术栈

  • 数据规模是第一道分水岭:百万到千万级用 PostgreSQL 加 PGVector 这类扩展就够用,量级再往上、尤其是要支撑亿级向量时,就得考虑 Milvus 这类原生分布式方案。
  • 运维方式是第二道:不想自己维护集群就选全托管服务(Pinecone、Zilliz Cloud 以及各家云的向量检索服务),要私有化部署就选自建开源方案(Milvus、PGVector、Redis)。
  • 既有技术栈往往起决定作用:已经在用 PostgreSQL 的团队直接上 PGVector 最省事,已经在用 Elasticsearch 的直接用它的向量能力做「关键词 + 语义」混合检索,比单独再引进一套库划算。
  • 还要留意索引能力的差别,专用向量库提供 HNSW、IVF 等索引和参数调优空间,扩展型方案在超大规模下的内存和延迟表现会先遇到瓶颈。

选型不是在挑「最好的库」,是在挑规模扛得住、运维接得住、和现有技术栈接得上的那一个。


六、本篇小结

  • 入库是知识库构建的最后一环,前面加载、分块、嵌入三步的产出,到这一步才真正变成可检索、可持久化的资产。
  • 一条入库记录里,向量管检索、原文管生成、元数据管过滤、唯一 ID 管定位,四段各司其职,少一段都不完整。
  • 存进去之后就轮到用的时候了:用户提问、查询向量化、向量检索、提示词增强、大模型生成,这套流程是下一节的内容。

构建阶段到这里收尾,向量已经落库,接下来要解决的是「用户一句话进来,怎么把最相关的那几块捞出来并变成答案」。


七、文末面试题(全真题)

  1. RAG 为什么需要向量数据库?它和传统数据库有什么区别?
    答: 核心原因是传统关系型数据库无法高效处理高维向量的相似性搜索,而检索环节恰恰要的就是这个能力。
  • 传统数据库擅长精确匹配(等号、LIKE、范围查询),索引是 B 树、哈希这类结构,回答不了「跟这个向量最相似的十条是什么」。
  • 向量数据库用 HNSW、IVF 等 ANN 索引,能在千万甚至亿级向量里快速返回 Top-K,复杂度远低于全表遍历。
  • 除此之外它还承担了向量的增删改查、元数据存储与过滤、横向扩展和副本容错这些工程能力。
    【真题·转述自 RAG 为什么需要向量数据库?它和传统数据库有什么区别?(面试鸭)】
  1. 入库的一条记录里要存哪些内容?为什么必须把原文一起存进去?
    答: 一条记录通常包含原始文本块、它的向量、以及来源文件、页码、时间、作者这类元数据,向量本身是不可读的。
  • 向量只负责相似度计算,检索命中的是向量,但要送给大模型生成答案的是可读的原文,所以原文必须一起落库。
  • 元数据用于缩小检索范围和回答时给出处,比如「只在 2024 年的技术文档里检索」这种条件就靠它。
  • 建库是一次性的(文档变更时增量更新),查询是每次都要做的,所以存下来的东西要同时满足检索和生成两个环节。
    【真题·转述自 Vector Databases Explained: How RAG Gives AI a Memory(RAG pipeline 端到端一节)】
  1. HNSW 和 IVF 两种索引有什么区别?亿级规模下该选哪个?
    答: HNSW 是分层可导航小世界图,查询时从上层稀疏图开始逐层收窄,召回率高、速度快;IVF 先把向量聚类分桶,查询时只搜最相关的几个桶。
  • HNSW 的关键参数是 M(每个节点的邻居数,通常 16–32)和 ef(搜索时考察的候选集大小),精度高但内存开销大。
  • IVF 的关键参数是 nlist(聚类数量)和 nprobe(搜索几个桶),内存占用小、适合超大规模,但精度略低于 HNSW。
  • 到了亿级规模,HNSW 的内存消耗可能扛不住,这时候用 IVF 拿聚类换内存是更现实的选择。
    【真题·转述自 我如何通过向量数据库实现 RAG 应用的完整解决方案(核心索引算法 HNSW 与 IVF 一节)】
  1. 检索时加元数据过滤,前置过滤和后置过滤有什么坑?
    答: 生产环境很少做纯向量检索,通常要把 ANN 和元数据条件组合起来,而过滤放在检索前还是检索后,效果差别很大。
  • 前置过滤(先按元数据筛再向量检索)会缩小候选集,导致召回率下降,该找回来的可能压根不在候选里。
  • 后置过滤(先全库 ANN 再筛结果)会浪费算力,很多算出来的结果最后被直接丢掉,还会出现返回条数不足的情况。
  • 成熟的向量库普遍实现了带过滤的 HNSW,把元数据约束直接嵌进图遍历过程,这是三者里更合理的做法。
    【真题·转述自 Vector Database(Metadata Filtering 一节)】
  1. 什么规模下用 PGVector 就够了?什么时候必须上专用向量数据库?
    答: PGVector 在 768 维、约 200 万向量以内配合 HNSW 索引,表现是够用的,P99 延迟可以控制在 50 毫秒以内。
  • 选它的理由是团队本来就在跑 PostgreSQL,向量和关系型数据的事务一致性是白送的,运维复杂度不会增加。
  • 超过 500 万向量,或者在负载下有严格延迟要求时,专用向量数据库的表现会稳定超过它。
  • 判断标准不是「能不能跑」,而是规模、延迟指标和运维成本三者一起权衡。
    【真题·转述自 Vector Database(When to Use pgvector Instead 一节)】
  1. 向量数据库怎么选?Milvus、Pinecone、PGVector 各自适合什么场景?
    答: 选型看三个维度:部署形态(自建还是托管)、数据规模、以及现有技术栈。
  • Milvus 开源且功能强大,支持分布式部署,适合数据量大、要求自主可控的大规模应用。
  • Pinecone 是云服务,开箱即用、不需要自己运维,但要付费,适合想快速上线的团队。
  • PGVector、Redis 这类是传统数据库的向量扩展,适合数据量不大、又希望在现有数据库上直接增加向量能力的场景。
    【真题·转述自 RAG 为什么需要向量数据库?它和传统数据库有什么区别?(面试鸭·扩展知识:主流向量数据库的选择)】

💬 入库这一环看着只是「存进去」,实际决定了检索能不能快、答案有没有出处。你项目里用的是哪种向量库、踩过哪些索引或过滤的坑,评论区聊聊。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进