跳转到内容

3种交互模式 ​

模式由 VaGlowInput.vue 右下角下拉切换,循环顺序 智能交互 → 专家问答 → 系统导览。

AI 回答中 / 演示进行中(modeLocked)禁用切换,避免中途打断;若在回答中切换,切换提示会暂存在回答结束后追加到消息列表末尾。

三种模式下,输入框左下角按钮会呈现不同内容:

模式左下角按钮下拉内容
智能交互猜你想问接口分页返回的推荐问题,右上角"换一批"翻页(末页回到第一页)
专家问答选择知识库知识库分类列表(进入模式时懒加载一次)
系统导览演示指令内置问答库的 10 条指令(由 demoQA.js 动态生成)

一、智能交互(interactive) ​

面向业务数据问答的 Agent 模式,走后端 SSE 流式接口。

  • 请求:GET {VITE_APP_BASE_API}/ai/chat/stream?message=xxx,非首次追加 &sessionId=xxx;请求头带 Authorization: Bearer {token}。

  • 多轮记忆:后端在 type=done 事件中返回 sessionId,前端缓存后下次请求回传;清空对话视为新会话,重置 sessionId。

  • 事件处理(streamAiChatReply,实现位于 core/aiChatStream.js):

    事件 type前端行为
    answer拼接正文,实时渲染;复位工具调用状态
    tool_call不显示内容,指示器显示"正在调用工具"
    tool_response不显示内容,指示器显示"查询结果处理中"
    done结束流,提取 { timeCost, sessionId };不展示耗时
  • 协议兼容:同时支持 data:{"type":..}、event: + data: 行、answer{...} 类型前缀、以及若依 {code, data:{...}} 多层包装(用 deepFind 递归取值)。

  • 空闲看门狗:30 秒(STREAM_IDLE_TIMEOUT_MS)内无任何数据到达则 abort 整个请求;超时且无任何正文时提示"对话超时、请稍后重试"。

  • 边收边播:短回答在流式过程中不会发出任何 TTS 请求,实际由流结束时的 flush 收尾统一播报;只有长回答才会中途播报。


二、专家问答(expert) ​

面向知识库 + 联网检索的深度问答,走 Dify 风格 SSE 接口。

  • 请求:POST /ai/orchestrate/chat/stream,请求体由 buildExpertChatPayload 构造(含 query、responseMode: 'streaming'、model、knowledge、internalData、externalSearch)。

  • 事件处理(handleDifyStreamEvent):

    事件前端行为
    retrieval_status / search_status状态文本写入独立字段 retrievalStatusText,不混入正式回答
    search联网搜索结果,渲染为可折叠引用卡片(默认折叠),同步推给移动端
    message / agent_message正式回答文本累加
    message_end立即终止读取(不等后端关连接),避免 reader.read() 挂起
    think一期不展示
  • 知识库:左下角下拉选择分类(接口 /ai/kb/categories/chat-options);移动端选中的分类通过 COMMAND 的 knowledgeCategory 字段 piggyback 传给大屏,优先级更高。

  • 语音播报:流结束后对完整回答做一次 TTS 分段播报(不边收边播)。


三、系统导览(demo) ​

面向大屏演示汇报的确定性模式:不调用大模型生成回答,全部走本地内置脚本,保证演示稳定、可复现。

处理流程(doSendDemoMessage,实现位于 core/demoTour.js):

  1. 精确匹配内置问答库(demoList.some(item => item.question === content))→ 播放内置多段回复 + 派发 functionTool 动作;
  2. 未精确匹配 → 不回复内置内容,改由 NLU 语义识别结果驱动,避免与 NLU 重复回答。

段落播放特性:

  • 每段先启动音频(优先播放本地预生成 MP3,public/audios/*.mp3;无音频或加载失败 duration=0 时回退实时 TTS),同时以打字机逐字输出文本,用 Promise.all([typewriter, audio.ended]) 保证音字同步;
  • 打字机默认固定 35ms/字;开启"文字跟随音频"后按音频时长反推间隔((duration*1000)/字数,下限 15ms);
  • 段间停顿 220ms;每段播放完后派发该段携带的 functionTool;
  • 用户点击"禁止播报"/"打断播报"后,broadcastAborted 置位,剩余文字一次性输出并立即结束后续段落与工具派发。

10 条内置指令与 NLU 动作映射,见 内置演示脚本。


四、三模式横向对比 ​

维度智能交互专家问答系统导览
数据来源后端 Agent(含工具调用)知识库 + 联网搜索 + DeepSeek前端内置脚本 + NLU
后端依赖高高仅 NLU(演示指令完全离线)
回答可控性中低高(确定性)
大屏联动通过 NLU 动作映射通过 NLU 动作映射functionTool 写死 + NLU
语音播报边收边播(受 280 字攒字门槛限制)全文播报本地 MP3 优先,回退 TTS
多轮上下文sessionIdconversationId: null(单轮)无
面板行为常驻常驻回答中自动折叠

数字人「小慧」项目文档