下面先看两张机制图 ——RAG 里向量数据库的完整工作流,以及向量空间与近似索引(ANN)的内部机理—— 再逐节展开。
一、先建立直觉:向量数据库是什么
传统数据库(如 MySQL):存 "表格行",按条件精确匹配查询 ——"WHERE 价格 < 100"、"WHERE 用户 = ' 小明 '"。它回答 "哪个值等于什么"。
向量数据库:存 "向量",按语义相似度查询 ——" 找出和这句话意思最接近的 10 条 "。它回答" 什么跟什么最像 "。
比喻:
- 传统数据库 = 查字典(必须拼对字才能查到);
- 向量数据库 = 逛书店时对店员说 "我喜欢悬疑小说",店员带你去悬疑区(不用说出具体书名)。
一句话定义:向量数据库 = 给 AI 装 "长期记忆" 的仓库 + 按语义相似度检索的引擎。上一讲 Agent 里的 "长期记忆(向量数据库)"、RAG,都是它的应用。
二、基础概念:向量(Embedding)与 "语义近"
向量是啥(衔接 Token 一讲):文本、图像、音频经过 Embedding 模型,都变成一串数字(向量)。关键性质是 ——语义相似的东西,向量距离近。
示例(示意数值):
- "猫" 的向量 与 "狗" 的向量 → 相似度 0.85(都是宠物,很近)
- "猫" 的向量 与 "汽车" 的向量 → 相似度 0.20(毫不相干,很远)
- "猫" 的向量 与 "猫咪" 的向量 → 相似度 0.98(几乎同义)
这就是向量检索能 "懂语义" 的根基:它不用你输入精确关键词,只要意思相近就能找到 —— 搜 "可爱的小狗",能返回 "柯基犬养护指南",因为两者向量距离近。
一个铁律:写入和查询必须用同一个 Embedding 模型。用 A 模型把文档转成向量、用 B 模型把问题转成向量,两者的 "语义空间" 不同,距离没有意义。
三、相似度怎么算:三种度量方式
| 度量 | 公式(直觉) | 特点 | 常用场景 |
|---|---|---|---|
| 余弦相似度 | cos (θ) = 向量夹角余弦 | 只看 "方向是否一致",不受长度影响 | 最常用,文本 / 语义检索 |
| 欧氏距离 | 各维度差平方和开根 | 看 "绝对距离",对长度敏感 | 需要控制 "数值大小" 时 |
| 内积 | Σ(aᵢ·bᵢ) | 方向 + 长度一起算 | 有专门优化的场景 |
机理解释(余弦相似度):把每个文本看作高维空间里的一个 "方向箭"。余弦相似度衡量的是两个箭头指向有多一致——"猫" 和 "狗" 指向宠物区(夹角小,相似度高),"猫" 和 "汽车" 指向不同区域(夹角大,相似度低)。数值范围 -1~1,越接近 1 越相似。向量数据库默认用它排序,取相似度最高的 Top-K。
四、检索的核心难点:为什么不能全库扫描
假设你有1000 万条文档块,每条是一个 768 维向量。每次查询,最简单粗暴的做法是:把问题向量和全部 1000 万条逐个算相似度,再排序取 Top-K—— 这叫暴力扫描(精确检索)。
问题:数据到百万、千万、亿级时,每次查询都要做海量计算,延迟不可接受;内存 / 磁盘 IO 也扛不住。
解法:近似最近邻(ANN,Approximate Nearest Neighbor)—— 用索引结构先 "圈定一小片区域",只在那片区域里精确比较。换来几个数量级的提速,代价是极小概率漏掉真正最近邻(近似而非精确)。
五、两大主流 ANN 索引机制
两大索引的机理解释:
- IVF(倒排文件,Inverted File):像 "图书馆先分区再找书"—— 建索引时用聚类(K-Means 等)把全部向量分成若干 "桶"(聚类中心);查询时先算问题向量离哪个桶中心最近,然后只在这个桶(和相邻几个桶)里精确比较。搜的范围从 "全库" 缩小到 "一个桶",速度大幅提升。
- HNSW(分层可导航小世界图):像 "先坐高铁跨城、再打车到小区、最后步行进楼"—— 把向量建成多层图:顶层稀疏(节点少、跳得远,快速定位大方向),底层密集(节点全、找得细)。查询从顶层入口开始,逐层向下 "顺藤摸瓜",只访问沿途少量节点就能找到最近邻。目前最主流的高性能方案。
- PQ(乘积量化,Product Quantization):把高维向量切成几段分别压缩,让每条向量只占很少字节 ——用精度换内存,让上亿条向量也能放进内存检索。
六、向量数据库 vs 传统数据库 vs 全文搜索引擎
| 维度 | 传统数据库(MySQL) | 全文搜索(Elasticsearch) | 向量数据库 |
|---|---|---|---|
| 查询方式 | 条件精确匹配 | 关键词匹配(倒排索引) | 语义相似度 |
| 能否懂 "意思" | 不能 | 有限(同义词需人工配置) | 能(向量编码语义) |
| 典型问题 | "价格 < 100 的商品" | "含 ' 小狗 ' 的页面" | " 和小狗意思相近的内容 " |
| 典型用途 | 业务数据 | 网站搜索 | AI 记忆 / RAG / 推荐 |
示例对比:搜 "可爱的小狗"——
- 全文搜索:只能找到字面上含 "小狗" 的文档,找不到 "柯基犬养护"(除非配置同义词);
- 向量检索:直接找到 "柯基犬养护指南"—— 因为它和 "可爱的小狗" 语义相近。
进阶:混合检索(Hybrid Search)—— 把 "关键词精确匹配"(BM25)和 "向量语义检索" 的结果融合排序:既能命中精确术语,又能召回语义近邻,是生产环境的推荐做法。
七、为什么 RAG 是向量数据库最大的应用
回到第一张图。RAG(检索增强生成)解决大模型的三大痛点:
- 知识截止:模型训练数据有截止日期,不知道 "2025 年的新政策"—— 检索把最新资料喂给它;
- 幻觉:模型不知道时会编 —— 检索给了它 "依据原文回答" 的材料,并能在回答里引用出处;
- 私有数据:企业内部文档模型没见过 —— 把文档向量化进库,就能基于它回答,且数据不用进模型训练(隐私友好)。
实战示例:企业知识库问答
员工问:"2025 年报销制度是什么?" ① 问题转成向量 → ② 在向量库里检索到《财务制度 2025 版》第 3 章 "报销流程"、附录 2"报销标准表" → ③ 把这两个片段 + 问题一起交给 LLM → ④ LLM 回答:"餐饮报销上限 200 元 / 人,需附发票,流程是……(引自《财务制度 2025 版》第 3 章)"。
机理:这一步就是第一张图的完整流程 ——写入(离线把制度文档切块、向量化、入库)+查询(在线把问题向量化、检索 Top-K、原文喂 LLM)。对比没有 RAG 的模型:它会一本正经地 "编" 一个报销标准,而且无法指出出处。
八、主流产品与选型(新手速览)
| 类型 | 代表 | 特点 |
|---|---|---|
| 独立向量数据库 | Milvus、Qdrant、Weaviate、Pinecone | 功能全(索引多、过滤、分布式),适合生产 |
| 轻量嵌入式 | FAISS(库)、pgvector(PostgreSQL 插件)、ES 向量插件 | 部署简单,适合中小规模 / 起步 |
| 云服务 | 各家向量库 SaaS | 免运维,按量付费 |
新手建议:学习阶段先用FAISS(纯库,几百行就能跑通)或pgvector(不用新学系统);做正式项目再考虑 Milvus/Qdrant 这类独立产品。
九、从零搭建一个向量检索应用(实操五步)
- 选 Embedding 模型:中文场景用中英双语模型效果更好;确定后写入和查询都用它。
- 切块(Chunking):按段落 / 固定长度切成几百字的小块(切太大:检索粒度粗、答不准;切太小:语义不完整;还要带一点重叠)。
- 向量化入库:每块 → 向量 → 连同原文、元数据(来源、章节、时间)写入向量库。
- 检索调参:
top_k(取几条,一般 3~10)、相似度阈值(低于多少算 "没查到",避免硬答)。 - 评估迭代:准备一组 "问题 → 期望命中的文档" 测试集,看召回率(该找到的找到没),反复调切块大小和索引参数。
十、常见坑与优化
- Embedding 模型不一致:写入 / 查询混用不同模型 → 相似度失真(最常见的新手错误)。
- 切块不合理:太大漏细节、太小断语义;建议按 "语义段落" 切并带重叠。
- 阈值设错:不设阈值时,无关问题也会返回 "最接近" 的片段,模型硬答 → 幻觉。要设 "低于阈值就回答:资料中没有"。
- 只靠向量:术语、编号、人名等精确信息,向量可能召回不准 → 用混合检索(BM25 + 向量)。
- 更新与删除:文档更新后要同步更新向量(增量索引),否则答的是旧内容。
- 元数据过滤:先按 "部门 / 年份 / 密级" 过滤再检索,又快又准(如 "只查 2025 年的制度")。
一句话总结:向量数据库把 "文字" 变成 "可比的向量",用余弦相似度找语义近邻,用IVF/HNSW 近似索引在千万级数据里快速检索;它是RAG 的核心引擎和 AI 的长期记忆—— 理解它,你就掌握了 "怎么让大模型既懂私有知识、又不瞎编" 的关键技术。