后端 AI 实战|SpringBoot+SpringAI+Ollama+MySQL 向量库,搭建仓储知识库智能助手 📅 发布时间:2026/7/13 3:08:28 👁️ 浏览次数: 作为多年供应链 / 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 落地相关问题。
医疗AI建模前的数据准备:编码、防泄露与Pipeline工程实践 1. 项目概述:为什么数据准备不是“脏活”,而是建模成败的分水岭你手头刚拿到一份医院糖尿病患者的电子病历数据,目标是预测30天内再入院风险。EDA做完,分布图、相关性热力图、缺失值矩阵都看了个遍——接下来呢?很多人… 2026/7/13 3:08:27
基于 PyTorch 的 LLaMA/Qwen 大模型微调与行业 Agent 智能体落地实践 摘要 随着大模型技术快速普及,通用大模型在垂直行业场景中普遍存在专业知识缺失、任务执行逻辑混乱、输出内容幻觉严重等痛点,无法直接满足职称申报、工业运维、金融文案等细分业务需求。本文将从工程落地视角,完整讲解一套端到端轻量化微调 … 2026/7/13 3:06:27
推荐系统 4 阶段(召回/粗排/精排/重排)延迟与资源消耗量化分析 推荐系统四阶段性能工程:从召回到重排的延迟与资源消耗全景分析当用户点击电商APP首页的瞬间,后台的推荐引擎便开启了一场毫秒级的接力赛。这场接力赛由四个关键选手组成:召回、粗排、精排和重排,每个环节都在资源消耗与响应速度之… 2026/7/13 3:06:27
基于ADS127L11和PIC18F26K22的高精度数据采集系统设计 1. 项目概述:高精度模拟信号数字化方案在工业测量、医疗设备和科学仪器等领域,我们经常需要将微弱的模拟信号转换为高精度的数字信号。这次要分享的是基于TI的ADS127L11 Δ-Σ ADC和Microchip的PIC18F26K22 MCU搭建的高精度数据采集系统。这个组合特别适… 2026/7/13 4:37:21
零基础实战!Prompt工程→Context上下文工程→Harness驾驭工程→Loop循环工程:从普通提问→精准输出→可控合规→自动纠错(小白直接套用) 零基础实战!Prompt工程→Context上下文工程→Harness驾驭工程→Loop循环工程:从普通提问→精准输出→可控合规→自动纠错(小白直接套用) 前言 上一篇文章我完整讲清了提示词四代演化逻辑:Prompt工程→Context上下文工程… 2026/7/13 4:35:20
STM32与蓝牙音频模块开发实战:低延迟与高音质方案 1. 项目背景与硬件选型解析在嵌入式音频开发领域,蓝牙无线传输一直面临着延迟、音质损耗和功耗三大挑战。IDC777-1蓝牙音频模块与STM32L496AG微控制器的组合,恰好针对这些痛点提供了完整的解决方案。这套方案最吸引我的地方在于它同时支持传统蓝牙音频&a… 2026/7/13 4:35:20
从0入门!提示词技术完整演化路线:提示词→上下文→驾驭→循环工程,纯概念小白教程 从0入门!提示词技术完整演化路线:提示词→上下文→驾驭→循环工程,纯概念小白教程 前言 很多新手只会随便丢一句话提问AI,输出效果时好时坏,不知道提示词早已迭代四代,单纯修改文字早已不够用。今天从零拆… 2026/7/13 4:35:20
MCP3428与PIC18F86K22高精度数据采集系统设计 1. 为什么选择MCP3428与PIC18F86K22组合在工业现场和实验室环境中,数据采集系统的精度和稳定性往往直接决定最终数据的可靠性。MCP3428作为一款18位Δ-Σ ADC(模数转换器),其核心优势在于集成了可编程增益放大器(PGA)和内部基准电… 2026/7/13 4:33:19
AI音乐生成提示词设计指南:从零创作专业级歌曲 你是否曾经听过一首爆款歌曲,心里想着"这旋律真不错,我也能写出来",但一想到需要学习乐理、编曲软件、乐器演奏,就望而却步?现在,AI音乐生成工具Suno正在彻底改变这一局面。Suno不是简单的音乐拼… 2026/7/13 4:33:19
HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70+个痛点 HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70个痛点 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经在Honey Select 2中遇到过… 2026/7/13 0:01:19
语音转文字工具AsrTools:让音频整理变得简单高效 语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text … 2026/7/13 0:03:19
基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_ 基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 独家界面!不会重复,此项目属于本人原创,若有雷同,均是盗卖,各位买… 2026/7/13 0:05:20
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/13 2:34:55