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>
119 lines
7.3 KiB
Markdown
119 lines
7.3 KiB
Markdown
# **SSA-Pro 方案深度审查与风险评估报告**
|
||
|
||
**审查对象:** SSA-Pro V4.1 架构及配套开发计划 (v1.0)
|
||
|
||
**审查视角:** 系统架构、工程落地、安全性、可维护性
|
||
|
||
**审查结论:** **总体优秀 (A-)**,架构逻辑清晰,但 R 服务工程化细节存在隐患,需在开发前修正。
|
||
|
||
## **1\. 架构层面的潜在风险 (Architecture Risks)**
|
||
|
||
### **1.1 R 服务并发瓶颈 (The Single-Threaded Bottleneck)**
|
||
|
||
* **现状**:设计采用同步 HTTP (Plumber) 调用 R。
|
||
* **问题**:R 是**单线程**的。虽然 MVP 限制了数据量,但如果 SAE 实例配置为单进程,当一个 T 检验正在计算(耗时 2秒)时,第二个请求会被阻塞。如果并发量稍大(如 20 人同时点击),请求会排队导致超时。
|
||
* **建议**:
|
||
1. **SAE 弹性策略**:必须配置 SAE 的自动扩容策略(例如 CPU \> 60% 或 并发数 \> 5 时扩容)。
|
||
2. **Plumber 配置**:在生产环境,建议使用 future 包或在 Docker 中配置多个 R Worker 进程(利用 pm2 或类似工具管理多个 R 进程端口,前端 Nginx 做负载均衡),而不仅仅依赖 SAE 的容器级扩容。
|
||
|
||
### **1.2 "网络隔离"与"OSS下载"的矛盾**
|
||
|
||
* **现状**:
|
||
* 架构文档提到:R 容器配置 Egress Deny(禁止外网)。
|
||
* 数据协议提到:R 服务需要从 OSS 下载大于 1MB 的文件。
|
||
* **问题**:如果 OSS 是公网 Endpoint,配置 Egress Deny 后 R 服务将**无法下载数据**,导致系统瘫痪。
|
||
* **建议**:
|
||
* 务必使用阿里云 OSS 的 **VPC 内网 Endpoint**(oss-cn-beijing-internal.aliyuncs.com)。
|
||
* 网络策略应配置为:**Deny All Public Internet**,但 **Allow VPC Internal Traffic**。
|
||
|
||
### **1.3 临时文件堆积 (Storage Leak)**
|
||
|
||
* **现状**:R 服务会生成临时图片 (tempfile) 和下载 OSS 数据。
|
||
* **问题**:文档中未提及**清理策略**。长期运行后,/tmp 目录会爆满,导致 Docker 容器崩溃。
|
||
* **建议**:
|
||
* 在 plumber.R 中添加 on.exit(unlink(tmp\_files)) 逻辑。
|
||
* 或者在 Docker 启动脚本中添加定时清理任务(Cron)。
|
||
|
||
## **2\. R 工程化细节审查 (R Engineering Review)**
|
||
|
||
### **2.1 代码生成方式过于脆弱 (Fragile Code Gen)**
|
||
|
||
* **现状**:02-R服务开发指南.md 中使用 code\_lines \<- c(..., paste0(...)) 进行字符串拼接。
|
||
* **问题**:
|
||
* 这种硬编码方式非常**难以维护**。一旦需要修改代码模板,很容易拼错引号或括号。
|
||
* 生成的代码缺乏缩进和格式化,用户下载后可读性差。
|
||
* **建议**:
|
||
* 引入 **模板引擎**(如 R 的 glue 包或 whisker)。
|
||
* 将代码模板存为独立的 .R 模板文件(如 templates/t\_test.R.template),运行时读取并填充参数。
|
||
* **强力推荐**:使用 styler 包在生成代码后自动美化格式。
|
||
|
||
### **2.2 依赖包管理的隐患 (Dependency Hell)**
|
||
|
||
* **现状**:Dockerfile 中通过 install.packages 安装了一堆包。
|
||
* **问题**:100 个工具可能依赖 50+ 个包。如果不锁定版本,下个月重新构建镜像时,某个包升级(如 ggplot2 API 变动)可能导致整个服务挂掉。
|
||
* **建议**:
|
||
* 使用 **renv** 进行包管理。生成 renv.lock 文件,确保生产环境安装的包版本与开发环境完全一致。
|
||
* 或者使用 RStudio Public Package Manager (P3M) 的**快照日期源**(已在指南中提及,需严格执行)。
|
||
|
||
### **2.3 错误处理的颗粒度**
|
||
|
||
* **现状**:Wrapper 使用 tryCatch 捕获所有错误并返回 message。
|
||
* **问题**:R 的报错信息(如 object 'x' not found)对 LLM 来说可能不够明确,或者包含了系统路径等敏感信息。
|
||
* **建议**:
|
||
* 在 Wrapper 中区分 **"业务错误"**(如列名不存在、数据类型不对)和 **"系统错误"**。
|
||
* 对于业务错误,返回特定的 error\_code,方便 Planner 进行针对性的参数自愈。
|
||
|
||
## **3\. 后端逻辑审查 (Backend Review)**
|
||
|
||
### **3.1 LLM 生成 JSON 的稳定性**
|
||
|
||
* **现状**:依赖 Prompt 让 LLM 输出 JSON。
|
||
* **问题**:DeepSeek 虽然强,但偶尔也会输出 Markdown 包裹的 JSON,或者 JSON 格式错误(如末尾多逗号)。单纯的 JSON.parse 很容易挂。
|
||
* **建议**:
|
||
* 引入 json-repair 库或使用正则表达式提取 JSON 块。
|
||
* 或者使用 **Structured Output (JSON Mode)** 如果模型支持。
|
||
* 增加一层 **Schema Validation (Zod)**:在收到 LLM 的 Plan 后,先用 Zod 校验参数结构是否符合 tools\_library 中的定义,如果不符合,直接触发重试,不要发给 R。
|
||
|
||
### **3.2 数据 Schema 提取的隐私风险**
|
||
|
||
* **现状**:DataParserService 计算数值列的 Min/Max/Mean。
|
||
* **问题**:对于罕见病或小样本数据(N\<10),极值(Min/Max)可能导致患者身份泄露(如:年龄=102岁)。
|
||
* **建议**:
|
||
* 增加 **隐私阈值**:如果行数 \< 10,不计算 Min/Max,或者进行模糊化处理(如向下取整)。
|
||
|
||
## **4\. 前端交互审查 (Frontend Review)**
|
||
|
||
### **4.1 大图与多图渲染**
|
||
|
||
* **现状**:R 返回 Base64 图片。
|
||
* **问题**:如果图片很大(高DPI),或者一次返回 10 张图(如相关性矩阵拆解),Base64 字符串会极大,导致 HTTP 响应慢,且前端卡顿。
|
||
* **建议**:
|
||
* 对于复杂图表,R 服务应将图片上传到 OSS,返回 **URL** 而不是 Base64。
|
||
* Base64 仅限于 MVP 阶段的小图预览。
|
||
|
||
### **4.2 长连接与超时**
|
||
|
||
* **现状**:同步 HTTP,超时 60s。
|
||
* **问题**:虽然大部分 T 检验很快,但如果是 Bootstrap 或 MCMC,很容易超过 60s。前端 Nginx 或浏览器可能会提前断开连接。
|
||
* **建议**:
|
||
* 前端 axios 请求需显式设置 timeout: 120000 (2分钟)。
|
||
* 增加 **"正在计算..."** 的动态文案(如:正在进行第 500 次置换检验...),这需要 R 支持流式日志输出(SSE),但在同步架构下较难实现。MVP 阶段至少要有一个假的进度条动画,缓解焦虑。
|
||
|
||
## **5\. 补充的任务清单 (Missing Items)**
|
||
|
||
在当前的开发计划中,缺少以下关键任务,建议补充进 Phase 2 或 3:
|
||
|
||
1. **🔍 审计日志查看器**:后台管理端(ADMIN)需要一个界面查看 execution\_logs,方便运营人员排查 AI 为什么规划错了。
|
||
2. **🧹 自动清理任务**:编写 CronJob,定期清理 R 容器的 /tmp 和 OSS 中的临时数据文件(24小时过期)。
|
||
3. **📊 资源监控**:在运营看板中增加 R 服务的内存/CPU 监控,防止内存泄漏导致的 OOM。
|
||
4. **📚 帮助文档生成**:不仅是 R 代码生成 JSON,还需要一个脚本将 R 的注释自动生成前端可见的“工具说明书”,展示在 Chat 的侧边栏或悬停提示中。
|
||
|
||
## **6\. 最终修订建议**
|
||
|
||
**请研发团队在开工前,重点落实以下 3 点变更:**
|
||
|
||
1. **R 代码生成**:放弃 paste0 拼接,改用 glue 模板技术。
|
||
2. **网络配置**:确认 SAE 与 OSS 的内网连通性,配置精确的 ACL。
|
||
3. **JSON 容错**:后端增加 LLM 输出的 JSON 修复与 Zod 强校验层。
|
||
|
||
**总评:** 方案非常扎实,以上问题属于“精益求精”的工程细节。解决这些问题后,SSA-Pro 将具备极高的鲁棒性。 |