向量数据库是什么?为什么RAG必须靠它存Embedding?

0 阅读6分钟

大家好, 我是小编~

上一篇我们搞懂了Embedding

我们知道了:

文本、问题、段落,都会被压缩成一串高维数字向量。
语义越接近,向量在空间里距离就越近。

现在问题来了:

这些几百维、上千维的向量,储存到 MySQL 里行不行?

不行

为了彻底了解向量数据库

我们需要回答下面这三个问题

  1. 向量数据库到底解决了什么问题?

  2. RAG 为什么绕不开它?

  3. 普通数据库差在哪?


一、传统数据库为什么存不了向量

我们所熟知的数据库,比如MySQL、Oracle 这类库,

它们天生为结构化标量数据设计:

字符串、数字、时间、状态码

它们只适合精准匹配、模糊查询、条件筛选。

但Embedding是高维稠密浮点数组:

比如 768 维、1536 维,一条数据就是一长串小数。

如果硬用 MySQL 存,会出现两个致命问题:

检索效率爆炸:

用户提问生成向量后,要和库里几十万条向量逐条计算余弦相似度、欧氏距离。

全量遍历比对,时间复杂度 O (n),数据一多直接卡死。

没有向量计算原生能力:

MySQL 没有内置向量距离算法,只能自己写函数暴力运算,性能极差,完全没法落地 RAG 项目。

简单说:

普通数据库只会关键词匹配

向量数据库才会语义匹配


二、向量数据库的核心能力

向量数据库的核心能力是高效持久化存储海量高维向量
然后通过ANN近似最近邻检索,快速找出语义最相似的内容

什么是 ANN?

暴力检索是百分百精准,但慢到离谱。

ANN是提前建索引(比如HNSW、IVF、PQ),适当牺牲一点点精度,把检索速度拉满。

现在主流 RAG 项目,底层基本都靠HNSW 索引

百万级向量毫秒级返回结果,完全满足业务并发。

RAG 场景里的常用距离算法就认准两个:

1. 余弦相似度:只关心语义方向,最适合文本

2. 欧氏距离:适合内容长度、特征强弱对比

向量距离越近 = 语义相似度越高


三、向量数据库位置不可替代

我门先回顾一下RAG的链路:

1.本地文档、知识库 → 切片Chunk
2.切片文本 → 调用Embedding模型生成向量
3.向量 + 原文 → 存入向量数据库
4.用户提问 → 同样生成Query向量
5.向量数据库快速检索Top-K相似片段
6.把检索内容塞进Prompt → 交给大模型生成答案

如果删掉向量数据库:第5步直接变成全库遍历比对,可想而知这对性能是不可估计的影响。

你们会不会好奇为什么还需要把原文存进向量数据库?

这是一个很关键的点

向量只是特征指纹,不能还原完整语义

Embedding是压缩后的高维特征,是一串浮点数组,

它的作用只有一个:计算相似度、判断语义远近。

但向量本身无法逆向还原出完整原文,

没有可读性、没有完整上下文,大模型没法直接用。

大模型读不懂向量,你喂给大模型的是它看得懂的文字

检索时用向量比对,回答时必须用原文。

向量检索只负责找相似,不负责读内容

向量库真实存储结构三元组:

id | text(原文) | embedding(高维向量) | metadata(元数据)

id:唯一标识

text:最终投喂给大模型的真实内容

embedding:用于相似度检索的特征

metadata:课程类型、时间、权限、分类等过滤字段


四、主流向量数据库

现在市面上主流的向量数据库

1. Chroma

轻量开源向量库,零复杂配置、支持本地持久化、开箱即用。

优点:部署简单、集成友好、适合本地测试、小型知识库

缺点:大数据量、高并发场景性能一般

适用:个人项目、Demo、小型 RAG 应用

2. Milvus

工业级分布式向量数据库,当下开源项目使用率最高。

优点:支持百亿级向量、HNSW 高性能索引、分布式扩容、混合检索

缺点:部署稍重,需要容器化运维

