3.0.0
3.0.0 更新说明
3.0.0 为主要功能版本,新增业务 Tool 查询结果图表可视化能力,并增强知识文档导入、知识问答、流式响应和历史会话回放。
✨ 核心功能
Tool 结果图表可视化
业务 Tool 查询到结构化数据后,可在返回文字答案的同时生成图表:
- LLM 只负责选择图表类型和标题。
- 后端根据真实 Tool 数据自动完成来源选择、字段绑定、数据转换和安全校验。
- 前端通过本地 ECharts 直接渲染图表。
- 每次问答最多返回一个图表,同一会话中的后续问答仍可继续生成图表。
- 图表生成失败时自动降级为纯文本,不影响业务回答。
- 图表随助手消息保存,支持历史记录和续聊回放。
- 不重新查询业务数据库,不允许 LLM 直接提交业务数值或任意 ECharts 配置。
支持以下 23 种图表:
- 环形图
- 旭日图
- 条形图
- 瀑布图
- 子弹图
- 面积图
- 阶梯图
- 雷达图
- 散点图
- 气泡图
- 直方图
- 箱线图
- 热力图
- 桑基图
- 矩形树图
- 甘特图
- 漏斗图
- 词云图
- 仪表盘图
- 水位图
- 平行坐标图
- 折线图
- 饼图
知识库能力增强
- knowledge 模式使用独立的知识问答提示词,不再受 ERP 业务范围提示限制。
- 支持回答用户导入的 Java、JVM、RabbitMQ 等非 ERP 技术文档。
- 增加知识库召回数量并调整相似度阈值,改善中文技术文档召回效果。
- knowledge 模式不装配业务 Tool,继续保持租户隔离。
- 同租户、同来源文档重新导入时自动覆盖旧向量。
大文档受控导入
上传限制调整为:
- 单文件最大
500MB - 单次请求最大
550MB
同时增加多层资源保护:
- 限制文档提取后的最大字符数。
- 限制单文档最终分片数量。
- 使用实际 ONNX WordPiece 分词器进行二次切分。
- 保证每个向量分片不超过 128 Token。
- 向量数据按 100 条分批写入。
- 写入失败时清理当前来源的残留数据,避免留下半成品向量。
🚀 流式响应优化
- 流式接口统一使用类型化 SSE。
- 支持
delta、chart、done、error四类事件。 - 恢复正文实时逐段输出效果。
- 图表在正文完成后发送并渲染。
- 异常和用户取消只执行一次消息、计费及 Tool 流水收口。
- 修复查询、重试和图表规划等内部英文旁白泄漏问题。
- 修复最终答案边界跨网络分片时可能泄漏协议残片的问题。
- SSE 错误复用当前助手消息,避免生成空白或重复气泡。
Important
GET /api/ask/stream 已从历史纯文本 SSE 升级为类型化 SSE,属于协议变更。项目内置前端已同步升级;独立接入该接口的客户端需要适配新的事件结构。
🧩 会话历史与数据安全
- 助手消息增加可空
chart_spec字段。 - 历史详情和续聊可直接回放已保存图表。
- 历史回放不会重新调用 LLM 或业务 Tool。
- 旧消息没有图表字段时继续正常展示文本。
- 非法或不兼容的历史图表自动降级为
chart = null。 - 会话读取、归档和状态查询增加租户及当前用户所有权校验。
- 原始业务 Tool 数据只在当前请求生命周期内使用,请求结束后自动清理。
- Tool 结果按 trace、租户和会话隔离,禁止跨请求或跨租户复用。
🏗️ 架构调整
为降低核心问答服务复杂度,本版本拆分了 ErpAssistantService 的部分职责:
-
AssistantClientProvider- 负责模型 Provider、模式路由、RAG 和 Tool 装配。
-
AssistantLifecycleService- 负责消息持久化、计费、Tool 流水和终止收口。
-
BusinessDataTurnGuard- 保证业务数据问题使用当前轮查询结果。
-
AssistantAnswerSanitizer- 负责最终答案边界处理和内部旁白净化。
图表能力按职责拆分至:
chat/chart/modelchat/chart/capturechat/chart/compilechat/chart/protocolchat/chart/selectionchat/chart/tool
同时增加 Spring Bean 构造器依赖图测试,防止后续重构引入循环依赖。
🎨 前端更新
- 本地引入 Apache ECharts。
- 本地引入词云图和水位图扩展。
- 新增统一的
chart-adapter.js图表适配器。 - 不依赖 CDN,不增加前端构建工具。
- 支持实时问答、非流式回答、历史记录和续聊图表展示。
- 支持图表实例释放和消息重新渲染。
- 甘特图使用项目内固定水平时间范围实现。
- 图表渲染异常时保留 Markdown 文本答案。
- 中英文 README 增加图表能力介绍、测试话术和实际效果截图。
🔐 图表安全与可靠性
- LLM 不能提交来源 Tool、字段绑定、转换规则、业务数据或任意 ECharts option。
- 图表类型由统一枚举约束。
- Tool 结果、规划输入和最终图表协议均设置大小、深度、宽度、节点数、行数和维度限制。
- 自动排除订单号、工单号等数值型业务标识,避免被误选为业务指标。
- 支持纯分类业务数据按真实记录数生成统计图表。
- 多个业务 Tool 返回结果时只选择一个可信来源,不自动合并不同 Tool 数据。
- 内部图表规划 Tool 不计入业务 Tool 命中次数、调用流水或动态 Tool 管理列表。
- 图表失败、空结果和不可图表化数据均安全降级为文本回答。
🗄️ 数据库变更
ERP MySQL 的 a_chat_message 表增加可空字段:
chart_spec JSON NULL
数据库初始化逻辑支持:
- 新数据库自动创建字段。
- 已有数据库幂等增加字段。
- 重复启动不会重复修改表结构。
- 历史消息无需迁移,原有文本数据继续兼容。
⚠️ 升级注意事项
从 2.1.1 升级到 3.0.0 时请注意:
- 使用项目数据库初始化逻辑或手工确认
a_chat_message.chart_spec字段已创建。 - 独立调用
/api/ask/stream的客户端需要适配类型化 SSE。 - 项目内前后端必须作为同一版本一起部署。
- 如需让已导入文档使用新的真实 Token 切分和覆盖导入逻辑,可重新导入对应文档。
- 本版本不迁移历史向量数据,也不要求迁移历史纯文本消息。
- ECharts 及扩展已经内置在静态资源中,部署环境不需要访问外部 CDN。
✅ 验证结果
- Java 测试:194 项通过
- 测试失败:0
- 测试错误:0
- 前端图表 fixture:33 项通过
- Spring Bean 依赖图检查:通过,未发现循环依赖
- OpenSpec 主规范严格校验:8 项通过,0 项失败
- 图表类型、流式事件、历史回放和异常降级均有自动化测试覆盖
- 中英文 README 图表话术和本地图片引用检查通过
📚 文档
- 更新中文 README
- 更新英文 README
- 新增 20 条可直接复制的图表测试话术
- 新增环形图、条形图、瀑布图、子弹图、面积图、阶梯图和甘特图等效果截图
- 完成
tool-result-chart-visualizationOpenSpec change 归档 - OpenSpec 任务完成度:169/169
📦 变更规模
- 修改文件:102 个
- 新增代码及文档:约 16,430 行
- 删除或调整:约 765 行