模块2上:RAG原理与向量数据库选型——Java人的AI知识库指南

0 阅读1分钟

模块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的逻辑几乎一样:

  1. 用户提问 → 查向量数据库(类似Redis)

  2. 查到相关文档 → 拼装上下文

  3. 大模型基于真实数据 → 生成答案

区别在于: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. 总结

  1. RAG是让大模型"知道"私有知识的唯一靠谱方案

  2. 向量数据库是RAG的存储层,选型要看数据量和基础设施

  3. 100万向量以下:PGVector性价比最高

  4. 100万向量以上:Milvus是不二之选

  5. 已有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

互动:你目前在用哪个向量数据库?遇到什么问题了吗?欢迎评论区交流!