适用:企业级生产、私有化部署、海量知识库 RAG

3. PostgreSQL + pgvector

关系型数据库插件化向量方案。

优点:业务数据 + 向量数据统一存储,不用维护两套存储

缺点:高维海量向量检索性能弱于专业向量库

适用:中小型项目、传统业务系统改造 RAG

4. Qdrant

高性能轻量向量数据库,兼顾性能与轻量化。

优点:检索速度快、内存占用低、REST 接口友好

适用:中体量服务、API 化 RAG 服务

5. Pinecone / Weaviate

云原生托管向量服务。

优点:免运维、弹性扩容、开箱即用

缺点:私有化部署成本高、依赖第三方云服务

适用:SaaS 产品、快速上线的商业化 AI 应用

选型逻辑:

本地开发 & 小项目 → Chroma

企业私有化 & 大数据量 → Milvus

老系统改造、不想新增中间件 → pgvector


五、Java 演示

Java + Chroma + Embedding 存入&检索&大模型

能看懂代码就能理解 RAG 向量入库核心逻辑哦~

引入依赖

<dependency>
    <groupId>io.github.chromadb4j</groupId>
    <artifactId>chromadb4j</artifactId>
    <version>0.1.5</version>
</dependency>

核心代码

// 1. 连接本地向量库
ChromaClient client = ChromaClient.builder()
        .host("localhost")
        .port(8000)
        .build();
// 2. 创建/获取集合(相当于向量表)
Collection collection = client.getOrCreateCollection("knowledge");
// 模拟:文档片段 + 业务文本
List<String> documents = List.of(
        "瑜伽课每周一三五 19点开课,单课上限20人",
        "有氧燃脂课周二周四晚20点,适合减脂人群",
        "健身房预约需提前2小时取消,否则计入违约记录"
);
// 3. 模拟生成embedding(实际调用模型返回向量)
List<List<Float>> embeddings = generateEmbedding(documents);

// 4. 向量批量入库
collection.add(
        documents,
        embeddings,
        List.of("doc-01","doc-02","doc-03")
);

// 5. 用户问题向量化,进行语义检索
String query = "瑜伽课程上课时间";
List<Float> queryEmbedding = getQueryEmbedding(query);

// 6. 相似度检索,返回Top2相似内容
QueryResponse response = collection.query()
        .queryEmbeddings(List.of(queryEmbedding))
        .nResults(2)
        .run();

List<String> retrievedDocuments = response.getDocuments().get(0);
List<Double> distances = response.getDistances().get(0);

// 7. 打印结果
System.out.println("===== 检索结果 =====");
for (int i = 0; i < retrievedDocuments.size(); i++) {
    System.out.println("相似度排名: " + (i + 1));
    System.out.println("原文内容: " + retrievedDocuments.get(i));
    System.out.println("向量距离: " + distances.get(i));  // 越小越相似
    System.out.println("-------------------");
}

// 8. 把检索到的原文拼成上下文
StringBuilder context = new StringBuilder();
for (String doc : retrievedDocuments) {
    context.append(doc).append("\n");
}

// 9. 构造 Prompt 给大模型
String prompt = "请根据以下上下文回答用户问题,不要编造内容。\n"
        + "上下文:\n" + context + "\n"
        + "用户问题:" + query;

// 10. 把 prompt 传给大模型
String finalAnswer = llmService.generateAnswer(prompt);

// 11. 输出最终回答
System.out.println("===== AI 最终回答 =====");
System.out.println(finalAnswer);

六、总结

  • 向量数据库负责存向量 + 高速语义检索

  • 传统数据库扛不住高维向量计算,天生不适合RAG

  • 不同向量库各司其职,小项目用轻量库、生产级选分布式库

  • 没有向量数据库,RAG 只能做demo,无法规模化落地

简单来说:

Embedding 解决了文字如何变成向量

向量数据库解决了海量向量如何快速检索

二者互相配合,才让私有知识库、本地问答、企业级 RAG 落地成为可能~