chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交 (5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。 一、docs 结构整改(整改 #14) 根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入, 随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录 树并存于 docs/,共 791 文件、双分类体系冲突。 修复动作: - b2 同名异主题文件改名迁移保全 9 个 - C 类 39 个孤立文件按主题正确归类 - A/B1 类 222 个重复文件删除(新结构已有内容副本) - 9 个旧独有空目录删除 - 270 处内部引用按 verified 映射改写 - 整改记录 #14 登记于 04-运维文档/部署运维 结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。 残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。 二、compose 双目录对齐(消除踩坑 A) - docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist 改为 src/frontend-*/dist(h5 / agent / admin / terminal) - docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/ - 效果:本地 docker compose up 不再把根目录 stale dist 挂回, 与线上一致,分叉隐患消除(已 docker compose config 校验通过) 防复发铁律: - 重构须提交;仓库修复须 git stash -u 或先 commit - 新结构须 git add 并提交,避免再次 untracked 复活 - H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
This commit is contained in:
@@ -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 tokens)AI 正常响应率 ≥ 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,353 @@
|
||||
# 业务路由推荐功能 PRD
|
||||
|
||||
> **版本**: v1.0
|
||||
> **日期**: 2026-07-15
|
||||
> **作者**: Alice(产品经理)
|
||||
> **状态**: 待评审
|
||||
|
||||
---
|
||||
|
||||
## 1. 项目信息
|
||||
|
||||
| 字段 | 值 |
|
||||
|------|-----|
|
||||
| **项目名称** | business_routing |
|
||||
| **技术栈** | H5端: Vue3 + Vant4 + TypeScript / 坐席端: Vue3 + Element Plus / 后端: FastAPI + SQLAlchemy + PostgreSQL + Redis / AI: Dify 原生 API |
|
||||
| **语言** | 中文 |
|
||||
| **UI风格** | 企微浅色扁平风格,accent = #07C160 |
|
||||
|
||||
### 原始需求复述
|
||||
|
||||
IT智能服务台当前通过 Dify Prompt 识别用户消息中的审批意图并返回审批类型卡片。但当员工提出的问题**不属于 IT 服务台服务范围**时(如打印机问题属行政、工牌补办属 HR、报销问题属财务等),系统当前无法给出有效引导。
|
||||
|
||||
本需求要求系统在识别出「非 IT 业务」后,在聊天中主动发送对应业务联系人的**员工名片卡片**,员工点击名片上的「联系TA」按钮即可跳转到与该联系人的企微单聊(`wx.invoke('openEnterpriseChat', {userids: 'xxx'})`),实现精准的业务路由分发。
|
||||
|
||||
### 架构决策(已确认)
|
||||
|
||||
采用 **方案A:统一到同一个 Dify Prompt**:
|
||||
- 将现有「审批意图识别」Dify Prompt 扩展为统一的意图识别引擎
|
||||
- 一次 API 调用同时判断:IT服务台范围内(审批/咨询) / 非IT业务路由
|
||||
- 现有审批功能需回归测试确保不受影响
|
||||
|
||||
---
|
||||
|
||||
## 2. 产品定义
|
||||
|
||||
### 2.1 产品目标
|
||||
|
||||
**实现非IT业务的精准路由分发**:当员工提出的问题超出 IT 服务台服务范围时,系统自动识别业务类别并推荐对应业务联系人,员工一键即可跳转企微单聊,消除「问了半天才发现找错人」的体验断层。
|
||||
|
||||
### 2.2 用户故事
|
||||
|
||||
| # | 角色 | 用户故事 |
|
||||
|---|------|---------|
|
||||
| US-1 | 员工 | **As a** 报修员工, **I want** 当我问了非IT问题(如打印机故障、工牌补办)时,服务台直接给我推荐对应业务联系人的名片, **so that** 我不需要到处打听该找谁,一键就能联系到对的人 |
|
||||
| US-2 | 员工 | **As a** 员工, **I want** 点击名片上的「联系TA」按钮直接跳转到与该联系人的企微单聊, **so that** 我无需手动搜索联系人、复制工号,降低沟通发起成本 |
|
||||
| US-3 | 坐席 | **As a** IT坐席, **I want** 系统自动拦截非IT问题并路由给对应业务联系人, **so that** 我不被非IT工单打扰,能专注于真正的IT支持工作 |
|
||||
| US-4 | 坐席 | **As a** 坐席, **I want** 在会话中看到AI已发送的路由名片记录及推荐原因, **so that** 如果员工后续追问,我能知道之前已推荐了谁,避免重复推荐 |
|
||||
| US-5 | 管理员 | **As a** 系统管理员, **I want** 在后台维护业务联系人数据(姓名、部门、负责业务、企微userid), **so that** 人员变动时我能及时更新路由数据,保证推荐准确 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 需求池(P0/P1/P2)
|
||||
|
||||
### P0 — 必须完成(核心体验)
|
||||
|
||||
#### BE-01 统一意图识别 Prompt 扩展
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 将现有 Dify 审批意图识别 Prompt 扩展为统一意图识别引擎,一次调用同时输出审批意图判断 + 非IT业务路由判断 |
|
||||
| **扩展字段** | 在现有 JSON 输出基础上新增 `intent_type`、`business_category`、`routing_confidence` 字段(详见第5节) |
|
||||
| **兼容性** | `is_approval_request` / `confidence` / `approval_type` 三个原字段语义和取值范围保持不变,确保审批功能零回归 |
|
||||
| **调用方式** | 继续使用现有 Dify API:`http://yw-dify.dc.servyou-it.com/v1/chat-messages`,API Key: `app-7jkRkAzvX4QM9v9SM3P8mMEO` |
|
||||
|
||||
#### BE-02 业务联系人数据模型
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 新建 `business_contacts` 表存储业务联系人信息(详见第6节) |
|
||||
| **初始数据** | 预置行政、HR、财务、法务等非IT部门的联系人数据 |
|
||||
| **查询接口** | 后端根据 Dify 返回的 `business_category` 查询匹配联系人,支持按业务类别 + 服务区域筛选 |
|
||||
|
||||
#### BE-03 名片卡片消息发送
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 当 Dify 判定为非IT业务路由时,后端自动发送一条 `msg_type = 'contact_card'` 的消息 |
|
||||
| **消息结构** | `extra_data` 中携带联系人完整信息(姓名、部门、岗位、负责业务、分机号、服务区域、企微userid) |
|
||||
| **前置消息** | 名片发送前,先发送一条文本消息说明路由原因(如"打印机问题属于行政设备范畴,不在IT服务台服务范围内,为您推荐行政服务联系人") |
|
||||
| **双通道** | 通过企微消息(必达) + WebSocket(即时) 双通道下发 |
|
||||
|
||||
#### FE-H5-01 员工名片卡片组件
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 新建 `ContactCard.vue` 组件,在 `MessageBubble.vue` 中增加 `msg_type === 'contact_card'` 渲染分支 |
|
||||
| **字段** | 头像、姓名+性别、部门·岗位、负责业务(绿色高亮)、分机号、服务区域/办公地点、「员工名片」标识 |
|
||||
| **交互** | 点击「联系TA」按钮 → 调用 `wx.invoke('openEnterpriseChat', {userids: contact_userid})` 打开企微单聊 |
|
||||
| **容错** | userid 为空或企微SDK未就绪时,Toast 提示「暂时无法发起聊天,请联系管理员」 |
|
||||
| **原型参考** | `docs/01-产品文档/08-集成生态/原型-REQ-集成-003-员工名片-v1.0.html` |
|
||||
|
||||
#### FE-H5-02 消息类型映射层扩展
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 在 `conversation.ts` 的 `MsgContentType` 类型中新增 `'contact_card'` |
|
||||
| **映射** | `mapMessage()` 无需改动核心逻辑(`msg_type` 和 `extra_data` 已透传),仅需扩展类型定义 |
|
||||
|
||||
### P1 — 应该完成(增强体验)
|
||||
|
||||
#### BE-04 坐席端名片可见性
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 坐席端也能看到 AI 发送的路由名片消息,展示联系人信息 + 推荐原因 |
|
||||
| **渲染** | 坐席端 `MessageBubble` 增加 `contact_card` 渲染分支,复用名片组件(Element Plus 风格适配) |
|
||||
| **目的** | 坐席可了解路由历史,避免重复推荐,必要时可手动跟进 |
|
||||
|
||||
#### BE-05 路由命中统计
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 记录每次路由推荐事件:会话ID、员工消息内容、识别的业务类别、推荐联系人、是否点击联系 |
|
||||
| **存储** | 新建 `routing_events` 表或写入现有日志表 |
|
||||
| **目的** | 为后续优化 Prompt 准确率、分析高频非IT业务提供数据支撑 |
|
||||
|
||||
### P2 — 可以完成(后续迭代)
|
||||
|
||||
#### BE-06 管理后台联系人管理
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 坐席端管理页面提供业务联系人的 CRUD 界面 |
|
||||
| **功能** | 新增/编辑/停用联系人,按业务类别分组管理 |
|
||||
| **优先级说明** | 初期可通过数据库直接维护,管理后台为后续迭代 |
|
||||
|
||||
#### FE-H5-03 多联系人推荐
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **需求** | 当一个业务类别有多个联系人时,支持按服务区域匹配最合适的联系人,或在名片中展示多个备选 |
|
||||
| **优先级说明** | 初期单联系人推荐即可满足核心需求 |
|
||||
|
||||
---
|
||||
|
||||
## 4. UI 设计描述
|
||||
|
||||
### 4.1 名片卡片布局
|
||||
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ ┌──────┐ │
|
||||
│ │ 头像 │ 王芳 ♀ 员工名片 │
|
||||
│ │ 44px │ 行政部 · 设备管理岗 │
|
||||
│ └──────┘ │
|
||||
│─────────────────────────────────│
|
||||
│ 负责业务 打印机/复印机/扫描仪 │ ← 绿色高亮 #07C160
|
||||
│ 分机号 8002 │
|
||||
│ 服务区域 滨江园区 3-5楼 │
|
||||
│─────────────────────────────────│
|
||||
│ ┌─────────────────────────────┐ │
|
||||
│ │ 💬 联系TA │ │ ← 绿色按钮 #07C160
|
||||
│ └─────────────────────────────┘ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 卡片字段定义
|
||||
|
||||
| 字段 | 数据来源 | 说明 |
|
||||
|------|---------|------|
|
||||
| 头像 | `avatar_url` 或姓名首字渐变色块 | 44×44px 圆角6px |
|
||||
| 姓名 | `name` | 16px 加粗 |
|
||||
| 性别 | `gender` | 小图标,男蓝女粉 |
|
||||
| 部门·岗位 | `department` + `position` | 13px 灰色 #888 |
|
||||
| 负责业务 | `responsibility` | **绿色高亮** #07C160,加粗 |
|
||||
| 分机号 | `extension` | 13px |
|
||||
| 服务区域 | `service_area` | 13px,标签文案可为「服务区域」或「办公地点」 |
|
||||
| 名片标识 | 固定文本「员工名片」 | 11px 灰色徽标,右上角 |
|
||||
| 企微userid | `wecom_userid` | 隐藏字段,用于 `openEnterpriseChat` 调用 |
|
||||
|
||||
### 4.3 交互流程
|
||||
|
||||
```
|
||||
员工发送非IT消息
|
||||
↓
|
||||
Dify 统一意图识别 → intent_type: "non_it_routing"
|
||||
↓
|
||||
后端发送文本消息(路由说明)
|
||||
↓
|
||||
后端发送 contact_card 消息(联系人名片)
|
||||
↓
|
||||
后端发送 system 消息("以上为AI自动推荐,点击名片可直接发起企微聊天")
|
||||
↓
|
||||
员工点击「联系TA」
|
||||
↓
|
||||
wx.invoke('openEnterpriseChat', {userids: 'WangFang'})
|
||||
↓
|
||||
跳转企微单聊
|
||||
```
|
||||
|
||||
### 4.4 与现有审批卡片的统一性
|
||||
|
||||
名片卡片与现有 `approval_card` / `byod_card` 采用相同的渲染架构:
|
||||
- 后端统一通过 `msg_type` 区分卡片类型
|
||||
- 卡片数据通过 `extra_data` 透传
|
||||
- 前端 `MessageBubble.vue` 增加 `v-else-if="msg.msg_type === 'contact_card'"` 分支
|
||||
|
||||
---
|
||||
|
||||
## 5. 意图识别扩展方案
|
||||
|
||||
### 5.1 扩展策略:向后兼容的 JSON Schema 演进
|
||||
|
||||
现有 Dify Prompt 输出:
|
||||
```json
|
||||
{
|
||||
"is_approval_request": true,
|
||||
"confidence": 0.95,
|
||||
"approval_type": "设备申请"
|
||||
}
|
||||
```
|
||||
|
||||
扩展后输出(**原3个字段语义不变,新增3个字段**):
|
||||
```json
|
||||
{
|
||||
"is_approval_request": true,
|
||||
"confidence": 0.95,
|
||||
"approval_type": "设备申请",
|
||||
"intent_type": "approval",
|
||||
"business_category": null,
|
||||
"routing_confidence": 0.0
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 新增字段说明
|
||||
|
||||
| 字段 | 类型 | 取值 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `intent_type` | string | `"approval"` / `"it_consult"` / `"non_it_routing"` / `"chitchat"` | 意图大类:审批 / IT咨询 / 非IT业务路由 / 闲聊 |
|
||||
| `business_category` | string\|null | `"行政"` / `"人力资源"` / `"财务"` / `"法务"` / `"行政-设备"` 等 | 非IT业务类别,仅 `intent_type === "non_it_routing"` 时有值 |
|
||||
| `routing_confidence` | float | 0.0~1.0 | 非IT路由置信度,≥0.7 触发名片推荐 |
|
||||
|
||||
### 5.3 判断优先级(Prompt 内部逻辑链)
|
||||
|
||||
```
|
||||
1. 先判断是否为 IT 审批意图(现有逻辑不变)
|
||||
→ 是: intent_type = "approval", is_approval_request = true
|
||||
|
||||
2. 非审批 → 判断是否为 IT 范围内的咨询/报修
|
||||
→ 是: intent_type = "it_consult", is_approval_request = false
|
||||
|
||||
3. 非 IT 范围 → 判断具体业务类别
|
||||
→ 是: intent_type = "non_it_routing", business_category = "行政"/"人力资源"/...
|
||||
|
||||
4. 闲聊/无关
|
||||
→ intent_type = "chitchat"
|
||||
```
|
||||
|
||||
### 5.4 Prompt 扩展要点
|
||||
|
||||
在现有 Prompt 基础上增加以下内容(不修改原有审批判断规则):
|
||||
|
||||
```markdown
|
||||
### 非IT业务路由识别(新增)
|
||||
|
||||
当用户消息不属于上述12种IT审批类型,且不属于IT服务台服务范围时,判断其属于哪个非IT业务类别:
|
||||
|
||||
| 业务类别 | 典型场景 | 关键词线索 |
|
||||
|---------|---------|-----------|
|
||||
| 行政 | 打印机/复印机/扫描仪故障、办公用品、名片印刷、保洁 | 打印机、复印机、保洁、名片 |
|
||||
| 人力资源 | 工牌补办、考勤异常、入职/离职手续、社保公积金 | 工牌、考勤、入职、离职、社保 |
|
||||
| 财务 | 报销、发票、借款、工资 | 报销、发票、借款、工资条 |
|
||||
| 法务 | 合同、法律咨询、知识产权 | 合同、法务、知识产权 |
|
||||
| 行政-物业 | 空调、电梯、门禁、停车 | 空调、电梯、门禁、停车 |
|
||||
|
||||
判断规则:
|
||||
- 明确非IT业务 → intent_type: "non_it_routing", routing_confidence ≥ 0.8
|
||||
- 可能非IT但不确定 → routing_confidence: 0.5~0.7(后端可决定是否推荐)
|
||||
- 明确是IT范围 → routing_confidence ≤ 0.2, business_category = null
|
||||
```
|
||||
|
||||
### 5.5 回归测试要点
|
||||
|
||||
| 测试场景 | 预期结果 |
|
||||
|---------|---------|
|
||||
| "我要申请一台笔记本电脑" | `intent_type: "approval"`, `is_approval_request: true`, `approval_type: "设备申请"` |
|
||||
| "我的VPN连不上了" | `intent_type: "it_consult"`, `is_approval_request: false` |
|
||||
| "电脑连不上打印机了" | `intent_type: "non_it_routing"`, `business_category: "行政"`, `routing_confidence ≥ 0.8` |
|
||||
| "工牌丢了补办找谁" | `intent_type: "non_it_routing"`, `business_category: "人力资源"` |
|
||||
| "你好" | `intent_type: "chitchat"`, `routing_confidence ≤ 0.1` |
|
||||
|
||||
---
|
||||
|
||||
## 6. 业务联系人数据模型
|
||||
|
||||
### 6.1 表结构设计:`business_contacts`
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | Integer PK | 自增主键 |
|
||||
| `name` | String(50) | 联系人姓名 |
|
||||
| `gender` | String(10) | 性别(male/female) |
|
||||
| `department` | String(100) | 部门名称(如「行政部」) |
|
||||
| `position` | String(100) | 岗位(如「设备管理岗」) |
|
||||
| `responsibility` | String(500) | 负责业务描述(如「打印机/复印机/扫描仪」) |
|
||||
| `extension` | String(20) | 分机号 |
|
||||
| `service_area` | String(200) | 服务区域/办公地点 |
|
||||
| `wecom_userid` | String(100) | 企微用户ID(用于 `openEnterpriseChat`) |
|
||||
| `avatar_url` | String(500) | 头像URL(为空时用姓名首字渲染) |
|
||||
| `business_category` | String(50) | 业务类别(对应 Dify 返回的 `business_category`) |
|
||||
| `is_active` | Boolean | 是否启用(默认 true) |
|
||||
| `created_at` | DateTime | 创建时间 |
|
||||
| `updated_at` | DateTime | 更新时间 |
|
||||
|
||||
### 6.2 业务类别与联系人映射关系
|
||||
|
||||
```
|
||||
business_category (Dify输出) → business_contacts 表查询
|
||||
─────────────────────────────────────────────────────
|
||||
"行政" → WHERE business_category = '行政' AND is_active = true
|
||||
"人力资源" → WHERE business_category = '人力资源' AND is_active = true
|
||||
"财务" → WHERE business_category = '财务' AND is_active = true
|
||||
"法务" → WHERE business_category = '法务' AND is_active = true
|
||||
```
|
||||
|
||||
一个 `business_category` 可对应多个联系人(P2 支持多推荐),初期取第一个有效联系人。
|
||||
|
||||
### 6.3 API 接口(内部)
|
||||
|
||||
| 接口 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/api/h5/routing/contact` | GET | 根据 `business_category` 查询联系人,返回名片数据 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 待确认问题
|
||||
|
||||
| # | 问题 | 影响范围 | 建议 |
|
||||
|---|------|---------|------|
|
||||
| Q1 | 非IT业务类别除了行政/HR/财务/法务/物业,是否还有其他需要覆盖的部门? | Prompt 设计 + 数据初始化 | 建议与各部门确认完整清单 |
|
||||
| Q2 | 一个业务类别有多个联系人时,初期是取第一个还是按服务区域匹配? | 后端查询逻辑 | 建议 P0 取第一个有效联系人,P2 支持区域匹配 |
|
||||
| Q3 | `routing_confidence` 在 0.5~0.7 之间(不确定是否非IT)时,是否仍然推荐名片? | 路由触发策略 | 建议不推荐,走正常 AI 回复流程,避免误路由 |
|
||||
| Q4 | 员工点击「联系TA」跳转企微单聊后,当前 IT 服务台会话是否自动结束? | 会话生命周期 | 建议不自动结束,员工可能还需要回来继续咨询 |
|
||||
| Q5 | 联系人名片是否需要支持「长按保存到通讯录」? | 前端交互 | 建议 P2 迭代,初期仅需「联系TA」跳转 |
|
||||
| Q6 | 坐席端是否需要手动发送名片的能力(如坐席判断需要路由时主动发名片)? | 坐席端功能 | 建议 P1 增加,坐席应能手动触发路由推荐 |
|
||||
| Q7 | Dify Prompt 修改后,是否需要 A/B 测试对比新旧 Prompt 的审批识别准确率? | 上线策略 | 建议灰度上线,监控审批识别准确率无下降后全量 |
|
||||
| Q8 | 企微 `openEnterpriseChat` 的 `userids` 参数是企微账号ID还是工号?需要确认与 `business_contacts.wecom_userid` 的对应关系 | 数据模型字段 | 需确认企微通讯录同步的 userid 字段格式 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 技术风险与对策
|
||||
|
||||
| 风险 | 影响 | 对策 |
|
||||
|------|------|------|
|
||||
| Prompt 扩展后审批识别准确率下降 | 现有功能回归 | 扩展时保留原审批判断规则原文不动,仅新增非IT判断段落;上线前用审批测试用例集回归 |
|
||||
| Dify 单次调用延迟增加 | 用户等待感 | Prompt 扩展内容有限,预计延迟增加 <200ms;如明显可考虑流式输出 |
|
||||
| 企微 userid 数据不准确导致跳转失败 | 核心功能不可用 | 上线前核对联系人 userid 数据;前端做好容错 Toast |
|
||||
| 误路由:IT问题被识别为非IT | 用户体验受损 | `routing_confidence < 0.7` 不触发路由;可增加「仍需IT帮助」兜底文案 |
|
||||
|
||||
---
|
||||
|
||||
> **附**:交互原型文件 `docs/01-产品文档/08-集成生态/原型-REQ-集成-003-员工名片-v1.0.html`
|
||||
> **附**:现有 Dify Prompt `docs/02-技术文档/实现配置/dify_approval_system_prompt_v2.0.md`
|
||||
@@ -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:回复内容末尾嵌入 | | [ ]通过 [ ]需修改 |
|
||||
| 方案B:persist函数统一追加 | ✅ | [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` |
|
||||
Reference in New Issue
Block a user