Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南

系列

  • 所属专栏:《Java 开发者从零实现 RAG 知识库》
  • 文章类型:按需查阅的附录,不计入 12 篇主线进度
  • 建议前置:至少完成第 1 篇 Ollama 安装;更换 Embedding 模型前完成第 7 篇 Qdrant
  • 返回主线:《第12篇:AI 与 RAG 术语索引》

这不是 RAG 主线的必修章节。当电脑内存不足、希望提高回答速度,或要替换 Embedding 模型时,再回来查阅。

默认聊天模型是 qwen3:14b。24 GB 以下内存、同时运行较多应用或希望提高响应速度时,可以改用 qwen3:8b。

Embedding 模型仍然使用 bge-m3。不要因为更换聊天模型而修改 Qdrant 的 1024 维向量配置。

先判断你要换哪一类模型

想改善什么 应该更换 是否需要重建 Qdrant 索引
内存占用、回答速度、答案风格 聊天模型,例如 qwen3:14b 换成 qwen3:8b 不需要
语义检索效果、向量维度或 Embedding 服务 Embedding 模型,当前是 bge-m3 需要

原因是聊天模型只在检索完成后阅读 Prompt,它不会生成存入 Qdrant 的向量。Embedding 模型决定向量空间和维度,文档向量和问题向量必须由同一个模型生成。

完成进度

  • 1. 确认要换聊天模型还是 Embedding 模型
  • 2. 先下载新模型并单独验证
  • 3. 只修改当前运行模块的配置
  • 4. 用 ollama ps 或请求日志确认聊天模型
  • 5. 如果更换 Embedding 模型,创建新 Collection 并重新入库

第 1 步:下载并验证 8B 模型

bash 复制代码
ollama pull qwen3:8b
ollama list
ollama run qwen3:8b

能正常回答后输入 /bye 退出。

第 2 步:只修改正在学习的模块

不需要一次修改所有示例。每个模块都是独立学习阶段,只修改当前准备运行的入口即可。

01-ollama-basics

前五个阶段分别保存自己的模型名:

text 复制代码
step01/RawHttpCall.java       请求 JSON 中的 model
step02/ParsedResponse.java    请求 JSON 中的 model
step03/InteractiveChat.java   MODEL 常量
step04/ContextChat.java       MODEL 常量
step05/SystemPromptChat.java  MODEL 常量

把当前类中的:

java 复制代码
qwen3:14b

改成:

java 复制代码
qwen3:8b

03-markdown-rag

修改 MarkdownRagDemo 创建 OllamaChatClient 时传入的模型名:

java 复制代码
new OllamaChatClient(
        httpClient,
        objectMapper,
        URI.create("http://localhost:11434/api/chat"),
        "qwen3:8b"
);

04-qdrant-rag

修改 QdrantRagDemo 创建 OllamaChatClient 时传入的模型名:

java 复制代码
new OllamaChatClient(
        httpClient,
        objectMapper,
        URI.create("http://localhost:11434/api/chat"),
        "qwen3:8b"
);

05-spring-rag

Spring Boot 模块不需要修改 Java 代码。启动前设置环境变量:

bash 复制代码
RAG_OLLAMA_CHAT_MODEL=qwen3:8b \
  mvn -f 05-spring-rag/pom.xml spring-boot:run

Spring Boot 会把 RAG_OLLAMA_CHAT_MODEL 映射到:

yaml 复制代码
rag:
  ollama:
    chat-model: qwen3:8b

也可以直接修改 05-spring-rag/src/main/resources/application.yml,但环境变量更适合临时切换,不会产生 Git 修改。

第 3 步:确认实际聊天模型

查看 Ollama 当前加载的模型:

bash 复制代码
ollama ps

网页回答速度变快并不能证明配置一定生效,应以 ollama ps 或 Ollama 请求日志中的模型名为准。

更换 Embedding 模型时为什么必须重新入库

不同 Embedding 模型生成的向量不在同一个语义空间中,维度也可能不同。不能用新模型生成问题向量,再去搜索旧 bge-m3 文档向量。

安全的切换顺序是:

text 复制代码
下载并验证新 Embedding 模型
              ↓
查看新模型的向量维度
              ↓
创建一个新名称、新维度的 Collection
              ↓
使用新模型把全部文档重新入库
              ↓
同时切换 embedding-model 和 collection
              ↓
验证检索效果后,再决定是否保留旧 Collection

先查看新模型的实际维度:

bash 复制代码
curl -s http://localhost:11434/api/embed \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "新的-embedding-模型名",
    "input": ["维度测试"]
  }' | jq '.embeddings[0] | length'

