Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-C技术债务清单.md
HaHafeng f01981bf78 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
2025-12-07 16:21:32 +08:00

430 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tool C 技术债务清单
> **创建日期**: 2025-12-06
> **最后更新**: 2025-12-06
> **当前版本**: Day 3 MVP完成
> **优先级分级**: P0-紧急 | P1-重要 | P2-中期优化 | P3-长期规划
---
## 📋 技术债务概览
| 编号 | 债务项 | 优先级 | 预计工时 | 影响范围 | 计划时间 |
|------|-------|--------|---------|---------|---------|
| TD-C-001 | Python Session状态持久化 | P1 | 1天 | 稳定性 | Day 5-6 |
| TD-C-002 | 数据版本管理与回滚 | P2 | 2天 | 功能 | Week 3 |
| TD-C-003 | 大文件性能优化 | P2 | 1.5天 | 性能 | Week 3 |
| TD-C-004 | AI Prompt持续优化 | P1 | 持续 | 质量 | 持续 |
| TD-C-005 | 前端对话UI开发 | P0 | 3天 | 功能 | Day 4-5 |
| TD-C-006 | 复杂场景Prompt优化 | P2 | 0.5天 | 质量 | Day 4 |
---
## 🔴 P1: 重要(近期必做)
### TD-C-001: Python Session状态持久化
**当前问题**:
```python
# 当前实现内存维护Session状态
session_data = {} # 存在内存中
# 问题:
# 1. Python服务重启 → Session数据丢失
# 2. 多实例部署 → 负载均衡会导致状态不一致
# 3. 无法回滚到历史版本
```
**影响**:
- 用户体验差:重启服务后需重新上传文件
- 无法云原生部署:不支持多实例
- 数据安全性:内存断电即丢失
**优化方案**:
**方案A: Redis持久化**(推荐)
```python
# 使用Redis存储Session状态
import redis
import pickle
class SessionManager:
def __init__(self):
self.redis_client = redis.Redis(host='localhost', port=6379)
def save_session(self, session_id, dataframe):
# 序列化DataFrame
serialized = pickle.dumps(dataframe)
# 存储到Redis10分钟过期
self.redis_client.setex(
f"session:{session_id}",
600, # 10分钟
serialized
)
def get_session(self, session_id):
data = self.redis_client.get(f"session:{session_id}")
if data:
return pickle.loads(data)
return None
```
**方案B: OSS持久化**
```python
# 每次操作后保存到OSS
def save_to_oss(session_id, dataframe):
# 序列化为Parquet格式高效
buffer = io.BytesIO()
dataframe.to_parquet(buffer)
# 上传到OSS
oss_key = f"dc/tool-c/sessions/{session_id}/current.parquet"
oss_client.put_object(oss_key, buffer.getvalue())
```
**实施计划**:
- Day 5: 实现Redis集成
- Day 6: 测试与部署
---
### TD-C-004: AI Prompt持续优化
**当前问题**:
- 10个Few-shot示例可能不够覆盖所有场景
- 某些复杂医疗场景AI理解不准确
- 代码生成质量依赖DeepSeek-V3性能
**优化方向**:
**1. 扩展Few-shot库**
```python
# 当前10个示例
# 目标20-30个示例分类存储
few_shot_library = {
"basic": [...], # 基础清洗10个
"medical": [...], # 医疗专业10个
"advanced": [...] # 高级分析10个
}
# 根据用户需求动态选择相关示例
def select_relevant_examples(user_message):
# 语义匹配最相关的5个示例
...
```
**2. 用户反馈收集**
```python
# 记录AI生成失败的场景
failed_cases = []
# 定期分析,添加新示例
def analyze_failures():
# 找出高频失败场景
# 人工编写Few-shot
# 更新System Prompt
```
**3. 多模型备选**
```python
# 主DeepSeek-V3性价比高
# 备GPT-4质量高成本高
# 备Claude-3.5(代码能力强)
if deepseek_fails:
retry_with_gpt4()
```
**实施计划**:
- 持续收集失败案例
- 每月优化1次Prompt
- 测试其他LLM模型
---
## 🟡 P2: 中期优化1-2个月
### TD-C-002: 数据版本管理与回滚
**当前问题**:
- AI每次操作都直接修改当前数据
- 无法撤销/回滚到之前状态
- 无法对比不同版本
**优化方案**:
**版本管理架构**:
```python
# 每次操作后保存快照
class DataVersionManager:
def save_version(self, session_id, dataframe, operation_desc):
version_id = str(uuid.uuid4())
# 保存到OSSParquet格式压缩高效
oss_key = f"dc/tool-c/sessions/{session_id}/versions/{version_id}.parquet"
dataframe.to_parquet(oss_key)
# 元数据存数据库
db.save({
"session_id": session_id,
"version_id": version_id,
"operation": operation_desc,
"timestamp": now(),
"row_count": len(dataframe),
"file_size": ...
})
def rollback(self, session_id, version_id):
# 从OSS恢复
dataframe = pd.read_parquet(oss_key)
return dataframe
```
**前端展示**:
```typescript
// 版本历史列表
<Timeline>
<TimelineItem>
版本1: 上传原始文件 (100)
</TimelineItem>
<TimelineItem>
版本2: 删除缺失值 (95) []
</TimelineItem>
<TimelineItem>
版本3: 计算BMI (95) []
</TimelineItem>
</Timeline>
```
**成本估算**:
- 每个版本~1-5MBParquet压缩后
- 10个版本 = 10-50MB
- OSS成本¥0.01-0.05/Session
**实施计划**:
- Week 3: 后端版本管理
- Week 4: 前端UI + 测试
---
### TD-C-003: 大文件性能优化
**当前限制**:
- 文件大小10MB
- 行数限制:~50,000行
- 前端预览100行
**优化目标**:
- 文件大小50MB
- 行数限制500,000行
- 前端预览:虚拟滚动
**技术方案**:
**1. 流式处理**
```python
# 分块读取大文件
def process_large_file(file_path):
chunk_size = 10000 # 每次处理1万行
for chunk in pd.read_csv(file_path, chunksize=chunk_size):
# 分块处理
process_chunk(chunk)
```
**2. Apache Arrow集成**
```python
# 使用Arrow高性能列式存储
import pyarrow as pa
import pyarrow.parquet as pq
# Node.js ↔ Python 数据传输
# 使用Arrow IPC格式比JSON快10-100倍
```
**3. 前端虚拟滚动**
```typescript
// 使用AG Grid的虚拟滚动
<AgGridReact
rowModelType="infinite"
cacheBlockSize={100}
maxBlocksInCache={10}
/>
```
**实施计划**:
- Week 3: 流式处理 + Arrow
- Week 4: 前端虚拟滚动
---
## 🟡 P2: 中期优化1-2个月
### TD-C-006: 复杂场景Prompt优化Day 3测试遗留
**当前问题**:
Day 3测试中2个复杂场景持续超时失败3次重试都失败
- **示例2数值列清洗**creatinine列处理包含`<0.1`等特殊符号)
- **示例7智能去重**(日期解析 + 排序 + 去重)
**失败原因分析**:
```
❌ 示例2失败: timeout of 60000ms exceeded
用户需求: 把creatinine列里的非数字符号去掉<0.1按0.05处理,转为数值类型
问题:
- 需求描述复杂3个子任务去符号 + 特殊值处理 + 类型转换)
- AI理解不准确生成的代码有逻辑错误
- 3次重试仍无法修正
❌ 示例7失败: timeout of 60000ms exceeded
用户需求: 按patient_id去重保留check_date最新的记录
问题:
- 日期列可能包含多种格式
- 排序 + 去重的组合逻辑复杂
- AI生成的代码执行出错后难以自我修正
```
**优化方案**:
**方案A: 增强Few-shot示例**
```python
# 为这两个场景添加更详细的Few-shot示例
### 示例: 复杂数值清洗(含特殊符号)
用户: 把肌酐列里的非数字符号><去掉<0.1按0.05处理转为数值
代码:
\`\`\`python
try:
# 第1步去除符号
df['creatinine_clean'] = df['creatinine'].astype(str).str.replace('>', '').str.replace('<', '')
# 第2步处理特殊值
df.loc[df['creatinine_clean'] == '0.1', 'creatinine_clean'] = '0.05'
# 第3步转为数值
df['creatinine_numeric'] = pd.to_numeric(df['creatinine_clean'], errors='coerce')
print(f'清洗完成:{df["creatinine_numeric"].notna().sum()}个有效值')
except Exception as e:
print(f'错误: {e}')
\`\`\`
说明: 分步处理复杂清洗任务先去符号再处理特殊值最后转类型
```
**方案B: 优化System Prompt**
```typescript
##
1. ****
2. ****pd.to_datetime()
3. ****便
4. ****使try-except包裹每个子步骤
```
**方案C: 调整重试策略**
```typescript
// 针对特定错误类型,提供更明确的修正提示
if (error.includes('日期') || error.includes('datetime')) {
enhancedMessage = `${userMessage}
注意:日期列可能包含缺失值或格式不一致,请:
1. 使用 pd.to_datetime(df['date'], errors='coerce')
2. 删除日期为NaT的行
3. 再进行排序和去重`;
}
```
**实施计划**:
- Day 4: 实现方案A增强Few-shot示例
- Day 4: 实现方案B优化System Prompt
- Day 5: 测试优化效果目标通过率达到95%+
**预期效果**:
- 通过率从81.8%提升到95%+
- 复杂场景一次成功率提升50%
- 用户体验改善(减少等待时间)
---
## 🟢 P3: 长期规划3个月+
### TD-C-007: 自定义函数库
**愿景**: 用户可保存常用代码为函数,一键复用
```python
# 用户保存的自定义函数
my_functions = {
"血压分类": "df['bp_category'] = ...",
"年龄分组": "df['age_group'] = ...",
}
# 一键应用
apply_function("血压分类")
```
---
### TD-C-007: 协作功能
**愿景**: 多人协作数据清洗
- 权限管理:查看/编辑/审核
- 操作日志:谁在什么时候做了什么
- 评论功能:对特定操作添加备注
---
### TD-C-008: 数据质量报告
**愿景**: 自动生成数据质量报告
```python
quality_report = {
"缺失值分析": {...},
"离群值检测": {...},
"数据分布": {...},
"建议操作": [...]
}
```
---
## 📊 债务统计
### 按优先级
- P0: 1项前端UI阻塞发布
- P1: 2项Session持久化、Prompt优化
- P2: 3项版本管理、大文件、复杂场景优化
- P3: 3项长期规划
### 按工时
- 0.5天: 1项复杂场景优化
- 1天: 1项Session持久化
- 1-2天: 2项版本管理、大文件
- 3天以上: 1项前端UI
- 持续优化: 1项Prompt优化
### 总计
- **技术债务总数**: 9项
- **近期必做**: 4项P0-P1 + 复杂场景)
- **预计总工时**: ~10.5-12.5天
---
## 🔄 更新记录
| 日期 | 版本 | 更新内容 | 更新人 |
|------|------|---------|--------|
| 2025-12-07 | V1.1 | 新增TD-C-006复杂场景Prompt优化 | AI Assistant |
| 2025-12-06 | V1.0 | 初始创建Day 3 MVP完成后梳理 | AI Assistant |
---
**文档状态**: ✅ 已创建
**下次更新**: Day 5或Week 3