大家好, 我是小编~
上一篇我们搞懂了Embedding
我们知道了:
文本、问题、段落,都会被压缩成一串高维数字向量。
语义越接近,向量在空间里距离就越近。
现在问题来了:
这些几百维、上千维的向量,储存到 MySQL 里行不行?
不行
为了彻底了解向量数据库
我们需要回答下面这三个问题
-
向量数据库到底解决了什么问题?
-
RAG 为什么绕不开它?
-
普通数据库差在哪?
一、传统数据库为什么存不了向量
我们所熟知的数据库,比如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 落地成为可能~