Implement the full QPER intelligent analysis pipeline: - Phase E+: Block-based standardization for all 7 R tools, DynamicReport renderer, Word export enhancement - Phase Q: LLM intent parsing with dynamic Zod validation against real column names, ClarificationCard component, DataProfile is_id_like tagging - Phase P: ConfigLoader with Zod schema validation and hot-reload API, DecisionTableService (4-dimension matching), FlowTemplateService with EPV protection, PlannedTrace audit output - Phase R: ReflectionService with statistical slot injection, sensitivity analysis conflict rules, ConclusionReport with section reveal animation, conclusion caching API, graceful R error classification End-to-end test: 40/40 passed across two complete analysis scenarios. Co-authored-by: Cursor <cursoragent@cursor.com>
7.5 KiB
SSA-Pro 前端 UI 改进计划 - 审查回应
回应日期: 2026-02-20
回应人: SSA 开发团队
审查文档: SSA-Pro 前端 UI 改进计划审查报告.md
原计划文档: 05-前端UI改进开发计划-V8双屏版.md
📋 总体评价
感谢审查团队的细致审核,总体评价 A- 及三个亮点(组件复用、职责拆分、Zustand 状态管理)的肯定,我们深感认可。
以下是对 5 个盲区的逐条回应:
盲区一:流式输出与右侧面板的"精准握手"
审查意见
AI 正在打字输出时,右侧应该立刻切换到 SAPViewer,建议采用"特定标记解析"或"Tool Calling"机制。
回应:✅ 认可,补充到计划
我们的方案:采用 Artifact 标记解析 机制
// AI 输出流中嵌入结构化标记
"我已为您生成分析方案:<Artifact type='sap' id='plan-001' />"
// useAIStream Hook 中增加解析逻辑
const handleChunk = (chunk: string) => {
const artifactMatch = chunk.match(/<Artifact type='(\w+)' id='([^']+)' \/>/);
if (artifactMatch) {
const [_, type, id] = artifactMatch;
ssaStore.setActivePane(type as 'sap' | 'execution' | 'result');
ssaStore.loadArtifact(type, id);
}
};
已有能力支撑:
useAIStreamHook 已支持流式解析(见shared/components/Chat/hooks/useAIStream.ts)- 后端
StreamingService已支持 OpenAI Compatible 格式
计划更新:在 Day 2 任务中新增"流式标记解析器"开发(预计 2h)
盲区二:历史记录回溯的"状态水合"
审查意见
用户点击历史记录时,右侧要瞬间恢复到当时最终的 ResultViewer 状态。
回应:✅ 部分认可,MVP 简化处理
MVP 方案:
| 步骤 | 处理方式 |
|---|---|
| 1. 用户点击历史 | 左侧加载聊天记录 |
| 2. 右侧初始状态 | 显示 empty(空状态) |
| 3. 自动恢复 | 根据 session 数据判断最终状态,自动切换 |
Store 扩展:
// ssaStore.ts 新增
hydrateFromHistory: (session: SSASession) => {
// 根据 session 状态恢复右侧面板
if (session.executionResult) {
set({ activePane: 'result', currentArtifact: { type: 'result', data: session.executionResult } });
} else if (session.currentPlan) {
set({ activePane: 'sap', currentArtifact: { type: 'sap', data: session.currentPlan } });
} else {
set({ activePane: 'empty', currentArtifact: null });
}
}
后端配合:现有 GET /api/v1/ssa/sessions/:id 已返回完整 session 数据(含 plan、result),无需修改。
计划更新:在 Store 设计章节补充 hydrateFromHistory action。
盲区三:响应式降级策略
审查意见
小屏幕(<1024px)双屏会拥挤,建议降级为抽屉或模态框。
回应:✅ 认可,但延后至 Phase 2
理由:
- V8 原型图明确定位 PC 端宽屏(1280px+)
- 目标用户为医院研究人员,主要使用 PC 办公
- MVP 聚焦核心体验,响应式作为增强功能
Phase 2 降级方案(预留设计):
/* 小屏幕降级:右侧变为全屏 Drawer */
@media (max-width: 1024px) {
.ssa-workspace {
/* 隐藏右侧面板 */
.artifact-pane { display: none; }
/* 左侧全宽 */
.chat-pane { width: 100%; }
}
/* 结果以 Drawer 形式弹出 */
.artifact-drawer {
position: fixed;
right: 0;
width: 90vw;
height: 100vh;
}
}
计划更新:在"风险与应对"章节注明响应式降级作为 Phase 2 任务。
盲区四:ExecutionViewer 的动态数据流机制
审查意见
未说明 ExecutionViewer 数据是轮询还是 SSE,建议明确技术方案。
回应:⚠️ 审查者对现有能力不了解
现有能力:
| 能力 | 位置 | 状态 |
|---|---|---|
| useAIStream Hook | shared/components/Chat/hooks/useAIStream.ts |
✅ 已实现 |
| StreamingService | backend/src/common/streaming/ |
✅ 已实现 |
| traceSteps 状态管理 | ssaStore.ts 第 32-35 行 |
✅ 已实现 |
// 现有 ssaStore.ts
setTraceSteps: (steps: TraceStep[]) => void;
updateTraceStep: (index: number, step: Partial<TraceStep>) => void;
SSA 执行日志的技术路径:
| 方案 | 说明 | MVP 采用 |
|---|---|---|
| 方案 A | 对话流内嵌执行状态(复用 useAIStream) | ✅ 推荐 |
| 方案 B | 独立 SSE 端点 | Phase 2 |
| 方案 C | 同步返回 + 伪进度 | 备选 |
推荐方案 A 示例:
// AI 对话流中输出执行状态
data: {"choices":[{"delta":{"content":"🔍 正在检验正态性..."}}]}
data: {"choices":[{"delta":{"content":"✅ Shapiro-Wilk p=0.32,符合正态分布"}}]}
data: {"choices":[{"delta":{"content":"📊 正在执行独立样本 T 检验..."}}]}
data: {"choices":[{"delta":{"content":"<Artifact type='result' id='xxx' />"}}]}
无需额外开发:直接复用 AIStreamChat 组件,后端调整输出格式即可。
计划更新:在技术方案章节补充"执行日志数据流"说明。
盲区五:前端数据 Schema 解析前置
审查意见
建议前端用 papaparse 提取表头,拼接到 Prompt 发送给 Planner。
回应:❌ 不采纳,违背隐私架构
SSA 隐私保护架构(核心设计原则):
真实数据绝不传给 LLM,只传脱敏后的 Schema
正确的数据流:
┌─────────┐ 完整文件 ┌─────────┐ 脱敏 Schema ┌─────────┐
│ 前端 │ ───────────────→ │ 后端 │ ───────────────→ │ LLM │
└─────────┘ └─────────┘ └─────────┘
↑
DataParserService
├── 隐藏稀有值 (<5)
├── 模糊 Min/Max (N<10)
└── 脱敏处理
如果前端解析 Schema 会发生什么:
| 风险 | 说明 |
|---|---|
| 绕过隐私保护 | 原始 Schema 可能包含敏感分类值 |
| 脱敏逻辑分散 | 后端已有 DataParserService,前端重复实现 |
| 架构不一致 | 违背"后端统一控制"原则 |
现有后端实现:
// backend/src/modules/ssa/services/DataParserService.ts
// 已实现:
// - 表头解析
// - 稀有值隐藏(<5)
// - Min/Max 模糊(N<10)
// - 脱敏 Schema 返回
结论:保持现有设计,不在前端解析 Schema。
📝 计划更新汇总
| 盲区 | 处理方式 | 计划更新内容 |
|---|---|---|
| 盲区一 | ✅ 采纳 | Day 2 新增"流式标记解析器"任务 |
| 盲区二 | ✅ 部分采纳 | Store 设计章节补充 hydrateFromHistory |
| 盲区三 | ⏸️ 延后 | 风险章节注明 Phase 2 处理 |
| 盲区四 | 📝 澄清 | 技术方案章节补充执行日志数据流说明 |
| 盲区五 | ❌ 不采纳 | 无需修改,保持后端 Schema 解析 |
🎯 最终结论
- 计划总体方向正确,审查团队的 A- 评分符合实际
- 盲区一、二、三 的建议有价值,已纳入计划或延后处理
- 盲区四 审查者对现有 SSE 能力不了解,已澄清技术路径
- 盲区五 建议违背隐私架构设计,不予采纳
准予启动开发! 🚀
回应人: SSA 开发团队
日期: 2026-02-20