当前位置: 首页 > article >正文

Spring AI Alibaba + RAG 实战:知识库检索模块从设计到落地

Spring AI Alibaba RAG 实战知识库检索模块从设计到落地混合检索 幂等入库 动态权重这是 AI 客服知识库能跑稳的核心与上一篇的关系上一篇讲了 AI 客服系统的整体架构——情绪感知、意图识别、Agent 工具链。这篇是那篇的续集专门讲RAG 知识库模块的设计与实现。如果你没看过上一篇这里先补一张对比表让你知道 RAG 模块在整个系统里处于什么位置上一篇已有的本篇新增的情绪感知EmotionAnalyzer文档摄入管线Ingest Pipeline意图识别IntentClassifier多格式文档解析PDF / MD / TXT / WordAgent 工具链订单退款向量检索 关键词倒排双路并行Redis 会话缓存RRF 混合检索融合排序MyBatis-Plus 数据访问searchWithScore()相似度评分扩展多模块 Maven 架构动态检索权重system_config 表控制一、RAG 模块在整体架构中的位置先回顾一下整体请求链路RAG 是其中的一个分支用户问题 → ChatController → ConversationService会话管理 → 意图识别 → 命中 RAG 意图 → HybridSearchService混合检索 ├── PgVectorKnowledgeStore向量检索语义相似度 └── RedisKeywordIndex关键词倒排索引jieba 中文分词 → 构建 System Prompt含检索到的 context → ZhipuAI / Ollama 生成回答核心代码在ai-csr-rag模块下检索层 入库层 索引层三个组件各自独立、职责清晰互不耦合。二、文档摄入管线Ingest Pipeline用户上传知识库文档之后系统需要把它切块、生成向量、建索引这一套流程就是摄入管线。2.1 整体流程文档上传 → MultiFormatDocumentLoader支持 PDF / TXT / Markdown / Word → TokenTextSplitter按 token 分块默认 500 → PgVectorKnowledgeStoreOllama 生成 embedding写 pgvector → RedisKeywordIndexjieba 分词建立 Redis 倒排索引 → KnowledgeDocument 状态更新为 READY2.2 几个关键的设计决策多格式统一入口不同格式文档的解析逻辑差异很大——PDF 要提取正文并清洗特殊字符Markdown 要去掉语法标记Word 要处理样式嵌套。MultiFormatDocumentLoader统一对外暴露一个接口内部按文件类型分派具体解析器上层调用方不用关心格式细节。每个 Chunk 独立持有 metadata这里有个不起眼但很重要的细节分块时必须给每个 chunknew HashMap(doc.getMetadata())而不是直接复用父文档的 metadata 引用。为什么因为如果共享同一个 Map多个 chunk 写chunk_index时会互相覆盖最后所有 chunk 的chunk_index都变成同一个值入库触发唯一约束冲突。这个坑我踩过留到踩坑篇细讲。幂等写入PgVectorKnowledgeStore.add()在入库前先按document_idDELETE 旧数据再配合ON CONFLICT DO NOTHING写入。这样重复 ingest 同一份文档不会报错也不会留下重复数据。线上知识库更新文档是高频操作幂等是必须的。三、混合检索Hybrid Search这是整个 RAG 模块最核心的部分。3.1 为什么要混合而不是单纯向量检索纯向量检索在语义相似的场景很好用但有个明显短板用户问退款状态是 PENDING 是什么意思向量检索会把语义相近的内容都召回来但PENDING 是精确词——这种场景关键词检索命中率反而更高。反过来纯关键词检索应对近义词、缩写、语义跨度大的问法就不行了。所以两条路都要走再融合排序这就是混合检索的出发点。3.2 检索流程查询请求 ├── 语义路Ollama embedding → pgvector cosine 检索 → TopK 结果 similarity score └── 关键词路jieba 分词 → Redis 倒排索引命中 → TopK 结果 → RRF 融合k60→ 统一排名列表两路并行互不阻塞最后用RRFReciprocal Rank Fusion做融合排序。RRF 的公式很简单每个文档在两路结果里分别有排名把1/(k rank)加起来就是最终得分k60 是经验值能平衡两路结果的权重差异。3.3 动态权重配置# 不在 yml 里写死在 system_config 表里动态控制rag.keyword_weight 0.4 rag.vector_weight 0.6keyword_weight和vector_weight从system_config表里读不重启服务就能调整检索策略。这个设计在灰度调参时非常好用——先把 keyword_weight 调高跑几天看召回质量不满意再往回调不用打包发版。配置项说明推荐起始值rag.keyword_weight关键词检索在融合中的权重0.4rag.vector_weight语义检索在融合中的权重0.6rag.top_k每路各取 TopK 结果5rag.similarity_threshold语义相似度过滤阈值0.53.4 相似度评分扩展Spring AI 的VectorStore.similaritySearch()默认不返回相似度分数只返回文档列表。但 RRF 融合需要分数来排序所以这里做了扩展新建SearchHitDTO包含document和score两个字段在PgVectorKnowledgeStore里新增searchWithScore()方法通过向量内积计算余弦相似度回填到SearchHit.score扩展之后每条检索结果都带着similarity字段既能用于 RRF 融合也能在 System Prompt 里标注置信度让大模型知道这条知识的可靠程度。四、Session 会话管理多轮对话不是独立的前几轮的上下文要带进来大模型才能理解你刚才说的那个订单指的是哪一个。SessionService维护USER / ASSISTANT / SYSTEM三种角色消息记录每轮对话结束后追加写入下一轮检索时一并注入 System Prompt。支持历史回溯和滑动窗口截断避免上下文过长撑爆 token 限制。五、当前系统状态模块状态备注文档摄入PDF / TXT / MD✅ 正常12 个 chunkembeddings 全入库向量语义检索✅ 正常相似度 0.55–0.63 区间命中关键词倒排检索✅ 正常jieba NPE 已修复fallback 兜底混合检索 RRF 融合✅ 正常双路召回k60 融合会话管理✅ 正常USER / ASSISTANT 消息写入正常Ollama 本地模型✅ 正常bge-large-zh-v1.5 向量模型就绪六、后续计划已完成Spring AI Alibaba 集成智谱 GLM-4情绪感知模块意图识别模块Agent 工具链订单查询、退款申请订单查询服务MyBatis-Plus退款申请服务RAG 知识库模块文档上传 → 向量入库 → 检索问答正在做多轮对话记忆优化转人工功能自动转接 手动转接后面要做知识库运营后台客服工作台人工接待数据统计与监控大屏源码怎么拿公众号「亦暖筑序」底部菜单【获取源码】完整的 Gitee 仓库直接拉。源码里除了文章提到的这些还有几个文章没展开的数据库初始化脚本5 张表带模拟数据跑起来就能测完整的多模块 pom 依赖配置不用自己一个个试版本了情绪分析 / 意图识别的完整 Prompt 模板文章里只是核心片段源码里是完整可运行的说白了吧看完文章理解思路拿到源码照着跑这才是最省时间的路径。不拿源码硬看你会卡在这行代码放哪个模块这种低级问题上浪费半天。 想继续聊的你在项目里有没有遇到过检索能命中但回答驴唇不对马嘴的情况大概率是 Prompt 里的 context 注入方式有问题或者 chunk 切分粒度没调好。评论区说一句下篇可以专门讲这个。RAG 知识库踩坑复盘五个真实 Bug已经写好了关注等更新。

