Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/01-需求分析/PRD_工具C_科研数据编辑器_V6.md
HaHafeng 8be741cd52 docs(dc/tool-c): Complete Tool C MVP planning and TODO list
Summary:
- Update Tool C MVP Development Plan (V1.3)
  * Clarify Python execution as core feature
  * Add 15 real medical data cleaning scenarios (basic/medium/advanced)
  * Enhance System Prompt with 10 Few-shot examples
  * Discover existing Python service (extraction_service)
  * Update to extend existing service instead of rebuilding
- Create Tool C MVP Development TODO List
  * 3-week plan with 30 tasks (Day 1-15)
  * 4 core milestones with clear acceptance criteria
  * Daily checklist and risk management
  * Detailed task breakdown for each day

Key Changes:
- Python service: Extend existing extraction_service instead of new setup
- Test scenarios: 15 scenarios (5 basic + 5 medium + 5 advanced)
- Success criteria: Basic >90%, Medium >80%, Advanced >60%, Total >80%
- Development time: Reduced from 3 weeks to 2 weeks (reuse infrastructure)

Status: Planning complete, ready to start Day 1 development
2025-12-06 11:00:44 +08:00

6.0 KiB
Raw Blame History

PRDTool C - 科研数据编辑器 (The Research Editor)

文档版本 V6.0 (AI Code Interpreter 增强版)
产品形态 Web 端双核编辑器 (GUI 可视化操作 + LUI 自然语言交互)
核心价值 将“Excel 的易用性”与“Python 的强大能力”结合。医生既可以通过鼠标点击完成微操,也可以通过自然语言指挥 AI 编写代码完成复杂的清洗任务(如长宽转换、多重插补)。
技术底座 Node.js BFF + Python Server-side Sandbox + DeepSeek-V3

一、 产品核心理念 (Core Philosophy)

1.1 双核驱动 (Dual-Core Interaction)

  • 左脑 (GUI): 提供类似 Excel 的网格和工具栏,适合“直觉式、原子化”的操作(如手动修改一个值、排序、筛选)。
  • 右脑 (AI Copilot): 提供对话式代码解释器适合“逻辑性、批量化”的操作如“把年龄按60岁分箱”、“删除所有空行”、“计算生存时间”

1.2 可控黑盒 (Controllable Blackbox)

AI 不直接修改数据,而是生成 Python 代码。系统在执行前展示**“预操作卡片”**,由用户确认执行,确保科研数据的严谨性。

二、 核心业务流程 (User Flow)

数据导入 -> 双模式清洗 (点击工具栏 OR 对话 AI) -> 代码/操作执行 -> 实时预览更新 -> 版本快照 -> 导出结果

三、 功能模块详解 (Functional Requirements)

1. 界面布局 (The Workspace)

  • P0: 分栏布局 (Split View):
    • 左侧 (70%): 超级网格 (The Grid),展示数据预览。
    • 右侧 (30%): 智能侧边栏 (Smart Sidebar),包含 [统计概览][AI 助手] 两个 Tab。
  • P0: 全局状态指示:
    • 当 AI 正在思考或后端正在计算时,左侧网格显示 “AI 处理中...” 遮罩,并锁定编辑,防止双写冲突。

2. 顶部扁平工具栏 (Flat Toolbar) —— GUI 核心

保留高频、标准化的操作入口,作为 AI 的补充。

  • P0: 变量加工:
    • 生成新变量: 弹窗公式构建器。
    • 计算时间差: 内置医学常数 (年=365.25天)。
    • 生成哑变量: 回归分析专用。
    • 横纵表转换 (Pivot): * 交互升级: 点击后不再只是纯前端计算,而是调用后端 Python 逻辑,支持处理更复杂的转换。
  • P0: 质量治理:
    • 查找重复值: 按 ID 或全字段查重。
    • 多重插补 (MICE): 全局入口,调用后端 sklearn 或 fancyimpute 库。
  • P0: 样本筛选: 构建入排标准。

3. AI Copilot 智能助手 (The Brain) —— V6 核心升级

位于右侧侧边栏的 [AI 助手] Tab。

3.1 自然语言指令解析

  • P0: 意图识别: 支持模糊指令如“洗一下数据”、“把男变成1”。
  • P0: 上下文感知: AI 能够读取当前的列名 (Metadata) 和前 5 行数据示例,理解数据含义。

3.2 代码解释器模式 (Code Interpreter)

  • P0: 代码生成: AI 针对用户需求,生成可执行的 Python (Pandas) 代码块。
  • P0: 预操作卡片 (Action Card):
    • AI 不直接执行代码。
    • 界面展示一个卡片:操作类型: 数据分箱 | 目标列: 年龄 | 代码预览。
    • 按钮:[运行代码] | [取消]
  • P0: 执行反馈:
    • 执行成功:显示 ,左侧表格自动刷新。
    • 执行失败AI 自动分析 Error Log尝试自我修正代码并建议重试。

3.3 典型 AI 场景支持

  • 高级清洗: “把所有列的异常值(>3倍标准差替换为缺失值”。
  • 复杂提取: “从‘诊断’列中提取出由‘/’分隔的第二部分,生成新列”。
  • 批量处理: “删除所有缺失率超过 50% 的列”。

4. 智能统计面板 (Insight Panel)

位于右侧侧边栏的 [统计概览] Tab。

  • P0: 列联动: 点击左侧网格某一列,右侧自动显示该列的分布图(直方图/频次图)。
  • P0: 快捷操作: 图表下方直接提供“填补”、“分箱”、“映射”等快捷按钮。

5. 导出与流转 (Export)

  • P0: 结果导出: 支持 Excel (.xlsx) 和 SPSS (.sav) 格式。
  • P0: 操作审计: 导出的文件中,附带一份 "清洗日志 (Cleaning Log)",记录了所有的 AI 代码和手动操作步骤(用于科研溯源)。

四、 数据与性能策略 (Data Strategy)

4.1 性能准入 (Guardrails)

  • 文件大小限制: 单个文件 < 20MB
  • 行数限制: 建议 < 50,000 行 以保证前端渲染流畅度。
    • 策略: 后端 Python 可以处理百万行,但前端 AG Grid 仅加载前 100-1000 行作为预览Preview Mode导出时才生成全量文件。

4.2 安全与隐私

  • P0: 沙箱隔离: AI 生成的 Python 代码必须在服务端的安全沙箱Docker/SAE中运行禁止访问外网和系统文件。
  • P0: 数据脱敏: 确保输入编辑器的数据已在前置环节(工具 B完成了 PII 脱敏。

五、 埋点与统计

  • AI 采纳率: 展示 Action Card 后,用户点击“运行”的比例。
  • 代码报错率: AI 生成的代码在后端执行失败的比例。
  • 常用指令 Top 10: 统计医生最常对 AI 说的话。

六、 附录AI 指令集示例 (Few-Shot Examples)

用户指令 AI 动作 (Action) 生成代码逻辑 (Python Pandas)
"把性别转为数字" Recode df['sex'] = df['sex'].map({'男':1, '女':0})
"年龄按60分两组" Binning df['age_group'] = pd.cut(df['age'], bins=[0,60,150], labels=['0','1'])
"删除没有ID的行" Filter df = df.dropna(subset=['patient_id'])
"计算BMI" Formula df['bmi'] = df['weight'] / (df['height']/100)**2
"把每个人的一行变成多行" Pivot/Melt df = df.melt(id_vars=['id'], ...)