大家好,我是冰点,今天我们继续聊SpringAI的基本用法和特性

建议先阅读第五篇《RAG 核心原理》和第六篇《文档 ETL 实战》,理解 Embedding 在 RAG 中的角色。
本文聚焦 Embedding 与向量库的选型思路;具体客户端初始化方式请结合你当前使用的 Spring AI starter 版本确认。

一、Embedding 模型在 RAG 中的定位

在这里插入图片描述

用户提问 ──[Embedding]──→ 查询向量
    │                        │
    │                        ▼
    │              [向量数据库相似度搜索]
    │                        │
    │◀─────── Top-K 文档 ────┘
    │
    ▼
LLM 生成回答

Embedding 模型是 RAG 系统的"感知层"——它将人类可读的文本转换为机器可计算的向量。Embedding 的质量直接决定了检索的召回率和准确性,比向量数据库本身的影响更大。


二、主流 Embedding 模型深度对比

在这里插入图片描述

2.1 OpenAI Embedding 系列

模型 维度 特点 价格(每1K Token)
text-embedding-3-small 1536(可缩减到 256) 成本降低 5 倍,速度快 $0.02
text-embedding-3-large 3072(可缩减到 256) 质量最高,适合高精度场景 $0.13
ada-002(已不推荐) 1536 旧版,仍可用但性价比低 $0.10
@Bean
public EmbeddingModel embeddingModel() {
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("OPENAI_API_KEY")))
        .withDefaultOptions(
            OpenAiEmbeddingOptions.builder()
                .model("text-embedding-3-small")
                .dimensions(1024)  // 可选:缩减到 1024 维,加速存储和检索
                .build()
        );
}

OpenAI 3 代的核心升级

  • 支持 dimensions 参数,可以任意缩减向量维度而不损失太多精度
  • text-embedding-3-large 在 MTEB 基准测试上超过了 ada-002

2.2 国产 Embedding 模型

模型 提供方 维度 特点
text-embedding-v2 阿里 DashScope 1536 支持中文优化,通过百炼平台调用
bge-large-zh 智源(国产开源最强) 1024 开源、中英文双语、中文任务 SOTA
m3e-base 米哈游 768 开源、轻量、中文场景表现优秀
text2vec-large 腾讯 1024 中文语义匹配表现好
// 使用智源 BGE 中文 Embedding(通过 Ollama 本地运行)
@Bean
public EmbeddingModel bgeEmbedding() {
    return new OllamaEmbeddingModel()
        .withDefaultOptions(
            OllamaEmbeddingOptions.builder()
                .model("bge-large-zh-v1.5")
                .build()
        );
}

2.3 本地 Embedding:Ollama + LlamaEdge

不想依赖外部 API?Ollama 支持本地运行 Embedding 模型:

# 安装 Ollama 后
ollama pull bge-large-zh
ollama pull m3e-base

# Spring AI 配置
@Bean
public EmbeddingModel localEmbedding() {
    return new OllamaEmbeddingModel(
        OllamaApi.builder()
            .baseUrl("http://localhost:11434")
            .build()
    ).withDefaultOptions(
        OllamaEmbeddingOptions.builder()
            .model("bge-large-zh")
            .build()
    );
}

三、多语言 / 跨语言 Embedding 策略

3.1 为什么中文场景推荐用国产模型?

text-embedding-3-large 虽然英文世界第一,但中文分词和语义理解并非最优。以下是中文评测集(C-MTEB)上的对比:

模型 平均得分 中文语义 英文语义 跨语言
text-embedding-3-large 62.4 良好 优秀 优秀
bge-large-zh-v1.5 64.8 优秀 良好 一般
m3e-base 58.2 优秀 一般 一般
Voyage-multilingual 63.1 优秀 优秀 优秀

建议

  • 纯中文企业知识库 → bge-large-zh-v1.5text-embedding-v2
  • 中英双语场景 → text-embedding-3-largeVoyage-multilingual
  • 成本敏感 → m3e-base(免费本地运行)

四、向量数据库选型:完整对比

4.1 选型维度总览

选向量数据库 = 向量维度支持 × 索引算法 × 部署方式 × 扩展性 × 成本 × 生态集成

4.2 五大向量数据库深度对比

