📚 RAG 实战指南:Milvus、Ollama 与 Embedding 模型全解析

摘要:本文深度解析了 RAG(检索增强生成)架构中的核心组件关系,详细拆解了 Spring AI 的配置逻辑,并提供了主流 Embedding 模型的选型策略与避坑指南。


🧩 第一部分:核心概念解析

1. 模型 vs 数据库:面粉厂与粮仓的博弈

在 AI 应用中,bge-small-zh(模型)和 Milvus(数据库)经常成对出现,但分工截然不同。

💡 通俗比喻

  • 🏭 bge-small-zh 是“面粉加工厂”(或者“图书编目员”):它负责加工处理,把文字变成数字。
  • 🏠 Milvus 是“粮仓”(或者“图书馆书架”):它负责存储成品,并提供快速查找功能。
核心差异对比表
维度 🤖 Embedding 模型 (如 bge-small) 🗄️ 向量数据库 (如 Milvus)
本质角色 翻译官 (计算者) 图书管理员 (存储者)
输入数据 自然语言文本 (“华为手机怎么样”) 数值向量 ([0.12, -0.98...])
输出数据 向量数组 (List of Floats) 相似的向量 ID (Top-K)
运行环境 Python/Ollama/Docker Docker/K8s/云服务
核心任务 理解语义:计算词与词的距离 建立索引:在亿级数据中毫秒级检索
⚙️ 代码视角的协作流程

它们是上下游关系,缺一不可:

# 1. 🏭 生产阶段 (模型)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
vector = model.encode("我想找关于深度学习的资料") 
# 产出: [0.1, 0.2, 0.3 ...]

# 2. 🏠 存储与检索阶段 (数据库)
from pymilvus import MilvusClient
client = MilvusClient("my_db.db")
client.search(
    collection_name="knowledge_base",
    data=[vector],  # 接收模型生产的向量
    limit=5
)

🧠 第二部分:术语解码 (bge vs moe)

在 RAG 流程中,我们需要两个不同的大脑配合工作:

🔎 翻译官:bge-small-zh

  • 全称:BAAI General Embedding (Small, Chinese)

  • 全称 BAAI General Embedding - Small - Chinese,是由智源研究院 (BAAI) 发布的开源 Embedding 模型。

  • 核心作用
    它的工作不是“对话”,而是**“理解语义并转化为数值”**。它将文本(如“我想买手机”)转化为一个高维向量(如 [0.12, -0.45, 0.88...])。

  • 名字解读

    • BGE:智源通用嵌入模型 (BAAI General Embedding)。
    • Small:轻量级版本。速度极快,占用内存极小,适合资源有限的环境(相对的有 Base 和 Large 版本)。
    • zh:专为中文 (Chinese) 优化。
  • 为什么它很出名?

    • 霸榜:在 C-MTEB(中文大规模文本嵌入基准)中,BGE 系列曾长期霸榜,性能超越了许多闭源模型(如 OpenAI 的 text-embedding-ada-002)。
    • 高性价比:Small 版本虽然小,但检索效果非常惊人,是构建中文 RAG 系统(配合 Milvus)的首选入门模型。

在 Milvus 中的角色
用户提问 →\rightarrow bge-small-zh →\rightarrow 生成向量 →\rightarrow 在 Milvus 中搜索相似向量

  • 职责:将文字转化为向量。
  • 特点小而美。智源研究院出品,在 C-MTEB 榜单霸榜,适合资源受限但追求中文精度的场景。

2. 🎓 决策大脑:moe-7b

  • 全称:混合专家大模型-70 亿参数规模(Mixture of Experts 7 Billion Parameters)这通常不是指某一个具体的模型名称(除非是特定开发者的命名),而是指一类大语言模型 (LLM) 的架构和规格
  • 核心概念:MoE (Mixture of Experts)
    • 传统模型 (Dense):你是全才,处理任何问题都要动用大脑的所有神经元。这很累,计算量大。
    • MoE 模型 (Sparse):你是一个专家团队(比如有 8 个专家)。处理问题时,只有 2 个相关的专家被“激活”(比如问代码问题,就叫编程专家;问历史,就叫历史专家)。
    • 优势参数量虽然大,但推理速度非常快(因为每次只用一部分参数)。
  • 7B 的含义
    • 代表模型的参数规模约为 70 亿 (7 Billion)
    • 在 MoE 架构中,这可能指总参数量是 7B,或者由多个小模型(如 8 个 1B 的专家)组成的混合体。
  • 典型代表
    • Mixtral 8x7B(Mistral AI 发布,虽然总参数约 47B,但常被称为 7B 级别的 MoE 代表)。
    • DeepSeek-MoEQwen-MoE 等国内模型也有类似的架构。

