Files
ai-device/intelligent_cabin/archive/docs/design.md
2026-06-11 16:28:00 +08:00

2105 lines
62 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 面向客服/售后/前台/智能座舱的高响应 Agent 技术方案
## 1. 文档目标
本文档用于设计一套可落地的 Agent 系统,满足以下核心诉求:
- 响应快:用户发起操作后,系统能够在极短时间内给出首响应或执行反馈。
- 执行准:对高频业务请求识别准确,对复杂请求可拆解、可校验、可执行。
- 可多轮:支持上下文记忆、槽位补全、断点续跑和任务恢复。
- 可扩展:适配客服、售后、前台接待、智能座舱等不同业务场景。
- 可运营:意图、槽位、规则、话术、插件均支持配置化管理。
本方案不是单纯的问答机器人,而是一个“可理解用户意图、可生成执行计划、可调用业务能力完成任务”的 Agent 平台。
## 2. 目标场景
### 2.1 客服场景
- 查询订单、物流、退款进度
- 识别催单、投诉、转人工、取消订单等诉求
- 多轮追问补全订单号、手机号、收货人等信息
### 2.2 售后场景
- 退货、换货、维修、预约上门
- 收集故障描述、图片、时间、地址等槽位
- 根据政策规则决定是否可直接处理、升级或转人工
### 2.3 前台场景
- 来访登记、会议室预约、路线引导、通知被访人
- 识别身份、预约信息、时间、地点等关键字段
- 支持多步骤任务执行和结果确认
### 2.4 智能座舱场景
- 导航、空调、车窗、音乐、电话、座椅等车控指令
- 识别复合指令,如“打开空调并导航去公司”
- 在驾驶场景下保证低延迟、强确定性和安全边界
## 3. 总体设计原则
### 3.1 快慢分层
高频、标准化、可确定执行的请求走“快路径”;复杂、低频、跨任务、带条件逻辑的请求走“慢路径”。
- 快路径:小模型分类 + 规则校验 + 直接执行
- 慢路径RAG 召回 + LLM 精判 + 工作流生成 + 插件执行
这样可以同时满足“响应速度”和“复杂理解能力”。
### 3.2 LLM 不直接控制业务
LLM 只负责:
- 意图识别与精判
- 多意图拆分
- 槽位提取
- 执行计划生成
- 回复文案生成
真正的业务执行由规则引擎、状态管理器和插件执行器完成,避免 LLM 幻觉带来的误操作。
### 3.3 会话状态中心是核心
多轮对话不能依赖模型“记忆”,必须建设独立的 Session State。
状态中心负责:
- 保存当前会话上下文
- 保存已识别意图和已填充槽位
- 保存当前任务状态和执行进度
- 记录待补充信息和断点恢复位置
### 3.4 配置优先、插件扩展
以下能力尽量配置化,而不是写死在代码中:
- 意图定义
- 槽位定义
- 规则表达式
- 反问话术
- 权限与风控限制
- 插件路由关系
## 4. 建设目标
### 4.1 业务目标
- 支持不少于 100 个可配置意图
- 支持单意图、多意图、条件意图三类输入
- 支持跨轮补充槽位并继续执行
- 支持知识问答、事务办理、设备控制三类能力
### 4.2 体验目标
- 首字响应时间小于 800ms
- 高频标准请求平均响应时间 500ms 到 1500ms
- 复杂规划请求平均响应时间 1500ms 到 3500ms
- 多轮槽位补全过程中保持上下文一致
### 4.3 质量目标
- 高频意图识别准确率大于 95%
- 槽位抽取 F1 大于 90%
- 高风险动作误执行率接近 0
- 转人工触发符合业务策略并可追踪
## 5. 能力边界与功能点
### 5.1 核心能力
- 意图识别:识别用户到底要做什么
- 槽位提取:提取时间、地点、金额、对象、设备等参数
- 多意图拆分:识别一句话中多个任务
- 逻辑解析:识别顺序、条件、重试、并行关系
- 会话管理:跟踪当前任务、历史轮次和上下文变量
- 任务执行:调用业务接口、设备控制接口或人工服务接口
- 结果回复:结构化返回执行结果,必要时生成自然语言
### 5.2 平台能力
- 意图知识库管理
- 规则与话术配置平台
- 插件注册中心
- 会话状态存储
- 指标监控与日志追踪
- 安全审计与权限控制
### 5.3 场景化能力
- 客服FAQ、工单、订单操作、转人工
- 售后:退换修、预约、故障诊断、流程推进
- 前台:访客接待、通知、预约、引导
- 智能座舱:设备控制、导航、多设备联动、安全确认
## 6. 系统总体架构
```text
用户输入
-> 接入层Web/App/语音/车机)
-> 预处理层ASR/文本归一化/敏感词/语言检测)
-> 路由层
-> 快路径:意图分类模型 + 规则匹配 + 插件执行
-> 慢路径:向量召回 + LLM 精判 + Workflow 生成
-> 状态中心Session/Context/Slots/Current Step
-> 执行引擎(规则引擎 + 插件调度 + 断点恢复)
-> 回复生成层(模板/LLM
-> 用户
```
## 7. 核心处理链路
### 7.1 快路径
适用于客服、前台、座舱中的高频标准请求,例如:
- “查一下我的订单”
- “打开空调”
- “帮我通知张三来前台”
执行流程:
1. 对输入做标准化与轻量实体提取
2. 进入轻量意图分类模型
3. 命中高置信度意图后,进行槽位校验
4. 槽位齐全则直接调用插件执行
5. 槽位缺失则触发反问并记录状态
优势:
- 延迟低
- 成本低
- 可控性强
### 7.2 慢路径
适用于复杂请求,例如:
- “帮我查一下订单,如果还没发货就取消”
- “导航去公司,然后把空调调到 22 度,再给我播放轻音乐”
- “我要退货,若超过 7 天就帮我转人工”
执行流程:
1. 向量召回 Top-K 候选意图
2. LLM 对候选意图做精判
3. 对输入做多意图拆分
4. 生成结构化 Workflow JSON
5. 执行引擎按步骤调度插件
6. 缺槽位时暂停并反问
7. 用户补充后从断点恢复执行
## 8. 推荐的多层 Agent 架构
### 8.1 第 1 层:输入理解层
职责:
- 文本清洗
- 口语归一化
- 同义词映射
- 设备指令别名统一
- 敏感/危险指令预过滤
### 8.2 第 2 层:意图路由层
职责:
- 判断是否命中高频快路径
- 判断是否需要进入复杂规划链路
- 判断是问答类、事务类还是控制类任务
推荐策略:
- 高频意图使用专门分类器
- 低频和新增意图使用向量召回
- 复杂指令交给 LLM 做精判和拆解
### 8.3 第 3 层:会话状态层
核心数据:
- session_id
- user_id / device_id
- current_intent
- current_workflow
- completed_steps
- pending_slots
- business_context
- risk_level
### 8.4 第 4 层:执行编排层
职责:
- 执行工作流
- 管理步骤状态
- 根据规则判断分支
- 调用插件
- 处理重试、超时和回滚
### 8.5 第 5 层:能力插件层
插件示例:
- 查询订单插件
- 取消订单插件
- 创建售后工单插件
- 访客登记插件
- 通知员工插件
- 导航插件
- 空调控制插件
- 音乐控制插件
### 8.6 第 6 层:回复生成层
优先级建议:
- 优先模板化返回
- 复杂解释场景再用 LLM 生成自然语言
- 高风险动作必须做明确确认和结果回执
## 9. 意图、槽位、工作流设计
### 9.1 意图设计
建议每个意图至少包含:
- intent_id
- intent_name
- domain
- description
- examples
- boundary
- required_slots
- optional_slots
- execution_plugin
- risk_level
示例:
```json
{
"intent_id": "cabin_set_ac_temperature",
"intent_name": "设置空调温度",
"domain": "cabin_control",
"required_slots": ["temperature"],
"optional_slots": ["zone"],
"execution_plugin": "ac_control_plugin",
"risk_level": "low"
}
```
### 9.2 槽位设计
每个槽位建议配置:
- 名称
- 类型
- 是否必填
- 默认值
- 校验规则
- 提问模板
- 错误提示
- 来源优先级
### 9.3 Workflow 设计
复杂请求最终统一转成结构化执行计划。
示例:
```json
{
"workflow_id": "wf_1001",
"logic_type": "sequence",
"steps": [
{
"step": 1,
"intent": "query_order_status",
"slots": {
"order_id": "A123"
}
},
{
"step": 2,
"condition": "order_status == 'pending_shipment'",
"intent": "cancel_order"
}
]
}
```
## 10. 多轮对话设计
### 10.1 多轮的本质
多轮不是每一轮都重新做完整识别,而是:
- 首轮生成任务或命中任务
- 后续轮次只做补槽位、确认、修正、继续执行
### 10.2 状态机设计
建议会话状态包括:
- `idle`:空闲
- `understanding`:理解中
- `waiting_slot`:等待用户补充信息
- `ready_to_execute`:准备执行
- `executing`:执行中
- `paused`:中断等待
- `completed`:完成
- `fallback`:兜底或转人工
### 10.3 断点续跑
示例:
1. 用户说“我要退货”
2. 系统识别退货意图,但缺少订单号
3. 系统反问“请提供订单号”
4. 用户回复“A123”
5. 系统只做槽位提取,不重新做全量规划
6. 系统恢复原任务继续执行
### 10.4 多轮省略恢复与上下文改写
参考车机场景的公开方案,多轮对话不能只靠“读取上一轮状态”,还应增加“相邻轮改写”和“高频缓存命中”能力。
适用场景:
- “音量调大” -> “再大一点”
- “导航去公司” -> “不要高速”
- “查一下北京天气” -> “上海呢”
建议新增一层 `context rewrite engine`,位于 `Session State``Router` 之间:
1. 读取上一轮已确认的主任务、领域和关键槽位
2. 将“当前轮短句 + 上一轮已确认语义”送入高频缓存引擎查询
3. 若命中缓存模板,直接改写为完整指令
4. 若缓存未命中,再使用轻量改写模型生成补全后的标准句
5. 改写后再进入意图识别与槽位提取
示例:
- 上一轮:`空调调高`
- 当前轮:`再高一点`
- 改写后:`把空调温度再调高一点`
缓存建议:
- key`previous_intent + current_utterance_pattern`
- value`rewritten_text / target_intent / slot_delta`
- 数据来源:高频真实语料、线上点击日志、人工标注样本
收益:
- 显著提升省略表达、连续调节、改口表达的识别率
- 避免每一轮都走完整大模型规划
- 将多轮短句场景时延压缩到接近单轮快路径
## 11. 模型方案
### 11.1 选型原则
- 高频场景优先低延迟
- 复杂场景优先理解能力
- 高风险场景优先可控和可审计
- 模型职责必须拆开,不要一个模型包打天下
### 11.2 推荐模型组合
#### A. 轻量意图识别模型
用途:
- 高频标准请求分类
- 第一时间做快路径路由
推荐方向:
- BERT / RoBERTa 中文分类模型
- 小型指令模型蒸馏版
- ONNX / TensorRT 部署后的轻量分类模型
适合场景:
- 客服高频查询
- 前台固定流程
- 座舱高频控制
#### B. 向量召回模型
用途:
- 动态意图库检索
- 召回候选意图与候选技能
推荐方向:
- BGE-M3
- BCE Embedding
- text-embedding 系列中文向量模型
#### C. 主 LLM
用途:
- 候选意图精判
- 多意图拆分
- 槽位抽取
- Workflow 生成
- 自然语言回复
推荐方向:
- 通义千问系列
- DeepSeek 系列
- GLM 系列
- GPT 类模型
建议:
- 线上使用支持函数调用、结构化输出、低温度推理的模型
- 对复杂规划与多轮状态更新使用 JSON schema 约束输出
#### D. ASR / TTS 模型
用于前台语音交互和智能座舱:
- ASR语音转文本
- TTS语音播报反馈
- VAD语音活动检测提升交互流畅度
### 11.3 推荐模型职责拆分
- 小模型:意图分类、风险识别、简单槽位抽取
- 向量模型:候选意图召回
- 大模型:复杂理解、规划和自然语言生成
- 规则引擎:确定性判断与业务约束
这是兼顾速度、成本和准确性的最佳组合。
### 11.4 端云协同模型分工
要达到接近车机助手的体验,必须采用“本地优先、云端增强、结果融合”的模型架构,而不是所有请求都走一个远端大模型。
建议分工如下:
- 本地 ASR / 文本归一化:负责第一时间得到稳定文本或拼音特征
- 本地快分支 1关键词/规则/Trie 高频模式匹配
- 本地快分支 2轻量 BERT 意图分类模型
- 本地快分支 3多轮缓存改写 + 连续调节识别
- 本地快分支 4轻量检索或 FAQ 命中
- 云端慢分支复杂语义理解、多意图拆分、条件规划、知识问答、RAG、API 预测
融合原则:
- 本地结果若达到最高置信等级,则直接触发首响应与本地执行
- 云端结果若在可接受时间窗口内返回,则可覆盖或补充本地结果
- 对高风险动作,云端只能提供建议,最终执行仍由规则与插件层裁决
### 11.5 声学语义大模型的落地方式
参考公开专利中的“声学编码 + 字符转写 + 检索增强 + 大模型”思路,后续如果要做语音版车机,不建议继续把 ASR、NLU、知识检索和 API 预测完全割裂成独立长链路。
推荐两阶段落地:
- 第一期:保留模块化工程架构,但缩短串行链路,做到 `ASR -> local router -> plugin/cloud planner`
- 第二期:引入端到端语音语义模型,使其直接输出:
- intent
- slots
- candidate_api
- reject / clarify / execute decision
这样可以同时保留工程可控性和后续车机语音体验的升级空间。
## 12. 技术栈建议
### 12.1 服务端
- Python适合快速构建 AI 编排、模型接入、规则处理
- FastAPI提供高性能 API 服务
- Celery / 队列系统:处理异步任务和外部接口调用
如果团队更偏 Java也可使用
- Java + Spring Boot
- LangChain4j 或自研 Agent 编排层
### 12.2 检索与存储
- Redis会话状态、热点缓存、限流计数
- PostgreSQL业务数据、配置中心、日志审计
- Elasticsearch检索与日志分析
- Qdrant / Milvus向量检索与意图知识库召回
### 12.3 Agent 编排与规则
- 自研 Workflow Engine 或基于状态机的编排引擎
- JSON Schema约束结构化输出
- 规则引擎:表达式解析、条件判断、路由控制
### 12.4 前端与接入
- Web 前端 / App SDK
- 呼叫中心接入
- 企业 IM 接入
- 车机系统接入
- 语音网关接入
### 12.5 可观测与运维
- Prometheus + Grafana监控
- OpenTelemetry链路追踪
- Loki / ELK日志采集与分析
## 13. 响应速度优化方案
这是本系统成败的关键。
### 13.1 低延迟设计
- 高频意图前置分类,不直接把所有请求都交给 LLM
- 热门意图和常用知识走缓存
- 首响应和最终响应分离,先反馈“正在处理”
- LLM 使用流式输出
- 复杂任务异步执行,前台先返回受理状态
### 13.2 结构化提速
- 只给 LLM 候选意图,不让模型自由发散
- 后续轮次只做槽位提取,不重复做全流程规划
- 采用模板化回复代替不必要的长文本生成
### 13.3 工程提速
- 模型服务常驻内存
- Embedding 批量化和缓存
- 插件接口超时控制与降级
- 预加载高频配置与词典
### 13.4 参考车机方案的极速响应架构
为了逼近“小鹏 P7 类”体验,建议在当前快慢路径基础上,升级为“本地多支路并发 + 结果分级融合 + 云端延迟覆盖”的架构。
```text
用户输入
-> 并发启动本地多支路
-> Branch A: keyword / rule / trie
-> Branch B: local bert classifier
-> Branch C: context rewrite + cache engine
-> Branch D: retrieval matcher
-> 结果分级器
-> high grade: 直接首响应 / 直接执行
-> medium grade: 等待 100~300ms 观察其他分支
-> low grade: 进入云端理解
-> 云端 planner / rag / llm
-> 融合器输出目标结果
```
分级融合建议使用以下特征:
- ASR 置信度 / 清晰度
- 本地意图分类置信度
- 领域置信度
- 槽位完备度
- 是否命中高频缓存
- 是否命中历史会话上下文
- 是否属于高风险动作
推荐时延预算:
- 0~150ms文本标准化、关键词、Trie、缓存改写
- 150~350ms本地 BERT / 本地检索 / 本地槽位提取
- 350~600ms返回首响应或执行简单任务
- 600~1500ms云端补充复杂理解或条件规划结果
首响应策略:
- 能本地直接执行的,优先回短反馈,如“好的,正在导航”
- 需要云端复杂规划的,先回受理反馈,如“收到,我先帮你确认一下”
- 云端超时不阻塞首响应,必要时走兜底或稍后补充结果
该策略是实现 `<1s` 体验的关键,不要求所有任务都在 1 秒内完成,但要求绝大多数任务在 1 秒内给出可感知反馈。
## 14. 准确率与执行可靠性设计
### 14.1 准确率保障
- 高频意图单独建模
- 意图边界描述清晰化
- 引入负样本和相似意图对比训练
- 使用 RAG 缩小候选范围后再让 LLM 精判
### 14.2 执行可靠性保障
- 高风险动作必须二次确认
- 插件执行前后都记录审计日志
- 核心步骤支持幂等、重试和回滚
- 输出必须是结构化结果,禁止自由文本直接驱动操作
### 14.3 风控策略
- 敏感词和危险动作拦截
- 用户身份和权限校验
- 场景安全等级区分
- 智能座舱中行车状态下限制高风险控制动作
### 14.4 多命令拆分与任务栈
为了支持“打开空调并导航去公司,再播放轻音乐”这一类车机复合指令,建议在路由层之后增加 `command splitter``task stack manager`
输出结构建议:
```json
{
"task_id": "task_001",
"logic_type": "sequence",
"commands": [
{"intent": "cabin_set_ac", "slots": {"temperature": 22}},
{"intent": "cabin_nav_to", "slots": {"destination": "公司"}},
{"intent": "cabin_play_music", "slots": {"genre": "轻音乐"}}
]
}
```
执行要求:
- 简单并列命令支持顺序执行
- 需要条件判断的命令转为 workflow condition
- 允许用户在执行中打断、改口和取消后续任务
- 为每个任务保留任务栈、当前步骤和已完成步骤
打断策略:
- 新请求与当前任务冲突时,允许暂停旧任务并保存上下文
- 明确打断词出现时,清空当前任务栈或清理对应子任务上下文
- 对高风险动作,打断后不得默认自动恢复
### 14.5 拒答、澄清与简短反馈策略
要实现“反馈迅速而简短,不会的内容有合适拒绝话术”,不能只靠模型生成,应建设统一的 `response policy layer`
回复规则:
- 简单执行成功:一句话短反馈,长度优先控制在 8~20 个字
- 缺槽位:只追问一个最关键槽位,不一次性问太多
- 不支持的请求:明确说明边界并给出可做事项
- 风险动作:先确认再执行
- 云端失败:给出降级反馈,不暴露内部错误
建议内置 5 类模板:
- `ack`:收到,马上处理
- `clarify`:信息不够,请补一个关键字段
- `confirm`:高风险动作确认
- `reject`:能力边界拒答
- `fallback`:系统忙或结果不稳定时的兜底
示例:
- `ack``好的,正在为你导航`
- `clarify``请告诉我订单号`
- `confirm``确认要取消这个订单吗`
- `reject``这个我暂时做不了,但我可以帮你导航、查订单或调空调`
- `fallback``我先记下你的需求,稍后再试一次`
核心原则:
- 首反馈短
- 首反馈稳
- 不会就明确拒答
- 不确定就先澄清
- 不让模型自由发挥高风险话术
## 15. 配置化设计
建议把以下内容全部放入配置中心:
- 意图定义
- 槽位定义
- 规则表达式
- 反问模板
- 插件映射
- 风险等级
- 转人工策略
- 场景开关
这样新增业务时,尽量做到“不改核心代码,只加配置和插件”。
## 16. 效果预期
### 16.1 对业务的价值
- 降低人工客服和前台重复劳动
- 提升售后处理自动化比例
- 提高智能座舱交互的自然度和完成率
- 缩短用户从提问到执行完成的路径
### 16.2 对用户的体验
- 回答更快
- 多轮更顺
- 执行更稳
- 出错可解释
- 失败可转人工
### 16.3 可量化指标
- 首响应耗时
- 请求完成率
- 单轮解决率
- 多轮补槽成功率
- 插件执行成功率
- 转人工率
- 用户满意度
## 17. 分阶段落地建议
### 17.1 第一阶段POC
目标:
- 先验证快路径和多轮补槽是否可用
范围:
- 10 到 20 个高频意图
- 单领域试点,如客服或智能座舱
方案:
- 轻量分类模型 + Redis 状态中心 + 少量插件 + 模板回复
### 17.2 第二阶段:商用 MVP
目标:
- 覆盖主要业务链路,支持转人工和监控闭环
范围:
- 50 到 100 个意图
- 问答 + 事务 + 执行三类能力
方案:
- 分类模型 + 向量召回 + LLM 精判 + 执行引擎 + 配置中心
### 17.3 第三阶段:平台化
目标:
- 多场景复用,支持客服、售后、前台、座舱统一底座
范围:
- 多租户、多场景、多插件
方案:
- 插件平台、规则平台、意图库平台、评测平台、可观测平台全面建设
## 18. 最终建议
对于“回答迅速且执行准确”的 Agent不建议直接用单一大模型硬做而应采用以下混合架构
- 高频请求:小模型分类直达执行
- 动态意图:向量召回缩小范围
- 复杂请求LLM 做拆分、精判和工作流生成
- 多轮会话:状态中心负责记忆与恢复
- 最终执行:插件和规则引擎负责落地
一句话总结:
这是一个“快路径保证速度、慢路径保证理解、状态中心保证多轮、插件执行保证结果”的 Agent 架构。
如果后续继续推进,下一步建议补两份文档:
- 一份《系统架构图 + 时序图》
- 一份《意图表、槽位表、插件表、接口协议表》
## 19. 系统架构图
### 19.1 总体架构图
```mermaid
flowchart LR
A[用户<br/>App / Web / 呼叫中心 / 车机] --> B[接入层<br/>API Gateway / WS / 语音网关]
B --> C[预处理层<br/>ASR / 文本归一化 / 安全过滤 / 语言识别]
C --> D[意图路由层]
D --> E[快路径<br/>轻量分类模型 + 规则匹配]
D --> F[慢路径<br/>向量召回 + LLM 精判 + Workflow 生成]
E --> G[槽位校验]
F --> H[复杂任务解析]
G --> I[状态中心<br/>Session / Slots / Context / Current Step]
H --> I
I --> J[执行引擎<br/>状态机 / 规则引擎 / 插件调度]
J --> K[插件层<br/>订单 / 售后 / 前台 / 座舱 / 转人工]
K --> L[业务系统<br/>CRM / ERP / 工单 / 地图 / IoT / 车控]
J --> M[回复生成层<br/>模板回复 / LLM 润色 / TTS]
M --> N[用户反馈]
I --> O[Redis]
J --> P[PostgreSQL]
F --> Q[向量库 Qdrant / Milvus]
J --> R[监控审计<br/>日志 / Trace / Metrics]
```
### 19.2 模块职责说明
- 接入层:统一承接文本、语音、车机和 IM 渠道请求。
- 预处理层:负责 ASR、文本标准化、敏感词过滤、别名归一。
- 意图路由层:判断进入快路径还是慢路径。
- 状态中心:保存会话、槽位、上下文和当前执行进度。
- 执行引擎:按规则与工作流调度插件,控制暂停、恢复、重试和回滚。
- 插件层:承接具体业务动作,保证执行可控和可审计。
## 20. 核心时序图
### 20.1 高频请求快路径时序图
适用场景:
- “打开空调”
- “查询订单”
- “通知张三到前台”
```mermaid
sequenceDiagram
participant U as 用户
participant G as 接入层
participant R as 路由层
participant C as 轻量分类模型
participant S as 状态中心
participant E as 执行引擎
participant P as 业务插件
participant B as 业务系统
U->>G: 发起请求
G->>R: 预处理后的文本
R->>C: 意图分类
C-->>R: 高频意图 + 置信度
R->>S: 读取/更新会话状态
R->>E: 发起执行请求
E->>P: 调用目标插件
P->>B: 调用业务接口
B-->>P: 返回结果
P-->>E: 执行结果
E->>S: 更新步骤状态
E-->>G: 结构化结果
G-->>U: 返回执行结果
```
### 20.2 复杂请求慢路径时序图
适用场景:
- “查订单,如果没发货就取消”
- “导航去公司,再把空调调到 22 度”
```mermaid
sequenceDiagram
participant U as 用户
participant G as 接入层
participant R as 路由层
participant V as 向量召回
participant L as LLM
participant S as 状态中心
participant E as 执行引擎
participant P as 插件层
U->>G: 发起复杂请求
G->>R: 预处理后的输入
R->>V: 召回候选意图 Top-K
V-->>R: 候选意图列表
R->>L: 候选意图 + 用户输入
L-->>R: 精判结果 + Workflow JSON
R->>S: 保存 workflow 和 slots
R->>E: 启动执行
E->>P: 按步骤调度插件
P-->>E: 每步执行结果
E->>S: 更新 current_step / context
E-->>G: 汇总结果
G-->>U: 返回执行反馈
```
### 20.3 多轮补槽与断点续跑时序图
适用场景:
- “我要退货”
- “帮我预约维修”
- “导航去机场,走高速”
```mermaid
sequenceDiagram
participant U as 用户
participant G as 接入层
participant R as 路由层
participant L as LLM/抽取模型
participant S as 状态中心
participant E as 执行引擎
participant P as 插件层
U->>G: 我要退货
G->>R: 首轮请求
R->>L: 识别意图并抽取槽位
L-->>R: 退货意图,缺少 order_id
R->>S: 保存 pending_slots=order_id
R-->>G: 生成追问
G-->>U: 请提供订单号
U->>G: A123456
G->>S: 带 session_id 读取上下文
S-->>G: 返回待补槽位信息
G->>L: 仅做槽位提取
L-->>G: order_id=A123456
G->>S: 更新槽位并置为 ready_to_execute
G->>E: 从断点恢复执行
E->>P: 调用退货插件
P-->>E: 返回结果
E->>S: 更新为 completed
E-->>G: 执行成功
G-->>U: 已为你提交退货申请
```
## 21. 场景执行图
### 21.1 智能座舱复合指令执行图
示例指令:
- “打开空调到 22 度,导航去公司,再播放轻音乐”
```mermaid
flowchart TD
A[用户输入复合指令] --> B[意图拆分]
B --> C1[设置空调]
B --> C2[导航到公司]
B --> C3[播放轻音乐]
C1 --> D[槽位校验 temperature=22]
C2 --> E[槽位校验 destination=公司]
C3 --> F[槽位校验 genre=轻音乐]
D --> G[空调插件]
E --> H[导航插件]
F --> I[音乐插件]
G --> J[更新座舱上下文]
H --> J
I --> J
J --> K[统一反馈执行结果]
```
### 21.2 客服售后条件流程图
示例指令:
- “帮我查订单,如果还没发货就取消”
```mermaid
flowchart TD
A[用户输入] --> B[识别查询订单 + 取消订单]
B --> C[生成条件工作流]
C --> D[执行查询订单插件]
D --> E{是否已发货}
E -- 否 --> F[执行取消订单插件]
E -- 是 --> G[返回不可取消说明]
F --> H[返回取消成功]
G --> I[结束]
H --> I
```
## 22. 时序图对应的工程说明
### 22.1 为什么要先路由再规划
- 不是所有请求都需要 LLM。
- 高频请求先经过快路径,能够显著降低响应延迟和调用成本。
- 复杂请求才进入召回与规划链路,保证资源集中用在真正困难的问题上。
### 22.2 为什么多轮只做补槽不重规划
- 这样可以减少模型重复推理,显著缩短第二轮及后续轮次响应时间。
- 可以避免上下文漂移,保证任务持续围绕原始目标推进。
- 更适合客服、售后、前台、座舱这类明确任务型交互。
### 22.3 为什么执行一定要经过状态中心
- 执行过程需要可追踪、可暂停、可恢复。
- 插件失败、超时、用户打断等情况都需要状态中心统一管理。
- 后续做审计、风控、会话分析时,也必须依赖完整状态记录。
## 23. 下一步详细设计建议
在当前架构图和时序图基础上,建议下一步输出以下内容:
1. 意图清单:按客服、售后、前台、座舱四大域拆分。
2. 槽位字典:定义每个意图所需字段、校验规则和追问模板。
3. 插件接口表:定义入参、出参、幂等键、超时与错误码。
4. MVP 范围:先选 10 到 20 个高频意图,构建第一版闭环。
## 24. 意图清单初稿
### 24.1 字段说明
建议每个意图至少包含以下字段:
- `intent_id`:意图唯一标识
- `intent_name`:意图名称
- `domain`:所属业务域
- `type`:问答 / 事务 / 控制
- `priority`:优先级
- `risk_level`:风险等级
- `entry_path`:快路径 / 慢路径
- `required_slots`:必填槽位
- `plugin_id`:执行插件标识
### 24.2 客服域意图表
| intent_id | intent_name | type | risk_level | entry_path | required_slots | plugin_id |
| --- | --- | --- | --- | --- | --- | --- |
| cs_query_order | 查询订单状态 | 事务 | low | 快路径 | order_id | plugin.order.query |
| cs_query_logistics | 查询物流 | 事务 | low | 快路径 | order_id | plugin.logistics.query |
| cs_cancel_order | 取消订单 | 事务 | medium | 快路径 | order_id | plugin.order.cancel |
| cs_refund_status | 查询退款进度 | 事务 | low | 快路径 | refund_id/order_id | plugin.refund.query |
| cs_transfer_human | 转人工 | 事务 | low | 快路径 | reason | plugin.service.transfer_human |
| cs_complaint_submit | 提交投诉 | 事务 | medium | 慢路径 | complaint_type, content | plugin.ticket.complaint |
### 24.3 售后域意图表
| intent_id | intent_name | type | risk_level | entry_path | required_slots | plugin_id |
| --- | --- | --- | --- | --- | --- | --- |
| af_apply_return | 申请退货 | 事务 | medium | 快路径 | order_id, reason | plugin.aftersale.return |
| af_apply_exchange | 申请换货 | 事务 | medium | 慢路径 | order_id, reason | plugin.aftersale.exchange |
| af_apply_repair | 申请维修 | 事务 | medium | 慢路径 | product_id, fault_desc | plugin.aftersale.repair |
| af_book_service | 预约上门服务 | 事务 | medium | 慢路径 | address, time_range, phone | plugin.aftersale.booking |
| af_query_ticket | 查询工单进度 | 事务 | low | 快路径 | ticket_id | plugin.ticket.query |
| af_upload_material | 补充售后材料 | 事务 | low | 快路径 | ticket_id, material_type | plugin.ticket.material |
### 24.4 前台域意图表
| intent_id | intent_name | type | risk_level | entry_path | required_slots | plugin_id |
| --- | --- | --- | --- | --- | --- | --- |
| front_visitor_register | 来访登记 | 事务 | medium | 慢路径 | visitor_name, phone, host_name | plugin.frontdesk.visitor_register |
| front_notify_host | 通知被访人 | 事务 | low | 快路径 | host_name | plugin.frontdesk.notify_host |
| front_book_meeting_room | 预约会议室 | 事务 | medium | 慢路径 | room_name, start_time, end_time | plugin.frontdesk.book_room |
| front_route_guide | 路线引导 | 问答 | low | 快路径 | destination | plugin.frontdesk.route_guide |
| front_check_appointment | 查询预约信息 | 事务 | low | 快路径 | phone/appointment_id | plugin.frontdesk.query_appointment |
| front_print_badge | 打印访客证 | 控制 | medium | 快路径 | visitor_name, company | plugin.frontdesk.print_badge |
### 24.5 智能座舱域意图表
| intent_id | intent_name | type | risk_level | entry_path | required_slots | plugin_id |
| --- | --- | --- | --- | --- | --- | --- |
| cabin_nav_to | 导航到目的地 | 控制 | medium | 快路径 | destination | plugin.cabin.navigation |
| cabin_set_ac | 设置空调 | 控制 | low | 快路径 | temperature | plugin.cabin.ac_control |
| cabin_window_control | 控制车窗 | 控制 | medium | 快路径 | position, action | plugin.cabin.window_control |
| cabin_play_music | 播放音乐 | 控制 | low | 快路径 | song/genre | plugin.cabin.music_play |
| cabin_call_contact | 拨打电话 | 控制 | high | 慢路径 | contact_name | plugin.cabin.call_contact |
| cabin_multi_command | 复合指令执行 | 控制 | medium | 慢路径 | workflow | plugin.cabin.workflow_executor |
### 24.6 通用兜底意图
| intent_id | intent_name | type | risk_level | entry_path | required_slots | plugin_id |
| --- | --- | --- | --- | --- | --- | --- |
| common_faq | 知识问答 | 问答 | low | 快路径 | 无 | plugin.knowledge.faq |
| common_clarify | 澄清意图 | 问答 | low | 慢路径 | 无 | plugin.dialog.clarify |
| common_reject | 拒绝执行 | 问答 | high | 快路径 | 无 | plugin.guard.reject |
| common_fallback | 兜底处理 | 问答 | low | 慢路径 | 无 | plugin.dialog.fallback |
## 25. 槽位字典初稿
### 25.1 通用槽位表
| slot_name | type | required | example | validate_rule | ask_template | used_by |
| --- | --- | --- | --- | --- | --- | --- |
| order_id | string | 是 | A123456 | 长度 6-32字母数字 | 请提供订单号 | 客服、售后 |
| refund_id | string | 否 | R2025001 | 长度 6-32 | 请提供退款单号 | 客服 |
| ticket_id | string | 是 | T90001 | 长度 4-32 | 请提供工单号 | 售后 |
| appointment_id | string | 否 | AP2026001 | 长度 4-32 | 请提供预约编号 | 前台 |
| product_id | string | 是 | SKU12345 | 长度 4-64 | 请提供商品编号或设备编号 | 售后 |
| reason | string | 是 | 不想要了 | 长度 2-200 | 请说明原因 | 客服、售后 |
| fault_desc | string | 是 | 无法开机 | 长度 5-300 | 请描述故障现象 | 售后 |
| complaint_type | enum | 是 | 服务问题 | 枚举校验 | 请问是商品问题、物流问题还是服务问题 | 客服 |
| content | string | 是 | 客服态度差 | 长度 5-500 | 请描述具体情况 | 客服 |
| phone | string | 是 | 13800138000 | 手机号格式 | 请提供手机号 | 售后、前台 |
| time_range | string | 是 | 明天下午 2 点到 4 点 | 可解析时间范围 | 请提供预约时间 | 售后、前台 |
| address | string | 是 | 上海浦东新区 XX 路 | 长度 5-200 | 请提供服务地址 | 售后 |
| material_type | enum | 是 | 故障图片 | 枚举校验 | 请说明要补充的材料类型 | 售后 |
| visitor_name | string | 是 | 张三 | 长度 2-50 | 请提供来访人姓名 | 前台 |
| host_name | string | 是 | 李经理 | 长度 2-50 | 请问要拜访谁 | 前台 |
| company | string | 否 | 某某科技 | 长度 2-100 | 请提供访客单位名称 | 前台 |
| room_name | string | 是 | 3F-A01 | 会议室编码格式 | 请提供会议室名称或编号 | 前台 |
| start_time | datetime | 是 | 2026-05-10 14:00 | 标准时间格式 | 请提供开始时间 | 前台 |
| end_time | datetime | 是 | 2026-05-10 15:00 | 晚于开始时间 | 请提供结束时间 | 前台 |
| destination | string | 是 | 公司/虹桥机场 | POI 或地址可解析 | 请告诉我要去哪里 | 前台、座舱 |
| temperature | number | 是 | 22 | 16-30 | 请问要设置多少度 | 座舱 |
| position | enum | 是 | 主驾窗 | 枚举校验 | 请问要控制哪个车窗 | 座舱 |
| action | enum | 是 | 打开/关闭 | 枚举校验 | 请问要打开还是关闭 | 座舱 |
| song | string | 否 | 夜曲 | 长度 1-100 | 请问要播放哪首歌 | 座舱 |
| genre | string | 否 | 轻音乐 | 长度 1-50 | 请问要听什么类型的音乐 | 座舱 |
| contact_name | string | 是 | 王总 | 长度 2-50 | 请问要拨打给谁 | 座舱 |
| workflow | json | 是 | 复合动作 JSON | JSON Schema 校验 | 正在解析复合指令 | 座舱 |
### 25.2 槽位配置建议
每个槽位建议增加如下元数据:
- `normalize_fn`:归一化方法,例如金额、时间、地址标准化
- `source_priority`:优先从用户当前输入、历史会话还是业务上下文中取值
- `confirm_required`:是否需要用户确认
- `risk_binding`:是否与风险动作绑定
- `rewrite_prompt`:槽位识别失败时的重试提示
### 25.3 槽位提取策略
- 首轮请求:意图识别与槽位提取同时进行
- 补槽轮次:只提取 `pending_slots`
- 高风险槽位:提取后必须二次确认
- 可继承槽位:如 `phone``host_name`,可从历史会话或用户档案中补全
## 26. 插件接口规范初稿
### 26.1 插件统一接口
所有业务插件建议遵循统一接口,便于执行引擎调度:
```json
{
"plugin_id": "plugin.order.cancel",
"request_id": "req_001",
"session_id": "sess_001",
"user_id": "user_001",
"intent_id": "cs_cancel_order",
"slots": {
"order_id": "A123456",
"reason": "不想要了"
},
"context": {
"channel": "app",
"trace_id": "trace_001"
}
}
```
统一响应格式建议如下:
```json
{
"success": true,
"code": "OK",
"message": "订单取消成功",
"data": {
"order_id": "A123456",
"status": "cancelled"
},
"need_confirm": false,
"need_more_slots": [],
"retryable": false
}
```
### 26.2 插件表初稿
| plugin_id | plugin_name | domain | input_slots | output_fields | timeout_ms | retry_policy | idempotent_key |
| --- | --- | --- | --- | --- | --- | --- | --- |
| plugin.order.query | 查询订单 | 客服 | order_id | order_status, pay_status | 1500 | 失败重试 1 次 | session_id + order_id |
| plugin.logistics.query | 查询物流 | 客服 | order_id | logistics_status, trace_list | 1500 | 失败重试 1 次 | session_id + order_id |
| plugin.order.cancel | 取消订单 | 客服 | order_id, reason | cancel_status | 2000 | 不自动重试 | session_id + order_id |
| plugin.service.transfer_human | 转人工 | 客服 | reason | queue_no, wait_time | 1000 | 不自动重试 | session_id + reason |
| plugin.aftersale.return | 申请退货 | 售后 | order_id, reason | return_ticket_id | 2000 | 不自动重试 | session_id + order_id |
| plugin.aftersale.repair | 申请维修 | 售后 | product_id, fault_desc | repair_ticket_id | 2500 | 不自动重试 | session_id + product_id |
| plugin.aftersale.booking | 上门预约 | 售后 | address, time_range, phone | booking_id | 2500 | 失败重试 1 次 | session_id + phone + time_range |
| plugin.frontdesk.visitor_register | 来访登记 | 前台 | visitor_name, phone, host_name | visit_id, qr_code | 2000 | 不自动重试 | session_id + phone |
| plugin.frontdesk.notify_host | 通知被访人 | 前台 | host_name | notify_status | 1000 | 失败重试 1 次 | session_id + host_name |
| plugin.frontdesk.book_room | 预约会议室 | 前台 | room_name, start_time, end_time | booking_status, booking_id | 2000 | 不自动重试 | session_id + room_name + start_time |
| plugin.cabin.navigation | 导航 | 座舱 | destination | route_id, eta | 1200 | 失败重试 1 次 | session_id + destination |
| plugin.cabin.ac_control | 空调控制 | 座舱 | temperature | ac_status | 800 | 不自动重试 | session_id + temperature |
| plugin.cabin.window_control | 车窗控制 | 座舱 | position, action | window_status | 800 | 不自动重试 | session_id + position + action |
| plugin.cabin.music_play | 音乐播放 | 座舱 | song/genre | play_status, media_id | 1000 | 失败重试 1 次 | session_id + song + genre |
### 26.3 插件错误码建议
| code | meaning | action |
| --- | --- | --- |
| OK | 执行成功 | 正常返回 |
| MISSING_SLOT | 缺少必要槽位 | 转为追问流程 |
| INVALID_SLOT | 槽位不合法 | 触发重试提示 |
| NEED_CONFIRM | 需要用户确认 | 进入确认节点 |
| NO_PERMISSION | 权限不足 | 拒绝执行并解释原因 |
| RISK_BLOCKED | 风险拦截 | 终止执行并记录审计 |
| BIZ_TIMEOUT | 下游超时 | 可重试或降级 |
| BIZ_FAILED | 业务失败 | 给出失败原因 |
| SYSTEM_ERROR | 系统异常 | 兜底或转人工 |
### 26.4 插件开发约束
- 插件必须无状态,状态统一交给状态中心管理。
- 插件必须返回结构化结果,不能只返回自然语言。
- 高风险插件必须支持 `need_confirm` 控制。
- 写操作类插件必须支持幂等键。
- 插件必须记录 trace_id支持全链路审计。
## 27. 接口协议建议
### 27.1 对话入口接口
`POST /api/v1/agent/chat`
请求示例:
```json
{
"session_id": "sess_001",
"user_id": "user_001",
"channel": "app",
"input_text": "帮我查一下订单,如果没发货就取消",
"input_type": "text",
"metadata": {
"device_id": "dev_001",
"tenant_id": "tenant_a"
}
}
```
响应示例:
```json
{
"session_id": "sess_001",
"reply_type": "workflow_result",
"reply_text": "已为你查询订单,当前未发货,正在为你取消。",
"intent": "cs_cancel_order",
"status": "executing",
"pending_slots": [],
"workflow_id": "wf_001",
"trace_id": "trace_001"
}
```
### 27.2 补槽接口
`POST /api/v1/agent/fill-slots`
请求示例:
```json
{
"session_id": "sess_001",
"user_id": "user_001",
"input_text": "订单号是 A123456"
}
```
响应示例:
```json
{
"session_id": "sess_001",
"status": "ready_to_execute",
"filled_slots": {
"order_id": "A123456"
},
"pending_slots": [],
"reply_text": "收到,正在继续为你处理。"
}
```
### 27.3 管理后台接口建议
- `GET /api/v1/intents`
- `POST /api/v1/intents`
- `GET /api/v1/slots`
- `POST /api/v1/plugins/register`
- `GET /api/v1/sessions/{session_id}`
- `GET /api/v1/traces/{trace_id}`
## 28. MVP 一期范围建议
### 28.1 一期目标
目标不是一开始覆盖所有场景,而是优先打通一条“能快速响应、能多轮补槽、能真正执行”的闭环。
### 28.2 推荐一期场景
建议先选两个最有代表性的场景:
- 客服:查询订单、查物流、取消订单、转人工
- 智能座舱:导航、空调控制、音乐播放、复合指令
这样可以同时覆盖:
- 标准事务型任务
- 高实时控制型任务
- 多轮补槽能力
- 复杂复合指令能力
### 28.3 一期推荐意图
建议第一期先落 12 个意图:
| domain | intent_id | intent_name | priority |
| --- | --- | --- | --- |
| 客服 | cs_query_order | 查询订单状态 | P0 |
| 客服 | cs_query_logistics | 查询物流 | P0 |
| 客服 | cs_cancel_order | 取消订单 | P0 |
| 客服 | cs_transfer_human | 转人工 | P0 |
| 售后 | af_apply_return | 申请退货 | P1 |
| 售后 | af_query_ticket | 查询工单进度 | P1 |
| 前台 | front_notify_host | 通知被访人 | P1 |
| 前台 | front_route_guide | 路线引导 | P1 |
| 座舱 | cabin_nav_to | 导航到目的地 | P0 |
| 座舱 | cabin_set_ac | 设置空调 | P0 |
| 座舱 | cabin_play_music | 播放音乐 | P0 |
| 座舱 | cabin_multi_command | 复合指令执行 | P0 |
### 28.4 一期必须具备的能力
- 会话状态中心
- 快路径意图分类
- 基础槽位提取
- 补槽追问与断点恢复
- 插件统一协议
- 至少 8 个可执行插件
- 基础监控和审计日志
### 28.5 一期不建议过早投入的能力
- 全量复杂规则平台
- 多租户运营后台
- 自动训练平台
- 端到端自主规划型 Agent
### 28.6 一期验收标准
| metric | target |
| --- | --- |
| 高频快路径平均响应时间 | <= 1.5s |
| 复杂慢路径平均响应时间 | <= 3.5s |
| 多轮补槽成功率 | >= 85% |
| 插件执行成功率 | >= 95% |
| 高频意图识别准确率 | >= 95% |
| 高风险误执行率 | 0 |
## 29. 开发拆分建议
### 29.1 服务拆分
- `gateway-service`:统一接入与鉴权
- `nlu-service`:分类、抽取、召回、精判
- `session-service`:会话状态管理
- `orchestrator-service`:工作流执行与插件调度
- `plugin-service`:业务插件实现
- `ops-console`:配置与观测后台
### 29.2 迭代顺序
1. 先做会话状态中心和统一协议。
2. 再做快路径分类与基础插件闭环。
3. 然后接入向量召回和 LLM 精判。
4. 最后补复合指令、多轮恢复、监控审计。
### 29.3 人员建议
- 后端工程师2 人
- AI/NLP 工程师1 到 2 人
- 前端或客户端工程师1 人
- 测试工程师1 人
- 产品经理1 人
## 30. 下一步建议
基于当前文档,下一步最适合继续补的是:
1. 数据库表结构设计
2. Redis Session 结构设计
3. Workflow JSON Schema
4. 插件 SDK 规范
5. 评测集与测试用例设计
## 31. 数据库表结构设计
### 31.1 设计原则
- 业务配置与运行态数据分离。
- 高并发状态放 Redis持久化和审计放 PostgreSQL。
- 配置表优先满足可运营、可灰度、可版本化。
- 运行表优先满足可追踪、可排障、可回放。
### 31.2 核心表清单
| table_name | purpose |
| --- | --- |
| intents | 意图定义表 |
| intent_examples | 意图示例语料表 |
| slots | 槽位定义表 |
| intent_slot_bindings | 意图和槽位绑定表 |
| plugins | 插件注册表 |
| plugin_routes | 意图到插件路由表 |
| workflow_templates | 工作流模板表 |
| sessions | 会话主表 |
| session_messages | 会话消息表 |
| task_executions | 任务执行表 |
| task_steps | 任务步骤表 |
| plugin_calls | 插件调用日志表 |
| audit_logs | 审计日志表 |
| evaluation_cases | 评测样本表 |
### 31.3 关键表字段示例
#### intents
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| intent_id | varchar(64) unique | 意图唯一标识 |
| intent_name | varchar(128) | 意图名称 |
| domain | varchar(64) | 业务域 |
| type | varchar(32) | 问答/事务/控制 |
| risk_level | varchar(16) | 风险等级 |
| entry_path | varchar(16) | 快路径/慢路径 |
| enabled | boolean | 是否启用 |
| version | int | 配置版本 |
| description | text | 说明 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
#### slots
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| slot_name | varchar(64) unique | 槽位名称 |
| slot_type | varchar(32) | string/number/enum/json |
| required | boolean | 是否必填 |
| validate_rule | varchar(256) | 校验规则 |
| ask_template | varchar(256) | 追问模板 |
| normalize_fn | varchar(64) | 归一化方法 |
| confirm_required | boolean | 是否需要确认 |
| enabled | boolean | 是否启用 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
#### intent_slot_bindings
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| intent_id | varchar(64) | 意图标识 |
| slot_name | varchar(64) | 槽位名称 |
| required | boolean | 对该意图是否必填 |
| priority | int | 提问优先级 |
| source_priority | varchar(128) | 来源优先级 |
| created_at | timestamp | 创建时间 |
#### plugins
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| plugin_id | varchar(128) unique | 插件标识 |
| plugin_name | varchar(128) | 插件名称 |
| domain | varchar(64) | 所属域 |
| endpoint | varchar(256) | 插件地址或服务名 |
| timeout_ms | int | 超时时间 |
| retry_policy | varchar(64) | 重试策略 |
| idempotent_rule | varchar(128) | 幂等规则 |
| enabled | boolean | 是否启用 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
#### sessions
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| session_id | varchar(64) unique | 会话标识 |
| user_id | varchar(64) | 用户标识 |
| channel | varchar(32) | 渠道 |
| current_intent | varchar(64) | 当前意图 |
| current_status | varchar(32) | 当前状态 |
| current_workflow_id | varchar(64) | 当前工作流 |
| risk_level | varchar(16) | 当前风险等级 |
| last_message_at | timestamp | 最后活跃时间 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
#### session_messages
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| session_id | varchar(64) | 会话标识 |
| role | varchar(16) | user/assistant/system |
| message_text | text | 文本内容 |
| structured_payload | jsonb | 结构化载荷 |
| trace_id | varchar(64) | 链路标识 |
| created_at | timestamp | 创建时间 |
#### task_executions
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| task_id | varchar(64) unique | 任务标识 |
| session_id | varchar(64) | 会话标识 |
| workflow_id | varchar(64) | 工作流标识 |
| status | varchar(32) | pending/running/paused/completed/failed |
| current_step | int | 当前步骤 |
| context_snapshot | jsonb | 上下文快照 |
| error_code | varchar(64) | 错误码 |
| error_message | varchar(256) | 错误信息 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
#### task_steps
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| task_id | varchar(64) | 任务标识 |
| step_no | int | 步骤号 |
| intent_id | varchar(64) | 步骤意图 |
| plugin_id | varchar(128) | 插件标识 |
| status | varchar(32) | 步骤状态 |
| input_payload | jsonb | 入参 |
| output_payload | jsonb | 出参 |
| started_at | timestamp | 开始时间 |
| ended_at | timestamp | 结束时间 |
#### plugin_calls
| field | type | desc |
| --- | --- | --- |
| id | bigint pk | 主键 |
| trace_id | varchar(64) | 链路标识 |
| task_id | varchar(64) | 任务标识 |
| plugin_id | varchar(128) | 插件标识 |
| request_payload | jsonb | 请求内容 |
| response_payload | jsonb | 响应内容 |
| success | boolean | 是否成功 |
| latency_ms | int | 调用耗时 |
| created_at | timestamp | 创建时间 |
### 31.4 建表索引建议
- `intents(intent_id)` 唯一索引
- `slots(slot_name)` 唯一索引
- `plugins(plugin_id)` 唯一索引
- `sessions(session_id)` 唯一索引
- `sessions(user_id, updated_at)` 组合索引
- `session_messages(session_id, created_at)` 组合索引
- `task_executions(session_id, status)` 组合索引
- `plugin_calls(trace_id)` 普通索引
## 32. Redis Session 结构设计
### 32.1 设计目标
- 支持毫秒级读取会话状态
- 支持多轮补槽和断点恢复
- 支持任务并发控制和幂等去重
- 支持热点上下文缓存
### 32.2 Key 设计
| key_pattern | type | purpose | ttl |
| --- | --- | --- | --- |
| `agent:session:{session_id}` | Hash | 会话主状态 | 24h |
| `agent:slots:{session_id}` | Hash | 当前已填槽位 | 24h |
| `agent:pending:{session_id}` | List | 待补槽位队列 | 24h |
| `agent:workflow:{session_id}` | String | 当前 Workflow JSON | 24h |
| `agent:context:{session_id}` | String | 上下文快照 JSON | 24h |
| `agent:lock:{session_id}` | String | 会话执行锁 | 30s |
| `agent:idempotent:{key}` | String | 幂等去重键 | 10m |
| `agent:cache:intent:{text_hash}` | String | 高频意图缓存 | 30m |
### 32.3 Session Hash 示例
Key: `agent:session:sess_001`
```json
{
"session_id": "sess_001",
"user_id": "user_001",
"channel": "app",
"status": "waiting_slot",
"current_intent": "af_apply_return",
"workflow_id": "wf_001",
"current_step": "1",
"risk_level": "medium",
"last_active_at": "2026-05-09T10:00:00Z"
}
```
### 32.4 Slots Hash 示例
Key: `agent:slots:sess_001`
```json
{
"order_id": "A123456",
"reason": "不想要了"
}
```
### 32.5 Pending Slots List 示例
Key: `agent:pending:sess_001`
```json
[
"order_id",
"reason"
]
```
### 32.6 Context JSON 示例
Key: `agent:context:sess_001`
```json
{
"biz_context": {
"order_status": "pending_shipment"
},
"history_summary": "用户发起退货申请",
"plugin_results": {
"plugin.order.query": {
"success": true,
"status": "pending_shipment"
}
}
}
```
### 32.7 Redis 操作建议
- 进入执行前对 `agent:lock:{session_id}` 加分布式锁。
- 每次补槽后同时更新 `session``slots``pending`
- 工作流执行完成后,可保留短时缓存用于追问和结果追溯。
- 长会话可异步落盘 PostgreSQL 后缩短 Redis TTL。
## 33. Workflow JSON Schema 设计
### 33.1 设计目标
- 让 LLM 输出严格受控
- 让执行引擎易于解析
- 支持单步、顺序、条件、并行和补槽暂停
### 33.2 Workflow 顶层结构
```json
{
"workflow_id": "wf_001",
"workflow_type": "sequence",
"domain": "customer_service",
"intent_id": "cs_cancel_order",
"status": "ready",
"risk_level": "medium",
"slots": {
"order_id": "A123456"
},
"missing_slots": [],
"steps": [],
"meta": {
"source": "llm_planner",
"version": "1.0"
}
}
```
### 33.3 Step 结构
```json
{
"step": 1,
"step_id": "step_001",
"intent_id": "cs_query_order",
"plugin_id": "plugin.order.query",
"action": "query_order",
"status": "pending",
"depends_on": [],
"slots": {
"order_id": "A123456"
},
"on_success": "next",
"on_failure": "fallback",
"timeout_ms": 1500
}
```
### 33.4 条件步骤结构
```json
{
"step": 2,
"step_id": "step_002",
"type": "condition",
"condition": {
"expr": "context.order_status == 'pending_shipment'"
},
"if_true": {
"intent_id": "cs_cancel_order",
"plugin_id": "plugin.order.cancel"
},
"if_false": {
"action": "reply",
"message": "订单已发货,暂时无法取消。"
}
}
```
### 33.5 补槽暂停结构
```json
{
"status": "waiting_slot",
"missing_slots": [
{
"slot_name": "order_id",
"ask_template": "请提供订单号",
"priority": 1
}
]
}
```
### 33.6 JSON Schema 示例
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AgentWorkflow",
"type": "object",
"required": ["workflow_id", "workflow_type", "intent_id", "status", "steps"],
"properties": {
"workflow_id": {
"type": "string"
},
"workflow_type": {
"type": "string",
"enum": ["single", "sequence", "conditional", "parallel"]
},
"domain": {
"type": "string"
},
"intent_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": ["ready", "waiting_slot", "running", "completed", "failed"]
},
"risk_level": {
"type": "string",
"enum": ["low", "medium", "high"]
},
"slots": {
"type": "object"
},
"missing_slots": {
"type": "array"
},
"steps": {
"type": "array",
"items": {
"type": "object",
"required": ["step", "step_id"],
"properties": {
"step": {
"type": "integer"
},
"step_id": {
"type": "string"
},
"intent_id": {
"type": "string"
},
"plugin_id": {
"type": "string"
},
"action": {
"type": "string"
},
"status": {
"type": "string"
},
"depends_on": {
"type": "array"
},
"slots": {
"type": "object"
}
}
}
},
"meta": {
"type": "object"
}
}
}
```
### 33.7 约束建议
- LLM 只能从候选意图和候选插件中选择,不能自由生成未知标识。
- 所有工作流必须通过 JSON Schema 校验后才能进入执行引擎。
- 高风险动作必须显式输出 `risk_level``need_confirm`
- 补槽状态和执行状态必须严格区分,避免重复执行。
## 34. 开工建议
在完成以上设计后,建议按以下顺序正式开工:
1. 初始化后端项目骨架。
2. 实现配置模型、会话模型和 Workflow Schema。
3. 打通 `/chat``/fill-slots` 两个核心接口。
4. 先接入 mock 插件,完成完整闭环。
5. 再逐步接入真实业务系统和模型服务。
## 35. 多标签 Detector 过渡方案
### 35.1 背景
当前多意图链路已经具备以下结构:
- `clause split` 负责切分明显并列或条件语句
- `clause classifier` 负责对单个子句提供语义补偿
- `multi_intent_detector` 负责在整句粒度提供多标签先验
- `planner fusion` 负责合并 heuristic、classifier 和 detector 的信号
现阶段的问题不在 `planner` 主骨架,而在 detector 的训练方式。当前 detector 基于单标签分类头的 logits 做 sigmoid 解释,只能作为过渡信号,不能代表真正学到的“多标签共现关系”。
### 35.2 迁移目标
本阶段的目标不是重写规划器,而是把 detector 从“推理时解释型多标签”升级成“训练时显式监督的多标签模型”。
迁移后应满足:
- `planner` 继续消费 `detector_prior`,主骨架保持稳定
- detector 使用独立模型目录,不与单标签 classifier 共享分类头
- 训练样本显式表达一个句子对应多个 intent 的监督关系
- 评测指标从单一准确率升级为多标签指标
- 为下一阶段 `NER / token classification` 提供更稳定的候选意图集合
### 35.3 数据格式
保留现有单标签训练数据:
```json
{"text": "打开车窗", "intent_id": "cabin_window_open"}
```
新增多标签训练数据:
```json
{"text": "打开车窗并播放音乐", "intent_ids": ["cabin_window_open", "cabin_play_music"]}
```
约束建议:
- 单标签样本可以直接提升为 `intent_ids` 长度为 1 的多标签样本
- 多标签样本优先覆盖座舱高频并列控制场景
- `__social__``__out_of_scope__` 不作为多标签共现目标,避免污染业务动作组合学习
- 多标签语料要覆盖口语连接词、顺序词、弱连接和省略表达
### 35.4 模型与训练
建议为 detector 使用独立训练脚本和独立输出目录:
- 训练脚本:`scripts/train_local_bert_multi_intent.py`
- 评测脚本:`scripts/eval_local_bert_multi_intent.py`
- 模型目录:`models/local_bert_multi_intent/`
训练方式:
- 底座继续使用本地 MacBERT
- 任务类型设置为 `multi_label_classification`
- 标签为多热向量,损失函数为 `BCEWithLogitsLoss`
- 输出为每个意图的独立概率,不再依赖单标签 softmax 头的副产物
### 35.5 运行时接入
运行时只替换 detector 的模型来源和解释方式,不改 `planner` 主逻辑。
接入原则:
- `classifier` 继续服务单子句语义分类
- `multi_intent_detector` 独立加载多标签模型
- detector 输出仍然是 `candidates -> detector_prior`
- detector 默认屏蔽 `__social__``__out_of_scope__`
- 当 detector 不可用时planner 仍可退化到 `clause split + clause classifier + heuristic`
### 35.6 与 NER 的衔接
在真正多标签 detector 稳定前,不建议直接推进 `NER / token classification` 作为主增量。
原因:
- NER 擅长抽取边界,不擅长先决定整句有几个意图
- 如果上游 detector 仍是假多标签NER 很容易围绕错误意图做精细抽取
- 先把多标签 detector 训练扎实,可以让 NER 在“候选意图集合已收敛”的前提下工作
因此推荐顺序固定为:
1. 真正多标签 detector
2. detector 线上评测和阈值稳定
3. NER / token classification
### 35.7 本阶段验收标准
本阶段完成后至少应满足:
- detector 支持独立训练、独立加载、独立评测
- 对典型并列座舱指令,`recall@k``micro_f1` 明显优于现有 sigmoid 解释方案
- `planner` 主骨架无需改写,现有 fusion 逻辑保持兼容
- 后续引入 NER 时,只需增加边界抽取模块,不必再次调整 detector 接口
## 36. Joint NLU 升级方案
### 36.1 目标
本阶段不再继续扩旧的 heuristic 槽位提取逻辑,而是把本地 NLU 快链路升级成真正的 `Joint Intent + Slot` 联合识别。
升级目标:
- 用一个共享编码器同时完成意图识别和槽位抽取
- 替换当前 `HeuristicSlotExtractor` 的主路径职责
- 保留 `planner / workflow / session / response policy` 主骨架
- 多意图整句仍走 `clause split + multi-intent detector + planner`
- 单句或单 clause 的语义理解改为 `JointBERT`
### 36.2 为什么不直接推倒整条链
当前系统已经有稳定的上层编排能力:
- `fusion` 负责 `execute / clarify / reject / route_to_cloud`
- `planner` 负责 `sequence / conditional workflow`
- `workflow executor` 负责多步执行、条件判断、确认和补槽
这些能力并不是 `JointBERT` 能替代的。
因此本次升级只替换本地理解层,不重写上层编排层。
### 36.3 新架构边界
升级后的本地链路定义为:
```text
text
-> rewrite
-> Joint NLU
- intent head
- slot tagging head
-> fusion / planner
-> workflow executor
```
新的职责划分:
- `JointBERT`:单句或单 clause 的 intent + slot
- `multi-intent detector`:整句多标签先验
- `planner`:多意图、条件句、多步骤 workflow
- `workflow executor`:补槽、确认、执行、汇总
### 36.4 Joint NLU 数据格式
新增联合训练数据,采用 span 标注格式:
```json
{
"text": "把空调调到22度",
"intent_id": "cabin_set_ac",
"slots": [
{"slot_name": "temperature", "value": "22度", "start": 6, "end": 9}
]
}
```
说明:
- 单条样本只标注一个主意图
- 多意图句在训练阶段优先拆成 clause 级样本
- 无槽位意图的 `slots` 为空数组
- 运行时将 span 转换为 token-level BIO 标签
### 36.5 模型结构
采用共享编码器的双头结构:
- 编码器:`MacBERT`
- 意图头:句级单标签分类
- 槽位头token classification输出 BIO 标签
第一版先不引入复杂的 slot-gate先保证
- 共享编码器
- 联合训练
- 意图与槽位共享语义表征
在当前项目里,这已经比“句分类 + 规则抽槽”前进一步。
### 36.6 接入方式
运行时新增 `JointNLU` 服务,供两处复用:
1. `classifier backend = joint_bert`
- 用联合模型的 intent head 输出意图分数
2. `slot_extractor backend = joint_bert`
- 用联合模型的 slot head 输出槽位
要求:
- 两个 backend 共享同一个模型实例,避免重复冷启动
- 对同一文本允许做短时预测缓存,避免一次请求重复前向
- 若联合模型不可用,直接报错或显式 fallback不继续隐式走旧 heuristic 逻辑
### 36.7 与多意图链路的关系
`JointBERT` 不直接负责整句多意图 workflow 规划。
多意图流程保持:
1. `multi-intent detector` 对整句给出多标签先验
2. `planner` 进行 clause split
3. 每个 clause 用 `Joint NLU` 做 intent + slot
4. `planner` 汇总 clause 结果为 workflow
这样做的原因:
- 经典 JointBERT 更适合单句单意图
- 当前系统已经有成熟的 clause-level planner 骨架
- 直接让一个单模型接管整句多步骤规划,风险更高
### 36.8 替换原则
本次升级的明确原则:
- 默认主链路不再依赖 `HeuristicSlotExtractor`
- planner 内部的 clause slots 也优先改为 `Joint NLU`
- 原 heuristic 抽槽只保留为测试对照或应急兜底,不再作为主路径
### 36.9 验收标准
升级完成后至少满足:
- 单步任务的槽位抽取来自 `Joint NLU`
- 缺槽位逻辑、确认逻辑、多步 workflow 逻辑保持兼容
- `router``planner` 都能读取联合模型输出
- 本地常见控制句的槽位抽取精度高于旧 heuristic
- 冷启动通过 warmup 控制,首轮推理不发生首次懒加载抖动