Skip to content

Chatbot Widget — 管理后台悬浮问答组件设计

文档版本:v1.0 更新日期:2026-07-13 文档定位:为管理后台页面增加悬浮 Chatbot 按钮 + 右侧抽屉问答组件的产品设计 试点页面iot-semantics.html(标准化语义库)


1. 背景与目标

1.1 动机

管理后台(标准化语义库、空间/设备资产管理等)目前是纯配置界面,管理员在操作过程中遇到概念疑问时,需要切换到其他页面或系统查询。通过嵌入轻量 Chatbot,管理员可在不离开当前页面的情况下快速获取答案。

1.2 设计目标

  1. 不侵入现有页面 — 通过独立 Widget 方式叠加,不修改现有布局和样式
  2. 仅保留核心问答能力 — 猜你想问 + QA sub-agent(带 G-Cite 引用归因)
  3. 可复用 — 后续其他管理页面一行代码即可接入
  4. 交互一致 — 悬浮按钮 → 右侧抽屉,符合管理后台现有 UI 模式

1.3 排除范围

能力排除原因
设备控制(调温/开关灯)Web 端管理后台不需要实时控制
设备查询(查状态/温度)同左
会议室预定流程管理后台场景不需要
空间控制面板(整备)同左

2. 布局设计

2.1 浮动按钮

  • 位置:页面右下角,距右/下各 24px
  • 尺寸:52×52px 圆形
  • 样式:主色背景 #4f46e5 + 白色 💬 图标 + 阴影 0 4px 16px rgba(79,70,229,0.4)
  • 定位:position: fixed; z-index: 500
  • Hover 微放大效果

2.2 右侧抽屉

  • 宽度:420px
  • 打开/关闭:right 属性过渡动画 0.3s
  • 遮罩层:rgba(15,23,42,0.4) + backdrop-filter: blur(2px)
  • 关闭方式:✕ 按钮、点击遮罩、ESC 键

2.3 抽屉内部结构

┌──────────────────────┐
│ Header: "AI 智能问答" ✕ │
├──────────────────────┤
│                      │
│  消息列表 (flex:1)     │
│  ┌──────────────────┐│
│  │ 猜你想问卡片       ││
│  │ 问题1             ││
│  │ 问题2             ││
│  └──────────────────┘│
│                      │
│  🤖 回答文本[1][2]    │
│     ┌──────────────┐ │
│     │ 引用来源 (2)   │ │
│     └──────────────┘ │
│                      │
├──────────────────────┤
│ [输入框...]      [➤] │
└──────────────────────┘

3. 文件结构

space-agent/
├── css/
│   └── chatbot-widget.css          ← 新增:Widget 专属样式(命名空间隔离)
├── js/
│   └── chatbot-widget/             ← 新增目录
│       ├── chatbot-widget.js       ← 入口:浮窗/抽屉创建 + 开关控制
│       ├── chatbot-widget-chat.js  ← 对话:猜你想问 + 消息渲染 + 输入
│       └── chatbot-widget-citation.js  ← G-Cite 引用系统

└── iot-semantics.html              ← 修改:加 2 行引用

3.1 组件职责

chatbot-widget.js(入口)

  • 暴露全局 ChatbotWidget 对象
  • ChatbotWidget.init() — 创建浮动按钮 + 抽屉 DOM,绑定事件
  • ChatbotWidget.open() / ChatbotWidget.close() — 打开/关闭抽屉
  • 事件绑定:按钮点击切换、ESC 关闭、遮罩点击关闭

chatbot-widget-chat.js(对话)

  • 猜你想问预设问题列表 → 点击填充并发送
  • 输入框 Enter 发送
  • appendUserMessage() / appendBotMessage() / showTyping() / removeTyping()
  • Toast 提示、自动滚动

chatbot-widget-citation.js(引用)

  • chat-citation.js 精简移植
  • QA_CITATIONS 模拟数据(10 个 chunk,RAG + Web 双源)
  • renderQACitation() — 流式逐字渲染 + [C:N]<sup> 实时转换
  • idMap 重映射(按 LLM 首次出现顺序编号)
  • 引用摘要面板(展开/折叠)+ 点击上标打开半屏详情
  • 引用详情半屏 + 完整原文 Webview

chatbot-widget.css(样式)

  • 命名空间前缀 .chatbot-widget-*,避免与宿主页面冲突
  • 浮动按钮 + 抽屉动画 + 对话气泡 + G-Cite 引用样式

4. 交互流程

场景 1:猜你想问 → 快速问答

  1. 用户点击 💬 浮动按钮 → 抽屉从右侧滑入
  2. 猜你想问卡片显示预设问题列表(如"暖通空调的标准语义有哪些?")
  3. 用户点击问题 → 问题作为用户消息追加 → 打字机动画
  4. 延迟 1.2s → 移除 typing → 流式逐字输出回答
  5. 回答中的 [C:N] 实时渲染为蓝色上标
  6. 回答结束 → 引用摘要面板自动渲染

场景 2:用户自行输入

  1. 用户在输入框输入文本 → Enter 发送
  2. 同场景 1 的消息追加 → typing → 回答渲染流程
  3. 带 G-Cite 引用渲染(如果回答包含 [C:N] 标记)

场景 3:引用交互

  1. 点击上标 <sup>1</sup> → 从底部弹出半屏显示 chunk 详情
  2. 点击"展开引用来源" → 摘要面板展开显示引用条目列表
  3. 点击引用条目 → 半屏详情;有 URL 的可在"完整原文"查看 iframe Webview

退出场景

  • 点击 ✕ → 抽屉滑出
  • 点击遮罩 → 抽屉滑出
  • 按 ESC → 抽屉滑出

5. 集成方式

iot-semantics.html 中:

<head> 末尾(与现有样式并列):

html
<link rel="stylesheet" href="css/chatbot-widget.css">

<body> 末尾(与现有脚本并列):

html
<script src="js/chatbot-widget/chatbot-widget.js"></script>
<script>ChatbotWidget.init()</script>

无需修改页面原有的 HTML 结构、CSS 样式或 JS 逻辑。


6. 技术要点

6.1 样式隔离

所有样式选择器使用 .chatbot-widget-* 前缀,避免与宿主页面的 Bootstrap 风格样式(如 .btn.modal)冲突。

6.2 G-Cite 移植策略

chat-citation.jsrenderQACitation() + _renderCitationPanel() + toggleCitationPanel() + openCiteSheet() + closeCiteSheet() + openCiteWebview() + closeCiteWebview() + _initCiteSupClick 全部原样移植。

唯一修改:_initCiteSupClick 中的事件委托目标从 chatbox-body 改为 chatbot 消息容器。

6.3 猜你想问内容

初始预设问题适配语义库场景示例:

  • "暖通空调的标准语义 Key 有哪些?"
  • "Boolean 类型的语义用在什么场景?"
  • "[C:N] 在 G-Cite 中怎么工作的?"

7. 后续扩展

  • 其他管理页面(iot-assets.htmliot-devices.html 等)只需加同样的 2 行引用
  • 猜你想问内容可根据页面上下文动态配置(后续可对接 FAQ 配置管理后台)

Released under the Private License.