chore(docs): docs/ 目录全面重新编号 + 重组

**重构前**(旧编号 02-11):
- docs/02-产品需求/      → 00 产品规划/PRD
- docs/03-技术架构/      → 01-05 子目录散落
- docs/04-原型设计/      → 01-02 产品设计(HTML 原型)
- docs/05-原型设计/      → screens/
- docs/06-测试素材/      → 02-E2E / 03-功能 / 04-版本测试
- docs/07-项目管理/      → 任务说明书/日报/计划
- docs/08-安全审计/      → 审计报告
- docs/09-堡垒运维/      → toolbox / deploy
- docs/10-项目管理/      → 任务说明书(重复)
- docs/11-历史归档/      → deploy-nas-archived

**重构后**(新编号 00-07,语义化):
- docs/00-产品开发流程与文档管理规范.md
- docs/00-版本迭代总览.md
- docs/01-产品文档/      (PRD/原型/认证/会话/AI 服务/坐席/集成)
- docs/02-技术文档/      (技术方案/架构图/重构记录/前端改造/实现配置)
- docs/03-测试文档/      (E2E/功能用例/版本报告/缺陷单)
- docs/04-运维文档/      (部署运维/运维指南)
- docs/05-运营文档/      (品牌推广/用户手册)
- docs/06-安全审计/      (审计报告)
- docs/07-项目管理/      (任务说明书/日报/计划/看板)

**净收益**:
- 目录编号与产品文档管理规范对齐(按文档阶段 01-07 编号)
- 消除 02-产品需求 与 10-项目管理 的编号重叠
- 子目录按文档类型分组(如 01-产品文档/00-产品规划、01-产品文档/01-认证与登录)
- 把运维/安全/项目管理从 0X 散落改为 04/06/07

