后端 AI 实战|SpringBoot+SpringAI+Ollama+MySQL 向量库,搭建仓储知识库智能助手

📅 发布时间:2026/7/13 3:08:28 👁️ 浏览次数:
后端 AI 实战|SpringBoot+SpringAI+Ollama+MySQL 向量库,搭建仓储知识库智能助手
作为多年供应链 / WMS 方向 Java 后端开发结合我过往仓储业务背景花费两天独立搭建一套轻量化私有化 RAG 问答系统SpringBoot 3.5.16 SpringAI1.0 Ollama 本地大模型 MySQL9.7 原生向量单库同时持久化业务文档原文与 Embedding 向量无需第三方向量中间件适配企业内网离线场景最终实现仓储规则自然语言问答下面完整记录全流程实现、踩坑与架构选型思考。一、项目整体架构1. 架构流程图自行配图前端 SSE 对话页面 → SpringBoot 后端SpringAI 核心层 → Ollama 本地大模型对话大模型 Embedding 向量化模型 → MySQL9.7存储业务文档、文本、向量2. 各层职责拆解前端层极简对话页面基于 SSE 长连接实现打字机流式输出解决一次性加载长回答卡顿问题后端服务层SpringAI 封装 Ollama 调用统一管理对话请求、文本切片、Embedding 向量生成RAG 核心逻辑用户提问→问题向量化→MySQL 向量相似度检索匹配知识库文档→拼接上下文 Prompt 送入大模型→流式返回答案大模型层Ollama 本地离线部署全程不调用任何付费云端 API私有化无网络依赖存储层MySQL9.7 原生VECTOR字段存储向量TEXT 字段存原始业务文档结构化字段记录文档分类、创建时间单库保证原文与向量事务一致性。3. 业务场景定位面向仓储供应链内部员工知识库录入仓库管理制度、差旅报销标准、公司基础信息、售后流程等文档员工通过自然语言提问自动检索对应业务规则给出回答替代翻阅零散 Word 文档提升内部咨询效率。二、核心技术选型与选型权衡拔高核心面试重点1. 向量存储为什么选用 MySQL9.7放弃 Milvus/Chroma优势零额外运维现有业务均使用 MySQL无需部署、维护独立向量服务降低小团队运维成本数据强一致性业务文档、文本、向量存在同一张数据表新增 / 修改 / 删除可通过 MySQL 事务原子操作彻底规避「向量库与业务库数据不同步」的经典 RAG 痛点学习成本低开发无需额外掌握向量库专属 API全部使用标准 SQL 完成向量检索适用边界客观说明短板体现架构思考MySQL 仅支持精确 KNN 全表距离计算无 HNSW、IVF 等 ANN 近似向量索引仅适合10 万条以内文档的内部后台系统若面向 C 端、百万级海量向量高并发检索仍需 Milvus、PGVector 等专业向量引擎。对比 PGVector团队技术栈统一 MySQL无需额外搭建 PostgreSQL 环境优先选用 MySQL 原生向量能力。2. AI 框架SpringAI 2.0Spring 官方 AI 集成框架统一封装各大模型厂商 API本次对接本地 Ollama踩坑重点2.0 版本发生破坏性 API 重构大量旧类弃用、包路径变更网上多数教程为旧版本存在大量兼容问题。3. 本地大模型Ollama离线私有化部署本地完成对话、文本 Embedding 向量化无 API 调用费用适配企业内网、涉密场景无需申请任何模型 Key。4. 流式输出SSE 服务端推送区别于普通同步接口一次性返回完整文本采用 SSE 长连接分段推送大模型输出内容前端实现打字机实时展示效果提升交互体验。三、核心功能实现代码3.1 MySQL9.7 向量数据表结构附完整 SQL自行截图支持存储文档原文、分类、向量、创建时间VECTOR (768) 适配主流 Embedding 模型 768 维向量CREATE TABLE IF NOT EXISTS knowledge_source ( id BIGINT AUTO_INCREMENT PRIMARY KEY, category VARCHAR(64) COMMENT 数据分类如 wms / finance / company, content TEXT NOT NULL COMMENT 原始知识文本, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS vector_store ( id VARCHAR(64) PRIMARY KEY, content TEXT, metadata JSON, embedding TEXT -- 向量以 JSON 数组文本存储如 [0.12,-0.34,...] ); INSERT INTO knowledge_source (category, content) VALUES (wms, 商品库存低于安全库存时必须在24小时内提交补货申请), (wms, 入库货物外包装破损、水渍需生成质检异常单禁止上架), (wms, 拣货作业优先匹配就近库位同一订单多商品合并拣货减少动线), (wms, 仓库A01存放包装耗材B02存放大件货物不可混放), (finance, 员工差旅费住宿单日上限300元超出部分财务不予报销), (finance, 采购增值税发票必须匹配对应入库单票货不一致直接驳回审核), (finance, 仓储耗材采购单次金额超过5000元需要部门经理审批), (aftersale, 客户签收7天内商品无损坏支持无理由退货), (aftersale, 缺货订单需当日联系客户选择补发或全额退款二选一), (company, 公司全称北京智联仓储科技有限公司成立于2020年总部位于北京海淀区), (company, 公司目前员工总数350人其中仓储运营部120人、技术研发部80人...), (company, CEO张伟、CTO李明、COO王芳电话010-88886666...), (company, 公司在上海、广州、成都设有分公司...);3.2 Maven 关键依赖踩坑点SpringAI 依赖下载失败解决方案SpringAI 官方仓库国内镜像同步延迟高提供阿里云镜像加速配置解决依赖拉取超时、缺失问题目前因为springAi2.0.0刚上市不久aliyun服务器目前针对这个版本的jar包不全所以暂时用旧版稳定版完整 pom 核心依赖片段如下?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.5.16/version relativePath/ /parent groupIdcom.my/groupId artifactIdspringAi/artifactId version0.0.1-SNAPSHOT/version nameOllama-RAG-Demo/name properties java.version21/java.version spring-ai.version1.0.0/spring-ai.version /properties dependencies !-- Spring WebServlet 容器提供 REST 与 SSE 适配 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- WebFlux提供 Reactor 响应式适配使 Controller 能直接返回 FluxString 做 SSE 流式输出 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency !-- JDBCJdbcTemplate 数据源自动配置用于自定义 MySQL 向量库 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency !-- MySQL 9.7 驱动原生 VECTOR 类型支持 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency !-- Spring AI BOM 统一管理版本 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-ollama/artifactId /dependency !-- Spring AI 公共模块VectorStore 抽象、SearchRequest、Document、EmbeddingModel 等 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-vector-store/artifactId /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies !-- 通过 BOM 引入 Spring AI 1.0.0 各模块版本避免逐个指定 -- dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project3.3 SpringAI 整合 Ollama 配置application.yml Ollama 模型地址、超时配置 完整 Config 配置类OllamaChatModel、OllamaEmbeddingModel Bean 注入。3.4 RAG 核心业务逻辑文档入库流程原始文本分段切片 → 调用 Embedding 模型生成向量 → SQL 动态插入 MySQL文本与向量同步落库问答检索流程用户提问 → 问题向量化 → MySQL 向量相似度召回匹配文档 → 组装上下文 Prompt 传入对话模型 → SSE 流式返回结果。package com.my.springai.controller; import com.my.springai.dto.AiQueryDTO; import com.my.springai.service.RagService; import com.my.springai.vectorstore.MysqlVectorStore; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import java.util.LinkedHashMap; import java.util.Map; RestController RequestMapping(/ollama/rag) RequiredArgsConstructor public class RagController { private final RagService ragService; private final MysqlVectorStore mysqlVectorStore; /** 加载本地业务规则文档分片向量化后存入 MySQL */ GetMapping(/load) public String loadDoc() { return ragService.loadDoc(); } /** 同步问答 */ PostMapping(/chat) public String ragChat(RequestBody AiQueryDTO dto) { return ragService.chat(dto.getQuestion()); } /** SSE 流式问答前端 sse-test.html 调用 */ GetMapping(value /stream/chat, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxString streamChat(RequestParam String question) { return ragService.streamChat(question); } /** 手动上传单据文本分片入库 */ PostMapping(/upload/doc) public String uploadDoc(RequestParam String docText) { return ragService.uploadDoc(docText); } /** 从 knowledge_source 表重新同步数据到向量库 */ GetMapping(/sync) public String syncFromDb() { return ragService.syncFromDb(); } /** 诊断接口查看向量库状态 */ GetMapping(/status) public MapString, Object status() { MapString, Object result new LinkedHashMap(); result.put(向量库文档总数, mysqlVectorStore.count()); result.put(提示, 如果总数为 0请先调用 GET /ollama/rag/sync 或重启应用); return result; } }3.5 SSE 流式对话 Controller标准 SSE 接口实现分段推送大模型输出前端持续监听打印回答内容附带跨域、编码处理逻辑。最终前端页面展示的效果图如下现有短板MySQL 无 ANN 向量索引十万条以上文档向量检索速度大幅下降文本切片规则简单未做递归分割、重叠分块优化长文档召回精度一般无向量缓存重复提问会重复计算向量存在性能浪费未实现文档增量更新、向量批量刷新能力。后续迭代优化方向海量数据场景拆分存储架构MySQL 存业务原文引入 Milvus 做高性能向量检索检索优化增加 Redis 缓存高频问题向量结果提升重复问答响应速度文本处理完善递归文本分割、关键词增强检索提升 RAG 召回准确率功能扩展接入文档上传解析PDF/Word 自动切片入库、多轮对话记忆、角色权限控制。七、总结对于中小企业内部低并发知识库场景MySQL9.7 原生向量完全可以替代独立向量数据库大幅简化系统架构降低运维成本SpringAI 大幅降低 Java 后端接入大模型的开发门槛但版本迭代快2.0 存在大量不兼容改动开发时需要对照官方最新文档私有化 OllamaMySQL 的 RAG 方案适合内网、无外网环境的企业业务 AI 落地是传统后端向 AI 业务拓展低成本实践路径本次实战完整覆盖「文档存储→向量化→向量检索→大模型问答→流式前端交互」整条 RAG 链路弥补传统 Java 后端缺少 AI 落地实战经验的短板相关技术、选型思路、踩坑记录均可用于面试沟通。完整项目开源地址https://gitee.com/danruoshui/springai-ollama-rag.git; https://github.com/316959108/springai-ollama-rag.git配套资料MySQL9.7 向量官方文档、SpringAI2.0 官方参考文档欢迎交流后端 AI 落地相关问题。