PRD:全渠道 Specialist 连续性 —— 共享记忆 / KB / Skill(文本 × Tavus 视频)
- 状态:Reviewed —— O1–O5 已由 Franky 于 2026-07-14 拍板(见 §9 决策记录);2026-07-15 代码走查修订(要点:文本侧长期记忆
specialist_memories已存在 → D4 改为默认扩展该表;新增 R1.5 Active Directives 达视频、R2.7 组装位序;§5 基线表多处更新——各处均带"复核"标注);待建 Epic 拆解 - 作者:Franky(PM)+ Claude
- 日期:2026-07-14(决策同日)
- 语言:中文为主;英文镜像:
omnichannel-specialist-continuity-prd.md(两版保持同步) - 相关:
docs/specs/tavus-integration.md· ADR-008(KB K1/K2) · ADR-006(移除旧 memory 模块;注意:specialist_memories是其后新建的,见 §5) · #646(Tavus 账号级 KB 跨租户风险) · #1387(persona 一次性预置) · #2058(client 按需视频通话) · #2059(WeeklyCallSchedulerService 定时呼叫;§11 邻接 epic) · #1197/#3131(specialist_memories既有跨会话记忆层) · #3692(Active Directives) · #4399(chat 路径工具接线,W3 前置)
1. 问题陈述
产品目标:client 无论通过哪个渠道(webchat、Slack、Email、视频通话)与自己的 Specialist 沟通,感受到的都是同一个真人专家 —— 他记得之前聊过什么、知道客户上传 的资料、会做同样的事。
现状与目标的落差(2026-07 代码探查结论,详见 §5 基线表):
- 视频 AI 不读 KB。文本 Specialist 每轮实时检索租户 KB(K1/K2,
api/src/kb/kb-retrieval.service.ts);Tavus 视频 AI 的"知识"只是每次通话注入的conversational_context字符串(brief 快照 / onboarding 通用脚本 / 近 7 天会话摘要)。client 上传给 Specialist 的私有文档,文本里他"读过",视频里他"没见过"。 - 跨渠道记忆:文本侧已有一个浅层实现,视频侧完全没有(2026-07-15 复核修正——原文"文本侧自己也没有"不成立)。文本侧存在两层:per-conversation 的
agent_context(history_summary/facts/preferences,JSONB + Redis 1h,换 thread/渠道即断)和 org × specialist 粒度的specialist_memories(#1197/#3131:跨会话长期记忆,已注入 draft/stream/regenerate 三条 chat 路径,20 条 / 4000 字符预算,Expert workspace 已有查看/删除 UI)。但后者提取端是玩具级——仅 4 个英文正则句式、只在会话 resolve 时触发,实际沉淀量 ≈ 0。视频通话则完全无跨通话记忆,每次都是一次性快照。 - Skill/工具两套且不对齐。文本 draft 路径不带工具(工具只在 agentic/AgentRun 路径、且按 org 绑定
tool_permissions);Tavus persona 挂的是全体 persona 相同的固定工具并集(tavus_function_definitions+ 3 个硬编码 in-call 工具),与 Specialist 无关。 - 架构上刻意解耦:视频 AI 由 Tavus 自己的 LLM 驱动,h.work Python agent 不在环(spec §6.2);persona 提示词离线烘焙、"不再与 Python agent 共享模板"(#1390)。唯一共享的是 persona 身份(同一 catalog 行派生的名字/角色/能力描述)——且该共享会漂移:文本侧现读平台侧 config-assets 的已发布 Soul(发布后下一轮生效),Tavus persona 仍从 catalog 行离线烘焙,Soul 发布后若不重新 provision,两渠道人格即分叉(见 §5)。
- Active Directives 只达文本渠道(合规级断裂)。#3692 已上线:Expert 设置的情境指令(压过 KB 的红线级内容)注入文本 prompt;视频通路完全不感知。危机场景下("已发生黑客事件,不得谈安全措施")客户开一通视频会 = 红线穿透。
其中 (2) 是根因级问题:目标不是"把视频对齐到文本",也不是从零造共享层,而是把既有的 specialist_memories 升级为渠道无关的共享层(提取 LLM 化、补视频写入端、补治理字段),然后所有渠道(含文本自身)都接上去。(5) 的红线类内容一致性优先于 facts 记忆。
2. 目标(可度量)
| # | 目标 | 度量 |
|---|---|---|
| G1 | 视频 AI 能召回租户 KB | 视频通话中针对"KB 中已有答案"的问题,召回率 ≥ 文本侧同题的 80%(抽样评测) |
| G2 | 跨渠道记忆连续 | client 在渠道 A 陈述的事实(facts),渠道 B 的下一次会话可被引用;评测集通过率 ≥ 90% |
| G3 | 视频记忆回写 | 每次视频通话结束后 ≤ 5min,transcript 摘要写入共享记忆层(BullMQ job 成功率 ≥ 99%) |
| G4 | 零跨租户泄露 | KB/记忆的所有读写路径均带 org × specialist 隔离过滤;新增路径 100% 有对应 spec 断言 |
| G5 | 用户感知 | 客 户满意度调研中"感觉像同一个专家"命题得分(基线待首次调研建立) |
3. 非目标
- 不使用 Tavus 平台的 documents/knowledge_base API(#646 账号级共享 → 跨租户泄露;现有三层硬禁不动)。
- 不引入向量/embedding 检索升级(现状 KB 为词法打分;检索质量升级另行立项)。
- 不做 Expert(人)侧的记忆工具(Expert 看到的上下文改进另行立项)。
- 不改变 HITL 默认(
autoRespondThreshold=101)与 draft 审核流。 - v1 不做文本 draft 路径的工具注入(见 W3 讨论 —— 文本侧"工具故事"本身需先厘清)。
4. 用户故事
- 作为 client 员工,我上周在 Slack 里告诉过 Specialist 我们的结算周期改为月结;这周视频通话时他主动按月结口径讨论,而不是再问一遍。
- 作为 client 员工,我在视频里问"你们之前给我们整理的供应商清单里 X 公司的条款",Specialist 能当场引用 KB 里那份文档回答。
- 作为 Expert,我审核文本草稿时能看到该 client 的共享记忆(facts),不会放行与既有事实矛盾的回复。
- 作为 AM,我能查看/纠正某 (org × specialist) 的沉淀事实,错误记忆可删除且立即全渠道生效。
- 作为 SuperAdmin,我确信任何记忆/KB 通路都不会把 A 客户的信息带给 B 客户。