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 协议,可自由学习与二次创作。
相关推荐
ForteScarlet14 分钟前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
FPC工厂——皇榜科技15 分钟前
机器人灵巧手线路板:从“握得住”到“摸得准”:一只机械手的柔性神经密码
网络·人工智能·科技·机器人·pcb工艺
萧瑟余晖17 分钟前
Java深入解析篇六十二之安全机制详解
java·开发语言
JMchen12319 分钟前
Cursor高阶玩法:.cursorrules编写与Spec-Driven开发实战,把AI调教成专属结对编程搭档
人工智能·vscode·kotlin·cursor·结对编程·spec-driven·.cursorrules
szxinmai主板定制专家30 分钟前
基于 RK3588+RK1820/28 算力卡的国产工控机,适用于机器视觉,机器人等边缘算力场景
人工智能·fpga开发·zynq·控制器·mpsoc·半导体设备
右耳朵猫AI41 分钟前
PHP周刊2026W36 | Laravel AI SDK 0.11可观测、Symfony 8.1.5、Octane并发、事件溯源
人工智能·php·laravel
小刘在重生~42 分钟前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle1 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
知几蜗牛1 小时前
ChatGPT Images 2.5更新解析:模板、草图与迭代编辑
人工智能
223糖1 小时前
思考 AI 应用架构
人工智能·架构