合计 494 文件 + 78495 行 / - 14076 行
This commit is contained in:
Simon
2026-08-03 18:46:55 +08:00
parent 3a44141eac
commit 44e77dcb0e
494 changed files with 78494 additions and 14075 deletions
@@ -0,0 +1,452 @@
# IT智能服务台 - 复杂场景重构与统一路由 PRD(合并版)
**版本**v1.2
**日期**2026-07-27
**状态**:已评审
**作者**:许清楚
**子系统**03-AI服务
**模块**:意图路由
---
## 一、文档变更记录
| 版本 | 日期 | 变更说明 |
|------|------|----------|
| v1.2 | 2026-07-27 | 新增4.1.1 打招呼检测规则:解决"您好+具体问题"被误判为纯打招呼的问题 |
| v1.1 | 2026-07-19 | 完成7个待确认问题的决策:<br>- 暂停超时阈值:可配置,默认8小时<br>- 可更正字段:按类型区分<br>- 压缩阈值:可配置,默认6000 tokens<br>- 撤销次数:默认3次<br>- 依赖关系:仅记录来源<br>- 业务类别:预设+管理员添加<br>- 路由置信度:可配置,默认0.7 |
| v1.0 | 2026-07-19 | 初始合并版本,整合以下文档:<br>- 复杂场景重构第一阶段<br>- 复杂场景重构第二阶段<br>- 业务路由推荐<br>- 统一意图路由层 |
---
## 二、产品目标
| # | 目标 | 衡量指标 |
|---|------|----------|
| G1 | **任务可中断、可恢复** — 员工因临时事务离开时,自动化处置流程不丢失,回来后一句话即可继续 | 暂停会话恢复成功率 ≥ 95%;恢复后无需重新输入已提供信息 |
| G2 | **信息可更正、可补充** — 员工说错或想补充信息时,系统能正确理解并更新,不重复询问已修正的信息 | 更正意图识别准确率 ≥ 90%;更正后信息项值正确更新率 ≥ 95% |
| G3 | **坐席可感知** — 坐席工作台能实时看到会话的暂停/恢复/更正事件,掌握员工处置进度 | 坐席端可查看暂停会话列表及恢复点信息;更正事件在会话时间线可见 |
| G4 | **长对话不中断** — 长对话场景下 AI 不因 token 超限而中断或丢失关键信息 | 超长会话(>6000 tokensAI 正常响应率 ≥ 99%;关键信息项零丢失 |
| G5 | **多轮纠错** — 员工可在同一会话中多次更正/补充信息,系统自动维护版本与依赖 | 单 session 支持无限次更正;依赖联动提示准确率 ≥ 95% |
| G6 | **透明体验** — 压缩与多轮纠错对员工透明,不增加操作负担 | 员工无额外操作步骤;压缩过程用户无感知 |
---
## 三、用户故事
### 3.1 任务中断恢复
| # | 角色 | 用户故事 |
|---|------|----------|
| US-1 | 员工 | **As a** 员工, **I want** 在自动化处置过程中说"我先去开会"就能暂停任务, **so that** 我不用急急忙忙处理完,也不用担心中途离开导致流程丢失 |
| US-2 | 员工 | **As a** 员工, **I want** 回来后说"继续刚才的"就能从断点恢复, **so that** 我不需要重新描述问题、重新提供已填的信息 |
| US-3 | 员工 | **As a** 员工, **I want** 暂停后如果有多个未完成的任务,系统能提示我选择恢复哪个, **so that** 我不会搞混多个处置流程 |
| US-4 | 坐席 | **As a** 坐席, **I want** 在工作台看到员工会话的暂停/恢复状态和更正记录, **so that** 我能了解处置进度的完整上下文,在需要介入时不会信息缺失 |
| US-5 | 坐席 | **As a** 坐席, **I want** 能手动恢复或终止员工暂停过久的会话, **so that** 避免暂停任务长期堆积占用资源 |
### 3.2 信息更正与补充
| # | 角色 | 用户故事 |
|---|------|----------|
| US-6 | 员工 | **As a** 员工, **I want** 当我说错信息后(如用户名说成 zhangsan 实际是 lisi),系统自动更正, **so that** 不会因为口误导致处置结果错误 |
| US-7 | 员工 | **As a** 员工, **I want** 能随时补充额外信息(如"顺便说一下,是财务部的电脑"), **so that** 系统掌握更完整的信息来精准处置 |
| US-8 | 员工 | **As a** 员工, **I want** 在对话过程中可以多次更正不同信息项(先更正工号,再更正设备型号),每次更正都被完整记录 |
| US-9 | 员工 | **As a** 员工, **I want** 更正某个信息项后,系统能提示我哪些关联信息需要一并更新,避免信息不一致 |
| US-10 | 员工 | **As a** 员工, **I want** 如果我更正错了,我可以撤销最近一次更正,恢复到更正前的状态 |
| US-11 | 坐席 | **As a** 坐席, **I want** 能在坐席端查看完整的信息项版本链,并对比任意两个版本的差异,以便快速理清员工多次更正的脉络 |
### 3.3 上下文压缩
| # | 角色 | 用户故事 |
|---|------|----------|
| US-12 | 员工 | **As a** 员工, **I want** 在超长对话中 AI 依然记得我之前提交的关键信息(如工号、申请事由),这样我不必反复重复 |
| US-13 | 员工 | **As a** 员工, **I want** 长对话被"智能记忆"后仍能继续正常审批与执行流程,不会因为对话太长而收到错误或中断 |
| US-14 | 运维 | **As a** 运维人员, **I want** 能够查看每次上下文压缩的日志记录,这样在 AI 行为异常时可以定位是否与压缩有关 |
### 3.4 业务路由
| # | 角色 | 用户故事 |
|---|------|----------|
| US-15 | 员工 | **As a** 员工, **I want** 当我咨询非IT业务时,系统能帮我转接到对应业务负责人, **so that** 我能得到正确的帮助 |
| US-16 | 坐席 | **As a** 坐席, **I want** 能看到业务路由的日志记录, **so that** 在需要时能追溯路由决策 |
---
## 四、架构总览
### 2.1 整体架构
```
用户消息到达
├──→ 并行执行:
│ ├── 控制意图识别(第0层)
│ │ └── PAUSE/RESUME/CORRECT/SUPPLEMENT
│ │ │
│ │ └── 命中 → 优先处理控制逻辑
│ │
│ └── 业务意图识别(第1层)
│ └── approval/it_consult/non_it_routing/chitchat
│ │
│ └── 正常业务路由
消息合并器(单队列输出)
响应用户
```
### 2.2 分层说明
| 层级 | 名称 | 职责 | 响应目标 |
|------|------|------|----------|
| 第0层 | 控制意图层 | 识别PAUSE/RESUME/CORRECT/SUPPLEMENT | 优先级最高,秒级响应 |
| 第1层 | 业务意图层 | 识别approval/it_consult/non_it_routing/chitchat | 毫秒级响应 |
| 第2层 | 动态信息与诊断链 | 信息更正/版本链/排查步骤联动 | 版本变化触发重算 |
---
## 三、第0层:控制意图层
### 3.1 意图类型
| 意图 | 说明 | 响应目标 |
|------|------|----------|
| PAUSE | 用户主动暂停会话 | 立即响应,保存上下文 |
| RESUME_TASK | 用户恢复暂停的会话 | 立即响应,恢复进度 |
| CORRECT | 用户更正之前的信息 | 记录变更,触发版本链,联动排查步骤 |
| SUPPLEMENT | 用户补充缺失的信息 | 记录补充,触发版本链,联动排查步骤 |
### 3.2 设计原则
1. **并行识别**:控制意图识别与业务意图识别并行执行,互不阻塞
2. **优先级规则**:控制意图 > 业务意图
3. **消息合并**:同一轮对话只产出一条最终响应,避免多队列问题
### 3.3 场景示例
```
场景1:用户暂停
用户:先去开会,稍后继续
系统:好的,您先忙~需要继续时跟我说一声「继续」就好。当前进度:{步骤描述}
场景2:用户恢复
用户:继续
系统:欢迎回来!您之前在处理「{会话标题}」,当前进度:{步骤描述},我们继续吧~
场景3:用户更正
用户:抱歉,部门写错了,我是财务部的
系统:[记录更正] + [更新版本链] + [重新计算排查步骤]
「好的,已更新为财务部。根据您的情况,建议重新排查以下步骤:...」
场景4:用户补充
用户:对了,电脑是台式机
系统:[记录补充] + [更新版本链] + [重新计算排查步骤]
「好的,已记录。根据新信息,更新排查步骤如下:...」
```
---
## 四、第1层:业务意图层
### 4.1 意图类型
| 意图 | 说明 | 后续流程 |
|------|------|----------|
| approval | 审批需求 | 推送审批卡片 |
| it_consult | IT咨询 | 进入排查流程 |
| non_it_routing | 非IT业务 | 路由到业务联系人 |
| chitchat | 闲聊/打招呼 | 友好回复,不调用AI推理 |
#### 4.1.1 打招呼检测规则
为避免无意义的AI调用,系统在进入意图识别前会先进行打招呼检测:
- **纯打招呼**(如"你好"、"您好"、"hi")→ 返回欢迎语,**不调用AI**
- **打招呼+实质问题**(如"您好,我电脑开不了机")→ 跳过打招呼检测,继续意图识别
**技术实现**`ai_handler.py``is_greeting()` 方法
```python
# 伪代码示意
def is_greeting(content):
# 如果消息包含实质性问题关键词,不视为打招呼
substantive_keywords = ["绑定", "连不上", "报错", "无法", "打印机", ...]
if any(kw in content for kw in substantive_keywords):
return False
# 纯打招呼关键词检测
greeting_keywords = ["你好", "您好", "hi", "hello", ...]
is_greet = any(kw in content for kw in greeting_keywords)
# 纯打招呼且消息足够短才触发
return is_greet and len(content) <= 15
```
### 4.2 路由分层决策
| 层级 | 方法 | 适用场景 |
|------|------|----------|
| 第1层 | 本地规则 | 关键词匹配、常用语 |
| 第2层 | 知识图谱 | 实体识别、业务关联 |
| 第3层 | Dify | 复杂意图、多轮对话 |
### 4.3 业务路由联动
当用户更正信息(如部门)时,联动更新业务路由配置:
| 信息项 | 联动字段 | 说明 |
|--------|----------|------|
| 部门 | service_area | 业务路由的服务范围 |
| 姓名 | contact_name | 业务联系人姓名 |
**联动规则**
1. 用户更正 → 信息项更新 → 触发业务路由同步
2. 优先级:人工配置 > 自动更正
3. 记录audit log,便于追溯
---
## 五、动态信息与诊断链(核心模块)
### 5.1 模块定位
本模块整合三个强耦合的功能:
1. **信息更正/补充** - 记录用户更正和补充的信息
2. **版本链** - 维护信息项的版本历史
3. **排查步骤** - 根据当前版本信息动态生成排查流程
### 5.2 核心设计原则
**版本变化触发排查步骤重新计算**
```
用户更正/补充信息
版本链记录变更(新增版本快照)
触发排查步骤重新计算
│ │
│ ├── 重置diagnosis_stage到initial
│ │
│ └── 根据新版本信息重新生成排查流程
展示更新后的排查步骤
```
### 5.3 数据模型
#### InformationItem(信息项表)
| 字段 | 类型 | 说明 |
|------|------|------|
| session_id | UUID | 会话ID |
| name | String | 信息项名称 |
| value | String | 信息项值 |
| modifiers | Array | 修饰词 |
| is_filled | Boolean | 是否已填写 |
| version | Integer | 版本号 |
| derived_from | String | 推导来源 |
| correction_reason | String | 更正备注 |
| update_history | JSON | 更新历史 |
| updated_at | Timestamp | 更新时间 |
#### 版本快照
每次信息变更时,生成版本快照:
- 快照内容:当前所有信息项的值
- 快照关联:当前diagnosis_stage状态
### 5.4 排查步骤联动
| 触发条件 | 排查步骤行为 |
|---------|-------------|
| 用户更正信息 | 自动重新触发排查步骤 |
| 坐席切换版本 | 自动重新触发排查步骤 |
| 坐席撤销更正 | 回滚到上一版本 + 重新触发排查步骤 |
**diagnosis_stage重置规则**
- 当版本切换时,diagnosis_stage重置为`initial`
- 重新进入gathering_info阶段收集信息
### 5.5 版本链可视化
| 功能 | 说明 |
|------|------|
| 时间线展示 | 按时间顺序展示信息项变更记录 |
| diff对比 | 版本间差异对比 |
| 撤销恢复 | 坐席可回滚到历史版本 |
---
## 六、上下文压缩
### 6.1 触发条件
当对话token超过8000阈值时,触发上下文压缩。
### 6.2 压缩策略
| 策略 | 说明 |
|------|------|
| Token阈值检测 | 监控对话总token数 |
| 压缩摘要 | 将早期消息压缩为摘要 |
| 快照保存 | 保留完整版本快照 |
### 6.3 推送策略
**不进行实时WebSocket推送**
原因:
1. 压缩对用户无感知,界面无变化
2. 减少消息干扰
3. 可通过AI回复自然提及
**替代方案**
- AI在回复中可自然提及:"由于对话较长,我简化了早期上下文,如有需要请提醒我补充"
---
## 七、WS事件定义
### 7.1 控制意图事件
| 事件名 | 说明 | 载荷 |
|--------|------|------|
| automation.paused | 会话已暂停 | session_id, resume_point, step_description |
| automation.resumed | 会话已恢复 | session_id, resume_point, step_description |
| automation.timeout_closed | 暂停超时关闭 | session_id, timeout_duration |
| automation.info_corrected | 信息已更正 | session_id, item_name, old_value, new_value, new_version |
| automation.info_supplemented | 信息已补充 | session_id, item_name, new_value, new_version |
### 7.2 事件推送规则
- 所有事件通过WebSocket推送
- 消息合并器确保单队列输出
- 同一轮对话只推送一条消息
---
## 八、非目标(Non-Goals
本PRD**不包含**以下内容:
1. ~~控制意图的WebSocket实时推送~~(由AI回复承载)
2. ~~上下文压缩的实时推送~~(对用户透明)
3. ~~时间线与版本链的分离设计~~(已整合为动态信息与诊断链)
4. ~~信息更正与业务路由的解耦~~(需要联动)
---
## 九、已确认配置参数
| 问题 | 结论 | 说明 |
|------|------|------|
| Q1: 暂停超时阈值 | **可配置,默认8小时** | 支持管理员调整,建议超时前15分钟提醒 |
| Q2: 可更正/不可更正字段 | **按字段类型区分** | 可编辑:用户相关字段(部门、工号等);只读:会话元数据、AI生成字段 |
| Q3: 上下文压缩阈值 | **可配置,默认6000 tokens** | 支持管理员调整 |
| Q4: 更正撤销次数限制 | **默认3次** | 防止滥用,控制版本链复杂度 |
| Q5: 信息项依赖关系 | **仅记录来源** | 使用derived_from字段记录推导来源,不自动推导 |
| Q6: 业务类别清单 | **预设+管理员添加** | 预设常见类别,支持管理员动态添加 |
| Q7: routing_confidence阈值 | **可配置,全局默认0.7** | 支持不同业务类别不同阈值 |
---
## 十、附录
### 10.1 文档来源
- 复杂场景重构第一阶段-增量PRD.md(已整合)
- 复杂场景重构第二阶段-增量PRD.md(已整合)
- ht-zx-ly-业务路由推荐-PRD-V2.1.1.md(已整合)
- 统一意图路由层PRD.md(已整合)
### 10.3 关联技术文档
| 文件 | 说明 |
|------|------|
| `02-技术文档/实现配置/dify_main_chat_prompt_v1.3_D1合并.md` | Dify主对话Prompt配置 |
| `02-技术文档/实现配置/dify_main_chat_prompt_v1.md` | Dify主对话Prompt v1 |
| `02-技术文档/实现配置/dify_unified_intent_prompt_v3.md` | 统一意图Prompt |
| `02-技术文档/实现配置/dify_approval_system_prompt_v2.md` | 审批系统Prompt |
| `02-技术文档/实现配置/dify_byod_intent_prompt.md` | BYOD意图Prompt |
| `02-技术文档/实现配置/AI对话链路全栈改造实施计划-v1.0.md` | 实施计划 |
| `02-技术文档/实现配置/Dify_App改造与AI供给链路修复方案-v1.0.md` | 修复方案 |
| `02-技术文档/实现配置/approval_templates.json` | 审批模板配置 |
### 10.4 原型设计
| 文件 | 说明 |
|------|------|
| `04-原型设计/01-员工端-暂停恢复.html` | 员工端暂停/恢复交互(已参考prototypes-原型图设计风格) |
| `04-原型设计/02-坐席端-版本链.html` | 坐席端版本链可视化与Diff对比 |
| `04-原型设计/03-坐席端-业务路由.html` | 坐席端业务路由分发(待参考现有原型) |
| `04-原型设计/04-坐席端-排查步骤联动.html` | 坐席端排查步骤与版本联动(待参考现有原型) |
### 10.4 关键决策记录
| 决策项 | 结论 | 日期 |
|--------|------|------|
| 全局意图定位 | 第0层(最高优先级),并行识别 | 2026-07-19 |
| 信息更正与业务路由联动 | 需要联动 | 2026-07-19 |
| 上下文压缩推送 | 不需要实时推送 | 2026-07-19 |
| 时间线/版本链/排查步骤 | 合并为"动态信息与诊断链"模块 | 2026-07-19 |
| 暂停超时阈值 | 可配置,默认8小时 | 2026-07-19 |
| 可更正字段区分 | 按字段类型区分 | 2026-07-19 |
| 上下文压缩阈值 | 可配置,默认6000 tokens | 2026-07-19 |
| 更正撤销次数限制 | 默认3次 | 2026-07-19 |
| 信息项依赖关系 | 仅记录来源 | 2026-07-19 |
| 业务类别清单 | 预设+管理员添加 | 2026-07-19 |
| routing_confidence阈值 | 可配置,默认0.7 | 2026-07-19 |
---
## 十一、验收标准
### 11.1 任务中断恢复
| ID | 验收标准 |
|----|----------|
| AC-US-1 | 员工说"先去开会"等关键词时,系统暂停会话并返回确认消息 |
| AC-US-2 | 暂停后员工说"继续",系统恢复会话并展示之前进度 |
| AC-US-3 | 多个暂停会话时,系统展示选择列表供员工选择恢复哪一个 |
| AC-US-4 | 坐席端可查看所有暂停会话列表及恢复点信息 |
| AC-US-5 | 暂停超过8小时未恢复,系统自动关闭并通知员工 |
### 11.2 信息更正与补充
| ID | 验收标准 |
|----|----------|
| AC-US-6 | 员工更正信息时,系统正确识别CORRECT意图并更新信息项 |
| AC-US-7 | 员工补充信息时,系统正确识别SUPPLEMENT意图并新增信息项 |
| AC-US-8 | 更正/补充后,系统自动触发排查步骤重新计算 |
| AC-US-9 | 坐席端可查看信息项的版本时间线 |
| AC-US-10 | 坐席端可对比任意两个版本的差异(diff) |
| AC-US-11 | 员工可撤销最近一次更正(限制3次) |
| AC-US-12 | 撤销后,系统回滚到上一版本并重新计算排查步骤 |
### 11.3 上下文压缩
| ID | 验收标准 |
|----|----------|
| AC-US-13 | 当token超过6000阈值时,系统自动触发压缩 |
| AC-US-14 | 压缩后AI仍能正确回答"我之前填的工号是多少"等回溯问题 |
| AC-US-15 | 压缩过程对用户透明,无额外操作步骤 |
| AC-US-16 | 运维可查看压缩日志(保留90天) |
### 11.4 业务路由
| ID | 验收标准 |
|----|----------|
| AC-US-17 | 员工咨询非IT业务时,系统识别为non_it_routing意图 |
| AC-US-18 | 系统根据业务类别路由到对应联系人 |
| AC-US-19 | routing_confidence低于0.7时,不自动路由 |
---
*文档结束*
@@ -0,0 +1,117 @@
# PRD - 置信度门控
> **REQ编号**: REQ-AI-002
> **版本**: v1.0
> **优先级**: P1
> **阶段**: 近期(1-2个月)
> **作者**: 宋献
> **日期**: 2026-07-19
---
## 一、问题陈述
**用户问题**
- AI 不分问题难易,都直接回答
- 低置信度问题被"硬答",回答质量差
- 员工体验差,认为"AI 答非所问"
**业务目标**
- 引入置信度评估,低置信度问题自动转人工
- 减少"AI 答非所问"的负面体验
- 提升 AI 回答的整体质量感知
---
## 二、需求范围
### 2.1 核心功能
| 功能 | 描述 |
|------|------|
| 置信度评分 | Dify 返回回答的置信度分数 |
| 阈值判断 | 根据置信度决定后续动作 |
| 自动转人工 | 低置信度问题自动转接人工坐席 |
| 提示引导 | 告知用户转人工原因 |
### 2.2 非目标
- 不修改 Dify 内部置信度计算逻辑
- 不支持人工调整阈值(后续迭代)
---
## 三、用户故事
| 角色 | 用户故事 | 验收标准 |
|------|----------|---------|
| 员工 | AI 无法回答我的问题时自动转人工 | 低置信度问题自动转接人工,无需重复描述问题 |
| 员工 | 我知道为什么被转人工 | 显示提示"这个问题比较复杂,已为您转接人工" |
| 坐席 | 转入的会话带有问题摘要 | 坐席可以看到员工刚才问的问题内容 |
---
## 四、功能详情
### 4.1 置信度评分
**流程**
```
员工提问 → Dify处理 → 返回回答 + confidence_score → 后端判断阈值 → 执行动作
```
**Dify 返回格式**(扩展):
```json
{
"answer": "...",
"confidence_score": 0.75,
"sources": [...]
}
```
### 4.2 阈值配置
| 置信度区间 | 动作 |
|-----------|------|
| ≥ 0.8 | 直接返回回答 |
| 0.5 - 0.8 | 返回回答 + 提示"如果不确定可以转人工" |
| < 0.5 | 自动转人工 + 提示"问题已转接人工处理" |
### 4.3 自动转人工逻辑
1. 触发条件:`confidence_score < 0.5`
2. 动作:
- 创建人工会话
- 将 AI 已生成的回答作为"预设回复"(坐席可修改后发送)
- 将会话状态标记为"待处理"
- 通知空闲坐席
3. 提示文案:
- "这个问题我暂时无法确定答案,已为您转接人工处理"
- "您的问题已提交,坐席将尽快为您解答"
---
## 五、指标设计
| 指标 | 目标 | 测量方式 |
|------|------|---------|
| 自动转人工率 | 10-20% | 转人工会话数/总会话数 |
| 转人工满意度 | ≥ 4.0 | 人工服务满意度评分 |
| 置信度准确率 | ≥ 80% | 高置信度回答被标记正确的比例 |
---
## 六、技术依赖
| 依赖项 | 说明 |
|--------|------|
| Dify API | 返回置信度分数 |
| 会话管理 | 自动转接逻辑 |
| 消息通知 | 坐席接收通知 |
---
## 七、关联文档
- 前置需求: REQ-AI-001 复杂场景与统一路由
- 后续需求: 无
@@ -0,0 +1,119 @@
# PRD - 多模态视觉理解
> **REQ编号**: REQ-AI-003
> **版本**: v1.0
> **优先级**: P2
> **阶段**: 中期(3-4个月)
> **作者**: 宋献
> **日期**: 2026-07-19
---
## 一、问题陈述
**用户问题**
- 员工遇到错误弹窗、蓝屏、代码报错等问题时,只能文字描述
- 文字描述往往不准确,AI 难以理解真实问题
- 导致问题解决效率低
**业务目标**
- 员工上传截图后,AI 自动识别图片内容
- AI 根据图片给出诊断建议或解决方案
- 提升问题一次解决率
---
## 二、需求范围
### 2.1 核心功能
| 功能 | 描述 |
|------|------|
| 图片理解 | 上传截图后,AI 自动识别图片内容 |
| 错误识别 | 自动识别错误码、蓝屏、弹窗、日志等 |
| 诊断建议 | 根据图片内容给出诊断建议 |
| 多图支持 | 支持一次上传多张图片 |
### 2.2 非目标
- 不支持视频理解
- 不支持语音理解(后续迭代)
- 不支持图片编辑/标注
---
## 三、用户故事
| 角色 | 用户故事 | 验收标准 |
|------|----------|---------|
| 员工 | 我可以上传问题截图获取帮助 | 上传截图后,AI 自动分析并给出建议 |
| 员工 | 我可以一次上传多张图片 | 最多支持 4 张图片同时上传分析 |
| 坐席 | 我可以看到用户上传的图片 | 图片作为消息展示,点击可放大 |
---
## 四、功能详情
### 4.1 交互流程
```
员工上传图片 → AI视觉模型分析 → 识别问题类型 → 生成诊断建议 → 返回给用户
```
### 4.2 支持的图片类型
| 类型 | 示例 |
|------|------|
| 错误弹窗 | "连接失败"、"权限不足" |
| 蓝屏/黑屏 | Windows BSOD、系统崩溃 |
| 代码报错 | 编译器错误、运行时异常 |
| 日志截图 | 应用日志、服务器日志 |
| UI异常 | 界面显示异常、布局错乱 |
### 4.3 返回格式
```json
{
"image_description": "Windows 10 蓝屏,错误代码 DRIVER_IRQL_NOT_LESS_OR_EQUAL",
"problem_type": "系统崩溃",
"diagnosis": "可能是驱动程序不兼容导致",
"suggestions": [
"尝试重启计算机",
"检查最近安装的驱动程序",
"使用系统还原恢复"
],
"confidence": 0.85
}
```
### 4.4 技术方案
- 调用视觉大模型 API(如 GPT-4V、Claude Vision
- 图片先压缩再发送,控制成本
- 支持主流图片格式:JPG、PNG、GIF、BMP
---
## 五、指标设计
| 指标 | 目标 | 测量方式 |
|------|------|---------|
| 图片理解准确率 | ≥ 75% | 识别结果被标记正确的比例 |
| 平均响应时间 | ≤ 5s | 上传图片到返回结果的时间 |
| 用户满意度 | ≥ 4.0 | 用户对AI理解结果的评价 |
---
## 六、技术依赖
| 依赖项 | 说明 |
|--------|------|
| 视觉大模型 API | 图片理解能力 |
| 文件上传服务 | REQ-用户-002 |
---
## 七、关联文档
- 前置需求: REQ-用户-002 文件上传
- 后续需求: 无
@@ -0,0 +1,212 @@
# IT智能服务台 - AI回复来源标识 PRD
**版本**v1.0
**日期**2026-07-20
**状态**:已评审
**评审日期**2026-07-20
**作者**:许清楚
**子系统**03-AI服务
**模块**:来源标识
---
## 一、文档变更记录
| 版本 | 日期 | 变更说明 |
|------|------|----------|
| v1.0 | 2026-07-20 | 初始版本 |
---
## 二、背景与目标
### 2.1 背景
当前系统 AI 回复来源不透明,用户和坐席无法感知回复来自哪个路由(本地快判/图谱/Dify/业务路由等),影响信任度和问题追溯。
### 2.2 目标
| # | 目标 | 衡量指标 |
|---|------|----------|
| G1 | **来源透明** - 用户能感知回复来自哪个路由 | 来源标识显示覆盖率 = 100% |
| G2 | **可追溯** - 坐席能追溯每条回复的来源 | 来源记录可追溯率 = 100% |
| G3 | **统一管理** - 来源标识统一配置,易维护 | 标识变更无需代码修改 |
---
## 三、用户故事
| # | 角色 | 用户故事 |
|---|------|----------|
| US-1 | 员工 | **As a** 员工, **I want** 能看到 AI 回复的来源标识, **so that** 我知道回复的可靠性来源 |
| US-2 | 坐席 | **As a** 坐席, **I want** 能在会话记录中追溯每条 AI 回复的来源, **so that** 在需要人工介入时快速定位问题来源 |
| US-3 | 运维 | **As a** 运维人员, **I want** 统一配置来源标识的图标和映射关系, **so that** 调整标识时无需修改代码 |
---
## 四、来源类型定义
### 4.1 来源类型
| 来源Key | 来源名称 | 图标 | 说明 |
|--------|----------|------|------|
| `byod` | BYOD拦截 | 🔒 | 员工自带设备策略拦截 |
| `rule` | 本地快判 | ⚡️ | 打招呼/呼叫人工等规则匹配 |
| `vision` | 图片增强 | 🖼️ | Vision多模态理解 |
| `graph` | Neo4j图谱 | 🕸️ | 知识图谱匹配命中 |
| `dify` | Dify推理 | 🤖 | Dify主推理链路 |
| `routing` | 业务路由 | 📋 | 非IT问题路由到业务负责人 |
| `assets` | 资产推荐 | 💻 | IT资产管理推荐 |
| `fallback` | 降级回复 | ⚠️ | 所有路由均未命中时的兜底回复 |
### 4.2 来源标识配置
```python
# 来源标识配置
REPLY_SOURCE_MARKERS = {
"byod": "🔒", # BYOD拦截
"rule": "⚡️", # 本地快判(打招呼/呼叫人工)
"vision": "🖼️", # 图片增强
"graph": "🕸️", # Neo4j图谱
"dify": "🤖", # Dify主推理
"routing": "📋", # 业务路由
"assets": "💻", # 资产推荐
"fallback": "⚠️", # 降级回复
}
```
---
## 五、实现方案
### 5.1 方案对比
| 方案 | 实现方式 | 优点 | 缺点 |
|------|----------|------|------|
| 方案A | 回复内容末尾嵌入标识 | 简单直接,实现成本低 | 可能被用户复制,影响体验 |
| 方案B | persist函数统一追加 | 统一管理,原始内容纯净,便于数据分析 | WS推送和DB存储都会追加,需注意区分 |
**推荐:方案B** - 统一在 persist 函数追加标识,便于集中管理和配置调整。
### 5.2 方案B详细设计
#### 5.2.1 数据结构
```python
# 消息表新增字段
class Message:
id: str
conversation_id: str
content: str # 原始内容(不含标识)
reply_source: List[str] # 来源列表,可叠加
created_at: datetime
```
#### 5.2.2 处理流程
```
AI回复生成
确定来源(rule/graph/dify/routing/...
persist函数统一追加标识
├── WS推送:content + 标识
└── DB存储:content + reply_source字段
```
#### 5.2.3 标识追加规则
- **单来源**:直接追加对应图标,如 `⚡️`
- **多来源**:按优先级顺序叠加,如 `📋💻`(业务路由 + 资产推荐)
- **来源优先级**`rule` > `byod` > `vision` > `graph` > `dify` > `routing` > `assets` > `fallback`
### 5.3 前端展示
#### 5.3.1 H5员工端
```
┌─────────────────────────────────┐
│ 用户消息 │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ AI回复内容... │
│ 🕸️ │ ← 来源标识
└─────────────────────────────────┘
```
#### 5.3.2 坐席工作台
```
┌─────────────────────────────────┐
│ 来源:🕸️ Neo4j图谱 │ ← 详细信息
└─────────────────────────────────┘
```
---
## 六、非目标
| # | 明确不做 |
|---|----------|
| N1 | 不修改各路由模块的返回逻辑,仅在 persist 层统一处理 |
| N2 | 不在消息气泡内显示详细来源文字(坐席端可查看详情) |
| N3 | 不支持前端自定义图标(统一配置管理) |
---
## 七、指标与验收
| # | 指标 | 目标值 | 验收方式 |
|---|------|--------|----------|
| AC1 | 来源标识显示覆盖率 | 100% | 每条AI回复均有标识 |
| AC2 | 来源记录可追溯率 | 100% | DB中reply_source字段完整 |
| AC3 | 标识配置可维护性 | 调整无需代码修改 | 配置文件变更即可 |
---
## 八、关联文档
| 文档 | 说明 |
|------|------|
| `PRD-REQ-AI-001-复杂场景与统一路由-v1.1.md` | 路由层设计 |
| `PRD-REQ-AI-002-置信度门控-v1.0.md` | 置信度门控 |
| `PRD-REQ-AI-003-多模态视觉理解-v1.0.md` | Vision设计 |
| `技术方案-REQ-AI-004-AI回复来源标识-v1.0.md` | 技术实现方案 |
---
## 九、风险与依赖
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| R1:现有路由未返回来源标识 | 功能不完整 | 审查所有路由模块,确保返回reply_source |
| R2:多来源叠加显示混乱 | 用户体验差 | 严格按优先级排序,限制最多3个 |
| R3:WS推送和DB存储不一致 | 数据分析困难 | 统一在persist层处理 |
**依赖**
- D01:各路由模块需返回reply_source字段
- D02:前端消息组件需支持显示标识
---
## 十、里程碑
| 阶段 | 任务 | 预计时间 |
|------|------|----------|
| M1 | 技术方案评审 | 1天 |
| M2 | 后端实现(persist层改造) | 2天 |
| M3 | 前端展示(H5+坐席端) | 2天 |
| M4 | 联调测试 | 1天 |
| M5 | 上线 | 1天 |
---
## 十一、待确认问题
| # | 问题 | 建议 | 优先级 |
|---|------|------|--------|
| Q1 | 多来源叠加时排序规则 | 按优先级排列 | P1 |
| Q2 | 降级回复是否固定显示fallback标识 | 是 | P2 |
| Q3 | 历史消息是否需要补充标识 | 否,仅新消息 | P2 |
@@ -0,0 +1,506 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>统一意图路由层 - 前端页面原型v2</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f0f2f5; padding: 20px; line-height: 1.6; }
h1 { color: #333; margin-bottom: 20px; font-size: 24px; }
h2 { color: #555; margin: 30px 0 15px; font-size: 18px; border-bottom: 2px solid #07C160; padding-bottom: 8px; }
.page-container { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
/* 管理后台统一样式 */
.admin-container { display: flex; min-height: 600px; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }
.admin-menu { width: 180px; background: #fafafa; border-right: 1px solid #e8e8e8; }
.menu-item { padding: 14px 20px; cursor: pointer; border-left: 3px solid transparent; display: flex; align-items: center; gap: 10px; }
.menu-item:hover { background: #e6f7ff; }
.menu-item.active { background: #e6f7ff; border-left-color: #07C160; color: #07C160; font-weight: 500; }
.menu-icon { font-size: 16px; }
.admin-content { flex: 1; padding: 20px; }
/* 搜索栏 */
.search-bar { display: flex; gap: 12px; margin-bottom: 16px; padding: 16px; background: #fafafa; border-radius: 8px; }
.search-bar input { flex: 1; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; }
.search-bar select { padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; }
.btn { padding: 8px 16px; border-radius: 4px; font-size: 13px; cursor: pointer; border: none; }
.btn-primary { background: #07C160; color: white; }
.btn-default { background: white; border: 1px solid #d9d9d9; color: #333; }
/* 表格 */
.data-table { width: 100%; border-collapse: collapse; }
.data-table th, .data-table td { padding: 12px; text-align: left; border-bottom: 1px solid #e8e8e8; }
.data-table th { background: #fafafa; font-weight: 500; color: #666; font-size: 13px; }
.data-table tr:hover { background: #fafafa; }
.tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; }
.tag-green { background: #f6ffed; color: #52c41a; }
.tag-blue { background: #e6f7ff; color: #1890ff; }
.tag-orange { background: #fff7e6; color: #fa8c16; }
.tag-purple { background: #f9f0ff; color: #722ed1; }
.tag-gray { background: #f5f5f5; color: #999; }
/* 规则类型图标 */
.rule-icon { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 4px; font-size: 12px; margin-right: 8px; }
.icon-greeting { background: #e6f7ff; color: #1890ff; }
.icon-transfer { background: #fff7e6; color: #fa8c16; }
.icon-bypass { background: #f6ffed; color: #52c41a; }
.icon-routing { background: #f9f0ff; color: #722ed1; }
/* 分隔线 */
.divider { height: 1px; background: #e8e8e8; margin: 8px 0; }
/* H5用户端 */
.h5-container { max-width: 375px; margin: 0 auto; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }
.h5-header { background: #07C160; color: white; padding: 14px 16px; text-align: center; font-weight: 500; font-size: 16px; }
.h5-messages { height: 500px; overflow-y: auto; padding: 12px; background: #f5f5f5; }
.msg { margin-bottom: 12px; display: flex; align-items: flex-start; }
.msg-user { justify-content: flex-end; }
.msg-ai { justify-content: flex-start; }
.msg-bubble { max-width: 80%; padding: 10px 14px; border-radius: 8px; font-size: 14px; }
.msg-user .msg-bubble { background: #07C160; color: white; border-top-right-radius: 2px; }
.msg-ai .msg-bubble { background: white; border: 1px solid #e8e8e8; border-top-left-radius: 2px; }
/* 名片卡片 */
.contact-card { background: white; border-radius: 8px; border: 1px solid #e8e8e8; overflow: hidden; width: 260px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
.card-header { display: flex; align-items: center; padding: 12px; background: #fafafa; border-bottom: 1px solid #eee; }
.card-avatar { width: 44px; height: 44px; border-radius: 6px; background: linear-gradient(135deg, #07C160, #06ad56); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 18px; }
.card-info { margin-left: 12px; flex: 1; }
.card-name { font-weight: 500; font-size: 15px; display: flex; align-items: center; gap: 6px; }
.card-badge { font-size: 10px; background: #eee; color: #666; padding: 2px 6px; border-radius: 2px; }
.card-title { font-size: 12px; color: #888; margin-top: 2px; }
.card-body { padding: 12px; }
.card-row { display: flex; margin-bottom: 6px; font-size: 13px; }
.card-label { color: #888; width: 56px; }
.card-value { flex: 1; color: #333; }
.card-value.highlight { color: #07C160; font-weight: 500; }
.card-action { padding: 12px; border-top: 1px solid #eee; }
.card-btn { width: 100%; padding: 10px; background: #07C160; color: white; border: none; border-radius: 6px; font-size: 14px; cursor: pointer; }
/* 坐席端 */
.agent-container { display: flex; height: 550px; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }
.agent-sidebar { width: 180px; background: #fafafa; border-right: 1px solid #e8e8e8; }
.sidebar-item { padding: 12px 16px; border-bottom: 1px solid #eee; cursor: pointer; display: flex; align-items: center; gap: 8px; }
.sidebar-item:hover, .sidebar-item.active { background: #e6f7ff; border-left: 3px solid #1890ff; }
.agent-main { flex: 1; display: flex; flex-direction: column; }
.agent-header { padding: 12px 16px; background: #fafafa; border-bottom: 1px solid #e8e8e8; font-weight: 500; }
.agent-messages { flex: 1; overflow-y: auto; padding: 12px; }
.agent-input { padding: 12px; border-top: 1px solid #e8e8e8; display: flex; gap: 8px; }
.agent-input input { flex: 1; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; }
.agent-input button { padding: 8px 16px; background: #07C160; color: white; border: none; border-radius: 4px; }
/* 页面标题 */
.page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
.page-title { font-size: 16px; font-weight: 500; }
</style>
</head>
<body>
<h1>🏗️ 统一意图路由层 - 前端页面原型 v2(统一配置)</h1>
<!-- 1. 管理后台 - 统一规则配置(核心页面) -->
<div class="page-container">
<h2>页面1:管理后台 - 统一规则配置(核心)</h2>
<div class="admin-container">
<div class="admin-menu">
<div class="menu-item active"><span class="menu-icon"></span>统一规则配置</div>
<div class="menu-item"><span class="menu-icon">📊</span>路由日志</div>
<div class="menu-item"><span class="menu-icon">⚙️</span>系统配置</div>
</div>
<div class="admin-content">
<div class="page-header">
<div class="page-title">统一规则配置</div>
<button class="btn btn-primary">+ 新增规则</button>
</div>
<div class="search-bar">
<input type="text" placeholder="搜索规则名称/关键词...">
<select>
<option>全部类型</option>
<option>打招呼</option>
<option>转人工</option>
<option>业务拦截</option>
<option>业务路由</option>
</select>
<select>
<option>全部状态</option>
<option>启用</option>
<option>禁用</option>
</select>
<button class="btn btn-primary">搜索</button>
</div>
<table class="data-table">
<thead>
<tr>
<th style="width: 40px;">类型</th>
<th>规则名称</th>
<th>关键词</th>
<th>返回方式</th>
<th>优先级</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="rule-icon icon-greeting"></span></td>
<td>打招呼</td>
<td>你好、hello、hi、您好</td>
<td><span class="tag tag-blue">文字</span></td>
<td>1</td>
<td><span class="tag tag-green">启用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
<tr>
<td><span class="rule-icon icon-transfer"></span></td>
<td>转人工</td>
<td>找人工、转人工、客服、我要投诉</td>
<td><span class="tag tag-orange">操作</span></td>
<td>2</td>
<td><span class="tag tag-green">启用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
<tr>
<td><span class="rule-icon icon-bypass">BY</span></td>
<td>BYOD补贴</td>
<td>BYOD、byod、电脑补贴、自备电脑</td>
<td><span class="tag tag-blue">文字</span></td>
<td>3</td>
<td><span class="tag tag-green">启用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
<tr>
<td><span class="rule-icon icon-routing"></span></td>
<td>行政-设备管理</td>
<td>打印机、复印机、扫描仪</td>
<td><span class="tag tag-purple">名片卡片</span></td>
<td>10</td>
<td><span class="tag tag-green">启用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
<tr>
<td><span class="rule-icon icon-routing"></span></td>
<td>HR-工牌补办</td>
<td>工牌、丢卡、补卡、门禁卡</td>
<td><span class="tag tag-purple">名片卡片</span></td>
<td>11</td>
<td><span class="tag tag-green">启用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
<tr>
<td><span class="rule-icon icon-routing"></span></td>
<td>财务-报销问题</td>
<td>报销、发票、贴票</td>
<td><span class="tag tag-purple">名片卡片</span></td>
<td>12</td>
<td><span class="tag tag-gray">禁用</span></td>
<td><button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button></td>
</tr>
</tbody>
</table>
<div style="margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
<div style="font-size: 13px; color: #888;">共 6 条规则</div>
<div style="display: flex; gap: 8px;">
<button class="btn btn-default">导入</button>
<button class="btn btn-default">导出</button>
</div>
</div>
</div>
</div>
</div>
<!-- 2. 新增/编辑规则弹窗 -->
<div class="page-container">
<h2>页面2:新增/编辑规则弹窗</h2>
<div style="max-width: 600px; margin: 0 auto; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden;">
<div style="padding: 16px 20px; background: #fafafa; border-bottom: 1px solid #e8e8e8; display: flex; justify-content: space-between; align-items: center;">
<div style="font-weight: 500;">编辑规则</div>
<div style="cursor: pointer; color: #999;"></div>
</div>
<div style="padding: 20px;">
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">规则类型 <span style="color: red;">*</span></div>
<select style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px;">
<option value="greeting">打招呼</option>
<option value="transfer">转人工</option>
<option value="bypass">业务拦截(BYOD等)</option>
<option value="routing">业务路由(行政/HR/财务)</option>
</select>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">规则名称 <span style="color: red;">*</span></div>
<input type="text" value="BYOD补贴" style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px;">
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">关键词 <span style="color: red;">*</span></div>
<textarea style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; min-height: 80px;" placeholder="多个关键词用逗号分隔">BYOD,byod,电脑补贴,自备电脑</textarea>
<div style="font-size: 12px; color: #888; margin-top: 4px;">支持模糊匹配</div>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">返回类型 <span style="color: red;">*</span></div>
<select style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px;">
<option value="text">文字</option>
<option value="card">名片卡片</option>
<option value="action">操作(转人工)</option>
</select>
<div style="font-size: 12px; color: #888; margin-top: 4px;">文字:纯文本回复 | 名片卡片:展示联系人名片 | 操作:系统操作(如转人工)</div>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">返回内容</div>
<textarea style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; min-height: 100px;" placeholder="命中时返回的内容,支持变量">您符合自备电脑补贴资格!
申请链接:https://oa.servyou.com.cn/byod/apply</textarea>
<div style="font-size: 12px; color: #888; margin-top: 4px;">选「名片卡片」时需选择关联的联系人</div>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">优先级</div>
<input type="number" value="3" style="width: 100px; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px;">
<div style="font-size: 12px; color: #888; margin-top: 4px;">数字越小越优先匹配</div>
</div>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 8px;">
<input type="checkbox" checked> <span>启用</span>
</div>
</div>
<div style="padding: 16px 20px; background: #fafafa; border-top: 1px solid #e8e8e8; display: flex; justify-content: flex-end; gap: 12px;">
<button class="btn btn-default">取消</button>
<button class="btn btn-primary">保存</button>
</div>
</div>
</div>
<!-- 3a. H5用户端 - BYOD文字回复 -->
<div class="page-container">
<h2>页面3a:H5用户端 - BYOD文字回复(返回类型=文字)</h2>
<div class="h5-container">
<div class="h5-header">IT智能服务台</div>
<div class="h5-messages">
<div class="msg msg-ai">
<div class="msg-bubble">您好!我是IT智能助手,请问有什么可以帮您?</div>
</div>
<div class="msg msg-user">
<div class="msg-bubble">我想申请BYOD补贴</div>
</div>
<div class="msg msg-ai">
<div class="msg-bubble">
您符合自备电脑补贴资格!<br><br>
申请链接:<a href="#" style="color: #07C160;">https://oa.servyou.com.cn/byod/apply</a><br><br>
如有疑问请联系IT服务台。
</div>
</div>
</div>
</div>
</div>
<!-- 2b. 名片卡片类型规则弹窗 -->
<div class="page-container">
<h2>页面2b:编辑规则 - 名片卡片类型(业务路由)</h2>
<div style="max-width: 600px; margin: 0 auto; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden;">
<div style="padding: 16px 20px; background: #fafafa; border-bottom: 1px solid #e8e8e8; display: flex; justify-content: space-between; align-items: center;">
<div style="font-weight: 500;">编辑规则 - 行政-设备管理</div>
<div style="cursor: pointer; color: #999;"></div>
</div>
<div style="padding: 20px;">
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">规则类型</div>
<input type="text" value="业务路由" readonly style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; background: #f5f5f5; font-size: 14px;">
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">规则名称 <span style="color: red;">*</span></div>
<input type="text" value="行政-设备管理" style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px;">
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">关键词 <span style="color: red;">*</span></div>
<textarea style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; min-height: 60px;">打印机,复印机,扫描仪,坏了一般,维修</textarea>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">返回类型 <span style="color: red;">*</span></div>
<select style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px;">
<option value="text">文字</option>
<option value="card" selected>名片卡片</option>
<option value="action">操作</option>
</select>
</div>
<div style="margin-bottom: 16px; padding: 12px; background: #f6ffed; border-radius: 4px; border: 1px solid #b7eb8f;">
<div style="font-weight: 500; margin-bottom: 8px;">关联联系人(选填)</div>
<select style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px;">
<option value="">-- 选择联系人 --</option>
<option value="wangfang" selected>王芳 - 行政部 · 设备管理岗(8002)</option>
<option value="lilei">李雷 - 行政部 · 物资管理岗(8003)</option>
</select>
<div style="font-size: 12px; color: #888; margin-top: 4px;">联系人数据来自"业务路由配置"模块</div>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">路由说明文字</div>
<textarea style="width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; min-height: 60px;">打印机问题属于行政设备范畴,不在IT服务台服务范围内,为您推荐行政服务联系人:</textarea>
</div>
<div style="margin-bottom: 16px;">
<div style="margin-bottom: 6px; font-weight: 500;">优先级</div>
<input type="number" value="10" style="width: 100px; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px;">
</div>
<div style="margin-bottom: 16px; display: flex; align-items: center; gap: 8px;">
<input type="checkbox" checked> <span>启用</span>
</div>
</div>
<div style="padding: 16px 20px; background: #fafafa; border-top: 1px solid #e8e8e8; display: flex; justify-content: flex-end; gap: 12px;">
<button class="btn btn-default">取消</button>
<button class="btn btn-primary">保存</button>
</div>
</div>
</div>
<!-- 3b. H5用户端 - 业务路由名片卡片 -->
<div class="page-container">
<h2>页面3b:H5用户端 - 业务路由名片(返回类型=名片卡片)</h2>
<div class="h5-container">
<div class="h5-header">IT智能服务台</div>
<div class="h5-messages">
<div class="msg msg-ai">
<div class="msg-bubble">您好!我是IT智能助手,请问有什么可以帮您?</div>
</div>
<div class="msg msg-user">
<div class="msg-bubble">打印机坏了,找谁修?</div>
</div>
<div class="msg msg-ai">
<div class="msg-bubble" style="margin-bottom: 8px;">打印机问题属于行政设备范畴,为您推荐行政服务联系人:</div>
</div>
<div class="msg msg-ai">
<div class="contact-card">
<div class="card-header">
<div class="card-avatar"></div>
<div class="card-info">
<div class="card-name">王芳 ♀ <span class="card-badge">员工名片</span></div>
<div class="card-title">行政部 · 设备管理岗</div>
</div>
</div>
<div class="card-body">
<div class="card-row"><span class="card-label">负责业务</span><span class="card-value highlight">打印机/复印机</span></div>
<div class="card-row"><span class="card-label">分机号</span><span class="card-value">8002</span></div>
</div>
<div class="card-action">
<button class="card-btn">💬 联系TA</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 4. 坐席端 - 会话页面 -->
<div class="page-container">
<h2>页面4:坐席端 - 会话页面</h2>
<div class="agent-container">
<div class="agent-sidebar">
<div class="sidebar-item active">💬 会话列表</div>
<div class="sidebar-item">📊 数据统计</div>
<div class="sidebar-item">⚙️ 系统设置</div>
</div>
<div class="agent-main">
<div class="agent-header">当前会话:李四(研发部)</div>
<div class="agent-messages">
<div class="msg msg-user"><div class="msg-bubble">打印机坏了,找谁修?</div></div>
<div class="msg msg-ai"><div class="msg-bubble">打印机问题属于行政设备范畴...</div></div>
<div class="msg msg-ai">
<div class="contact-card" style="width: 240px;">
<div class="card-header">
<div class="card-avatar" style="background: linear-gradient(135deg, #fa8c16, #d46b08);"></div>
<div class="card-info">
<div class="card-name">王芳 ♀</div>
<div class="card-title">行政部 · 设备管理</div>
</div>
</div>
<div class="card-body">
<div class="card-row"><span class="card-label">负责:</span><span class="card-value highlight">打印机</span></div>
<div class="card-row"><span class="card-label">分机:</span><span class="card-value">8002</span></div>
</div>
</div>
</div>
<div style="font-size: 12px; color: #999; padding: 8px 0;">🤖 AI已发送业务路由推荐 · 行政设备问题</div>
</div>
<div class="agent-input">
<input type="text" placeholder="输入回复内容...">
<button>发送</button>
</div>
</div>
</div>
</div>
<!-- 5. 路由日志 -->
<div class="page-container">
<h2>页面5:管理后台 - 路由日志</h2>
<div class="admin-container">
<div class="admin-menu">
<div class="menu-item"><span class="menu-icon"></span>统一规则配置</div>
<div class="menu-item active"><span class="menu-icon">📊</span>路由日志</div>
<div class="menu-item"><span class="menu-icon">⚙️</span>系统配置</div>
</div>
<div class="admin-content">
<div class="search-bar">
<input type="text" placeholder="搜索用户消息...">
<select>
<option>全部类型</option>
<option>打招呼</option>
<option>转人工</option>
<option>业务拦截</option>
<option>业务路由</option>
</select>
<input type="date" value="2026-07-18">
<button class="btn btn-primary">查询</button>
</div>
<table class="data-table">
<thead>
<tr>
<th>时间</th>
<th>用户</th>
<th>用户消息</th>
<th>命中规则</th>
<th>结果</th>
<th>耗时</th>
</tr>
</thead>
<tbody>
<tr>
<td>10:30:25</td>
<td>zhangsan</td>
<td>我想申请BYOD补贴</td>
<td><span class="tag tag-orange">业务拦截-BYD补贴</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>5ms</td>
</tr>
<tr>
<td>10:31:12</td>
<td>lisi</td>
<td>怎么重置密码</td>
<td><span class="tag tag-blue">Neo4j图谱</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>180ms</td>
</tr>
<tr>
<td>10:32:05</td>
<td>wangwu</td>
<td>打印机坏了</td>
<td><span class="tag tag-purple">业务路由-行政</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>2.1s</td>
</tr>
<tr>
<td>10:33:00</td>
<td>zhaoliu</td>
<td>你好</td>
<td><span class="tag tag-blue">打招呼</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>3ms</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div style="text-align: center; margin-top: 30px; color: #999; font-size: 13px;">
<p>统一意图路由层 - 前端页面原型 v2 | 2026-07-18</p>
</div>
</body>
</html>
@@ -0,0 +1,504 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>统一意图路由层原型</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: #f5f5f5;
padding: 20px;
line-height: 1.6;
}
h1 { color: #333; margin-bottom: 20px; font-size: 24px; }
h2 { color: #555; margin: 30px 0 15px; font-size: 18px; }
.prototype-section { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
/* 用户端消息处理流程 */
.flow-container { display: flex; flex-direction: column; gap: 12px; max-width: 600px; margin: 0 auto; }
.flow-step {
display: flex; align-items: center; gap: 12px;
padding: 16px; border-radius: 8px; border: 1px solid #e0e0e0;
background: #fafafa;
}
.flow-step.active { border-color: #1890ff; background: #e6f7ff; }
.flow-step.success { border-color: #52c41a; background: #f6ffed; }
.flow-step.fail { border-color: #ff4d4f; background: #fff2f0; }
.flow-number {
width: 32px; height: 32px; border-radius: 50%;
background: #1890ff; color: white;
display: flex; align-items: center; justify-content: center;
font-weight: bold; font-size: 14px; flex-shrink: 0;
}
.flow-content { flex: 1; }
.flow-title { font-weight: 500; color: #333; }
.flow-desc { font-size: 13px; color: #666; margin-top: 4px; }
.flow-arrow {
text-align: center; color: #999; font-size: 20px;
}
/* 管理员规则配置 */
.admin-panel { max-width: 900px; margin: 0 auto; }
.panel-header {
display: flex; justify-content: space-between; align-items: center;
padding-bottom: 16px; border-bottom: 1px solid #e8e8e8; margin-bottom: 16px;
}
.panel-title { font-size: 18px; font-weight: 500; }
.btn {
padding: 8px 16px; border-radius: 4px; border: none; cursor: pointer;
font-size: 14px; transition: all 0.2s;
}
.btn-primary { background: #1890ff; color: white; }
.btn-primary:hover { background: #40a9ff; }
.btn-default { background: white; border: 1px solid #d9d9d9; color: #333; }
.btn-default:hover { border-color: #40a9ff; color: #40a9ff; }
.rule-table { width: 100%; border-collapse: collapse; }
.rule-table th, .rule-table td {
padding: 12px; text-align: left; border-bottom: 1px solid #e8e8e8;
}
.rule-table th { background: #fafafa; font-weight: 500; color: #666; }
.rule-table tr:hover { background: #fafafa; }
.tag {
display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px;
}
.tag-blue { background: #e6f7ff; color: #1890ff; }
.tag-green { background: #f6ffed; color: #52c41a; }
.tag-orange { background: #fff7e6; color: #fa8c16; }
/* 知识闭环流程 */
.cycle-diagram {
display: flex; justify-content: space-between; align-items: center;
padding: 30px 20px; background: #f0f5ff; border-radius: 8px;
max-width: 800px; margin: 0 auto;
flex-wrap: wrap; gap: 20px;
}
.cycle-step {
text-align: center; flex: 1; min-width: 120px;
}
.cycle-icon {
width: 60px; height: 60px; border-radius: 50%;
background: white; border: 2px solid #1890ff;
display: flex; align-items: center; justify-content: center;
margin: 0 auto 8px; font-size: 24px;
}
.cycle-label { font-size: 14px; color: #333; }
.cycle-arrow { font-size: 24px; color: #1890ff; }
/* 新增规则弹窗 */
.modal-overlay {
position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center;
z-index: 1000;
}
.modal { background: white; border-radius: 8px; width: 500px; max-height: 80vh; overflow: auto; }
.modal-header {
padding: 16px 20px; border-bottom: 1px solid #e8e8e8;
display: flex; justify-content: space-between; align-items: center;
}
.modal-title { font-size: 16px; font-weight: 500; }
.modal-close { cursor: pointer; font-size: 20px; color: #999; }
.modal-body { padding: 20px; }
.form-group { margin-bottom: 16px; }
.form-label { display: block; margin-bottom: 8px; font-weight: 500; color: #333; }
.form-input {
width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px;
font-size: 14px;
}
.form-input:focus { border-color: #40a9ff; outline: none; box-shadow: 0 0 0 2px rgba(24,144,255,0.2); }
.form-select { width: 100%; padding: 8px 12px; border: 1px solid #d9d9d9; border-radius: 4px; }
.modal-footer { padding: 16px 20px; border-top: 1px solid #e8e8e8; display: flex; justify-content: flex-end; gap: 12px; }
/* 响应结果展示 */
.result-card {
background: white; border-radius: 8px; padding: 20px;
max-width: 500px; margin: 20px auto; box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.result-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.result-icon {
width: 40px; height: 40px; border-radius: 50%;
display: flex; align-items: center; justify-content: center; font-size: 20px;
}
.result-icon.success { background: #f6ffed; color: #52c41a; }
.result-icon.info { background: #e6f7ff; color: #1890ff; }
.result-title { font-weight: 500; }
.result-content { background: #fafafa; padding: 12px; border-radius: 4px; font-size: 14px; }
</style>
</head>
<body>
<h1>🏗️ 统一意图路由层 - 场景原型图</h1>
<!-- 场景1:用户端消息处理流程 -->
<div class="prototype-section">
<h2>场景1:用户端消息处理流程</h2>
<div class="flow-container">
<div class="flow-step">
<div class="flow-number">1</div>
<div class="flow-content">
<div class="flow-title">接收用户消息</div>
<div class="flow-desc">用户发送文本消息"我想申请BYOD补贴"</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step active">
<div class="flow-number">2</div>
<div class="flow-content">
<div class="flow-title">第1层:本地快速规则</div>
<div class="flow-desc">检测到"BYOD"关键词,命中BYOD规则</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step success">
<div class="flow-number"></div>
<div class="flow-content">
<div class="flow-title">直接返回结果</div>
<div class="flow-desc">返回BYOD补贴申请链接,流程结束</div>
</div>
</div>
</div>
<!-- 分支:未命中本地规则 -->
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px dashed #ddd;">
<h3 style="font-size: 14px; color: #666; margin-bottom: 15px;">分支:未命中本地规则</h3>
<div class="flow-container">
<div class="flow-step">
<div class="flow-number">2</div>
<div class="flow-content">
<div class="flow-title">第1层:本地快速规则</div>
<div class="flow-desc">未匹配关键词,进入下一层</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step">
<div class="flow-number">3</div>
<div class="flow-content">
<div class="flow-title">第2层:Neo4j图谱查询</div>
<div class="flow-desc">查询知识图谱,匹配问题"如何重置密码"</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step success">
<div class="flow-number"></div>
<div class="flow-content">
<div class="flow-title">返回解决方案</div>
<div class="flow-desc">返回重置密码的操作步骤</div>
</div>
</div>
</div>
</div>
</div>
<!-- 场景2:知识闭环流程 -->
<div class="prototype-section">
<h2>场景2:知识自循环体系</h2>
<div class="cycle-diagram">
<div class="cycle-step">
<div class="cycle-icon">📄</div>
<div class="cycle-label">训练师上传文档</div>
</div>
<div class="cycle-arrow"></div>
<div class="cycle-step">
<div class="cycle-icon">🔄</div>
<div class="cycle-label">RAGFlow处理</div>
</div>
<div class="cycle-arrow"></div>
<div class="cycle-step">
<div class="cycle-icon"></div>
<div class="cycle-label">审批入库</div>
</div>
<div class="cycle-arrow"></div>
<div class="cycle-step">
<div class="cycle-icon">🔄</div>
<div class="cycle-label">同步到Dify</div>
</div>
<div class="cycle-arrow"></div>
<div class="cycle-step">
<div class="cycle-icon">🤖</div>
<div class="cycle-label">AI回答用户</div>
</div>
</div>
</div>
<!-- 场景3:管理员规则配置 -->
<div class="prototype-section">
<h2>场景3:管理员规则配置(后台)</h2>
<div class="admin-panel">
<div class="panel-header">
<div class="panel-title">本地规则配置</div>
<button class="btn btn-primary">+ 新增规则</button>
</div>
<table class="rule-table">
<thead>
<tr>
<th>规则名称</th>
<th>类型</th>
<th>关键词</th>
<th>优先级</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>打招呼</td>
<td><span class="tag tag-blue">打招呼</span></td>
<td>你好、hello、hi</td>
<td>1</td>
<td><span class="tag tag-green">启用</span></td>
<td>
<button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button>
</td>
</tr>
<tr>
<td>转人工</td>
<td><span class="tag tag-orange">转人工</span></td>
<td>找人工、转人工、客服</td>
<td>2</td>
<td><span class="tag tag-green">启用</span></td>
<td>
<button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button>
</td>
</tr>
<tr>
<td>BYOD补贴</td>
<td><span class="tag tag-blue">业务拦截</span></td>
<td>BYOD、byod、电脑补贴</td>
<td>3</td>
<td><span class="tag tag-green">启用</span></td>
<td>
<button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button>
</td>
</tr>
<tr>
<td>考勤问题</td>
<td><span class="tag tag-blue">业务拦截</span></td>
<td>考勤、请假、打卡</td>
<td>4</td>
<td><span class="tag tag-green">启用</span></td>
<td>
<button class="btn btn-default" style="padding: 4px 8px; font-size: 12px;">编辑</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 场景4:新增规则弹窗 -->
<div class="prototype-section">
<h2>场景4:新增规则(弹窗)</h2>
<div class="result-card" style="margin: 0 auto;">
<div class="modal-header">
<div class="modal-title">新增规则</div>
<span class="modal-close">×</span>
</div>
<div class="modal-body">
<div class="form-group">
<label class="form-label">规则名称 *</label>
<input type="text" class="form-input" placeholder="请输入规则名称">
</div>
<div class="form-group">
<label class="form-label">规则类型 *</label>
<select class="form-select">
<option value="">请选择规则类型</option>
<option value="greeting">打招呼</option>
<option value="transfer">转人工</option>
<option value="business">业务拦截</option>
</select>
</div>
<div class="form-group">
<label class="form-label">关键词 *</label>
<input type="text" class="form-input" placeholder="多个关键词用逗号分隔">
</div>
<div class="form-group">
<label class="form-label">返回内容</label>
<textarea class="form-input" rows="3" placeholder="匹配成功时返回的内容,支持变量"></textarea>
</div>
<div class="form-group">
<label class="form-label">优先级</label>
<input type="number" class="form-input" value="10" min="1" max="100">
</div>
</div>
<div class="modal-footer">
<button class="btn btn-default">取消</button>
<button class="btn btn-primary">保存</button>
</div>
</div>
</div>
<!-- 场景5:响应结果展示 -->
<div class="prototype-section">
<h2>场景5:响应结果展示</h2>
<div style="display: flex; gap: 20px; justify-content: center; flex-wrap: wrap;">
<div class="result-card">
<div class="result-header">
<div class="result-icon success"></div>
<div class="result-title">BYOD资格检查结果</div>
</div>
<div class="result-content">
<p><strong>✓ 您符合自备电脑补贴资格</strong></p>
<p style="margin-top: 8px; color: #666;">请访问以下链接完成申请:</p>
<p style="margin-top: 8px; color: #1890ff;">https://oa.servyou.com.cn/byod/apply</p>
</div>
</div>
<div class="result-card">
<div class="result-header">
<div class="result-icon info">📋</div>
<div class="result-title">知识库答案</div>
</div>
<div class="result-content">
<p><strong>重置密码步骤:</strong></p>
<ol style="margin-top: 8px; padding-left: 20px; color: #666;">
<li>打开OA系统登录页面</li>
<li>点击"忘记密码"</li>
<li>输入工号和手机号</li>
<li>接收验证码并重置</li>
</ol>
</div>
</div>
</div>
</div>
<!-- 场景6:业务路由-非IT问题识别 -->
<div class="prototype-section">
<h2>场景6:业务路由-非IT问题识别(Dify)</h2>
<div class="flow-container">
<div class="flow-step">
<div class="flow-number">1</div>
<div class="flow-content">
<div class="flow-title">用户消息</div>
<div class="flow-desc">"打印机坏了,找谁修?"</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step active">
<div class="flow-number">2</div>
<div class="flow-content">
<div class="flow-title">Dify 意图识别</div>
<div class="flow-desc">intent_type: "non_it_routing", business_category: "行政", routing_confidence: 0.85</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step success">
<div class="flow-number">3</div>
<div class="flow-content">
<div class="flow-title">查询业务路由配置</div>
<div class="flow-desc">匹配到"行政-设备管理"联系人:王芳,分机8002</div>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-step success">
<div class="flow-number"></div>
<div class="flow-content">
<div class="flow-title">发送联系人名片卡片</div>
<div class="flow-desc">contact_card 消息,推送企微名片</div>
</div>
</div>
</div>
</div>
<!-- 场景7:业务路由-多层级配置 -->
<div class="prototype-section">
<h2>场景7:多层级路由配置(后台)</h2>
<div style="max-width: 900px; margin: 0 auto;">
<div style="background: #f5f5f5; padding: 16px; border-radius: 8px; margin-bottom: 16px;">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="background: #1890ff; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px;">部门</span>
<span style="font-weight: 500;">人力资源部 (HR)</span>
</div>
<div style="padding-left: 20px; border-left: 2px solid #ddd; margin-left: 10px;">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="background: #52c41a; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px;">业务</span>
<span style="font-weight: 500;">招聘管理</span>
</div>
<div style="padding-left: 20px; border-left: 2px solid #ddd; margin-left: 10px;">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="background: #fa8c16; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px;">应用</span>
<span>招聘管理系统</span>
</div>
<div style="padding-left: 20px; border-left: 2px solid #ddd; margin-left: 10px;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="background: #eb2f96; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px;">联系方式</span>
<span>张三 - 分机8001</span>
</div>
</div>
</div>
</div>
</div>
<div style="text-align: center; color: #888; font-size: 13px;">
← 就近匹配原则:优先使用最细粒度的联系方式
</div>
</div>
</div>
<!-- 场景8:路由决策日志 -->
<div class="prototype-section">
<h2>场景8:路由决策日志(后台)</h2>
<div style="max-width: 800px; margin: 0 auto;">
<table class="rule-table">
<thead>
<tr>
<th>时间</th>
<th>用户消息</th>
<th>命中层</th>
<th>结果</th>
<th>耗时</th>
</tr>
</thead>
<tbody>
<tr>
<td>10:30:25</td>
<td>我想申请BYOD补贴</td>
<td><span class="tag tag-blue">本地规则</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>5ms</td>
</tr>
<tr>
<td>10:31:12</td>
<td>怎么重置密码</td>
<td><span class="tag tag-blue">Neo4j图谱</span></td>
<td><span class="tag tag-green">命中</span></td>
<td>180ms</td>
</tr>
<tr>
<td>10:32:05</td>
<td>打印机驱动在哪下载</td>
<td><span class="tag tag-blue">Dify AI</span></td>
<td><span class="tag tag-green">回答</span></td>
<td>2.3s</td>
</tr>
<tr>
<td>10:33:00</td>
<td>帮我订会议室</td>
<td><span class="tag tag-blue">转人工</span></td>
<td><span class="tag tag-orange">转接中</span></td>
<td>1.2s</td>
</tr>
</tbody>
</table>
</div>
</div>
<div style="text-align: center; margin-top: 30px; color: #999; font-size: 13px;">
<p>统一意图路由层 - 原型图 v1.1(含业务路由推荐)| 2026-07-18</p>
</div>
</body>
</html>
@@ -0,0 +1,139 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI 回复处理流程</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: #f5f5f5; color: #333; }
h1 { text-align: center; margin-bottom: 5px; }
.subtitle { text-align: center; color: #666; margin-bottom: 20px; font-size: 14px; }
.note { background: #e3f2fd; border: 1px solid #1976d2; border-radius: 6px; padding: 12px 16px; margin-bottom: 20px; }
.note-title { font-weight: 600; color: #1565c0; margin-bottom: 8px; }
.rules-list { margin: 0; padding-left: 18px; font-size: 13px; }
.rules-list li { margin-bottom: 4px; }
.flowchart { background: white; padding: 25px; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 20px; }
.flow-row { display: flex; justify-content: center; gap: 15px; margin-bottom: 10px; flex-wrap: wrap; }
.flow-col { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.flow-box { padding: 10px 16px; border-radius: 8px; text-align: center; font-size: 12px; border: 2px solid; min-width: 100px; }
.flow-box.entry { background: #e3f2fd; border-color: #1976d2; color: #1565c0; }
.flow-box.pre { background: #e8f5e9; border-color: #388e3c; color: #2e7d32; }
.flow-box.step { background: #f3e5f5; border-color: #7b1fa2; color: #6a1b9a; }
.flow-box.delay { background: #fff8e1; border-color: #ffa000; color: #f57c00; }
.flow-box.term { background: #d4edda; border-color: #28a745; color: #155724; }
.condition { font-size: 10px; padding: 2px 8px; border-radius: 10px; background: #e8f5e9; color: #2e7d32; }
.arrow { text-align: center; color: #888; font-size: 16px; margin: 2px 0; }
.branch { display: flex; gap: 20px; margin-top: 8px; }
.branch-item { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.branch-label { font-size: 10px; padding: 2px 8px; border-radius: 4px; }
.branch-yes { background: #c8e6c9; color: #2e7d32; }
.branch-no { background: #ffcdd2; color: #c62828; }
.parallel-box { background: #e8f5e9; border: 2px dashed #4caf50; border-radius: 12px; padding: 15px; margin: 10px 0; }
.parallel-title { text-align: center; font-weight: 600; color: #2e7d32; margin-bottom: 10px; }
.parallel-items { display: flex; justify-content: center; gap: 30px; font-size: 11px; color: #555; flex-wrap: wrap; }
.table { width: 100%; border-collapse: collapse; background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-size: 12px; }
.table th, .table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid #eee; }
.table th { background: #f8f9fa; font-weight: 600; }
.tag { display: inline-block; padding: 2px 6px; border-radius: 4px; font-size: 10px; }
.tag-green { background: #d4edda; color: #155724; }
</style>
</head>
<body>
<h1>AI 回复处理流程</h1>
<p class="subtitle">IT 智能服务台 - 消息处理管线(v8.0)</p>
<div class="note">
<div class="note-title">核心逻辑:延迟前置 + 结果复用</div>
<ul class="rules-list">
<li><strong>前置处理</strong>:图片提前 Vision、前置消息图谱/Dify 预处理(与输入并行,结果缓存)</li>
<li><strong>延迟等待</strong>:合并上下文前延迟 3-5 秒(整个会话只一次)</li>
<li><strong>无新消息</strong>:直接使用缓存结果快速发送</li>
<li><strong>有新消息</strong>:合并上下文后,路由复用前置结果并补充处理</li>
</ul>
</div>
<div class="flowchart">
<!-- 用户输入 -->
<div class="flow-row">
<div class="flow-box entry">用户输入消息...</div>
</div>
<div class="arrow"></div>
<!-- 前置处理(并行) -->
<div class="flow-box pre" style="margin-bottom: 10px;">🔄 前置处理(与输入并行)</div>
<div class="parallel-box">
<div class="parallel-title">结果缓存</div>
<div class="parallel-items">
<span>🖼️ 图片:Vision 识别</span>
<span>🕸️ 前置消息:图谱预处理</span>
<span>🤖 前置消息:Dify 预处理</span>
</div>
</div>
<div class="arrow"></div>
<!-- 用户发送 -->
<div class="flow-row">
<div class="flow-box entry">用户点击发送</div>
</div>
<div class="arrow"></div>
<!-- 加载会话 -->
<div class="flow-row">
<div class="flow-box step">加载会话</div>
<div class="flow-box step">获取前置结果</div>
</div>
<div class="arrow"></div>
<!-- 延迟等待(合并前,只一次) -->
<div class="flow-box delay" style="margin-bottom: 10px;">
⏳ 延迟等待 3-5 秒(合并前,整个会话只一次)
</div>
<div class="branch">
<div class="branch-item">
<div class="branch-label branch-yes">有新消息/图片</div>
<div style="font-size:10px;color:#2e7d32;">→ 合并上下文</div>
</div>
<div class="branch-item">
<div class="branch-label branch-no">无新消息</div>
<div style="font-size:10px;color:#888;">→ 使用缓存结果</div>
</div>
</div>
<div class="arrow"></div>
<!-- 路由处理(复用前置结果) -->
<div class="flow-row">
<div class="flow-box step">通用场景</div>
<div class="flow-box step">本地路由</div>
</div>
<div class="flow-row">
<div class="flow-box step">Vision</div>
<div class="flow-box step">Neo4j图谱</div>
<div class="flow-box step">Dify推理</div>
</div>
<div class="arrow"></div>
<!-- 输出 -->
<div class="flow-row">
<div class="flow-box term">持久化 + 推送</div>
</div>
</div>
<h2>节点说明</h2>
<table class="table">
<thead>
<tr><th>节点</th><th>名称</th><th>功能</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>前置处理</td><td>图片提前Vision、前置消息图谱/Dify预处理,结果缓存</td></tr>
<tr><td>2</td><td>延迟等待</td><td>合并上下文前延迟3-5秒,有新消息→合并,无→用缓存</td></tr>
<tr><td>3</td><td>获取前置结果</td><td>加载前置处理缓存结果,供路由复用</td></tr>
<tr><td>4</td><td>通用场景</td><td>打招呼/呼叫人工关键词匹配</td></tr>
<tr><td>5</td><td>本地路由</td><td>业务关键词+置信度≥70%直接返回</td></tr>
<tr><td>6</td><td>Vision增强</td><td>图片理解(复用前置Vision结果)</td></tr>
<tr><td>7</td><td>Neo4j图谱</td><td>图谱知识库匹配(复用预处理结果)</td></tr>
<tr><td>8</td><td>Dify推理</td><td>主推理+action判断(复用预处理结果)</td></tr>
</tbody>
</table>
</body>
</html>
@@ -0,0 +1,309 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI回复来源标识 - 原型图</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f0f2f5; padding: 20px; line-height: 1.6; }
h1 { color: #333; margin-bottom: 20px; font-size: 24px; }
h2 { color: #555; margin: 30px 0 15px; font-size: 18px; border-bottom: 2px solid #07C160; padding-bottom: 8px; }
.page-container { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
/* H5移动端 */
.h5-container { max-width: 375px; margin: 0 auto; border: 1px solid #e8e8e8; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
.h5-header { background: linear-gradient(135deg, #07C160, #06ad56); color: white; padding: 16px; text-align: center; font-weight: 600; font-size: 16px; }
.h5-messages { height: 500px; overflow-y: auto; padding: 16px; background: #f5f5f5; }
.msg { margin-bottom: 16px; display: flex; flex-direction: column; }
.msg-user { align-items: flex-end; }
.msg-ai { align-items: flex-start; }
.msg-time { font-size: 10px; color: #999; margin-top: 4px; text-align: center; }
.msg-bubble { max-width: 85%; padding: 12px 16px; border-radius: 12px; font-size: 14px; line-height: 1.5; position: relative; }
.msg-user .msg-bubble { background: linear-gradient(135deg, #07C160, #06ad56); color: white; border-bottom-right-radius: 2px; }
.msg-ai .msg-bubble { background: white; border: 1px solid #e8e8e8; border-bottom-left-radius: 2px; box-shadow: 0 1px 3px rgba(0,0,0,0.05); }
/* 来源标识样式 */
.source-marker { margin-top: 8px; font-size: 14px; letter-spacing: 2px; }
.marker-byod { color: #fa8c16; }
.marker-rule { color: #1890ff; }
.marker-vision { color: #722ed1; }
.marker-graph { color: #52c41a; }
.marker-dify { color: #eb2f96; }
.marker-routing { color: #fa541c; }
.marker-assets { color: #13c2c2; }
.marker-fallback { color: #f5222d; }
/* 坐席端 */
.agent-container { display: flex; height: 550px; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }
.agent-sidebar { width: 200px; background: #fafafa; border-right: 1px solid #e8e8e8; }
.sidebar-header { padding: 16px; background: #f0f2f5; font-weight: 600; border-bottom: 1px solid #e8e8e8; }
.sidebar-item { padding: 12px 16px; border-bottom: 1px solid #eee; cursor: pointer; display: flex; align-items: center; gap: 8px; }
.sidebar-item:hover, .sidebar-item.active { background: #e6f7ff; }
.sidebar-item.active { border-left: 3px solid #07C160; }
.conversation-title { font-size: 14px; font-weight: 500; }
.conversation-status { font-size: 12px; color: #52c41a; }
.agent-main { flex: 1; display: flex; flex-direction: column; }
.agent-header { padding: 12px 16px; background: #fafafa; border-bottom: 1px solid #e8e8e8; display: flex; justify-content: space-between; align-items: center; }
.agent-user-info { display: flex; align-items: center; gap: 8px; }
.agent-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(135deg, #07C160, #06ad56); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; }
.agent-name { font-weight: 500; }
.agent-dept { font-size: 12px; color: #888; }
.agent-messages { flex: 1; overflow-y: auto; padding: 16px; }
.agent-msg { margin-bottom: 12px; display: flex; gap: 10px; }
.agent-msg-user { justify-content: flex-end; }
.agent-msg-ai { justify-content: flex-start; }
.agent-msg-bubble { max-width: 70%; padding: 10px 14px; border-radius: 8px; font-size: 14px; }
.agent-msg-user .agent-msg-bubble { background: #07C160; color: white; }
.agent-msg-ai .agent-msg-bubble { background: white; border: 1px solid #e8e8e8; }
/* 来源详情 */
.source-detail { display: flex; align-items: center; gap: 6px; font-size: 12px; padding: 6px 10px; background: #f0f5ff; border-radius: 4px; margin-top: 6px; }
.source-detail-label { color: #666; }
.source-detail-value { color: #1890ff; font-weight: 500; }
/* 图例 */
.legend { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 16px; padding: 12px; background: #fafafa; border-radius: 8px; }
.legend-item { display: flex; align-items: center; gap: 4px; font-size: 12px; }
.legend-icon { font-size: 14px; }
/* 多来源叠加示例 */
.multi-source { display: flex; gap: 4px; }
/* 输入框 */
.h5-input { padding: 12px; background: white; border-top: 1px solid #e8e8e8; display: flex; gap: 8px; }
.h5-input input { flex: 1; padding: 10px 14px; border: 1px solid #e8e8e8; border-radius: 20px; font-size: 14px; outline: none; }
.h5-input input:focus { border-color: #07C160; }
.h5-input button { width: 40px; height: 40px; border-radius: 50%; background: #07C160; color: white; border: none; font-size: 18px; cursor: pointer; }
.agent-input { padding: 12px; border-top: 1px solid #e8e8e8; display: flex; gap: 8px; }
.agent-input input { flex: 1; padding: 10px 14px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; }
.agent-input button { padding: 8px 16px; background: #07C160; color: white; border: none; border-radius: 4px; cursor: pointer; }
</style>
</head>
<body>
<h1>🏷️ AI回复来源标识 - 原型图</h1>
<p style="color: #666; margin-bottom: 20px;">REQ-AI-004 - IT智能服务台</p>
<!-- 1. H5员工端 - 单来源 -->
<div class="page-container">
<h2>场景1:H5员工端 - 单来源(图谱回复)</h2>
<div class="h5-container">
<div class="h5-header">IT智能服务台</div>
<div class="h5-messages">
<div class="msg msg-user">
<div class="msg-bubble">你好,我想咨询一下重置密码的问题</div>
</div>
<div class="msg-time">10:30</div>
<div class="msg msg-ai">
<div class="msg-bubble">
您好!重置密码有以下两种方式:
<br><br>
<strong>方式一:自助重置</strong>
<br>
登录OA系统 → 个人中心 → 安全管理 → 重置密码
<br><br>
<strong>方式二:联系IT协助</strong>
<br>
如需人工协助,请点击"转人工"
<br><br>
如有其他问题,欢迎继续咨询!
<div class="source-marker marker-graph">🕸️</div>
</div>
</div>
<div class="msg-time">10:30</div>
</div>
<div class="h5-input">
<input type="text" placeholder="请描述您的问题...">
<button></button>
</div>
</div>
<div class="legend">
<div class="legend-item"><span class="legend-icon">🕸️</span> 图谱</div>
<div class="legend-item"><span class="legend-icon">🤖</span> Dify</div>
<div class="legend-item"><span class="legend-icon">⚡️</span> 本地快判</div>
<div class="legend-item"><span class="legend-icon">📋</span> 业务路由</div>
<div class="legend-item"><span class="legend-icon">💻</span> 资产推荐</div>
</div>
</div>
<!-- 2. H5员工端 - 多来源 -->
<div class="page-container">
<h2>场景2:H5员工端 - 多来源叠加(业务路由+资产推荐)</h2>
<div class="h5-container">
<div class="h5-header">IT智能服务台</div>
<div class="h5-messages">
<div class="msg msg-user">
<div class="msg-bubble">推荐一款适合办公的笔记本电脑</div>
</div>
<div class="msg-time">10:35</div>
<div class="msg msg-ai">
<div class="msg-bubble">
为您推荐以下IT资产:
<br><br>
<strong>ThinkPad X1 Carbon</strong>
<br>
• 轻薄便携,适合移动办公
<br>
• 14英寸2K高清屏
<br>
• 续航可达15小时
<br><br>
<strong>联系IT资产部门获取采购流程</strong>
<div class="source-marker">
<span class="marker-routing">📋</span>
<span class="marker-assets">💻</span>
</div>
</div>
</div>
<div class="msg-time">10:35</div>
</div>
<div class="h5-input">
<input type="text" placeholder="请描述您的问题...">
<button></button>
</div>
</div>
</div>
<!-- 3. 坐席工作台 -->
<div class="page-container">
<h2>场景3:坐席工作台 - 来源详情</h2>
<div class="agent-container">
<div class="agent-sidebar">
<div class="sidebar-header">会话列表</div>
<div class="sidebar-item">
<div>
<div class="conversation-title">张三 - IT咨询</div>
<div class="conversation-status">● 进行中</div>
</div>
</div>
<div class="sidebar-item active">
<div>
<div class="conversation-title">李四 - 资产申请</div>
<div class="conversation-status">● 进行中</div>
</div>
</div>
<div class="sidebar-item">
<div>
<div class="conversation-title">王五 - 重置密码</div>
<div class="conversation-status">✓ 已完成</div>
</div>
</div>
</div>
<div class="agent-main">
<div class="agent-header">
<div class="agent-user-info">
<div class="agent-avatar"></div>
<div>
<div class="agent-name">李四</div>
<div class="agent-dept">财务部</div>
</div>
</div>
</div>
<div class="agent-messages">
<div class="agent-msg agent-msg-user">
<div class="agent-msg-bubble">推荐一款适合办公的笔记本电脑</div>
</div>
<div class="agent-msg agent-msg-ai">
<div class="agent-avatar" style="background: linear-gradient(135deg, #1890ff, #096dd9);">AI</div>
<div class="agent-msg-bubble">
为您推荐以下IT资产:
<br><br>
<strong>ThinkPad X1 Carbon</strong>
<br>
• 轻薄便携,适合移动办公
<br>
• 14英寸2K高清屏
<br><br>
<div class="source-detail">
<span class="source-detail-label">来源:</span>
<span class="source-detail-value">📋 业务路由 + 💻 资产推荐</span>
</div>
</div>
</div>
</div>
<div class="agent-input">
<input type="text" placeholder="输入回复内容...">
<button>发送</button>
</div>
</div>
</div>
</div>
<!-- 4. 坐席工作台 - 详情面板 -->
<div class="page-container">
<h2>场景4:坐席工作台 - 消息详情面板</h2>
<div class="agent-container">
<div class="agent-sidebar">
<div class="sidebar-header">会话列表</div>
<div class="sidebar-item active">
<div>
<div class="conversation-title">李四 - 资产申请</div>
<div class="conversation-status">● 进行中</div>
</div>
</div>
</div>
<div class="agent-main">
<div class="agent-header">
<div class="agent-user-info">
<div class="agent-avatar"></div>
<div>
<div class="agent-name">李四</div>
<div class="agent-dept">财务部</div>
</div>
</div>
</div>
<div class="agent-messages" style="background: #f5f5f5;">
<div style="padding: 12px; background: white; border-radius: 8px; margin-bottom: 12px;">
<div style="font-size: 12px; color: #888; margin-bottom: 8px;">点击消息查看详情</div>
<div class="agent-msg agent-msg-ai">
<div class="agent-msg-bubble" style="max-width: 100%;">
为您推荐以下IT资产...
<div class="source-detail">
<span class="source-detail-label">来源:</span>
<span class="source-detail-value">📋 业务路由 + 💻 资产推荐</span>
</div>
<div style="margin-top: 8px; font-size: 11px; color: #888;">
路由决策:Dify识别"笔记本电脑"→业务路由→资产推荐
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 来源类型汇总 -->
<div class="page-container">
<h2>来源类型汇总</h2>
<table style="width: 100%; border-collapse: collapse; font-size: 14px;">
<thead>
<tr style="background: #f8f9fa;">
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6;">来源Key</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6;">来源名称</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6;">图标</th>
<th style="padding: 12px; text-align: left; border-bottom: 2px solid #dee2e6;">说明</th>
</tr>
</thead>
<tbody>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">byod</td><td>BYOD拦截</td><td>🔒</td><td>员工自带设备策略拦截</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">rule</td><td>本地快判</td><td>⚡️</td><td>打招呼/呼叫人工等规则匹配</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">vision</td><td>图片增强</td><td>🖼️</td><td>Vision多模态理解</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">graph</td><td>Neo4j图谱</td><td>🕸️</td><td>知识图谱匹配命中</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">dify</td><td>Dify推理</td><td>🤖</td><td>Dify主推理链路</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">routing</td><td>业务路由</td><td>📋</td><td>非IT问题路由到业务负责人</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">assets</td><td>资产推荐</td><td>💻</td><td>IT资产管理推荐</td></tr>
<tr><td style="padding: 10px; border-bottom: 1px solid #eee;">fallback</td><td>降级回复</td><td>⚠️</td><td>所有路由均未命中时的兜底回复</td></tr>
</tbody>
</table>
</div>
</body>
</html>
@@ -0,0 +1,105 @@
# PRD评审表
> **需求编号**: REQ-AI-004
> **功能名称**: AI回复来源标识
> **评审日期**: 2026-07-20
> **评审人**: 待定
---
## 一、评审基本信息
| 评审项 | 内容 |
|--------|------|
| 需求编号 | REQ-AI-004 |
| 功能名称 | AI回复来源标识 |
| 需求类型 | [x] 新增 [ ] 变更 [ ] 废弃 |
| 模块 | AI服务 |
| 优先级 | P1 |
| 阶段 | 近期(1-2个月) |
| 文档 | PRD + 原型 + 技术方案 |
---
## 二、需求完整性评审
### 2.1 用户故事评审
| # | 用户故事 | 评审结论 | 问题/建议 |
|---|----------|----------|----------|
| US-1 | 员工能看到AI回复的来源标识 | [x]通过 [ ]需修改 [ ]不通过 | |
| US-2 | 坐席能追溯每条AI回复的来源 | [x]通过 [ ]需修改 [ ]不通过 | |
| US-3 | 运维统一配置来源标识 | [x]通过 [ ]需修改 [ ]不通过 | |
### 2.2 验收标准评审
| # | 验收标准 | 评审结论 | 问题/建议 |
|---|----------|----------|----------|
| AC1 | 来源标识显示覆盖率=100% | [x]通过 [ ]需修改 [ ]不通过 | |
| AC2 | 来源记录可追溯率=100% | [x]通过 [ ]需修改 [ ]不通过 | |
| AC3 | 标识配置可维护性 | [x]通过 [ ]需修改 [ ]不通过 | |
---
## 三、方案合理性评审
### 3.1 实现方案
| 方案 | 推荐 | 评审结论 |
|------|------|----------|
| 方案A:回复内容末尾嵌入 | | [ ]通过 [ ]需修改 |
| 方案Bpersist函数统一追加 | ✅ | [x]通过 [ ]需修改 |
### 3.2 评审问题
| # | 问题 | 严重程度 | 建议 |
|---|------|----------|------|
| Q1 | 多来源叠加排序规则 | [ ]高 [x]中 [ ]低 | 按优先级排列 |
| Q2 | 降级回复标识 | [ ]高 [ ]中 [x]低 | 固定显示fallback |
| Q3 | 历史消息处理 | [ ]高 [ ]中 [x]低 | 仅新消息 |
---
## 四、评审结论
| 评审项 | 结论 |
|--------|------|
| 需求完整性 | [x]通过 [ ]需修改 [ ]不通过 |
| 方案合理性 | [x]通过 [ ]需修改 [ ]不通过 |
| 技术可行性 | [x]通过 [ ]需修改 [ ]不通过 |
| UI/UX设计 | [x]通过 [ ]需修改 [ ]不通过 |
**总体结论**: [x]通过评审 [ ]需修改后重新评审 [ ]不通过
---
## 七、评审结果
| 评审项 | 结论 |
|--------|------|
| 需求完整性 | ✅ 通过 |
| 方案合理性 | ✅ 通过 |
| 技术可行性 | ✅ 通过 |
| UI/UX设计 | ✅ 通过 |
**评审结果**:✅ 通过
---
## 五、评审意见
| # | 评审人 | 意见 |
|---|--------|------|
| 1 | | |
| 2 | | |
| 3 | | |
---
## 六、关联文档
| 文档 | 路径 |
|------|------|
| PRD | `01-产品文档/03-AI服务/PRD-REQ-AI-004-AI回复来源标识-v1.0.md` |
| 原型图 | `01-产品文档/03-AI服务/原型-REQ-AI-004-AI回复来源标识-v1.0.html` |
| 技术方案 | `02-技术文档/技术架构/技术方案-REQ-AI-004-AI回复来源标识-v1.0.md` |