4、基于 RAG 的数据治理智能问答系统——流式对话接口设计
概述InfoHelper 是一个面向数据治理领域的智能问答系统基于RAG检索增强生成架构结合Elasticsearch 向量检索、Neo4j 图数据库和MySQL 关系型数据库三种数据源实现对数据标准、数据质量、数据资产、数据集市、元数据、数据血缘、数据安全等场景的智能问答。核心入口/chat/send是一个SSEServer-Sent Events流式接口支持逐 token 推送 LLM 生成内容并在各个环节插入进度消息降低用户等待焦虑。接口定义基本信息属性值方法POST路径/chat/sendContent-Typeapplication/x-www-form-urlencoded响应类型text/event-streamSSE传输模式流式Flux请求参数参数类型必填说明示例userIdString是用户唯一标识用于会话归属、权限判断test_user_001contentString是用户问题文本支持中文人员相关的数据有哪些conversationIdString否会话 ID不传则自动创建格式为UUIDuserId1494ea83d8254fffbf63a9964baa791ctest_user_001响应格式响应是一个 SSE 事件流每一条消息以data:开头包含以下三类事件事件类型格式说明进度通知[PROGRESS]:xxx当前处理阶段提示LLM Token纯文本逐 token 流式输出的回答内容结束标记[DONE]:conversationId流结束返回会话 ID 供后续对话使用真实响应示例以下是一次实际请求userIdtest_user_001content人员相关的数据有哪些的 SSE 流输出data:[PROGRESS]:正在识别您的意图... data:[PROGRESS]:正在优化您的问题... data:[PROGRESS]:正在路由您的问题... data:[PROGRESS]:正在检索知识库内容... data:[PROGRESS]:正在排序筛选结果... data:[PROGRESS]:正在生成回答... data:在数据集市中与人员相关的数据主要分布在**教职工管理**、**学生管理**以及**一卡通用户信息**等主题域中。以下是具体的数据实体及其核心字段信息 data:### 1. 教职工基本数据 data:属于**教职工管理主题域BKJG**主要存储教职工的基础身份信息。 data:* **数据实体**RS_StaffInfo data:* **数据大类**教职工基本数据类 data:* **核心字段** data: * StfNo职工号 data: * Name姓名 data: * GenderCode性别码 data:### 2. 学生基本数据 data:* **核心字段** data: * StuNo学号 data: * Name姓名 data: * GenderCode性别码 data: * BirthDate出生日期 data: * MajorCode专业代码 data: * IDCard证件号码 data:* **责任单位**教务处 data:### 3. 卡用户信息数据 data:属于**用户基本信息数据类**关联一卡通或校园卡系统。 data:* **数据实体**YKT_CardUserInfo data:* **核心字段** data: * UserId用户ID data: * Name姓名 data: * CardNo卡号 data: * Balance余额 data:### 4. 项目经费相关人员 data:用于标识项目负责人。 data:* **数据实体**CW_Project data:* **数据大类**项目经费数据类 data:* **核心字段** data: * ChargerId负责人ID关联具体人员 data:[DONE]:1494ea83d8254fffbf63a9964baa791ctest_user_001处理流程整个对话链路可拆分为5 个阶段用户输入: 人员相关的数据有哪些 │ ▼ ┌─────────────────────────────────────────────────────┐ │ 1. 会话管理 │ │ 创建 conversationId UUID userId │ │ 临时标题 人员相关的数据有哪些 │ │ └─ 虚拟线程异步: qwen3.6-flash 生成标题 → 回写DB │ └────────┬────────────────────────────────────────────┘ │ ~0ms ▼ ┌─────────────────────────────────────────────────────┐ │ 2. 消息持久化 │ │ 保存用户消息 (typeUSER, content原始问题) │ │ 创建空助手消息 (typeASSISTANT, contentnull) 占位 │ └────────┬────────────────────────────────────────────┘ │ ~0ms ▼ ┌─────────────────────────────────────────────────────┐ │ 3. 意图识别 (qwen3.7-plus, ~11.5s) │ │ [PROGRESS]:正在识别您的意图... │ │ 输入: 人员相关的数据有哪些 │ │ 输出: intent数据集市查询, data_domain人员 │ │ → 清除意图缓存避免污染后续对话 │ └────────┬────────────────────────────────────────────┘ │ relatedtrue ▼ ┌─────────────────────────────────────────────────────┐ │ 4. RAG 检索增强生成 │ │ │ │ a. 问题改写 (qwen3.7-plus, ~9.3s) │ │ [PROGRESS]:正在优化您的问题... │ │ 输入: 人员相关的数据有哪些 │ │ 输出: 人员相关数据资产查询 │ │ │ │ b. 查询路由 (qwen3.7-plus, ~19.8s) │ │ [PROGRESS]:正在路由您的问题... │ │ 输入: 人员相关数据资产查询 │ │ 输出: strategyrelational_db │ │ │ │ c. 多源检索 (仅激活 relational_db 一路) │ │ [PROGRESS]:正在检索知识库内容... │ │ → Text-to-SQL: 查询 data_metadata 表 │ │ → ES 检索: 补充知识库文档 │ │ │ │ d. 重排序/融合 │ │ [PROGRESS]:正在排序筛选结果... │ │ → RRF 融合 去重取 Top-K │ │ │ │ e. 内容注入 Prompt 加载业务 prompt │ │ → 注入>阶段 1会话管理如果conversationId为空生成格式为UUID userId的会话 ID以用户问题截取前 20 个字符作为临时标题创建会话通过Java 虚拟线程异步调用qwen3.6-flash生成语义化标题回写到数据库不阻塞主流程用户无感知阶段 2意图识别调用qwen3.7-plus加载intent-recognition-new-prompt.txt约 3300 token 的 system prompt判断用户问题是否属于数据治理领域并提取关键实体。实际执行结果输入 “人员相关的数据有哪些”{reasoning:1.相关性涉及数据查询与数据治理相关。2.场景定位用户想了解有哪些与人员相关的数据处于浏览数据集市阶段。3.辨析属于按数据域/主题搜索公开数据目录而非查询自己已申请的数据资产。- 数据集市查询,related:true,intent:数据集市查询,entities:{database_name:null,table_name:null,column_name:null,data_domain:人员,data_owner:null,data_level:null,application_id:null,system_name:null}}支持 8 种意图意图数据来源适用场景示例数据标准咨询知识库了解规范定义“字段命名规范是什么”数据质量检查知识库检查/监控数据质量“数据完整性怎么检查”数据资产查询my_data_table我的查自己已申请的数据“我申请了哪些数据表”数据集市查询data_metadata公开浏览数据目录“人员相关的数据有哪些”数据申请审批data_application申请/查看审批状态“申请单 APP20240101 通过了吗”元数据管理知识库管理元数据“怎么修改表字段注释”数据血缘分析Neo4j追踪数据来源流向“uid 从哪个上游表来的”数据安全合规知识库脱敏/加密/合规“L3 数据需要怎么脱敏”核心区分带我的 → 数据资产查询不带我的且问有什么 → 数据集市查询。阶段 3RAG 检索增强生成如果问题与数据治理相关relatedtrue进入 RAG 管道。核心组件及职责环节组件输入 → 输出耗时参考问题改写InfoHelperQueryTransformer“人员相关的数据有哪些” → “人员相关数据资产查询”~9s查询路由InfoHelperQueryRouter改写后问题 →strategyrelational_db~20sSQL 检索InfoHelperSqlDatabaseContentRetriever自然语言 → SQL → 查询结果~1sES 检索InfoHelperElasticsearchContentRetriever向量/全文检索 → 文档片段~1s重排序BgeScoringModelOnnx检索结果 → 语义排序 Top-K本地推理内容聚合InfoHelperReRankingContentAggregator去重、截断、注入 Prompt~0s生成qwen3.7-plusstreamingPrompt 检索结果 → 逐 token 回答~8s查询路由策略QueryRouter LLM 智能判断走哪路LLM 返回 strategy实际走的检索器典型场景relational_dbSQLMySQL结构化查询、按数据域/主题查元数据graph_dbNeo4j血缘追踪、上下游依赖knowledge_baseES 向量/全文标准咨询、文档语义搜索其他/异常三路并行兜底模糊问题、无法判断注本例中 “人员相关的数据有哪些” 被路由到relational_db因为 QueryRouter 判断这是结构化元数据查询按数据域条件检索。阶段 4权限控制通过RoleEnum控制数据访问范围角色枚举值权限范围普通用户USER只能看公开文档已申请数据用户APPLICANT可见自己申请的数据管理员ADMIN全部可见模型架构用途模型说明意图识别qwen3.7-plus结构化 JSON 输出8 种意图分类问题改写qwen3.7-plus口语化 → 标准检索查询查询路由qwen3.7-plus判断走哪路检索器 置信度Text-to-SQLqwen3.7-plus自然语言 → SQLText-to-Cypherqwen3.7-plus自然语言 → CypherRAG 回答生成qwen3.7-plus结合检索结果流式生成temperature0.2标题生成qwen3.6-flash轻量快速异步非阻塞文本向量化text-embedding-v4ES KNN 向量检索重排序bge-reranker-v2-m3Onnx本地推理语义精排实际执行时序以content人员相关的数据有哪些为例完整链路耗时12:26:15 会话创建 (INSERT chat_conversation) 12:26:16 消息持久化 (INSERT chat_message) 12:26:16 异步标题生成开始 (qwen3.6-flash) 12:26:16 意图识别开始 (qwen3.7-plus) 12:26:28 意图识别完成 → intent数据集市查询, data_domain人员 (~11.5s) 12:26:28 问题改写开始 (qwen3.7-plus) 12:26:37 问题改写完成 → 人员相关数据资产查询 (~9.3s) 12:26:37 查询路由开始 (qwen3.7-plus) 12:26:57 查询路由完成 → strategyrelational_db (~19.8s) 12:27:46 SQL检索 ES检索 排序 注入Prompt 完成 12:27:47 LLM流式生成开始 (qwen3.7-plus, streaming) 12:27:55 流式生成完成回填回答 (UPDATE chat_message) ───────────────────────────────────────── 总耗时: ~100s其中 LLM 调用占 ~48s网络/检索占 ~52s技术要点1. 流式推送 进度通知使用Flux.concatWith()将 RAG 各环节的进度消息与 LLM token 流串联到同一个 Flux 中确保进度消息先于 token 到达前端returnFlux.just([PROGRESS]:正在识别您的意图...).concatWith(/* 意图识别 分支路由 */).concatWith(Mono.just([DONE]:finalConversationId));2. 多数据源指路不盲搜四路检索器全部构建但QueryRouter 只激活 1 路常规情况避免无效检索。只有路由失败时才走三路并行兜底。3. 异步标题生成会话创建后不阻塞主流程通过 Java 虚拟线程异步调用qwen3.6-flash生成标题Thread.ofVirtual().name(title-summary-conversationId).start(()-{StringaiTitletitleSummaryService.generateTitle(content);updateConversationTitle(conversationId,aiTitle);});实际效果临时标题 “人员相关的数据有哪些” → 语义标题 “人员相关数据有哪些”。4. 意图缓存隔离意图识别完成后立即清除 LLM 的历史记忆缓存避免意图识别的对话上下文污染后续 RAG 对话databaseChatMemoryStore.evictCache(finalConversationId);5. 消息占位-回填机制流式返回时无法预知最终内容先保存空消息占位获取messageId流结束后再回填完整内容INSERT chat_message (contentnull) → 获取 messageId → LLM 流式生成 → UPDATE chat_message SET content完整回答前端集成示例asyncfunctionchat(userId,content,conversationId){constresponseawaitfetch(/chat/send,{method:POST,headers:{Content-Type:application/x-www-form-urlencoded},body:newURLSearchParams({userId,content,conversationId})});constreaderresponse.body.getReader();constdecodernewTextDecoder();letbuffer;while(true){const{done,value}awaitreader.read();if(done)break;bufferdecoder.decode(value,{stream:true});constlinesbuffer.split(\n);bufferlines.pop();for(constlineoflines){if(line.startsWith(data:[PROGRESS])){showProgress(line.replace(data:,));}elseif(line.startsWith(data:[DONE])){constconvIdline.split(:)[2];saveConversationId(convId);}elseif(line.startsWith(data:)){appendToken(line.replace(data:,));}}}}总结/chat/send是 InfoHelper 的唯一对话入口封装了意图识别、多源 RAG 检索、流式生成、会话管理、权限控制等完整链路。通过 SSE 进度通知机制用户可以在每个处理阶段看到实时反馈。整个架构的设计亮点意图识别做第一道分拣无关问题走通用对话兜底降低 RAG 成本指路不盲搜QueryRouter 智能判断走哪路检索器只有失败时才三路并行兜底BGE Reranker 本地重排序Onnx 模型本地推理无需网络调用提升结果精度进度消息与 LLM 输出同流推送前端只需一个 SSE 连接降低复杂度全链路耗时透明意图识别 ~11s、改写 ~9s、路由 ~20s、生成 ~8s便于性能优化定位

