Tika + Milvus + Spring AI 搭建企业级 RAG 知识库(解析→切块→向量化→检索→问答一条龙可落地)
前三篇我们把「Excel 精细化处理」「全格式文档解析」逐个解决了:
- Apache Fesod 入门:Excel 业务级读写 + 错误报告;
- Spring Boot + Fesod 生产组件:异步任务 + 进度 + 模板填充;
- Apache Tika 入门到生产:1000+ 格式统一文本/元数据提取 + OCR。
今天,我们把这几个工具 Spring AI + Milvus + Tika 三剑客串起来,搭一套真正可在企业落地的 RAG(Retrieval-Augmented Generation,检索增强生成)知识库。之后,你公司里 PDF、Word、Excel、PPT、Markdown、扫描件 OCR…… 上传后往知识库一丢,员工就可以用自然语言提问,拿到**”基于公司内部文档 + 带引用 + 不幻觉”** 的精准回答。
和网上玩具级 Demo 不一样,本篇会直面生产环境的 7 大硬问题:
- ✅ 1000+ 种格式文档解析(Tika 自带);
- ✅ 智能切块(TokenTextSplitter + 按语义边界,不切断半句话);
- ✅ 向量数据库选型与索引(Milvus 2.6.x,HNSW + COSINE);
- ✅ Spring AI 统一 ChatClient + Embedding 抽象(换模型不改代码);
- ✅ 多租户/按权限过滤(SQL-like metadata filter);
- ✅ 回答自带来源引用(员工能点回去看原文);
- ✅ 异步文档入库 + 进度可查(大文件不阻塞接口)。
全部代码复制即可跑通,结尾附带一张”RAG 效果调优路线图”,帮你从 60 分做到 90 分。
0)一张图看清整条链路
先上架构全景,后面每一章按箭头从上到下实现:
1 | |
0.1 技术栈版本(截至 2026 Q3,生产推荐组合)
| 组件 | 选型 | 版本 | 说明 |
|---|---|---|---|
| 基础运行 | Spring Boot | 3.3.5 | JDK 17+,稳定主流 |
| AI 框架 | Spring AI | 1.1.7 | 官方推荐,支持 OpenAI/通义/文心/Ollama 统一抽象 |
| 文档解析 | Apache Tika | 2.9.4 | 通过 spring-ai-tika-document-reader 引入 |
| 向量数据库 | Milvus | 2.6.24 LTS | 千万级向量首选;如果规模 < 100w 可降级为 PGVector |
| Embedding 模型 | OpenAI text-embedding-3-small / 通义 text-embedding-v3 | 1536 维 | 中文场景推荐 bge-m3 或通义 embedding |
| Chat 模型 | GPT-4o-mini / 通义千问 4-plus / 文心 4.0 | - | 回答生成,可随时换 |
1)基础设施:Milvus + Spring Boot 项目骨架
1.1 一键起 Milvus(开发环境,Docker Compose Standalone)
Milvus 官方强烈推荐的开发部署方式:三个容器(Milvus 节点 + etcd 元数据 + MinIO 对象存储),一启动就好,生产再换分布式集群。
新建 infra/docker-compose.yml:
1 | |
启动 + 验证:
1 | |
⚠️ 资源提醒:Milvus Standalone 三个容器约占 4~6GB 内存,开发机至少 8GB;16GB 才舒服。
1.2 完整 pom.xml 依赖
Spring AI 现在正式发布在 Maven Central,不再需要 milestone 仓库,真省心~
1 | |
💡 换国产大模型?把
spring-ai-openai-spring-boot-starter替换成:
- 通义千问:
spring-ai-dashscope-spring-boot-starter(spring.ai.dashscope.api-key);- 文心:
spring-ai-qianfan-spring-boot-starter;- Ollama 本地模型:
spring-ai-ollama-spring-boot-starter(零成本内网跑)。下面代码一行都不用改,因为我们全部用
ChatClient/EmbeddingModel抽象。
1.3 application.yml:配置串起来
1 | |
2)Spring AI 核心 Bean 初始化(ChatClient + 文本切块器)
Spring Boot Starter 会自动为你配置 ChatModel、EmbeddingModel、VectorStore。我们只需要再加点业务友好的 Bean:
1 | |
3)核心模块一:文档入库服务(异步 + 进度可查)
上传的文件一般不小,接口同步等 2 分钟不可接受。和 Fesod 那篇的思路一致:立刻返回任务 ID → 后台 @Async 跑 → 前端轮询进度。
3.1 任务模型
1 | |
3.2 入库服务(ETL 三步骤:Load → Split → Embed & Store)
1 | |
3.3 进度查询服务(最简单版本用 Caffeine 本地缓存;生产换 Redis)
1 | |
3.4 扫描件 PDF / 图片:OCR 预处理(可选)
前面检测到 Tika 提取的文本为空时,判断是扫描件。我们直接复用 Apache Tika 教程实战四 中的 OCR 能力,在入库前先 OCR 一把转成可搜索文本:
1 | |
生产建议:OCR 比较慢(1 页 PDF 1~3 秒),可以单独做个”OCR 异步队列”先把扫描件转成可搜索 PDF 再走入库流程。
4)核心模块二:问答检索服务(相似度检索 + Prompt 组装 + 来源引用)
这是在线问答的核心,也是最容易”幻觉”的地方。Spring AI 给了 QuestionAnswerAdvisor 帮你自动把”检索到的知识”塞进 Prompt,再传给 LLM 生成回答。下面我们一步步来。
4.1 知识库查询接口 Service
1 | |
4.2 返回 VO
1 | |
5)Controller 接口:4 个端点跑通整个 RAG
1 | |
请求体:
1 | |
通用 R<T> 就是第二篇里的那个 {code,msg,data} 结构,直接复用。
6)生产级 7 个硬问题的解决思路
6.1 文档去重 & 增量更新
用户同一份文件反复上传怎么办?在 buildCommonMeta 时加 content_hash 字段(文件 SHA256),入库前:
1 | |
6.2 删除 / 更新某份文档
因为每个 chunk 上都有 source(文件名)和 content_hash,按元数据删:
1 | |
6.3 中文 Embedding 效果差 → 换国产 Embedding + 更大 chunk
OpenAI text-embedding-3-small 对中文的理解不如国产中文 Embedding。推荐替换:
1 | |
6.4 回答的引用不准 → 加 Rerank 重排序
相似度检索 Top-K=30 → Rerank 模型(bge-reranker、通义 Rerank)精排到 Top 6,再给 LLM。这一步通常能提升 15%~30% 准确率。
6.5 接口慢 / 成本高 → Embedding 缓存
同一个 chunk 的文本不会变,Embedding 结果可以本地 Caffeine 10 分钟缓存或 Redis 缓存,避免反复调 API:
1 | |
6.6 知识库回答”胡说八道” → 加 Self-Check
让模型在回答结尾输出 [[confidence:0.9]],低于 0.6 的直接打回”未找到”。或者让 LLM 自己二次检查:
1 | |
6.7 超大文档(> 1000 页 PDF)
- 分层分块:
Parent Document Retrieval—— 检索用小 chunk (200 token),拼 Prompt 用整个父 section (2000 token); - 摘要索引:先让 LLM 给每个 section 写 1 句摘要,检索时先匹配摘要,再展开原 section。
7)本地快速验证 & 调用示例
7.1 上传文档
1 | |
轮询进度:
1 | |
7.2 提问
1 | |
预期返回:
1 | |
完成!🎉 从文档上传到问答全链路跑通。
8)总结 & RAG 从 60 分 → 90 分的成长路线图
8.1 本篇交付物
| 模块 | 功能 | 代码位置 |
|---|---|---|
| 基础设施 | Milvus Docker Compose 一键启动 + pom.xml + application.yml | 第 1 章 |
| 文档入库服务 | Tika → 切块 → Embedding → Milvus 异步 + 进度 | 第 3 章 |
| 问答服务 | 相似度检索 + 元数据过滤 + Prompt 组装 + 来源引用 + 流式 | 第 4、5 章 |
| 生产加固 | 去重、OCR、缓存、Self-Check、Rerank、大文档分层 | 第 6 章 |
8.2 RAG 效果分级路线图
| 级别 | 特征 | 做法 |
|---|---|---|
| 60 分(可用) | 基础问答 + 来源 + 不瞎编 | 本篇全部内容 |
| 70 分(准确) | 中文 Embedding + Rerank + 更大 Top-K | Ch6.3 + 6.4 |
| 80 分(好用) | 多轮对话记忆 + Query 改写 + 问答缓存 | MessageChatMemoryAdvisor + 重写用户问题 |
| 90 分(企业级) | 权限过滤(RBAC)+ Agent 工具调用 + 指标监控(召回率/准确率) | 元数据里加 dept_ids、security_level;接入 Micrometer Tracing |
| 95+(极致) | 图 RAG / 混合检索(向量 + BM25 全文) + 知识图谱 + 评估集自动回归 | Milvus 2.6 支持 BM25 全文混合检索,效果飙升 |
8.3 与前面三篇的配合图
1 | |
把这 4 篇代码整合进你的项目,Excel 导入导出、文档合规审计、智能知识库问答 三件套直接拉满,再也不用因为”解析格式”和”查不到资料”加班啦 🚀。