然后使用返回的维度创建新 Collection。例如新模型返回 768 维:

bash 复制代码
curl -X PUT http://localhost:6333/collections/kubernetes_chunks_new_embedding \
  -H 'Content-Type: application/json' \
  -d '{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    }
  }'

768 只是示例,必须替换为前一条命令返回的真实维度。不要直接修改或删除原 Collection,先保留回退能力。

Spring Boot 模块可以在启动时同时指定新模型和新 Collection:

bash 复制代码
RAG_OLLAMA_EMBEDDING_MODEL=新的-embedding-模型名 \
RAG_QDRANT_COLLECTION=kubernetes_chunks_new_embedding \
  mvn -f 05-spring-rag/pom.xml spring-boot:run

服务启动后,使用第 10 篇的知识管理 API 把原文档重新提交到新 Collection。只改配置不会自动搬运旧向量。

常见问题

提示模型不存在

模型名称必须与 ollama list 完全一致,包括标签。例如本教程使用的是 qwen3:8b,不是 qwen3-8b。

更换聊天模型后 Qdrant 维度错误

聊天模型不参与向量化。确认 embedding-model 仍是 bge-m3,Collection 仍是 1024 维。

更换 Embedding 模型后检索结果很奇怪

检查文档和问题是否使用同一个 Embedding 模型生成向量。如果 Collection 中还是旧向量,需要把所有文档重新入库,不能只重启应用。

测试仍然断言 qwen3:14b

部分客户端单元测试会明确验证默认模型名。学习时临时使用环境变量不会修改测试默认值;如果永久改变代码默认模型,需要同步更新对应测试。


本篇小结

  1. 默认聊天模型是 qwen3:14b,内存紧张或想更快时可以改用 qwen3:8b;这不需要重建向量索引。
  2. 不需要一次改完所有示例,只修改当前正在运行的模块入口即可。
  3. 01-ollama-basics、03-markdown-rag、04-qdrant-rag 改 Java 中的模型名,05-spring-rag 用环境变量 RAG_OLLAMA_CHAT_MODEL 临时切换,不产生 Git 修改。
  4. 用 ollama ps 确认真正加载的模型,不要凭回答速度判断配置是否生效。
  5. 更换 Embedding 模型时,必须确认新维度、创建新 Collection,并使用新模型重新入库全部文档。

本篇自测

  1. 从 qwen3:14b 换到 qwen3:8b 后,为什么不用重新入库?
  2. 更换 Embedding 模型时,为什么不能继续搜索原 Collection?
  3. 为什么建议创建新 Collection,而不是直接删除旧 Collection?
  4. 临时切换 Spring Boot 聊天模型时,哪个环境变量最合适?

参考答案:聊天模型不生成 Qdrant 向量;不同 Embedding 模型的向量空间和维度可能不同;新 Collection 可以保留回退和对比能力;使用 RAG_OLLAMA_CHAT_MODEL。

下一篇

到此,RAG 主线教程和模型切换附录已经结束。可以回到《Java RAG 实战专栏导读:从零跑通 Ollama + Qdrant + Spring Boot 知识库》复习整体路线。

完整代码都在 GitHub(欢迎 Star ⭐)

本专栏的全部示例代码都已开源,包含 5 个可独立运行的 Maven 模块、自动化测试和完整分篇教程。建议 Fork / Clone 下来,边读边跑:

🔗 https://github.com/bysbsh/ai-rag-learning-guide

  • 代码与教程同步更新,对照每一篇动手实践效果最好。
  • 如果这份教程帮到了你,点个 Star 就是对我最大的支持,也方便你之后找回最新版本。
  • 遇到问题或发现错漏,欢迎在仓库提 Issue / PR。项目采用 MIT 协议,可自由学习与二次创作。
相关推荐
m4Rk_6 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
不会就选b6 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
运行时异常6 小时前
【WMS 仓储系统集成 AI Agent 实战】第 8 讲(终篇):生产部署与并发安全——Semaphore 放进 Flux.defer 的坑,压测抓了一晚上
人工智能·安全
杨杨杨大侠6 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
代码方舟6 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
EatFan6 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
虹科网络安全6 小时前
“顶会”看安全(十八):超越越狱:揭示由能力边界模糊引发的 LLM 应用安全风险
人工智能·安全
Maiko Star6 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
鬓戈7 小时前
Rust 语言与 AI 应用生态调研及学习路径
人工智能·学习·rust
天远API7 小时前
零信任架构实战:基于天远人企关联构建自动化图谱网关
网络·人工智能·架构·自动化