维度 Pinecone Milvus Weaviate Qdrant Redis
类型 全托管云服务 开源自托管 / Zilliz云 开源 / 云 开源 / 云 带向量索引的缓存
部署 无需运维 K8s / Docker Docker / K8s Docker / K8s 现有 Redis 复用
向量维度 最大 100K 无限制 最大 65K 最大 4K 4K(默认)
索引算法 HNSW IVF/HNSW/DiskANN HNSW HNSW HNSW
元数据过滤 ✅ 支持 ✅ 支持 ✅ 支持 ✅ 支持 ✅ 支持
实时更新
MMR 重排序
免费配额 100K 向量 无限(开源) 无限(开源) 无限(开源) Redis OSS 免费
适用规模 中小型 超大规模(亿级) 中型 中型 小型 / 现有 Redis 用户
Spring AI 支持 ✅ 原生集成 ✅ 原生集成 ✅ 原生集成 ✅ 原生集成 ✅ 原生集成

4.3 各数据库适用场景

海量数据(>1000万向量)  ──→  Milvus / Zilliz Cloud
快速原型 / 小规模数据    ──→  Qdrant / Chroma
已用 Redis 的团队        ──→  Redis Vector
不想运维 / 中小企业      ──→  Pinecone / Zilliz Cloud
强类型安全 / GraphQL     ──→  Weaviate

五、Spring AI + Pinecone 完整集成

5.1 快速注册 Pinecone

  1. 访问 pinecone.io,注册并获取 API Key
  2. 在控制台创建一个 Serverless 项目(免费 100K 向量)
  3. 记下 environment(如 us-east-1)和 project-id

5.2 依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pinecone-spring-boot-starter</artifactId>
</dependency>

5.3 配置

spring:
  ai:
    embedding:
      openai:
        options:
          model: text-embedding-3-small
          dimensions: 1536
    vectorstore:
      pinecone:
        api-key: ${PINECONE_API_KEY}
        environment: us-east-1
        project-id: ${PINECONE_PROJECT_ID}
        index-name: spring-ai-rag

5.4 初始化与使用

@Configuration
public class PineconeConfig {

    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel) {
        return PineconeVectorStore.builder(embeddingModel)
            .apiKey(System.getenv("PINECONE_API_KEY"))
            .environment("us-east-1")
            .projectId(System.getenv("PINECONE_PROJECT_ID"))
            .indexName("spring-ai-rag")
            // 可选:设置向量维度
            .dimensions(1536)
            .build();
    }
}

@Service
public class RagService {

    private final VectorStore vectorStore;

    // 添加文档到向量库
    public void addDocument(String content, String metadata) {
        Document doc = Document.builder()
            .content(content)
            .metadata(Map.of("category", metadata))
            .build();
        vectorStore.add(List.of(doc));
    }

    // 语义检索
    public List<Document> search(String query, int topK) {
        return vectorStore.similaritySearch(
            SearchRequest.builder()
                .query(query)
                .topK(topK)
                .similarityThreshold(0.7)  // 最低相似度阈值
                .filterExpression(
                    Expression.builder()
                        .key("category")
                        .isIn("退货政策", "售后服务")
                        .build()
                )
                .build()
        );
    }
}

六、Spring AI + Milvus 完整集成

Milvus 是国内最流行的开源向量数据库,适合亿级向量规模。

6.1 本地 Docker 启动

docker run -d \
  --name milvus-etcd \
  -p 2379:2379 \
  -v $(pwd)/volumes/etcd:/etcd \
  quay.io/coreos/etcd:v3.5.5 \
  etcd -advertise-client-urls=http://127.0.0.1:2379

docker run -d \
  --name milvus-minio \
  -p 9001:9001 \
  -p 9000:9000 \
  -v $(pwd)/volumes/minio:/minio_data \
  minio/minio server /minio_data

docker run -d \
  --name milvus-standalone \
  -p 19530:19530 \
  -p 9091:9091 \
  -v $(pwd)/volumes/milvus:/var/lib/milvus \
  milvusdb/milvus:v2.4.0 \
  milvus run standalone

6.2 依赖与配置

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>
spring:
  ai:
    vectorstore:
      milvus:
        url: http://localhost:19530
        collection-name: spring_ai_rag
        database-name: default

6.3 高级:MMR(最大边际相关性)去重检索

MMR 在 Top-K 检索后进一步去除相似度过高的结果,提升答案多样性:

