RAG 实战指南:Milvus、Ollama 与 Embedding 模型全解析
📚 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-MoE、Qwen-MoE 等国内模型也有类似的架构。
在 RAG 中的角色:
Milvus 找回来的资料 + 用户的问题 →\rightarrow→ MoE-7B (大模型) →\rightarrow→ 阅读理解并生成最终答案。
- 职责:阅读检索到的资料,生成最终回答。
- 特点:三个臭皮匠顶个诸葛亮。它不是一个单纯的大模型,而是由多个“专家模型”组成。遇到编程问题唤醒编程专家,遇到历史问题唤醒历史专家。
- 优势:推理速度快,效果好。
这两个术语分别代表了 AI 应用(特别是 RAG 检索增强生成)流程中两个完全不同但紧密配合的环节。
3. 它们如何配合工作?(RAG 流程图)
如果你在做一个企业知识库问答系统,这两个东西是这样串联的:
- 用户提问:“公司的报销流程是什么?”
- Embedding 阶段 (
bge-small-zh):- 把这个问题转化成向量:
[0.5, 0.1, ...]
- 把这个问题转化成向量:
- 检索阶段 (Milvus):
- 拿着向量去数据库里找,找到了《公司财务手册.pdf》里的第 3 段(因为它和问题的向量距离最近)。
- 生成阶段 (
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)
- 启动数据库:
docker ps | grep milvus确保容器存活。 - 拉取模型:
ollama pull qwen:7b(大脑)ollama pull bge-m3(翻译官,体积较小但下载需时间)
- 验证维度:确认
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)就是固定的。
错误场景:
- 你一开始用
bge-m3(1024维) 跑通了代码,Milvus 创建了 1024 维的表。 - 后来觉得想换个模型,改成了
text-embedding-3-small(1536维)。 - 报错:插入数据失败,提示维度不匹配。
正确解决方案:
如果你要更换 Embedding 模型,必须执行以下“三部曲”:
- 🗑️ 删库:删除 Milvus 中旧的
policy_docs集合。 - 📝 改配:修改配置文件中的
embedding-dimension。 - 🔄 重跑:重启应用,重新读取 PDF 进行切片和入库。
更多推荐



所有评论(0)