在 RAG 中的角色
Milvus 找回来的资料 + 用户的问题 →\rightarrow MoE-7B (大模型) →\rightarrow 阅读理解并生成最终答案。

  • 职责:阅读检索到的资料,生成最终回答。
  • 特点三个臭皮匠顶个诸葛亮。它不是一个单纯的大模型,而是由多个“专家模型”组成。遇到编程问题唤醒编程专家,遇到历史问题唤醒历史专家。
  • 优势:推理速度快,效果好。
    这两个术语分别代表了 AI 应用(特别是 RAG 检索增强生成)流程中两个完全不同但紧密配合的环节

3. 它们如何配合工作?(RAG 流程图)

如果你在做一个企业知识库问答系统,这两个东西是这样串联的:

  1. 用户提问:“公司的报销流程是什么?”
  2. Embedding 阶段 (bge-small-zh)
    • 把这个问题转化成向量:[0.5, 0.1, ...]
  3. 检索阶段 (Milvus)
    • 拿着向量去数据库里找,找到了《公司财务手册.pdf》里的第 3 段(因为它和问题的向量距离最近)。
  4. 生成阶段 (moe-7b)
    • 系统把“用户问题”和“财务手册第3段”一起扔给大模型。
    • Prompt:“请根据以下手册内容回答用户问题…”
    • MoE-7B 生成回答:“根据财务手册,报销需要先在 OA 系统提交…”

总结

特性 bge-small-zh moe-7b
类型 Embedding Model (嵌入模型) LLM (大语言模型)
输出 向量列表 (一堆数字) 自然语言 (一段文字)
功能 判断句子意思像不像 理解上下文并写作文
算力需求 极低 (CPU 都能跑) 较高 (通常需要 GPU)
搭配 存入向量数据库 (Milvus) 用于生成最终回复

🛠️ 第三部分:Spring AI 实战配置详解

以下配置基于 Spring AI + Ollama + Milvus 的技术栈,构建一个严谨的政策问答系统。

📄 application.yml 深度注释版

ai:
  ollama:
    base-url: http://localhost:11434  # Ollama 本地服务地址
    chat:
      model: qwen:7b  # 🧠 大脑:使用通义千问 7B
      options:
        # 🌡️ 温度控制:0.3 代表严谨。
        # 政策问答不能瞎编(幻觉),需要模型严格依赖上下文。
        temperature: 0.3 
    embedding:
      model: bge-m3   # 🔎 翻译官:使用 BGE-M3 (注意:这是大模型,非 small)
  
  vectorstore:
    milvus:
      client:
        host: localhost
        port: 19530   # Milvus API 端口 (注意不是 9091)
      collection-name: policy_docs # 🗂️ 集合名称 (类似 SQL 表名)
      # ⚠️ 关键配置:维度必须匹配!
      # bge-m3 的输出维度是 1024。
      # 如果换成 bge-small (512) 或 OpenAI (1536),这里必须改!
      embedding-dimension: 1024 

✅ 启动前的检查清单 (Checklist)

  1. 启动数据库docker ps | grep milvus 确保容器存活。
  2. 拉取模型
    • ollama pull qwen:7b (大脑)
    • ollama pull bge-m3 (翻译官,体积较小但下载需时间)
  3. 验证维度:确认 bge-m3 对应的维度确实是 1024

📊 第四部分:Embedding 模型选型指南 (2025版)

如何选择最适合你的“翻译官”?以下是分场景推荐:

🏆 第一梯队:开源/本地部署 (推荐)

适合注重隐私、使用 Ollama/Docker 的场景。

模型名称 厂商 维度 推荐理由 Ollama 命令
bge-m3 智源 1024 🔥 综合最强。支持多语言、长文本、混合检索,性能全面。 ollama pull bge-m3
bge-small-zh 智源 512 极速轻量。适合 CPU 环境或对延迟极敏感的场景。 ollama pull bge-small
jina-embeddings-v3 Jina AI 1024 长文王者。支持 8k+ 长度,适合法律/财报分析。 ollama pull jina/jina-embeddings-v3
gte-large 阿里 1024 阿里生态。与 Qwen 模型配合默契,语义理解强。 ollama pull gte-large

☁️ 第二梯队:商业 API

适合无需维护基础设施的场景。

  • OpenAI text-embedding-3-small: 维度 1536,性价比高,行业基准。
  • 智谱 AI embedding-3: 国内合规首选,中文能力强。

⚠️ 第五部分:避坑指南 —— “维度陷阱”

🚨 这是新手最容易犯的致命错误!

问题描述
Milvus 的集合(Collection)一旦创建,其向量维度(Dimension)就是固定的。

错误场景

  1. 你一开始用 bge-m3 (1024维) 跑通了代码,Milvus 创建了 1024 维的表。
  2. 后来觉得想换个模型,改成了 text-embedding-3-small (1536维)。
  3. 报错:插入数据失败,提示维度不匹配。

正确解决方案
如果你要更换 Embedding 模型,必须执行以下“三部曲”:

  1. 🗑️ 删库:删除 Milvus 中旧的 policy_docs 集合。
  2. 📝 改配:修改配置文件中的 embedding-dimension
  3. 🔄 重跑:重启应用,重新读取 PDF 进行切片和入库。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