模块2上:RAG原理与向量数据库选型——Java人的AI知识库指南
作者:Java宋转AI | 6年Java后端 → AI Agent开发中
定位:Java/后端程序员转AI的实战学习路线图
本篇:模块2上——RAG原理与向量数据库选型(理论+选型篇)
1. 为什么RAG是大模型应用的第二条腿
Prompt Engineering是大模型的第一条腿,让模型"听话"。
但光靠Prompt,你的AI应用永远只能"抖机灵",没法变"真专家"。
举个真实场景:
你问GPT-4:"我们公司的年假政策是什么?"
GPT-4一脸懵:啥?你们公司是哪根葱?
这就是RAG要解决的问题——让大模型"知道"你的私有知识。
2. RAG原理:Java人秒懂的版本
2.1 什么是RAG?
RAG = Retrieval Augmented Generation(检索增强生成)。
类比Java的Cache Aside Pattern:
plaintext
// Cache Aside Pattern
public String getUserById(String id) {
String cached = redis.get(id);
if (cached != null) return cached;
User user = db.selectUserById(id);
redis.setex(id, 3600, user.toJson());
return user;
}
RAG的逻辑几乎一样:
-
用户提问 → 查向量数据库(类似Redis)
-
查到相关文档 → 拼装上下文
-
大模型基于真实数据 → 生成答案
区别在于:Redis是"精确匹配",向量数据库是**"语义相似匹配"**。
2.2 RAG完整流程
plaintext
用户问题: "Spring Boot 3.0有哪些新特性?"
↓
[Embedding模型] → 向量 [0.123, -0.456, 0.789, ...]
↓
[向量数据库检索] → Top-K相似文档
↓
[Prompt拼装]
---
用户问题: Spring Boot 3.0有哪些新特性?
参考文档:
[1] Spring Boot 3.0迁移指南 - 基于Java 17...
[2] Java 17强制要求解读 - Spring Boot 3.0要求Java 17以上...
请根据以上文档回答。
---
↓
[大模型生成] → 准确答案
2.3 为什么不能把所有知识直接塞给模型?
成本角度:GPT-4 Turbo 128k上下文看着大,塞完一个中型项目文档就满了。
效果角度:模型对"塞在中间"的信息记性最差,叫"Lost in the Middle"问题。
类比:为什么不全放Redis?因为内存贵。向量数据库就是大模型外挂的"知识缓存层"。
3. 向量数据库选型对比
以下数据基于公开benchmark和作者实际项目经验,数据量级仅供参考。
3.1 核心对比表
特性
PGVector
Milvus
Redis Vector
Chroma
类型
PostgreSQL扩展
专用向量DB
Redis模块
嵌入式
分布式
需Citus
原生支持
原生支持
❌
数据量上限
~100万向量
亿级+
受内存限制
~100万
查询延迟
毫秒级
毫秒级
亚毫秒级
毫秒级
Java SDK
✅ 完善
✅ 完善
✅ 完善
❌
运维复杂度
低
高
低
极低
Spring AI支持
✅ 原生
✅ 原生
✅ 重点增强
⚠️
3.2 PGVector:Java人最熟悉的选择
优点:
-
零额外组件,PostgreSQL老熟人了
-
SQL运维一条龙,备份恢复无压力
-
HikariCP连接池直接复用
sql
-- 创建向量字段
CREATE EXTENSION vector;
CREATE TABLE tech_docs (
id SERIAL PRIMARY KEY,
title VARCHAR(255),
content TEXT,
embedding VECTOR(1536)
);
-- 创建HNSW索引加速检索
CREATE INDEX ON tech_docs USING hnsw (embedding vector_cosine_ops);
-- 相似度查询
SELECT title, content, 1 - (embedding <=> $1) AS similarity
FROM tech_docs
ORDER BY embedding <=> $1
LIMIT 5;
缺点:
-
PostgreSQL本身扩展性有限
-
100万向量是性能甜点,更大需要Citus
3.3 Milvus:大规模场景的不二之选
优点:
-
专为向量检索设计,架构成熟
-
分布式水平扩展能力强
-
索引类型丰富(HNSW、IVF、ANNOY等)
yaml
# docker-compose.yml
version: '3.8'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
volumes:
- etcd_data:/etcd
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
minio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
volumes:
- minio_data:/minio
command: minio server /minio --console-address ":9001"
milvus:
image: milvusdb/milvus:v2.3.3
ports:
- "19530:19530"
- "9091:9091"
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
volumes:
- milvus_data:/var/lib/milvus
depends_on:
- etcd
- minio
作者在dream-ai-agent项目里用Milvus存储技术文档:
java
// Spring AI + Milvus 配置
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
return MilvusVectorStore.builder()
.embeddingModel(embeddingModel)
.host("localhost")
.port(19530)
.collectionName("tech_docs_v4")
.build();
}
java
// 检索示例
List<Document> docs = vectorStore.similaritySearch(
SearchRequest.builder()
.query("Spring Boot 3.0 新特性")
.topK(5)
.similarityThreshold(0.7)
.build()
);
缺点:多一个服务要运维,学习曲线比PGVector陡。
3.4 Redis Vector:Spring AI 2.0重点增强
优点:
-
不用新起服务(如果你已有Redis)
-
Spring AI 2.0重点支持
-
亚毫秒级查询延迟
yaml
# application.yml
spring:
ai:
vectorstore:
redis:
initialize-schema: true
index-name: ai_knowledge
prefix: rag:docs:
distance-type: COSINE
java
// Jedis连接配置
@Bean
public JedisPooled jedisPooled() {
return new JedisPooled("localhost", 6379);
}
@Bean
public VectorStore vectorStore(JedisPooled jedisPooled, EmbeddingModel embeddingModel) {
return RedisVectorStore.builder(jedisPooled, embeddingModel)
.prefix("rag:docs:")
.build();
}
缺点:
-
Redis是内存数据库,大数据量内存成本高
-
2000维向量 × 100万条 ≈ 2-3GB内存
3.5 Chroma:Python生态专属
-
✅ 上手简单:
pip install chromadb -
❌ Java支持约等于零
-
✅ 适合Python团队快速原型
结论:Java同学请绕道。
4. Embedding模型选型
4.1 主流模型对比
模型
提供商
维度
特点
价格
text-embedding-3-small
OpenAI
1536
便宜快速
$0.02/1M tokens
text-embedding-3-large
OpenAI
3072
效果最好
$0.13/1M tokens
text-embedding-v3
通义千问
1024/768/512
支持维度缩减
阿里云百炼计费
text-embedding-v4
通义千问
2048/1536/1024
效果提升
阿里云百炼计费
bge-m3
BAAI(开源)
1024
本地部署可选
免费(自托管)
4.2 Spring AI集成
OpenAI Embedding
yaml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
embedding:
options:
model: text-embedding-3-small
通义千问Embedding(Spring AI Alibaba)
yaml
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
embedding:
options:
model: text-embedding-v3
dimensions: 1024
java
@Configuration
public class EmbeddingConfig {
@Bean
public EmbeddingModel embeddingModel() {
DashScopeApi api = DashScopeApi.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.build();
DashScopeEmbeddingOptions options = DashScopeEmbeddingOptions.builder()
.withModel("text-embedding-v3")
.withDimensions(1024)
.build();
return new DashScopeEmbeddingModel(api, MetadataMode.EMBED, options);
}
}
本地部署BGE(适合数据敏感场景)
java
@Bean
public EmbeddingModel embeddingModel() {
return new OllamaEmbeddingModel(
OllamaApi.builder()
.baseUrl("http://localhost:11434")
.build(),
"bge-m3"
);
}
5. 选型决策树
plaintext
你的向量数据量?
├── <100万
│ ├── 你有现成的PostgreSQL?
│ │ ├── ✅ → PGVector(零额外成本,够用)
│ │ └── ❌ → 评估成本:
│ │ ├── 想快速启动 → PGVector装一个
│ │ └── 已有Redis → Redis Vector
│ └──
└── >100万
└── 选Milvus(无悬念)
└── 如果你已有Redis集群且数据量<500万 → 评估迁移成本
特殊情况:
├── 数据敏感不能上云 → BGE本地部署
├── 追求极致低延迟 → Redis Vector(内存级)
└── 团队全是Python → Chroma(仅限Python团队)
6. 总结
-
RAG是让大模型"知道"私有知识的唯一靠谱方案
-
向量数据库是RAG的存储层,选型要看数据量和基础设施
-
100万向量以下:PGVector性价比最高
-
100万向量以上:Milvus是不二之选
-
已有Redis:Redis Vector是省事方案
下期预告
模块2下我们将实战:用Spring AI + Milvus从0到1搭建RAG知识库助手,代码会开源到dream-ai-agent仓库。
往期回顾:
-
开篇:Java转AI,8模块学习路线图
-
模块1上:Prompt Engineering——4个技巧让大模型听话
-
模块1下:Spring AI代码审查助手实战
标签:AI · RAG · Spring AI · 向量数据库 · Java
互动:你目前在用哪个向量数据库?遇到什么问题了吗?欢迎评论区交流!