相关新闻

CVE-2026-50522 SharePoint RCE实战:漏洞原理、检测脚本、防御配置与溯源复盘

CVE-2026-50522 SharePoint RCE实战:漏洞原理、检测脚本、防御配置与溯源复盘

2026年7月微软月度补丁更新周期结束后,全网企业安全运维团队都迎来了一轮高强度应急压力。本月Patch Tuesday补丁库一次性收录并修复622个不同类型的安全漏洞,覆盖Windows服务器系统、SQL数据库、IIS中间件、Office全家桶以及企业高频部署的SharePoint协…

2026/9/25 2:40:19 阅读更多 →
I2C控制器Draining机制详解:解决FIFO非对齐传输与AERR中断问题

I2C控制器Draining机制详解:解决FIFO非对齐传输与AERR中断问题

1. 项目概述:I2C控制器中的Draining机制与FIFO管理 在嵌入式系统开发中,I2C总线因其简洁的两线制(SDA和SCL)和灵活的多主从架构,成为了连接各类传感器、EEPROM、RTC等外设的“血管”。但凡真正深入驱动过I2C控制器&…

2026/9/20 17:46:41 阅读更多 →
好客搜陈海伟专访:以文化凝聚人心,以自研助力企业全域获客

好客搜陈海伟专访:以文化凝聚人心,以自研助力企业全域获客

