feat(dc/tool-c): 完成AI代码生成服务(Day 3 MVP)
核心功能: - 新增AICodeService(550行):AI代码生成核心服务 - 新增AIController(257行):4个API端点 - 新增dc_tool_c_ai_history表:存储对话历史 - 实现自我修正机制:最多3次智能重试 - 集成LLMFactory:复用通用能力层 - 10个Few-shot示例:覆盖Level 1-4场景 技术优化: - 修复NaN序列化问题(Python端转None) - 修复数据传递问题(从Session获取真实数据) - 优化System Prompt(明确环境信息) - 调整Few-shot示例(移除import语句) 测试结果: - 通过率:9/11(81.8%) 达到MVP标准 - 成功场景:缺失值处理、编码、分箱、BMI、筛选、填补、统计、分类 - 待优化:数值清洗、智能去重(已记录技术债务TD-C-006) API端点: - POST /api/v1/dc/tool-c/ai/generate(生成代码) - POST /api/v1/dc/tool-c/ai/execute(执行代码) - POST /api/v1/dc/tool-c/ai/process(生成并执行,一步到位) - GET /api/v1/dc/tool-c/ai/history/:sessionId(对话历史) 文档更新: - 新增Day 3开发完成总结(770行) - 新增复杂场景优化技术债务(TD-C-006) - 更新工具C当前状态文档 - 更新技术债务清单 影响范围: - backend/src/modules/dc/tool-c/*(新增2个文件,更新1个文件) - backend/scripts/create-tool-c-ai-history-table.mjs(新增) - backend/prisma/schema.prisma(新增DcToolCAiHistory模型) - extraction_service/services/dc_executor.py(NaN序列化修复) - docs/03-业务模块/DC-数据清洗整理/*(5份文档更新) Breaking Changes: 无 总代码行数:+950行 Refs: #Tool-C-Day3
This commit is contained in:
114
docs/03-业务模块/DC-数据清洗整理/02-技术设计/工具 C:AI 辅助医疗数据清洗场景分级清单.md
Normal file
114
docs/03-业务模块/DC-数据清洗整理/02-技术设计/工具 C:AI 辅助医疗数据清洗场景分级清单.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# **工具 C:AI 辅助医疗数据清洗场景分级清单**
|
||||
|
||||
这份清单按**技术实现难度**和**业务逻辑复杂度**从简单到复杂排列。所有场景均假设数据已加载为 Pandas DataFrame (df)。
|
||||
|
||||
## **Level 1: 基础卫生清理 (Data Hygiene)**
|
||||
|
||||
*目标:把“脏”数据变成“能读”的数据。Excel 也能做,但 Python 更快更准。*
|
||||
|
||||
### **1.1 变量名标准化 (Rename)**
|
||||
|
||||
* **场景:** 原始表头是中文或含特殊符号(年龄(岁), 性别/Gender, 入院\_日期),SPSS 报错。
|
||||
* **用户指令:** “把所有列名转为纯英文小写,去掉括号。”
|
||||
* **Python 逻辑:** 使用映射字典或正则替换列名。
|
||||
|
||||
### **1.2 数值列“排毒” (Clean Numeric)**
|
||||
|
||||
* **场景:** 检验科导出的数据,数值列混入了符号(\>100, \<0.1, 12.5+, 未查)。
|
||||
* **用户指令:** “把‘肌酐’列里的非数字符号去掉,‘\<0.1’按‘0.05’处理,转为浮点数。”
|
||||
* **Python 逻辑:** str.replace \+ 正则提取 \+ pd.to\_numeric(errors='coerce')。
|
||||
|
||||
### **1.3 统一缺失值 (Standardize Nulls)**
|
||||
|
||||
* **场景:** 数据里混杂了各种代表“空”的词:NA, N/A, \-, \\, 不详。
|
||||
* **用户指令:** “把所有代表‘没有’的字符都统一替换为标准的空值。”
|
||||
* **Python 逻辑:** df.replace(\['-', '不详', 'NA'\], np.nan, inplace=True)。
|
||||
|
||||
## **Level 2: 变量标准化与重编码 (Recode & Standardization)**
|
||||
|
||||
*目标:为统计分析准备分类变量。*
|
||||
|
||||
### **2.1 文本转数值映射 (Map Categorical)**
|
||||
|
||||
* **场景:** 性别列是 Male/Female,吸烟史是 Yes/No。
|
||||
* **用户指令:** “把性别转为 1(男)/0(女),把吸烟史转为 1/0。”
|
||||
* **Python 逻辑:** df\['sex'\].map({'Male': 1, 'Female': 0})。
|
||||
|
||||
### **2.2 连续变量分箱 (Binning)**
|
||||
|
||||
* **场景:** 需要按年龄分组进行卡方检验。
|
||||
* **用户指令:** “把年龄按 0-18, 19-60, 60+ 分为‘未成年’, ‘成年’, ‘老年’三组。”
|
||||
* **Python 逻辑:** pd.cut() 函数。
|
||||
|
||||
### **2.3 复杂日期计算 (Date Logic)**
|
||||
|
||||
* **场景:** 计算生存时间(OS)。Excel 经常算错闰年或月份。
|
||||
* **用户指令:** “根据‘确诊日期’和‘随访日期’计算生存月数,保留1位小数。”
|
||||
* **Python 逻辑:** (df\['end\_date'\] \- df\['start\_date'\]).dt.days / 30.4。
|
||||
|
||||
## **Level 3: 临床逻辑特征工程 (Feature Engineering)**
|
||||
|
||||
*目标:基于医学知识生成新的分析指标。*
|
||||
|
||||
### **3.1 复合公式计算 (Complex Formula)**
|
||||
|
||||
* **场景:** 计算 eGFR (肾小球滤过率) 或 BMI。
|
||||
* **用户指令:** “帮我计算 BMI。如果 BMI \> 28,生成新列标记为‘肥胖’。”
|
||||
* **Python 逻辑:** 向量化计算 df\['weight'\] / (df\['height'\]/100)\*\*2 \+ 条件赋值 np.where。
|
||||
|
||||
### **3.2 提取入排标准 (Cohort Selection)**
|
||||
|
||||
* **场景:** 筛选符合条件的入组人群。
|
||||
* **用户指令:** “筛选出:确诊为肺腺癌,且年龄大于18岁,且没有高血压病史的病人。”
|
||||
* **Python 逻辑:** df.query("diagnosis \== 'Lung Adenocarcinoma' & age \> 18 & hypertension \== 0")。
|
||||
|
||||
### **3.3 哑变量生成 (One-Hot Encoding)**
|
||||
|
||||
* **场景:** 准备做 Logistic 回归,有一个无序多分类变量“血型 (A, B, AB, O)”。
|
||||
* **用户指令:** “把血型生成哑变量。”
|
||||
* **Python 逻辑:** pd.get\_dummies(df\['blood\_type'\], prefix='blood')。
|
||||
|
||||
## **Level 4: 结构重塑与高级治理 (Reshaping & Governance)**
|
||||
|
||||
*目标:改变表格结构以适应特定的统计模型,或进行高阶数据修复。*
|
||||
|
||||
### **4.1 长宽表转换 (Pivot/Melt) —— Excel 的噩梦**
|
||||
|
||||
* **场景:** 目前是“一人多行”(张三-第1次化验,张三-第2次化验),要做重复测量分析,需要变成“一人一行”(张三-化验1-化验2)。
|
||||
* **用户指令:** “把表格从长表转为宽表,按病人ID索引,用‘访视次序’做后缀,铺开‘白细胞’列。”
|
||||
* **Python 逻辑:** df.pivot(index='id', columns='visit', values='wbc')。
|
||||
|
||||
### **4.2 智能去重 (Smart Deduplication)**
|
||||
|
||||
* **场景:** 同一个病人有两条记录,一条信息全,一条信息缺。
|
||||
* **用户指令:** “按病人ID去重。如果有重复,保留‘检查日期’最近的那一条;如果日期一样,保留‘数据完整度’最高的那条。”
|
||||
* **Python 逻辑:** df.sort\_values(\['date', 'completeness'\]).drop\_duplicates(subset=\['id'\], keep='last')。
|
||||
|
||||
### **4.3 跨列逻辑校验 (Cross-Check)**
|
||||
|
||||
* **场景:** 发现脏数据。
|
||||
* **用户指令:** “检查一下有没有‘男性’但是‘怀孕次数\>0’的错误数据,标记出来。”
|
||||
* **Python 逻辑:** df.loc\[(df\['sex'\]=='男') & (df\['preg\_count'\]\>0), 'error\_flag'\] \= 1。
|
||||
|
||||
### **4.4 多重插补 (Multiple Imputation) —— 统计学的高级填补**
|
||||
|
||||
* **场景:** 数据集有缺失值(如 BMI 缺失),单纯用均值填补会破坏数据分布。需要利用其他变量(如年龄、性别、肌酐)的相关性来预测填补。
|
||||
* **用户指令:** “使用多重插补法(MICE)对‘BMI’和‘年龄’列的缺失值进行填补。”
|
||||
|
||||
* # **Python 逻辑: \`\`\`python** **from sklearn.experimental import enable\_iterative\_imputer** **from sklearn.impute import IterativeImputer** **仅针对数值列进行插补** **cols \= \['bmi', 'age', 'creatinine'\]** **imp \= IterativeImputer(max\_iter=10, random\_state=0)** **df\[cols\] \= imp.fit\_transform(df\[cols\])**
|
||||
|
||||
## **Level 5: 非结构化文本挖掘 (Text Mining) —— Python 的绝对统治区**
|
||||
|
||||
*目标:从备注或报告文本中“抠”出数据。这是 Excel 绝对做不到的。*
|
||||
|
||||
### **5.1 正则表达式提取 (Regex Extraction)**
|
||||
|
||||
* **场景:** 只有一列文本“病理诊断”,内容如:“(左肺上叶)浸润性腺癌,大小3.5\*2cm”。需要提取肿瘤大小。
|
||||
* **用户指令:** “从‘病理诊断’里提取出肿瘤的长径(最大的那个数字)。”
|
||||
* **Python 逻辑:** df\['text'\].str.extract(r'(\\d+\\.?\\d\*)\\s\*\[\\\*xX\]\\s\*(\\d+\\.?\\d\*)') 并取最大值。
|
||||
|
||||
### **5.2 字符串模糊匹配 (Fuzzy Matching)**
|
||||
|
||||
* **场景:** 医院名称录入混乱:“协和医院”、“北京协和”、“协和”。需要统一。
|
||||
* **用户指令:** “把‘医院名称’列里所有包含‘协和’的,都统一改为‘PUMCH’。”
|
||||
* **Python 逻辑:** df.loc\[df\['hospital'\].str.contains('协和'), 'hospital'\] \= 'PUMCH'。
|
||||
Reference in New Issue
Block a user