Skip to main content

PRD:Expert Portal — 与 AI 迭代改进草稿文件(图片/PDF/Excel),满意后再发给 client

状态Draft — 待评审
OwnerFranky(产品)
日期2026-07-09
交互载体复用现有「Ask Specialist」侧聊(SideChatPanel)+ 草稿附件策展区(产品决策已确认)
P0 前置#4089(侧聊无法产出文件附件,OPEN)· 设计任务 #4092
关联#4153(幻觉附件 + 双开关不一致)· #3944(文件工具集,已关)· #3501(agent 文件存储范围,P3 未决)· #1621(侧聊内部性不变量)
姊妹 PRDSlack per-Specialist App · WhatsApp 1:1 号码

1. 问题陈述

客户会要求 Specialist 生成文件(图片 / PDF / Excel / PPT 等)。在 HITL 模型下,这些产物先以 AI 草稿附件的形式进入 Expert 队列。今天 Expert 的把关工具是断裂的,存在三个缺口:

  1. 迭代不能产文件:Expert 想让 AI 改文件(换配色、补一页、改数据),唯一的对话工具「Ask Specialist」侧聊产不出文件(#4089:consult 路径缺 ATTACHMENT_PROTOCOL 注入与产物提取——AI 要么口头承诺再收回,要么直接说做不到)。
  2. 产物进不了草稿:即便侧聊将来能产文件,也没有任何「采纳到草稿」的动作——Expert 只能手动下载再用回形针(paperclip)重新上传,且 AI 产物与手动上传是两套互不相通的模型。
  3. 满意度把关缺工具:草稿附件不可移除/替换、无版本概念;更糟的是发送前没有"文案-附件一致性"校验——#4153 的生产事故正是 Expert 放行了一条"声称附件在上方"却根本没有附件的草稿(置信 90%、LOW 风险,审核界面零提示)。

结果:文件类请求要么在 Expert 手里断掉,要么带着错误/幻觉发给客户,侵蚀「AI + 人类专家」的核心信任。

2. 目标

  • G1 — 不离开队列完成迭代:Expert 在 Expert portal 内与 AI 迭代文件任意轮次,全程无需下载/外部工具。度量:文件迭代会话中外部往返(下载→重传)次数 = 0。
  • G2 — 一键采纳:侧聊产物一次点击进入草稿附件区;采纳→发送零手动搬运。度量:采纳动作成功率 ≥ 99%;文件类草稿从"开始迭代"到"发送"的中位时长可测并下降。
  • G3 — 发送即所见:客户收到的文件 = Expert 最后策展确认的版本,任何中间版本/侧聊内容绝不外泄。度量:内部性回归测试(#1621 族)100% 通过;中间版本外泄事故 = 0。
  • G4 — 杜绝幻觉附件放行:草稿文案引用附件而附件区为空 → 发送前 100% 拦截(阻断或强提示)。度量:拦截器触发计数;#4153 类事故复发 = 0。
  • G5 — 可观测:迭代轮次、采纳/替换/拦截次数、文件生成 token 成本按 osa_id 归集可查。

3. 非目标(v1)

  • 客户可见的迭代过程 — 侧聊与中间版本恒为 internal(isInternal:true),客户只看到最终发送的版本。
  • 专属文件工作台 — v1 复用侧聊;独立的"文件迭代面板/版本树 UI"列为 v2 演进。
  • 跨会话文件库 / agent 文件系统浏览 — 依赖 #3501 的存储范围决策(per-agent vs per-org vs per-conversation),未决前不做。
  • 文件的在线精细编辑(如 Excel 单元格级编辑器)— v1 的编辑模型是对话式重生成,不是编辑器。
  • 修复 #4089 本身 — 它是本 PRD 的 P0 前置,按其自身 issue/设计任务(#4092)推进,此处只引用不重复立项。

4. 用户故事

Expert(核心角色)

  1. 作为 Expert,当草稿带着 AI 生成的文件时,我想直接对 AI 说"把第二页的数据改成最新的",并拿到新版本文件,而不是自己动手重做。
  2. 作为 Expert,我想把侧聊里满意的那一版一键采纳进草稿附件区,替换掉旧版。
  3. 作为 Expert,我想看清草稿附件区里每个文件的来源(AI 生成 / 我上传),并能移除任何一个。
  4. 作为 Expert,如果草稿文字说"附件在此"而实际没有附件,我希望系统在我点 Accept & send 之前拦住我。
  5. 作为 Expert,我想在发送前预览每个附件的实际内容(而不是只看文件名)。

Client 6. 作为客户成员,我只会收到 Expert 最终确认的文件版本——不会看到中间稿、不会看到 Expert 和 AI 的讨论。

Ops(SuperAdmin / AM) 7. 作为 ops,我想看到文件迭代的用量与成本(生成次数、token、按 org × specialist 归集),评估该能力的 ROI。

5. UX 流程

5.1 迭代(发生在现有侧聊内)

入口 A(改进已有产物):草稿附件 chip 上「与 AI 改进此文件 ▸」
→ 打开 Ask Specialist 侧聊,自动带上该文件与草稿上下文
入口 B(从零生成):Expert 在侧聊直接要求"生成一份 XX 的 PDF"

迭代:Expert 每轮给出修改意见 → AI 回复 + 新版本文件(消息级附件,
SideChatPanel 已有 AttachmentList 渲染能力)
失败/超时 → 明确报错文案,绝不出现"已生成"却无附件的回复(对齐 #4153 反幻觉要求)

5.2 采纳(新增动作,本 PRD 核心)

  • 侧聊中每个 AI 产出的文件附件旁新增 「采纳到草稿」 按钮。
  • 点击 → 该文件进入草稿附件策展区
    • 与草稿现有附件同名/同类型 → 默认替换(旧版仍留在侧聊历史,可再采纳换回);
    • 否则 → 追加
    • 每次采纳/替换写审计日志(谁、何时、替换了哪个版本)。
  • 草稿附件策展区(Accept & send 上方):每个附件显示 来源徽标(AI 生成 ✨ / Expert 上传 📎)、文件名、大小、预览入口、移除按钮。AI 产物与 paperclip 手动上传统一在同一列表中管理。

5.3 发送(现有把关点,加一道校验)

  • Accept & send 携带策展区当前的附件集(现有 release 通路已接受 attachments 并传给 dispatchExpertReply,四渠道派发就绪)。
  • 发送前一致性校验(新增):若草稿文案引用了附件("attached / 附件 / 见下图 / find the image…" 等)而策展区为空 → 阻断发送 + 提示「文案提到了附件,但当前没有任何附件——请采纳文件或修改文案」;反向(有附件但文案未提及)仅弱提示不阻断。
  • 版本语义(v1 轻量):侧聊历史天然保留每一版;策展区始终只有"当前版";换版 = 回侧聊重新采纳。正式版本列表 + 一键回退为 P1。

5.4 文案(v1)

位置文案
附件 chip 动作与 AI 改进此文件
侧聊附件动作采纳到草稿
采纳成功 toast已更新草稿附件:{filename}
一致性拦截草稿文案提到了附件,但当前没有任何附件。请先采纳文件,或修改文案。
来源徽标AI 生成 / Expert 上传

6. 需求

Must-have(P0)

R1 — 侧聊能产文件(引用 #4089,不重复立项)。 本 PRD 的一切建立在 consult 路径能产出真实 HW_ATTACHMENT 产物之上。验收以 #4089 自身为准(含流式路径、#4059 结构化输出对齐、fail-open:渲染失败不得吞掉文字回复)。

R2 — 采纳到草稿。 侧聊 AI 附件上的「采纳到草稿」把该产物(R2 storageKey 引用,不复制字节)写入草稿的附件集合。

  • Given 侧聊产出文件 F2,草稿已有同名文件 F1,when Expert 采纳 F2,then 草稿附件区 F1 被 F2 替换,审计记录 (expert, 时间, F1→F2);F1 仍可从侧聊历史再次采纳。
  • Given 草稿无同类附件,then 采纳为追加。
  • 幂等:重复点击同一文件的采纳不产生重复附件。

R3 — 草稿附件策展。 草稿附件区统一展示 AI 产物与 Expert 手动上传(来源徽标区分),支持预览与逐个移除;移除写审计。

  • 实现时按 HEAD 复核:AI 产物当前在草稿 Message 上的确切落点(attachments 列 vs metadata artifacts)——#3944 之后主路径已有投递门控与产物物化,但两处检出对"是否已写到草稿行"结论不一致,实现前须以 HEAD 为准对齐数据模型。

R4 — 发送携带策展集。 Accept & send / per-draft release 携带策展区当前附件集(现有 releaseDraft/F3 respondattachments 参数通路),经 3 层派发到达客户渠道(Slack files.uploadV2 / WhatsApp Twilio 媒体 / Email Gmail 多部件 / webchat 内联)。

  • 验收:四渠道各跑通一次"迭代→采纳→发送→客户收到最终版"端到端。

R5 — 发送前文案-附件一致性拦截。 草稿文案引用附件而策展区为空 → 阻断 + 提示;判定方式见开放问题 O5(启发式关键词起步,agent 自报 intent 为演进)。该拦截同时作为 #4153 的防复发验收之一。

R6 — 内部性不变量。 侧聊消息、中间版本文件、迭代过程永不进入客户可见面(复用 isInternal + metadata.expertAgentThread 排除;#1621)。新增回归:采纳动作不得把侧聊消息本身变为可见——只搬运文件引用。

R7 — 指标与审计。 expert_file_iteration_total{action=generate|adopt|replace|remove|block} 计数器 + 审计日志(actor/org/specialist/conversation);文件生成 token/成本按 osa_id 归集(consult 路径成本归集现状在实现时核验)。§2 每个目标可由此度量。

Nice-to-have(P1)

  • 版本历史面板:草稿附件的历次版本列表 + 一键回退(v1 靠侧聊历史换版)。
  • 附件 chip 快捷指令:常用修改一键发起("换成品牌配色""导出为 PDF")。
  • 成本展示:本会话文件生成消耗(次数/tokens)在侧聊头部可见。
  • 文案中文本地化。

Future(P2)

  • 专属文件工作台(独立面板:版本树、对比视图、批注)。
  • 跨会话文件库(依赖 #3501 存储范围决策)。
  • 模板化产物(品牌 PPT/报表模板,生成时套用)。

7. 现状基线(改什么)

能力今天v1 之后
侧聊产文件❌ #4089(consult 路径缺协议注入+产物提取)✅(前置修复,引用 #4089)
侧聊渲染附件SideChatPanel 已有 AttachmentList复用
采纳到草稿❌ 无任何 promote 动作✅ R2
草稿附件管理❌ AI 产物不可移除/替换;与手动上传两套模型✅ R3 统一策展区
发送携带附件✅ release attachments 参数 → dispatchExpertReply 四渠道复用 + R4 端到端验收
文案-附件一致性❌ 零校验(#4153 幻觉附件被 90% 置信放行)✅ R5 拦截
版本语义❌ draft supersede 仅覆盖文字v1 轻量(侧聊历史);P1 版本面板
内部性isInternal/expertAgentThread 排除(#1621)复用 + R6 新增回归

检出差异声明:上表"今天"列中侧聊/草稿附件的部分结论来自两个不同时点的代码检出且互有出入(#3944 落地前后);已按 #4089 issue 正文(近期对 HEAD 验证)为权威,标注 R3 处实现前必须按当时 HEAD 复核数据模型落点。

8. 依赖与阶段

  • P0 前置:#4089 实现(其设计文档 = #4092)。建议推进顺序:#4092 设计 → #4089 实现 → 本 PRD v1。
  • 同期协同:#4153(生成开关一致性 + 反幻觉)——R5 拦截是其防复发面之一;修复 #4153 时的"agent 自报附件 intent"若落地,可直接升级 R5 的判定方式(O5)。
  • v1:R1(引用)–R7。
  • v1.1:P1 项(版本面板、快捷指令、成本展示)。
  • v2:工作台、文件库(等 #3501)、模板化。

9. 开放问题

#问题Owner阻塞?
O1采纳默认策略:同名/同类替换、否则追加(现建议)——还是永远追加、由 Expert 手动删旧版?产品(Franky) — 决定 R2 交互
O2采纳是否触发草稿"新版本"(supersede 语义扩展到附件)还是原地更新 + 审计(现建议:原地)?产品 + 工程 — 决定数据模型
O3中间版本(未采纳的侧聊产物)保留期与存储配额(R2 成本)工程 + ops
O4附件大小/类型限制与 paperclip 允许清单(25MB、MIME 白名单)对齐即可?生成类是否需要更大上限(如 PPT)工程
O5一致性拦截判定:v1 关键词启发式(中英"附件/attached/image…")vs agent 结构化自报"本回复含 N 个附件 intent"(更准,依赖 agent 改动)工程否 — v1 先启发式
O6consult 路径的 token 成本目前是否已按 osa_id 归集(R7 前提)工程否 — 实现时核验

10. 参考

  • #4089 侧聊附件缺口(P0 前置)· #4092 其设计任务 · #4153 幻觉附件 · #3944 文件工具集 · #3501 存储范围 · #1621 侧聊内部性
  • 代码:frontend/src/app/workspace/queue/SideChatPanel.tsx · api/src/conversations/expert-agent-thread.service.ts · api/src/conversations/conversations.service.ts(草稿/投递门控)· api/src/expert-queue/expert-queue.service.ts(release)· api/src/channels/channel-dispatcher.service.ts(四渠道附件派发)· agent/attachment_render.py / agent/prompts_loader.py(HW_ATTACHMENT)