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:
@@ -433,3 +433,5 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}:${f.desc}`).join('\n')}
|
||||
**文档维护:** 每次处理技术债务时更新此文档
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
429
docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-C技术债务清单.md
Normal file
429
docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-C技术债务清单.md
Normal file
@@ -0,0 +1,429 @@
|
||||
# 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)
|
||||
|
||||
# 存储到Redis,10分钟过期
|
||||
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())
|
||||
|
||||
# 保存到OSS(Parquet格式,压缩高效)
|
||||
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-5MB(Parquet压缩后)
|
||||
- 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
|
||||
|
||||
Reference in New Issue
Block a user