相关文章:

Spring AI Alibaba + RAG 实战:知识库检索模块从设计到落地

Spring AI Alibaba RAG 实战:知识库检索模块从设计到落地 混合检索 幂等入库 动态权重,这是 AI 客服知识库能跑稳的核心 与上一篇的关系 上一篇讲了 AI 客服系统的整体架构——情绪感知、意图识别、Agent 工具链。这篇是那篇的续集,专门讲…...

给汽车软件工程师的ASPICE入门指南:别再只知其名,搞懂V模型和双向追溯性怎么落地

汽车软件工程师实战ASPICE:V模型与双向追溯性的敏捷落地指南 当JIRA看板上堆满用户故事,当每日站会变成需求变更讨论会,当测试工程师拿着三个月前过时的需求文档质问"这功能为什么和文档不符"——作为汽车软件工程师的你&#xff0…...

智慧树视频学习自动化:如何用浏览器插件实现高效学习?

智慧树视频学习自动化:如何用浏览器插件实现高效学习? 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台上的重复性操作而烦恼吗…...

碧蓝航线自动化脚本:你的24小时智能舰队管家

碧蓝航线自动化脚本:你的24小时智能舰队管家 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为每天重复的碧…...

【20年DevOps老兵亲授】Docker跨架构调试的3层抽象模型:底层指令集差异、中间层运行时适配、上层应用行为漂移

