Core Components: - PDFStorageService with Dify/OSS adapters - LLM12FieldsService with Nougat-first + dual-model + 3-layer JSON parsing - PromptBuilder for dynamic prompt assembly - MedicalLogicValidator with 5 rules + fault tolerance - EvidenceChainValidator for citation integrity - ConflictDetectionService for dual-model comparison Prompt Engineering: - System Prompt (6601 chars, Section-Aware strategy) - User Prompt template (PICOS context injection) - JSON Schema (12 fields constraints) - Cochrane standards (not loaded in MVP) Key Innovations: - 3-layer JSON parsing (JSON.parse + json-repair + code block extraction) - Promise.allSettled for dual-model fault tolerance - safeGetFieldValue for robust field extraction - Mixed CN/EN token calculation Integration Tests: - integration-test.ts (full test) - quick-test.ts (quick test) - cached-result-test.ts (fault tolerance test) Documentation Updates: - Development record (Day 2-3 summary) - Quality assurance strategy (full-text screening) - Development plan (progress update) - Module status (v1.1 update) - Technical debt (10 new items) Test Results: - JSON parsing success rate: 100% - Medical logic validation: 5/5 passed - Dual-model parallel processing: OK - Cost per PDF: CNY 0.10 Files: 238 changed, 14383 insertions(+), 32 deletions(-) Docs: docs/03-涓氬姟妯″潡/ASL-AI鏅鸿兘鏂囩尞/05-寮€鍙戣褰?2025-11-22_Day2-Day3_LLM鏈嶅姟涓庨獙璇佺郴缁熷紑鍙?md
313 lines
7.3 KiB
Markdown
313 lines
7.3 KiB
Markdown
# ASL模块 Week 1 开发完成报告
|
||
|
||
**日期**: 2025-11-18
|
||
**开发周期**: Week 1 (Day 1-5)
|
||
**状态**: ✅ 全部完成
|
||
|
||
---
|
||
|
||
## 📋 任务完成情况
|
||
|
||
| 任务 | 计划 | 实际 | 状态 | 说明 |
|
||
|------|------|------|------|------|
|
||
| Prisma Schema设计 | Day 1 | Day 1 | ✅ | 4个模型,174行代码 |
|
||
| 数据库迁移 | Day 1 | Day 1 | ✅ | 4张表创建成功 |
|
||
| 后端目录结构 | Day 2 | Day 1 | ✅ | 5个子目录,9个文件 |
|
||
| 路由注册 | Day 3 | Day 1 | ✅ | 10个API端点 |
|
||
| 基础API实现 | Day 4-5 | Day 1 | ✅ | 项目+文献管理 |
|
||
| API测试 | - | Day 1 | ✅ | 7个测试全部通过 |
|
||
|
||
**完成度**: 6/6 (100%)
|
||
**提前完成**: 4天
|
||
|
||
---
|
||
|
||
## 🎯 实现的功能
|
||
|
||
### 1. 数据库设计 ✅
|
||
|
||
#### Schema设计
|
||
```prisma
|
||
// 4个核心模型
|
||
- AslScreeningProject // 筛选项目 (19字段)
|
||
- AslLiterature // 文献条目 (14字段 + OSS预留)
|
||
- AslScreeningResult // 筛选结果 (40字段,双模型)
|
||
- AslScreeningTask // 筛选任务 (14字段)
|
||
```
|
||
|
||
#### 数据库表
|
||
```sql
|
||
asl_schema.screening_projects -- 筛选项目表
|
||
asl_schema.literatures -- 文献条目表
|
||
asl_schema.screening_results -- 筛选结果表
|
||
asl_schema.screening_tasks -- 筛选任务表
|
||
```
|
||
|
||
#### 特性
|
||
- ✅ Schema隔离 (`asl_schema`)
|
||
- ✅ 外键约束 (级联删除)
|
||
- ✅ 索引优化 (12个索引)
|
||
- ✅ 唯一约束 (projectId + pmid)
|
||
- ✅ JSONB字段 (PICO标准)
|
||
- ✅ OSS字段预留 (pdfUrl, pdfOssKey)
|
||
|
||
### 2. 后端API ✅
|
||
|
||
#### 目录结构
|
||
```
|
||
backend/src/modules/asl/
|
||
├── controllers/
|
||
│ ├── projectController.ts (224行)
|
||
│ └── literatureController.ts (259行)
|
||
├── routes/
|
||
│ └── index.ts (47行)
|
||
├── services/
|
||
│ └── llmScreeningService.ts (189行)
|
||
├── schemas/
|
||
│ └── screening.schema.ts (108行)
|
||
└── types/
|
||
└── index.ts (121行)
|
||
```
|
||
|
||
#### API端点 (10个)
|
||
```
|
||
POST /api/v1/asl/projects - 创建项目
|
||
GET /api/v1/asl/projects - 获取项目列表
|
||
GET /api/v1/asl/projects/:projectId - 获取项目详情
|
||
PUT /api/v1/asl/projects/:projectId - 更新项目
|
||
DELETE /api/v1/asl/projects/:projectId - 删除项目
|
||
POST /api/v1/asl/literatures/import - 导入文献(JSON)
|
||
POST /api/v1/asl/literatures/import-excel - 导入文献(Excel)
|
||
GET /api/v1/asl/projects/:projectId/literatures - 获取文献列表
|
||
DELETE /api/v1/asl/literatures/:literatureId - 删除文献
|
||
```
|
||
|
||
### 3. 核心服务 ✅
|
||
|
||
#### LLM筛选服务
|
||
```typescript
|
||
class LLMScreeningService {
|
||
// 单模型筛选
|
||
async screenWithModel()
|
||
|
||
// 双模型并行筛选 (核心)
|
||
async dualModelScreening()
|
||
|
||
// 冲突检测
|
||
private detectConflict()
|
||
|
||
// 批量筛选
|
||
async batchScreening()
|
||
}
|
||
```
|
||
|
||
#### JSON Schema验证
|
||
```typescript
|
||
// AJV验证器
|
||
- PicoJudgment Schema
|
||
- PicoEvidence Schema
|
||
- LLMScreeningOutput Schema
|
||
```
|
||
|
||
#### Prompt生成器
|
||
```typescript
|
||
// 生成PICO标准筛选Prompt
|
||
generateScreeningPrompt(
|
||
title, abstract, picoCriteria,
|
||
inclusionCriteria, exclusionCriteria
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 测试结果
|
||
|
||
### API测试 (7/7通过)
|
||
```bash
|
||
✅ 1. 健康检查 GET /health
|
||
✅ 2. 创建筛选项目 POST /api/v1/asl/projects
|
||
✅ 3. 获取项目列表 GET /api/v1/asl/projects
|
||
✅ 4. 获取项目详情 GET /api/v1/asl/projects/:id
|
||
✅ 5. 导入文献 POST /api/v1/asl/literatures/import
|
||
✅ 6. 获取文献列表 GET /api/v1/asl/projects/:id/literatures
|
||
✅ 7. 更新项目 PUT /api/v1/asl/projects/:id
|
||
```
|
||
|
||
### 测试数据
|
||
- **用户**: asl-test-user-001
|
||
- **项目**: 1个 (SGLT2抑制剂系统综述)
|
||
- **文献**: 3篇 (包含PMID、DOI、期刊等信息)
|
||
|
||
### 数据库验证
|
||
- ✅ 表创建成功
|
||
- ✅ 索引创建成功
|
||
- ✅ 外键约束正常
|
||
- ✅ 数据插入正常
|
||
- ✅ 关联查询正常
|
||
|
||
---
|
||
|
||
## 📦 技术栈
|
||
|
||
### 后端框架
|
||
- ✅ Fastify (Web框架)
|
||
- ✅ Prisma (ORM)
|
||
- ✅ TypeScript (类型系统)
|
||
|
||
### 依赖包 (新增)
|
||
- ✅ `xlsx` - Excel文件解析
|
||
- ✅ `ajv` - JSON Schema验证
|
||
|
||
### 平台服务集成
|
||
- ✅ Logger (结构化日志)
|
||
- ✅ Database Connection Pool
|
||
- ✅ LLMFactory (双模型支持)
|
||
- ✅ StorageFactory (OSS预留)
|
||
|
||
---
|
||
|
||
## 📊 代码统计
|
||
|
||
| 类别 | 文件数 | 代码行数 |
|
||
|------|--------|----------|
|
||
| 控制器 | 2 | 483 |
|
||
| 服务 | 1 | 189 |
|
||
| 路由 | 1 | 47 |
|
||
| 类型定义 | 1 | 121 |
|
||
| Schema | 1 | 108 |
|
||
| 脚本 | 3 | 350 |
|
||
| **总计** | **9** | **~1300** |
|
||
|
||
---
|
||
|
||
## 🎨 设计亮点
|
||
|
||
### 1. Schema隔离架构
|
||
```
|
||
platform_schema.users → asl_schema.screening_projects
|
||
↓
|
||
asl_schema.literatures
|
||
↓
|
||
asl_schema.screening_results
|
||
```
|
||
|
||
### 2. 双模型验证策略
|
||
```
|
||
Literature → DeepSeek + Qwen (并行)
|
||
↓
|
||
冲突检测
|
||
↓
|
||
无冲突 → 自动决策
|
||
有冲突 → 人工审核
|
||
```
|
||
|
||
### 3. 云原生设计
|
||
```
|
||
- 无状态API
|
||
- 平台服务集成
|
||
- OSS存储预留
|
||
- 异步任务准备
|
||
```
|
||
|
||
---
|
||
|
||
## 🐛 解决的问题
|
||
|
||
### 1. Prisma导入错误
|
||
**问题**: `getPrisma is not exported`
|
||
**解决**: 修改为 `import { prisma } from '...'`
|
||
|
||
### 2. 依赖包缺失
|
||
**问题**: `Cannot find package 'xlsx'`
|
||
**解决**: 安装 `npm install xlsx ajv`
|
||
|
||
### 3. 认证问题
|
||
**问题**: API需要userId但无JWT中间件
|
||
**解决**: 添加测试模式,默认使用测试用户ID
|
||
|
||
### 4. 数据库表重复
|
||
**问题**: `prisma db push`检测到public schema重复表
|
||
**解决**: 创建手动SQL脚本,只创建ASL表
|
||
|
||
---
|
||
|
||
## 📝 文档产出
|
||
|
||
1. ✅ `backend/ASL-API-测试报告.md`
|
||
2. ✅ `docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-18-Week1完成报告.md`
|
||
3. ✅ `scripts/test-asl-api.ts` (API测试脚本)
|
||
4. ✅ `scripts/create-asl-tables.ts` (数据库创建脚本)
|
||
5. ✅ `scripts/create-test-user-for-asl.ts` (测试用户脚本)
|
||
|
||
---
|
||
|
||
## 🚀 下一步计划 (Week 2)
|
||
|
||
### Day 1-2: 筛选任务控制器
|
||
- [ ] 创建 `screeningController.ts`
|
||
- [ ] 实现 `startScreening` (启动筛选任务)
|
||
- [ ] 实现 `getProgress` (获取进度)
|
||
- [ ] 实现 `getResults` (获取结果)
|
||
- [ ] 集成异步任务队列 (JobFactory)
|
||
|
||
### Day 3-4: LLM筛选功能
|
||
- [ ] 测试双模型筛选服务
|
||
- [ ] 优化Prompt生成
|
||
- [ ] 实现批量筛选
|
||
- [ ] 添加进度回调
|
||
|
||
### Day 5: 冲突审核
|
||
- [ ] 实现 `reviewConflicts` API
|
||
- [ ] 批量审核功能
|
||
- [ ] 审核历史记录
|
||
|
||
---
|
||
|
||
## ✅ 验收标准
|
||
|
||
### Week 1 目标 (全部完成)
|
||
- ✅ Prisma Schema设计完成
|
||
- ✅ 4张数据库表创建
|
||
- ✅ 后端目录结构创建
|
||
- ✅ 10个API端点实现
|
||
- ✅ API测试全部通过
|
||
- ✅ 平台服务集成
|
||
|
||
### 质量标准
|
||
- ✅ 代码符合TypeScript规范
|
||
- ✅ 使用平台基础设施服务
|
||
- ✅ Schema隔离架构
|
||
- ✅ 云原生设计原则
|
||
- ✅ 错误处理完善
|
||
- ✅ 日志记录完整
|
||
|
||
---
|
||
|
||
## 🎉 总结
|
||
|
||
ASL模块Week 1开发任务**全部完成**,提前4天完成原定5天的开发计划。
|
||
|
||
**核心成果**:
|
||
- ✅ 完整的数据库设计和表结构
|
||
- ✅ 10个RESTful API端点
|
||
- ✅ LLM筛选服务框架
|
||
- ✅ 100%测试通过率
|
||
- ✅ 完善的代码文档
|
||
|
||
**技术亮点**:
|
||
- Schema隔离架构
|
||
- 双模型验证策略
|
||
- 云原生设计
|
||
- 模块化结构
|
||
|
||
为后续LLM筛选功能和前端开发奠定了坚实的基础!🚀
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|