public List<Document> mmrSearch(String query, int topK, int fetchK, double mmrK) {
    return vectorStore.similaritySearch(
        SearchRequest.builder()
            .query(query)
            .topK(topK)
            .similarityThreshold(0.0)  // MMR 模式下设为 0
            // MMR 参数:fetchK 从数据库多取一些,再用 mmrK 筛选多样结果
            .filterExpression(
                FilterExpressionBuilder.builder()
                    .key("status")
                    .isEqualTo("active")
                    .build()
            )
            .build()
    );
}

七、向量索引算法详解

7.1 HNSW(Hierarchical Navigable Small World)

构建阶段:
    ↓
Layer 2: [节点] ─────── [节点] ──→ 长距离跳转
Layer 1: [节点] ─ [节点] ─ [节点] ──→ 中距离跳转
Layer 0: [节点] ─ [节点] ─ [节点] ─ [节点] ─ [节点] ─→ 精确近邻
  • 原理:构建多层图,查询时从顶层快速定位大致区域,逐层收敛到最近邻
  • 优点:查询速度快(毫秒级)、精度高
  • 缺点:内存占用大(是原始向量的 1.2~1.5 倍)、构建慢
  • 适用:几乎所有场景,Milvus/Qdrant/Pinecone 默认索引

7.2 IVF(Inverted File Index)

  • 原理:将向量空间聚类为 N 个簇,查询时只扫描目标向量所在簇
  • 优点:内存占用低
  • 缺点:精度依赖聚类质量,低召回时速度反而慢

7.3 生产环境推荐配置

// Milvus 索引配置示例
{
  "index_type": "HNSW",
  "metric_type": "COSINE",      // 余弦相似度
  "params": {
    "M": 16,                    // HNSW 连接数(越高精度越高,越占内存)
    "efConstruction": 200       // 构建时搜索广度(越高精度越高,越慢)
  }
}

// Qdrant 索引配置
{
  "vector_size": 1536,
  "distance": "Cosine",
  "hnsw_config": {
    "m": 16,
    "ef_construct": 200
  }
}

八、维度选择与 Embedding 压缩

8.1 维度对检索质量的影响

实验数据(基于 MTEB 基准):

维度 检索精度 存储占用 检索速度 适用场景
3072 100% 基准 100% 最慢 极高精度要求
1536 98.5% 50% 较快 默认推荐
1024 96.2% 33% 成本敏感
512 91.8% 17% 非常快 海量数据
256 85.4% 8% 最快 极致成本优化

8.2 OpenAI 3 代的维度缩减

// text-embedding-3-large 缩减到 256 维,精度损失 < 5%
// 配合 PCA 可进一步压缩
OpenAiEmbeddingOptions options = OpenAiEmbeddingOptions.builder()
    .model("text-embedding-3-large")
    .dimensions(256)  // 直接指定,模型内部自动优化
    .build();

九、生产环境完整配置模板

# application.yml - Spring AI 向量库配置模板
spring:
  application:
    name: spring-ai-rag

  ai:
    # Embedding 配置(按需选择)
    embedding:
      openai:
        api-key: ${OPENAI_API_KEY}
        options:
          model: text-embedding-3-small
          dimensions: 1536
          # model: text-embedding-3-large  # 高精度场景

    # Pinecone 配置(示例)
    vectorstore:
      pinecone:
        api-key: ${PINECONE_API_KEY}
        environment: ${PINECONE_ENV}
        project-id: ${PINECONE_PROJECT_ID}
        index-name: production-rag
        # 或切换为 Milvus:
        # milvus:
        #   url: http://localhost:19530
        #   collection-name: production-rag

十、本章小结

知识点 核心要点
Embedding 模型 OpenAI 3 代 > 国产 BGE > m3e;中文场景优先选国产模型
维度选择 1536 是通用最优解,成本敏感用 1024
HNSW 算法 工业级向量检索标准,查询快、精度高、内存占用大
Pinecone 无运维,适合中小企业快速上线
Milvus 开源最强,适合亿级向量规模
Qdrant Rust 实现,性能优秀,适合中等规模
Redis Vector 已有 Redis 基础设施的团队首选
MMR 去重 提升答案多样性,必备生产优化

下一篇预告:《八、完整 RAG 问答实战:检索 + 重排序 + 生成全链路》—— 从零搭建一个完整的 RAG 问答系统,整合前四篇的所有知识点。


📌 系列导航

📎 示例说明:本文重点帮助你做模型与向量库选型,完整链路实现放在第八篇展开。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