第一章:Docker跨架构调试的3层抽象模型总览Docker跨架构调试并非简单地运行不同CPU指令集的镜像,而是在运行时、构建时与平台描述三个正交维度上协同工作的系统性工程。这三层抽象分别对应**执行层(Runtime Abstraction)**、**构建…...

青龙面板脚本管理进阶:如何安全高效地维护你的多个脚本仓库(以京东为例)

青龙面板多脚本仓库管理实战:从混乱到秩序的进阶指南 在自动化脚本的世界里,青龙面板就像一位不知疲倦的管家,24小时为我们处理各种重复性任务。但当这位管家同时管理着来自不同主人的十几套规则手册时,混乱往往悄然而至——脚本冲…...

MZmine 4.5.0:质谱数据处理架构优化与算法性能深度解析

MZmine 4.5.0:质谱数据处理架构优化与算法性能深度解析 【免费下载链接】mzmine3 mzmine source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 在代谢组学和蛋白质组学研究领域,大规模质谱数据的处理效率直接决定了科研…...

Obsidian Excel插件终极指南:如何用3个步骤实现笔记与表格的无缝整合

Obsidian Excel插件终极指南:如何用3个步骤实现笔记与表格的无缝整合 【免费下载链接】obsidian-excel 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-excel 还在为Obsidian笔记中的表格管理而烦恼吗?Obsidian Excel插件为你带来了一场…...

告别演讲超时烦恼!PPTTimer:Windows平台最智能的演示时间管理终极方案

告别演讲超时烦恼!PPTTimer:Windows平台最智能的演示时间管理终极方案 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 还在为演讲时间掌控不佳而焦虑吗?每次重要演示都担心超…...

从odbc.ini到isql命令:手把手教你排查Linux ODBC连接数据库的常见报错

从odbc.ini到isql命令:手把手教你排查Linux ODBC连接数据库的常见报错 当你按照教程一步步配置完Linux下的ODBC连接,满心期待地输入isql命令测试时,屏幕上却跳出一行刺眼的报错信息——这种挫败感,相信每个DBA和开发者都深有体会。…...

React useRef 机制:为什么 ref.current 的修改不会触发组件重渲染?它在 Fiber 节点中是如何存储的?

React Refs 深度解析:为什么你的组件像个“哑巴”,而 Ref 却是个“忍者”?大家好,欢迎来到今天的 React 内部机制深度解剖课。我是你们的老朋友,那个总是试图在代码里找 Bug 的“资深专家”。今天我们不聊业务逻辑&…...

Maven配置翻车实录:从JDK15降级到1.8,我的Maven为何‘记忆’犹新?附3.8.4修复方案

Maven环境变量疑难解析:当JDK降级遭遇版本记忆效应 那天深夜,我的IDE突然弹出一连串红色错误——一个早已卸载的JDK15居然阴魂不散地干扰着当前项目。明明系统环境变量显示JAVA_HOME指向JDK1.8,java -version命令也确认运行在1.8环境&#xf…...

ArcGIS掩膜裁剪翻车实录:从‘矩形框’到精准流域边界,我踩了哪些坑?

ArcGIS掩膜裁剪实战避坑指南:从矩形陷阱到精准流域边界的进阶之路 当你在深夜的办公室里盯着屏幕上那个突兀的矩形裁剪结果,而预期中的流域边界却不见踪影时,那种GIS从业者特有的挫败感会瞬间涌上心头。这不是简单的操作失误,而是…...

微信视频号直播数据采集终极指南:5分钟实现弹幕与礼物实时监控

微信视频号直播数据采集终极指南:5分钟实现弹幕与礼物实时监控 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 在直播电商和内容创作蓬勃发展的今天,微信视频号直播数据采…...

Visual C++运行库整合安装器:告别繁琐安装的一站式解决方案

Visual C运行库整合安装器:告别繁琐安装的一站式解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经因为"缺少MSVCP140.dll&quo…...

WechatRealFriends:微信单向好友检测的终极解决方案

WechatRealFriends:微信单向好友检测的终极解决方案 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …...

VisualCppRedist AIO:一站式解决Windows应用运行库依赖难题

VisualCppRedist AIO:一站式解决Windows应用运行库依赖难题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为各种软件无法启动而烦恼吗&#xf…...

终极免费开源音乐播放器:LX Music桌面版完整使用指南