扎根苏州创业园的江苏好客搜,十年成长为国内稀缺全链路 AI 自研厂商,企业每一步布局都来自创始人好客搜陈海伟。在他的经营逻辑里,企业文化凝聚团队、规范服务,自研产品开拓市场、解决客户痛点,二者缺一不可。 2016 年…

2026/9/24 9:35:16 阅读更多 →

最新新闻

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →
802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

如果你最近在无线网络圈子里逛,应该会频繁看到“ax调度”这个词。“ax”就是 802.11ax,也就是 Wi-Fi 6 的技术代号,而“调度”才是 802.11ax 真正值钱的地方。很多人以为 Wi-Fi 6 只是“快了一点”,换了张网卡、开了 160MHz 频宽就…

2026/9/25 22:56:19 阅读更多 →
Windows下H.264解码库集成指南:从选型到踩坑

Windows下H.264解码库集成指南:从选型到踩坑

简介:这是一份面向Windows平台的H.264视频解码库资源,由开发者rapidly552整理分享,适合需要在应用程序中快速集成H.264解码能力的C/C工程师及视频技术学习者。该库严格基于AVC标准,实现了运动补偿、帧内预测、多参考帧、熵编码等核…

2026/9/25 22:56:19 阅读更多 →
C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

简介:面向C#初学者的控制台贪吃蛇实战项目,以经典小游戏为载体,串联类、方法、变量、条件语句等核心语法,并完整覆盖控制台输入输出、按键捕获、主循环、碰撞检测、蛇身增长、随机食物生成、状态更新与字符画面重绘等关键开发环节…

2026/9/25 22:56:19 阅读更多 →
图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

简介:本资源是一份面向高校数据库课程学习者与Python初学者的完整课程设计实践方案,聚焦图书管理系统的开发全流程,涵盖需求分析、数据库建模、后端逻辑实现与基础部署。压缩包共9个文件,含4个SQL脚本(books、admin、s…

2026/9/25 22:56:19 阅读更多 →
ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停 【免费下载链接】ZoneDeck The Ultimate Workspace Manager, Switch between work and life, seamlessly生活工作无缝切换,专业的桌面工作区管理助手 项目地址: http…

2026/9/25 22:54:18 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →