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-basics03-markdown-rag04-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 协议,可自由学习与二次创作。
相关推荐
wuyk5551 小时前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
武子康1 小时前
Pi Extension 写完不等于可用:从类型检查到真实 Runtime 的证据阶梯
人工智能·llm·agent
SL_staff1 小时前
销售知识管理的断点分析与技术解法:从3天找话术到秒级检索
java·开源·github
荣码1 小时前
向量数据库选型:4种方案全测了,选错重来成本最高
java·python
rannn_1111 小时前
【力扣hot100】二叉树专题+总结
java·算法·leetcode·二叉树
润乾软件1 小时前
如何给已有报表系统增加 AI 语言查询能力——AI 赋能数据分析技术探讨与实践
人工智能·chatbi
微硬创新1 小时前
不用换设备,也能接入智能系统:耐达讯自动化NY-B801网关的神奇功效
人工智能·网络协议·自动化·信息与通信
Elastic 中国社区官方博客1 小时前
Elasticsearch:什么是向量数据库?
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai
啊嘞嘞?1 小时前
力扣(岛屿数量)
算法·leetcode