终极免费开源音乐播放器:LX Music桌面版完整使用指南 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 还在为各大音乐平台的会员费用烦恼吗?想要一个软件就…...

SpyGlass CDC检查避坑指南:为什么你的abstract port模型总报错?

SpyGlass CDC检查避坑指南:为什么你的abstract port模型总报错? 在数字芯片设计验证中,CDC(Clock Domain Crossing)检查是确保设计可靠性的关键环节。而面对复杂IP或黑盒模块时,抽象模型(abstra…...

智慧海上识别数据集 海上交通管理船舶识别标注数据 海事监控系统 采砂船识别 集装箱货船识别数据集 游船识别数据集 yolo数据集第10199期

海上船舶数据集核心信息表 类别 Classes (6) 类别(6) bulk cargo carrier 散装货船 container ship 集装箱船 fishing boat 渔船 general cargo ship 杂货船 ore carrier 矿石运输船 passenger ship 客船信息类别具体内容数据集类别目标检测类数据集&…...

从面试官视角看:5年软件经理告诉你,嵌入式简历里哪些项目经验是‘雷区’

嵌入式简历避坑指南:5年面试官揭秘项目经验中的危险信号 当你把精心准备的简历投递给心仪的公司时,是否想过它会在HR手中停留多久?作为嵌入式领域的面试官,我平均每天要筛选50份简历,每份的初筛时间不超过90秒。那些充…...

HunterPie:怪物猎人世界的智能狩猎伴侣终极指南

HunterPie:怪物猎人世界的智能狩猎伴侣终极指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/HunterPie-legacy …...

从一张《花花公子》照片到AI标准:Lenna图背后的技术伦理与开源文化变迁

Lenna图:数字图像处理史上的技术伦理启示录 1973年夏天,南加州大学实验室里的一次偶然选择,让一张杂志插页成为了计算机视觉领域的"蒙娜丽莎"。这张被称作Lenna图的512512像素图像,不仅见证了图像处理技术的演进史&…...

2026年4月4款万方降AI率工具盘点:率零和嘎嘎降AI最稳

2026年4月4款万方降AI率工具盘点:率零和嘎嘎降AI最稳 万方降AI这件事,在2026年4月的毕业季里被很多同学反复问到。万方检测平台在今年更新了AIGC识别模型,很多原本能过的段落突然飙到30%以上,学校要求又卡在20%甚至15%&#xff0c…...

从‘猜’到‘懂’:用LIME和SHAP给你的机器学习模型做一次‘可解释性体检’(对比与选型指南)

从‘猜’到‘懂’:用LIME和SHAP给你的机器学习模型做一次‘可解释性体检’(对比与选型指南) 在医疗诊断中,医生往往需要借助X光、CT等影像学检查来了解患者体内的情况。类似地,当我们面对一个表现优异但内部机制复杂的…...

终极Windows音频路由指南:用Audio Router实现多设备音频分发

终极Windows音频路由指南:用Audio Router实现多设备音频分发 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 你是否曾为Windows系统的音频管理而烦恼&am…...

别再对着手册发愁了!手把手教你用STM32 HAL库搞定TDC-GP22的SPI通信(附完整代码)

STM32 HAL库驱动TDC-GP22激光测距模块实战指南 第一次拿到TDC-GP22模块时,我盯着那堆SPI时序图和寄存器配置说明发呆了半小时——文档里每个字都认识,但连起来就是不知道从哪下手。如果你也正在经历这种痛苦,别担心,这篇指南会带你…...

从‘黑盒’到‘白盒’:用scikit-plot可视化你的模型到底学到了什么(特征重要性、学习曲线详解)

从‘黑盒’到‘白盒’:用scikit-plot可视化你的模型到底学到了什么 当你训练出一个准确率高达95%的随机森林分类器时,是否曾好奇它究竟是如何做出决策的?或者当测试集表现远不如训练集时,你是否困惑于模型到底出了什么问题&#x…...

抖音下载器终极指南:一键批量下载视频、音乐和图片的免费方案

抖音下载器终极指南:一键批量下载视频、音乐和图片的免费方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

【正点原子STM32】HAL库实战入门:从CMSIS标准到项目构建

1. 从零认识CMSIS标准与HAL库 刚拿到正点原子STM32开发板时,很多新手会被各种专业术语搞得晕头转向。我第一次接触STM32Cube生态时,面对CMSIS、HAL库这些名词也是一头雾水。后来才发现,理解这些基础概念就像盖房子打地基,看似枯燥…...