跳到主要内容基于 Ollama 和 Milvus 的本地 RAG 知识库搭建(Java) | 极客日志JavaAIjava算法
基于 Ollama 和 Milvus 的本地 RAG 知识库搭建(Java)
介绍使用 Ollama 和 Milvus 在本地搭建 RAG 知识库助手的完整流程。首先通过 Docker 部署 Milvus 向量数据库及 Attu 可视化工具,并安装 Ollama 加载开源模型。接着基于 Spring Boot 和 Java 17 开发后端服务,集成 Apache Tika 解析文档,实现文本向量化存储与检索。最后通过 API 接口验证文档入库与智能问答功能,支持离线运行,保障数据隐私。
松间照月28K 浏览 前提需要 Docker 环境,本文基于 Docker 安装 Milvus 向量数据库。后台通过 Java 项目启动,Java 版本 17。
技术组件核心作用与优势
| Ollama | 本地运行开源大模型(对话生成、文本向量化) | 1. 轻量便捷,一键部署,无需复杂的模型环境配置; |
- 离线可用,支持 Qwen、Llama、Mistral 等多款开源模型;
- 支持自定义模型,可嵌入固定角色与业务规则;
- 无调用额度限制,零成本使用。 |
| Milvus | 存储与检索高维向量数据(知识库核心载体) | 1. 专为向量检索设计,性能远超通用数据库,支持百万级向量快速检索;
- 支持数据持久化,重启服务后知识库数据不丢失;
- 提供可视化工具 Attu,方便管理向量集合与数据;
- 可横向扩展,从单机版平滑升级到分布式集群,满足业务增长需求。 |
| Spring AI | 基于 Spring Boot,简化大模型 / 向量库整合 | 1. 封装 Ollama 调用,无需手写 HTTP 请求,一行代码完成文本向量化与对话生成;
- 与 Spring Boot 无缝集成,支持配置化管理模型参数,自动注入客户端;
- 提供统一的 RAG 流程支撑,降低大模型项目开发成本;
- 支持扩展多种大模型 / 向量库,便于后续技术选型替换。 |
| Apache Tika | 解析 PDF/Word 等多种格式文档(辅助构建知识库) | 1. 支持几乎所有主流文档格式,无需单独开发各格式解析逻辑;
- 轻量高效,能快速提取文档中的纯文本内容,用于后续向量化。 |
步骤 1:Ollama 安装与必备模型下载
Ollama 是本地智能体的「大脑」,负责将文本转换为向量(供 Milvus 存储)和基于检索结果生成自然语言回答,先完成它的安装与模型下载。
1. 跨平台安装 Ollama
Ollama 支持全平台安装,步骤简单,无需额外配置:
- Windows 系统:
- 访问 Ollama 官方下载地址,点击下载 Windows 版本安装包(.exe 格式);
- 双击安装包,按照提示下一步安装(默认勾选「Add Ollama to PATH」,无需手动修改);
- 安装完成后,Ollama 会自动在后台启动服务,无需手动执行命令。
- macOS 系统:
- 访问 Ollama 官方下载地址,下载 macOS 版本安装包(.dmg 格式);
- 双击安装包,将「Ollama」拖拽到「应用程序」文件夹;
- 打开终端,执行
ollama --version 触发服务启动(首次启动可能需要 10 秒左右)。
- Linux 系统:
- 安装完成后,执行
systemctl start ollama 启动 Ollama 服务(设置开机自启:systemctl enable ollama)。
curl -fsSL https://ollama.com/install.sh | sh
2. 验证 Ollama 安装成功
打开终端 / 命令行,执行以下命令,若能显示 Ollama 版本号,则说明安装成功:
3. 下载必备开源模型
本文项目需求,需要下载两款模型:「对话生成模型」(负责回答用户问题)和「文本向量化模型」(负责将文档 / 问题转换为向量),以下对话生成模型和文本向量化模型可以根据自己需求切换:
- 验证模型下载成功:执行
ollama list,若能看到上述两款模型的记录(包含模型名、大小、修改时间),则说明下载成功。
快速测试 Ollama 服务:执行 ollama run qwen2:7b-instruct,进入模型对话界面,输入「你好」,若能收到正常回复,说明 Ollama 服务运行正常(输入 /bye 可退出对话界面)。
下载文本向量化模型(all-MiniLM-L6-v2,轻量高效,适合本地运行):
ollama pull mahonzhan/all-MiniLM-L6-v2
下载对话生成模型(Qwen2 7B 指令版,中文表现优异,性价比高):
ollama pull qwen2:7b-instruct
注意:模型下载需要联网,下载完成后后续运行可完全离线;若下载速度较慢,可更换国内镜像源或耐心等待(7B 模型大小约 4GB 左右)。
步骤 2:Docker Compose 一键部署 Milvus + Attu
Milvus 运行依赖 Etcd(元数据存储)和 MinIO(对象存储),手动部署复杂且容易出错,我们使用 docker-compose.yml 一键部署全套服务,同时整合 Attu 可视化工具,方便后续管理向量数据。
1. 编写完整的 Docker Compose 配置文件
- 新建一个空文件夹(如
milvus-standalone-deploy),用于存放 Milvus 配置与数据,避免文件混乱;
- 在该文件夹内创建
docker-compose.yml 文件,粘贴以下完整配置(已优化网络通信与数据持久化):
version: '3.5'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3
networks:
- milvus
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
ports:
- "9001:9001"
- "9000:9000"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
command: minio server /minio_data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
networks:
- milvus
standalone:
container_name: milvus-standalone
image: milvusdb/milvus:v2.3.0
command: ["milvus", "run", "standalone"]
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
start_period: 90s
timeout: 20s
retries: 3
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- "etcd"
- "minio"
networks:
- milvus
attu:
container_name: milvus-attu
image: zilliz/attu:v2.3.9
environment:
MILVUS_URL: standalone:19530
ports:
- "8000:3000"
depends_on:
- standalone
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 30s
start_period: 60s
timeout: 10s
retries: 3
networks:
- milvus
networks:
milvus:
name: milvus
2. 启动 Milvus + Attu 服务
- 打开终端 / 命令行,进入
milvus-standalone-deploy 文件夹(即 docker-compose.yml 所在目录);
- 等待服务启动完成(首次启动需要下载镜像,约 5-10 分钟,取决于网络速度)。
执行以下命令,后台启动所有服务(-d 表示后台运行,不占用终端窗口):
注意:镜像下载失败的话增加 Docker 镜像的下载地址。如果解析失败的话,增加 DNS 解析尝试:"dns": ["8.8.8.8", "114.114.114.114"]
3. 验证 Milvus + Attu 启动成功
方法 1:查看 Docker 容器状态
执行 docker ps,查看是否有 4 个容器处于 Up 状态(milvus-etcd、milvus-minio、milvus-standalone、milvus-attu),若全部 Up,说明容器启动成功。
方法 2:访问 Attu 可视化界面
- 打开浏览器,输入
http://localhost:8000;
- 无需额外配置(默认连接
localhost:19530),直接进入 Attu 主界面;
- 若左侧显示「Milvus」连接成功,且能看到「Collections」(向量集合)、「Indexes」(索引)等菜单,说明 Milvus 服务启动正常,可正常使用。
4. 关键说明
- 数据持久化:所有数据(Etcd 元数据、MinIO 向量数据、Milvus 核心数据)均存储在
milvus-standalone-deploy/volumes 文件夹下,停止服务后数据不会丢失,下次启动可直接复用;
- 版本兼容:本文使用
Milvus v2.3.0 + Attu v2.3.9,这是经过验证的兼容组合,请勿随意更换版本(版本不匹配会导致 Attu 无法连接 Milvus);
- 停止服务:如需停止所有服务,进入
milvus-standalone-deploy 文件夹执行 docker-compose down(保留数据);若需清理所有数据,执行 docker-compose down -v;
- 端口冲突:若 19530、8000、9000 等端口被占用,可修改
docker-compose.yml 中的端口映射(如 8001:3000),避免冲突。
步骤 4:核心功能开发(实现完整 RAG 流程)
我们实现完整的 RAG(检索增强生成)流程:「文档解析 → 文本向量化 → 向量存入 Milvus → 用户问题向量化 → Milvus 检索相关向量 → Ollama 生成回答」,Java 实现方式如下:
git clone https://gitee.com/li-hedong/ai-robot.git
下载代码并安装配置。仓库依赖下载失败时,可访问 Maven 搜索地址查找对应版本。
步骤 5:系统启动与验证(完整流程跑通)
至此,所有组件与代码已搭建完成,我们按顺序启动服务,验证整个系统的运行效果,确保每一步都能正常工作。
1. 启动前置服务(按顺序)
- 确保 Ollama 服务已启动(安装后默认后台运行,若未启动,执行
ollama serve);
- 确保 Milvus + Attu 服务已启动(进入
milvus-standalone-deploy 文件夹,执行 docker-compose up -d);
- 准备测试文档:在
src/main/resources 下创建 docs 文件夹,放入一份 PDF 或 Word 测试文档(如 product_manual.pdf),用于后续入库测试。
2. 启动 Spring Boot 项目
- 在 IDEA 中,右键点击项目主启动类
AiDocumentRetrievalApplication.java,选择「Run」;
- 查看控制台日志,若显示「🎉 AI 文档检索系统启动成功!」且无报错,说明 Spring Boot 项目启动成功;
- 同时查看 Milvus 客户端连接日志,若显示「Milvus 客户端连接成功:localhost:19530」,说明 Milvus 连接正常。
3. 验证核心功能(使用 Postman 或浏览器)
验证 1:文档入库
访问 http://localhost:8081/api/knowledge/import?documentPath=classpath:docs/product_manual.pdf(替换为你的测试文档路径),若返回「文档入库成功!」,说明文档已成功解析并存入 Milvus;同时可访问 Attu(http://localhost:8000),查看 document_knowledge_base 集合,能看到入库的数据条数,验证入库成功。
验证 2:智能问答
访问 http://localhost:8081/api/knowledge/qa?question=产品的核心功能有哪些(替换为与测试文档相关的问题),若能返回基于文档内容的回答,说明整个 RAG 流程运行正常,智能体已具备离线知识库检索能力。
4. 离线验证(可选)
断开网络连接,重复上述「智能问答」步骤,若仍能正常返回回答(基于已入库的本地文档),说明系统实现了全离线运行,数据隐私得到保障。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online