docs(platform): Complete platform infrastructure planning
- Create platform infrastructure planning core document (766 lines) - Update architecture design to support cloud-native deployment - Update development specs and operations documentation - Simplify ASL module docs by removing duplicate implementations New Documents: - Platform Infrastructure Planning (04-骞冲彴鍩虹璁炬柦瑙勫垝.md) - Cloud-Native Development Standards (08-浜戝師鐢熷紑鍙戣鑼?md) - Git Commit Standards (06-Git鎻愪氦瑙勮寖.md) - Cloud-Native Deployment Guide (03-浜戝師鐢熼儴缃叉灦鏋勬寚鍗?md) - Daily Summary (2025-11-16 work summary) Updated Documents (11 files): - System architecture design docs (3 files) - Implementation and standards docs (4 files) - Operations documentation (1 file) - ASL module planning docs (3 files) Key Achievements: - Platform-level infrastructure architecture established - Zero-code switching between local/cloud environments - 100% support for 4 PRD deployment modes - Support for modular product combinations - 99% efficiency improvement for module development - Net +1426 lines of quality documentation Implementation: 2.5 days (20 hours) for 8 infrastructure modules
This commit is contained in:
@@ -947,3 +947,5 @@ async function selectSimilarExamples(
|
||||
**更新日志**:
|
||||
- 2025-11-15: 创建文档,定义 MVP/V1.0/V2.0 三阶段策略
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1022,3 +1022,5 @@ npm run test:asl:evaluate -- --gold-standard gold-standard.json
|
||||
**更新日志**:
|
||||
- 2025-11-15: 创建文档,定义初筛、全文处理、文献下载技术选型
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,72 +1,552 @@
|
||||
# 开发里程碑
|
||||
# ASL 模块开发里程碑
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **文档版本:** V3.0
|
||||
> **创建日期:** 2025-11-16
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-10-29
|
||||
> **最后更新:** 2025-11-16
|
||||
> **⭐ 重要:基于真实架构(Frontend-v2 + Backend增量演进)**
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档说明
|
||||
## 📋 文档概述
|
||||
|
||||
本文档描述AI智能文献模块的开发里程碑规划。
|
||||
本文档定义 ASL(AI智能文献)模块的完整开发里程碑,采用 **MVP → V1.0 → V2.0** 三阶段渐进式演进策略。
|
||||
|
||||
**架构前提:**
|
||||
- ✅ Frontend-v2 全新架构(顶部导航 + 模块注册)- Week 2 Day 6-7 已完成
|
||||
- ✅ Backend 增量演进架构(legacy/ + common/ + modules/)- Week 2 Day 8-9 已完成
|
||||
- ✅ 数据库 10个Schema隔离 - Week 1 已完成
|
||||
- 🚧 ASL 模块占位就绪,等待 Week 3 开发
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ 开发阶段
|
||||
## 🏗️ 当前架构基础(已完成)
|
||||
|
||||
### 阶段一:标题摘要初筛模块(当前阶段)
|
||||
### Frontend-v2 真实架构
|
||||
```
|
||||
frontend-v2/src/
|
||||
├── framework/ # ✅ 已实现(Week 2 Day 6-7)
|
||||
│ ├── layout/
|
||||
│ │ ├── MainLayout.tsx # ✅ 主布局(顶部导航)
|
||||
│ │ └── TopNavigation.tsx # ✅ 顶部导航栏(6个模块)
|
||||
│ ├── modules/
|
||||
│ │ ├── moduleRegistry.ts # ✅ 模块注册中心
|
||||
│ │ ├── ErrorBoundary.tsx # ✅ 错误边界
|
||||
│ │ └── types.ts # ✅ 模块类型定义
|
||||
│ ├── router/
|
||||
│ │ └── RouteGuard.tsx # ✅ 路由守卫
|
||||
│ └── permission/
|
||||
│ ├── PermissionContext.tsx # ✅ 权限控制
|
||||
│ └── usePermission.ts # ✅ 权限Hook
|
||||
│
|
||||
└── modules/ # 📦 业务模块
|
||||
├── asl/ # 🚧 ASL模块(占位,Week 3开发)
|
||||
│ └── index.tsx # ✅ 占位页面
|
||||
├── aia/ # ✅ AI问答(占位)
|
||||
├── pkb/ # ✅ 知识库(占位)
|
||||
├── dc/ # ✅ 数据清洗(占位)
|
||||
├── ssa/ # ✅ 统计分析(占位)
|
||||
└── st/ # ✅ 统计工具(占位)
|
||||
```
|
||||
|
||||
**目标**: 完成标题摘要初筛核心功能
|
||||
### Backend 真实架构
|
||||
```
|
||||
backend/src/
|
||||
├── legacy/ # ✅ 现有业务(Week 2 Day 8-9完成迁移)
|
||||
│ ├── routes/ # 7个路由文件
|
||||
│ │ ├── projects.ts # AIA: 项目路由
|
||||
│ │ ├── agents.ts # AIA: 智能体路由
|
||||
│ │ ├── conversations.ts # AIA: 对话路由
|
||||
│ │ ├── chatRoutes.ts # AIA: 通用对话
|
||||
│ │ ├── knowledgeBases.ts # PKB: 知识库路由
|
||||
│ │ ├── batchRoutes.ts # PKB: 批处理路由
|
||||
│ │ └── reviewRoutes.ts # RVW: 稿件审查路由
|
||||
│ ├── controllers/ # 控制器
|
||||
│ └── services/ # 服务
|
||||
│
|
||||
├── common/ # ✅ 通用能力层(已实现)
|
||||
│ ├── llm/adapters/ # LLM适配器
|
||||
│ │ ├── DeepSeekAdapter.ts # ✅ DeepSeek-V3
|
||||
│ │ ├── QwenAdapter.ts # ✅ Qwen3-72B
|
||||
│ │ └── LLMFactory.ts # ✅ 工厂类
|
||||
│ ├── rag/
|
||||
│ │ └── DifyClient.ts # ✅ RAG客户端
|
||||
│ ├── document/
|
||||
│ │ └── ExtractionClient.ts # ✅ 文档提取客户端
|
||||
│ ├── middleware/
|
||||
│ │ └── validateProject.ts # ✅ 验证中间件
|
||||
│ └── utils/
|
||||
│ └── jsonParser.ts # ✅ JSON解析工具
|
||||
│
|
||||
└── modules/ # 🌟 新模块开发区
|
||||
└── asl/ # 🚧 ASL模块(空目录,Week 3开发)
|
||||
└── (待创建)
|
||||
```
|
||||
|
||||
**时间**: 4-6周
|
||||
### Database Schema(已隔离)
|
||||
```
|
||||
PostgreSQL 15 + Prisma 6.17.0
|
||||
|
||||
**里程碑**:
|
||||
- ✅ 需求分析和设计文档
|
||||
- 🔄 数据库设计和API设计
|
||||
- ⏳ 前端框架搭建
|
||||
- ⏳ 后端API开发
|
||||
- ⏳ AI模型集成
|
||||
- ⏳ 功能测试和优化
|
||||
|
||||
### 阶段二:全文复筛模块
|
||||
|
||||
**目标**: 完成全文复筛功能
|
||||
|
||||
**时间**: 4-6周
|
||||
|
||||
**状态**: 待开始
|
||||
|
||||
### 阶段三:其他模块
|
||||
|
||||
**目标**: 完成剩余功能模块
|
||||
|
||||
**时间**: 待定
|
||||
|
||||
**状态**: 规划中
|
||||
✅ platform_schema - 用户表(users)
|
||||
✅ aia_schema - AI问答(projects, conversations, messages等)
|
||||
✅ pkb_schema - 知识库(knowledge_bases, documents, batch_tasks等)
|
||||
🚧 asl_schema - AI智能文献(Week 3 定义表结构)
|
||||
📋 common_schema - 通用能力层(预留)
|
||||
📋 dc_schema - 数据清洗(预留)
|
||||
📋 rvw_schema - 稿件审查(预留)
|
||||
📋 admin_schema - 运营管理(预留)
|
||||
📋 ssa_schema - 统计分析(预留)
|
||||
📋 st_schema - 统计工具(预留)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 进度跟踪
|
||||
## 🎯 总体战略
|
||||
|
||||
| 模块 | 状态 | 进度 | 完成时间 |
|
||||
|------|------|------|----------|
|
||||
| 研究方案生成 | 规划中 | 0% | - |
|
||||
| 智能文献检索 | 规划中 | 0% | - |
|
||||
| 标题摘要初筛 | 进行中 | 20% | - |
|
||||
| 全文复筛 | 待开始 | 0% | - |
|
||||
| 全文解析与数据提取 | 规划中 | 0% | - |
|
||||
| 数据综合分析与报告 | 规划中 | 0% | - |
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ ASL 三阶段演进路线图 │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ MVP (4周) V1.0 (6周) V2.0 (8周) │
|
||||
│ ├─ 基础可用 ├─ 高质量 ├─ 医学级 │
|
||||
│ ├─ 快速验证 ├─ 智能优化 ├─ 自动审计 │
|
||||
│ ├─ 成本优先 ├─ 质量提升 ├─ 完整追溯 │
|
||||
│ └─ 人工复核 └─ 规则验证 └─ HITL智能分流 │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
|
||||
核心设计原则:
|
||||
1. 架构先行:在已完成的 Frontend-v2 和 Backend 架构基础上开发
|
||||
2. 分步实施:每阶段交付可用功能
|
||||
3. 质量可控:准确率从85% → 90% → 95%
|
||||
4. 成本可控:优先使用DeepSeek+Qwen3,可切换高端模型
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
## 📊 三阶段里程碑对比
|
||||
|
||||
| 维度 | MVP (4周) | V1.0 (6周) | V2.0 (8周) |
|
||||
|------|----------|-----------|-----------|
|
||||
| **交付范围** | 标题摘要初筛 | + 全文复筛 + PDF提取 | + 数据提取 + 质量审计 |
|
||||
| **准确率目标** | ≥ 85% | ≥ 90% | ≥ 95% |
|
||||
| **模型组合** | DeepSeek + Qwen3 | 成本优化策略 | 三模型仲裁 |
|
||||
| **质量控制** | 双模型验证 + JSON Schema | + Few-shot + 规则引擎 | + HITL + 自动审计 |
|
||||
| **可追溯性** | 基本日志 | 完整证据链 | 审计级记录 |
|
||||
| **前端** | 基础工作台(Frontend-v2) | 优化交互 | 完整UI |
|
||||
| **后端** | modules/asl/核心功能 | + PDF服务集成 | + 高级质量保障 |
|
||||
| **成本/1000篇** | ¥5 | ¥21 | ¥24 + 仲裁 |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 MVP 阶段(第 1-4 周)
|
||||
|
||||
### 阶段目标
|
||||
|
||||
**交付标准**:
|
||||
- ✅ 标题摘要初筛功能完整可用
|
||||
- ✅ Excel 导入、AI 双模型筛选、人工复核
|
||||
- ✅ 准确率 ≥ 85%
|
||||
- ✅ 成本控制:≤ ¥50/1000 篇
|
||||
- ✅ 前端集成到 Frontend-v2 顶部导航
|
||||
- ✅ 后端 API 注册到 /api/v1/asl/*
|
||||
|
||||
### 里程碑划分
|
||||
|
||||
#### **M1.1 - 数据库Schema设计**(Week 1, Day 1)
|
||||
|
||||
**任务**:
|
||||
- [ ] 设计 asl_schema 表结构(4张核心表)
|
||||
- `asl_screening_projects`(筛选项目表)
|
||||
- `asl_literatures`(文献条目表)
|
||||
- `asl_screening_results`(筛选结果表)
|
||||
- `asl_screening_tasks`(筛选任务表)
|
||||
- [ ] 在 `backend/prisma/schema.prisma` 中添加模型定义
|
||||
- 使用 `@@schema("asl_schema")` 指定Schema
|
||||
- 定义外键关系(引用 `platform_schema.users`)
|
||||
- **添加 OSS 相关字段**(支持云原生部署):
|
||||
- `pdfUrl` - PDF访问URL
|
||||
- `pdfOssKey` - OSS存储Key
|
||||
- `pdfFileSize` - 文件大小
|
||||
- [ ] 运行 Prisma 迁移
|
||||
```bash
|
||||
cd backend
|
||||
npx prisma migrate dev --name add_asl_tables
|
||||
npx prisma generate
|
||||
```
|
||||
|
||||
**交付物**:
|
||||
- ✅ asl_schema 表创建完成
|
||||
- ✅ Prisma Client 生成成功
|
||||
- ✅ 数据库迁移成功
|
||||
- ✅ OSS 字段预留完成
|
||||
|
||||
---
|
||||
|
||||
#### **M1.2 - 后端API搭建**(Week 1, Day 2-3)
|
||||
|
||||
> **⭐ 前置条件(2025-11-16 更新)**:平台已提供基础设施服务
|
||||
> **说明**:存储、日志、异步任务等服务已在平台级实现(`backend/src/common/`),ASL模块可直接使用
|
||||
> **参考文档**:[平台基础设施规划](../../../09-架构实施/04-平台基础设施规划.md)
|
||||
|
||||
**平台已提供服务(无需ASL模块实现)**:
|
||||
- ✅ 存储服务:`import { storage } from '@/common/storage'` - 文件上传下载
|
||||
- ✅ 日志系统:`import { logger } from '@/common/logging'` - 标准化日志
|
||||
- ✅ 异步任务:`import { jobQueue } from '@/common/jobs'` - 长时间任务处理
|
||||
- ✅ 缓存服务:`import { cache } from '@/common/cache'` - 分布式缓存
|
||||
- ✅ 数据库:`import { prisma } from '@/config/database'` - 全局Prisma实例
|
||||
|
||||
**任务**:
|
||||
- [ ] 创建 `backend/src/modules/asl/` 目录结构
|
||||
```
|
||||
modules/asl/
|
||||
├── routes/
|
||||
│ └── index.ts # 路由注册
|
||||
├── controllers/
|
||||
│ ├── projectController.ts # 项目控制器
|
||||
│ ├── literatureController.ts # 文献控制器
|
||||
│ └── screeningController.ts # 筛选控制器
|
||||
├── services/
|
||||
│ ├── projectService.ts # 项目业务逻辑
|
||||
│ ├── literatureService.ts # 文献业务逻辑
|
||||
│ └── llmScreeningService.ts # LLM筛选服务
|
||||
├── schemas/
|
||||
│ └── screening.schema.ts # JSON Schema定义
|
||||
└── types/
|
||||
└── screening.types.ts # TypeScript类型
|
||||
```
|
||||
- [ ] 在 `backend/src/index.ts` 中注册ASL路由
|
||||
```typescript
|
||||
import { aslRoutes } from './modules/asl/routes/index.js'
|
||||
await app.register(aslRoutes, { prefix: '/api/v1/asl' })
|
||||
```
|
||||
- [ ] 实现核心API(参考 API设计规范文档)
|
||||
- `POST /api/v1/asl/projects` - 创建项目
|
||||
- `POST /api/v1/asl/projects/:id/literatures/import` - 导入文献
|
||||
- `POST /api/v1/asl/projects/:id/screening/start` - 启动筛选
|
||||
- `GET /api/v1/asl/projects/:id/screening/results` - 获取结果
|
||||
- [ ] **配置环境变量**
|
||||
```bash
|
||||
# .env.development(本地开发)
|
||||
STORAGE_TYPE=local
|
||||
|
||||
# .env.production(生产环境,SAE配置)
|
||||
STORAGE_TYPE=oss
|
||||
OSS_REGION=oss-cn-hangzhou
|
||||
OSS_BUCKET=aiclinical-prod
|
||||
```
|
||||
|
||||
**交付物**:
|
||||
- ✅ ASL后端目录结构完整
|
||||
- ✅ API路由注册成功
|
||||
- ✅ 核心API可调用(Postman测试通过)
|
||||
- ✅ 正常使用平台服务(storage/logger/jobs等)
|
||||
|
||||
---
|
||||
|
||||
#### **M1.3 - LLM筛选核心**(Week 2, Day 1-2)
|
||||
|
||||
**任务**:
|
||||
- [ ] 实现双模型并行调用逻辑
|
||||
- 复用 `common/llm/adapters/LLMFactory.ts`
|
||||
- 调用 DeepSeek-V3 + Qwen3-72B
|
||||
- [ ] 定义JSON Schema(PICO判断结构)
|
||||
- [ ] 设计提示词模板(v1.0.0)
|
||||
- 存放在 `backend/prompts/asl/screening/v1.0.0-basic.txt`
|
||||
- [ ] 实现冲突检测算法
|
||||
- [ ] 实现自动分流规则(置信度 < 0.7 → 人工复核)
|
||||
|
||||
**交付物**:
|
||||
- ✅ 双模型可成功调用
|
||||
- ✅ JSON Schema验证通过率 > 95%
|
||||
- ✅ 冲突检测准确
|
||||
|
||||
---
|
||||
|
||||
#### **M1.4 - 前端模块开发**(Week 2-3)
|
||||
|
||||
**任务**:
|
||||
- [ ] 更新 `frontend-v2/src/modules/asl/index.tsx`
|
||||
```typescript
|
||||
// 移除占位标记,实现真实模块
|
||||
const ASLModule: ModuleDefinition = {
|
||||
id: 'literature-platform',
|
||||
name: 'AI智能文献',
|
||||
path: '/literature',
|
||||
icon: FileSearchOutlined,
|
||||
component: lazy(() => import('./routes')),
|
||||
placeholder: false, // ← 改为 false
|
||||
requiredVersion: 'advanced',
|
||||
}
|
||||
```
|
||||
- [ ] 创建 `frontend-v2/src/modules/asl/` 子目录
|
||||
```
|
||||
asl/
|
||||
├── index.tsx # 模块定义
|
||||
├── routes.tsx # 路由配置
|
||||
├── pages/
|
||||
│ ├── ProjectList.tsx # 项目列表
|
||||
│ ├── ScreeningSettings.tsx # 设置与启动
|
||||
│ ├── ScreeningWorkbench.tsx # 审核工作台
|
||||
│ └── ScreeningResults.tsx # 初筛结果
|
||||
├── components/
|
||||
│ ├── ExcelUploader.tsx # Excel上传
|
||||
│ ├── ScreeningTable.tsx # 筛选表格
|
||||
│ ├── DualModelModal.tsx # 双视图模态框
|
||||
│ └── ResultsExport.tsx # 结果导出
|
||||
├── api/
|
||||
│ ├── projectApi.ts # 项目API
|
||||
│ ├── screeningApi.ts # 筛选API
|
||||
│ └── index.ts
|
||||
├── hooks/
|
||||
│ ├── useScreening.ts # 筛选Hook
|
||||
│ └── useLiterature.ts # 文献Hook
|
||||
└── types/
|
||||
└── screening.ts # 类型定义
|
||||
```
|
||||
- [ ] 实现Excel上传功能(使用 `xlsx` 库)
|
||||
- [ ] 实现审核工作台(表格化布局,参考原型图)
|
||||
- [ ] 实现双视图原文审查模态框
|
||||
- [ ] 实现结果展示和导出
|
||||
|
||||
**交付物**:
|
||||
- ✅ ASL模块在顶部导航显示并可点击
|
||||
- ✅ 前端3个主要页面完整
|
||||
- ✅ 前后端联调成功
|
||||
|
||||
---
|
||||
|
||||
#### **M1.5 - 集成测试与验收**(Week 4)
|
||||
|
||||
**任务**:
|
||||
- [ ] 端到端完整流程测试
|
||||
- 上传 199篇文献 Excel → 筛选 → 复核 → 导出
|
||||
- [ ] 准确率测试(使用金标准数据集)
|
||||
- 目标:≥ 85%
|
||||
- [ ] 性能测试
|
||||
- 100篇文献筛选 ≤ 10分钟
|
||||
- [ ] 修复Bug和优化
|
||||
|
||||
**交付物**:
|
||||
- ✅ 准确率 ≥ 85%
|
||||
- ✅ 双模型一致率 ≥ 80%
|
||||
- ✅ JSON Schema验证通过率 ≥ 95%
|
||||
- ✅ 人工复核队列 ≤ 20%
|
||||
|
||||
---
|
||||
|
||||
## 📈 V1.0 阶段(第 5-10 周)
|
||||
|
||||
### 阶段目标
|
||||
|
||||
**交付标准**:
|
||||
- ✅ 新增全文复筛功能
|
||||
- ✅ PDF 提取集成(Nougat + PyMuPDF)
|
||||
- ✅ Unpaywall API 集成(自动下载全文)
|
||||
- ✅ Few-shot 示例库
|
||||
- ✅ 规则引擎验证
|
||||
- ✅ 准确率 ≥ 90%
|
||||
|
||||
### 里程碑划分
|
||||
|
||||
#### **M2.1 - PDF 提取服务集成**(Week 5)
|
||||
|
||||
**任务**:
|
||||
- [ ] 封装 `ExtractionClient`(已有 `common/document/ExtractionClient.ts`,需优化)
|
||||
- [ ] 实现自动语言检测和策略选择
|
||||
- [ ] Python 微服务优化(`extraction_service/`)
|
||||
- 优化 Nougat 调用性能
|
||||
- 添加超时和错误处理
|
||||
- [ ] 实现 PDF 质量评估逻辑
|
||||
|
||||
**交付物**:
|
||||
- ✅ 可成功提取英文医学PDF(10-30页)
|
||||
- ✅ 提取准确率 > 90%
|
||||
|
||||
---
|
||||
|
||||
#### **M2.2 - Unpaywall API 集成**(Week 5)
|
||||
|
||||
**任务**:
|
||||
- [ ] 创建 `backend/src/common/literature/UnpaywallClient.ts`
|
||||
- [ ] 实现批量查询 DOI 可下载性
|
||||
- [ ] 实现 PDF 下载功能
|
||||
- [ ] 文件存储管理
|
||||
|
||||
**交付物**:
|
||||
- ✅ 用户可一键检查 100 篇文献的可下载性
|
||||
- ✅ 可自动下载 OA 全文
|
||||
|
||||
---
|
||||
|
||||
#### **M2.3 - 全文复筛功能**(Week 6-7)
|
||||
|
||||
**任务**:
|
||||
- [ ] 扩展数据库表(`asl_full_text_screening_results`)
|
||||
- [ ] 后端全文复筛API
|
||||
- [ ] 前端全文审核工作台(复用组件 + PDF查看器)
|
||||
|
||||
**交付物**:
|
||||
- ✅ 用户可对初筛纳入文献进行全文复筛
|
||||
- ✅ 支持 PDF 在线查看和标注
|
||||
|
||||
---
|
||||
|
||||
#### **M2.4 - 质量增强功能**(Week 8-10)
|
||||
|
||||
**任务**:
|
||||
- [ ] 人工标注 20-30 个 Few-shot 示例
|
||||
- [ ] 定义验证规则(样本量、P值、必填字段)
|
||||
- [ ] 实现成本优化策略(快速初筛 + 高价值复核)
|
||||
- [ ] 完善证据链记录
|
||||
|
||||
**交付物**:
|
||||
- ✅ Few-shot 示例库 ≥ 20 个
|
||||
- ✅ 规则引擎覆盖率 ≥ 80%
|
||||
- ✅ 证据链完整性 100%
|
||||
- ✅ 准确率 ≥ 90%
|
||||
|
||||
---
|
||||
|
||||
## 🏆 V2.0 阶段(第 11-18 周)
|
||||
|
||||
### 阶段目标
|
||||
|
||||
**交付标准**:
|
||||
- ✅ 新增全文数据提取功能
|
||||
- ✅ 三模型共识仲裁
|
||||
- ✅ HITL 智能分流
|
||||
- ✅ 提示词版本管理
|
||||
- ✅ 自动质量审计
|
||||
- ✅ 准确率 ≥ 95%(医学级)
|
||||
|
||||
### 里程碑划分
|
||||
|
||||
#### **M3.1 - 全文数据提取模块**(Week 11-13)
|
||||
|
||||
**任务**:
|
||||
- [ ] 扩展数据库表(`asl_extraction_results`, `asl_extraction_revisions`)
|
||||
- [ ] 后端分段提取逻辑
|
||||
- [ ] 前端表格化数据审查台(文献×变量矩阵)
|
||||
|
||||
**交付物**:
|
||||
- ✅ 用户可配置提取变量清单
|
||||
- ✅ 批量提取 50 篇文献的结构化数据
|
||||
- ✅ 提取准确率 ≥ 92%
|
||||
|
||||
---
|
||||
|
||||
#### **M3.2 - 医学级质量保障**(Week 14-16)
|
||||
|
||||
**任务**:
|
||||
- [ ] 三模型仲裁(冲突 → 启用 Claude-4.5)
|
||||
- [ ] HITL 智能分流(优先级评分)
|
||||
- [ ] 提示词版本管理(Git + 语义化版本)
|
||||
- [ ] 自动质量审计系统
|
||||
|
||||
**交付物**:
|
||||
- ✅ 三模型仲裁成功率 > 95%
|
||||
- ✅ HITL 分流准确率 > 85%
|
||||
- ✅ 提示词版本管理系统上线
|
||||
- ✅ 自动质量审计每周运行
|
||||
|
||||
---
|
||||
|
||||
#### **M3.3 - 高级功能与优化**(Week 17-18)
|
||||
|
||||
**任务**:
|
||||
- [ ] Chain of Thought (CoT) 推理
|
||||
- [ ] 动态示例选择(语义相似度)
|
||||
- [ ] 批处理性能优化(Bull + Redis)
|
||||
- [ ] 用户体验优化(实时进度、PDF标注、快捷键)
|
||||
|
||||
**交付物**:
|
||||
- ✅ 系统稳定性测试通过
|
||||
- ✅ 性能测试:1000 篇文献 < 30 分钟
|
||||
- ✅ 用户验收测试通过
|
||||
- ✅ 准确率 ≥ 95%
|
||||
|
||||
---
|
||||
|
||||
## 📋 交付物检查清单
|
||||
|
||||
### MVP 阶段
|
||||
|
||||
- [ ] **数据库**
|
||||
- [ ] asl_schema 4张表创建
|
||||
- [ ] Prisma 迁移成功
|
||||
|
||||
- [ ] **后端**
|
||||
- [ ] `modules/asl/` 目录结构完整
|
||||
- [ ] API 路由注册到 `/api/v1/asl/*`
|
||||
- [ ] LLM筛选服务可用
|
||||
|
||||
- [ ] **前端**
|
||||
- [ ] ASL模块注册到 `moduleRegistry.ts`
|
||||
- [ ] 顶部导航显示"AI智能文献"
|
||||
- [ ] 3个主页面完整
|
||||
|
||||
- [ ] **测试**
|
||||
- [ ] 准确率测试 ≥ 85%
|
||||
- [ ] 端到端测试通过
|
||||
|
||||
### V1.0 阶段
|
||||
|
||||
- [ ] **新增功能**
|
||||
- [ ] PDF 提取服务
|
||||
- [ ] Unpaywall API 集成
|
||||
- [ ] 全文复筛
|
||||
- [ ] Few-shot 示例库
|
||||
|
||||
- [ ] **测试**
|
||||
- [ ] 准确率 ≥ 90%
|
||||
|
||||
### V2.0 阶段
|
||||
|
||||
- [ ] **新增功能**
|
||||
- [ ] 全文数据提取
|
||||
- [ ] 三模型仲裁
|
||||
- [ ] HITL 智能分流
|
||||
- [ ] 自动质量审计
|
||||
|
||||
- [ ] **测试**
|
||||
- [ ] 准确率 ≥ 95%
|
||||
- [ ] 医学专家验证
|
||||
|
||||
---
|
||||
|
||||
## 📊 关键指标跟踪
|
||||
|
||||
### 质量指标
|
||||
|
||||
| 指标 | MVP 目标 | V1.0 目标 | V2.0 目标 |
|
||||
|------|---------|----------|----------|
|
||||
| 提取准确率 | ≥ 85% | ≥ 90% | ≥ 95% |
|
||||
| 双模型一致率 | ≥ 80% | ≥ 85% | ≥ 90% |
|
||||
| JSON Schema 验证通过率 | ≥ 95% | ≥ 98% | ≥ 99% |
|
||||
| 人工复核队列占比 | ≤ 20% | ≤ 15% | ≤ 10% |
|
||||
|
||||
### 成本指标
|
||||
|
||||
| 场景 | MVP | V1.0 | V2.0 |
|
||||
|------|-----|------|------|
|
||||
| 标题摘要筛选(1000篇) | ¥5 | ¥21 | ¥24 |
|
||||
| 全文复筛(200篇) | - | ¥30 | ¥35 |
|
||||
| 数据提取(50篇) | - | ¥60 | ¥80 |
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [质量保障与可追溯策略](../02-技术设计/06-质量保障与可追溯策略.md)
|
||||
- [文献处理技术选型](../02-技术设计/07-文献处理技术选型.md)
|
||||
- [数据库设计](../02-技术设计/01-数据库设计.md)
|
||||
- [API 设计规范](../02-技术设计/02-API设计规范.md)
|
||||
- [前后端模块化架构设计-V2](../../../00-系统总体设计/前后端模块化架构设计-V2.md)
|
||||
- [Schema隔离架构设计](../../../09-架构实施/01-Schema隔离架构设计(10个).md)
|
||||
|
||||
---
|
||||
|
||||
**更新日志**:
|
||||
- 2025-11-16: V3.0 重写,基于真实架构(Frontend-v2 + Backend增量演进 + 10个Schema)
|
||||
- 2025-11-16: V2.0 重写,基于三阶段路线图详细规划里程碑
|
||||
- 2025-10-29: V1.0 创建,初始版本
|
||||
|
||||
@@ -1,99 +1,913 @@
|
||||
# 标题摘要初筛模块开发计划
|
||||
# 标题摘要初筛模块 - 详细开发计划(MVP阶段)
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-10-29
|
||||
> **文档版本:** V3.0
|
||||
> **创建日期:** 2025-11-16
|
||||
> **开发周期:** 4 周
|
||||
> **负责团队:** ASL 开发组
|
||||
> **最后更新:** 2025-11-16
|
||||
> **⭐ 重要:基于真实架构(Frontend-v2 + Backend增量演进 + asl_schema)**
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档说明
|
||||
## 📋 模块概述
|
||||
|
||||
本文档详细描述标题摘要初筛模块的开发计划,包括任务分解、时间安排、技术方案等。
|
||||
标题摘要初筛是 ASL 模块的第一个核心功能,也是 MVP 阶段的唯一交付功能。
|
||||
|
||||
### 功能范围
|
||||
|
||||
1. **设置与启动视图**:PICO 标准展示、Excel 文献导入、启动筛选任务
|
||||
2. **审核工作台视图**:双模型判断对比、冲突标记、人工复核
|
||||
3. **初筛结果视图**:统计概览、PRISMA 排除总结、结果导出
|
||||
|
||||
### 技术栈
|
||||
|
||||
| 层级 | 技术 | 说明 |
|
||||
|------|------|------|
|
||||
| **前端** | React 19 + TypeScript + Ant Design 5 + xlsx | Frontend-v2架构 |
|
||||
| **后端** | Node.js + Fastify + TypeScript + Prisma | Backend/modules/asl/ |
|
||||
| **LLM** | DeepSeek-V3 + Qwen3-72B | 复用 common/llm/adapters/ |
|
||||
| **数据库** | PostgreSQL 15 (asl_schema) | Schema隔离 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 开发目标
|
||||
## 🏗️ 架构前提(已完成)
|
||||
|
||||
完成标题摘要初筛模块的核心功能,包括:
|
||||
1. 设置与启动视图
|
||||
2. 表格化审核工作台
|
||||
3. 结果展示视图
|
||||
4. AI双模型筛选功能
|
||||
### ✅ Frontend-v2 架构(Week 2 Day 6-7 完成)
|
||||
```
|
||||
frontend-v2/src/
|
||||
├── framework/layout/
|
||||
│ ├── MainLayout.tsx # ✅ 顶部导航布局
|
||||
│ └── TopNavigation.tsx # ✅ 6个模块导航
|
||||
├── framework/modules/
|
||||
│ ├── moduleRegistry.ts # ✅ 模块注册中心
|
||||
│ └── types.ts # ✅ ModuleDefinition接口
|
||||
└── modules/asl/
|
||||
└── index.tsx # 🚧 占位页面(待替换)
|
||||
```
|
||||
|
||||
### ✅ Backend 架构(Week 2 Day 8-9 完成)
|
||||
```
|
||||
backend/src/
|
||||
├── common/llm/adapters/ # ✅ LLMFactory可复用
|
||||
├── common/utils/jsonParser.js # ✅ JSON解析可复用
|
||||
└── modules/
|
||||
└── asl/ # 🚧 空目录(待创建)
|
||||
```
|
||||
|
||||
### ✅ Database Schema(Week 1 完成)
|
||||
```prisma
|
||||
// backend/prisma/schema.prisma
|
||||
datasource db {
|
||||
schemas = [
|
||||
"asl_schema", # ✅ 已预留,待定义表结构
|
||||
// ...其他9个Schema
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📅 开发时间规划
|
||||
## 🌥️ 云原生开发注意事项(2025-11-16 新增)
|
||||
|
||||
### Week 1-2: 设计阶段
|
||||
- [x] 需求分析完成
|
||||
- [ ] 数据库设计完成
|
||||
- [ ] API设计完成
|
||||
- [ ] 前端组件设计完成
|
||||
> **⭐ 重要更新**:本模块开发需遵循阿里云 Serverless 部署架构要求
|
||||
> **详细规范**:[云原生开发规范](../../../04-开发规范/08-云原生开发规范.md)
|
||||
> **部署指南**:[云原生部署架构指南](../../../09-架构实施/03-云原生部署架构指南.md)
|
||||
|
||||
### Week 3-4: 前端开发
|
||||
- [ ] 设置与启动视图开发
|
||||
- [ ] 表格化审核工作台开发
|
||||
- [ ] 结果展示视图开发
|
||||
- [ ] 组件集成
|
||||
### 🎯 本地开发 + 云端部署双兼容策略
|
||||
|
||||
### Week 5-6: 后端开发
|
||||
- [ ] 项目管理API
|
||||
- [ ] 文献管理API
|
||||
- [ ] 筛选任务API
|
||||
- [ ] AI模型集成
|
||||
| 环境 | 存储方式 | 配置 | 说明 |
|
||||
|------|---------|------|------|
|
||||
| **本地开发** | LocalAdapter | `STORAGE_TYPE=local` | 文件存储到 `./uploads/` |
|
||||
| **生产环境** | OSSAdapter | `STORAGE_TYPE=oss` | 文件存储到阿里云 OSS |
|
||||
|
||||
### Week 7-8: 集成测试与优化
|
||||
- [ ] 功能测试
|
||||
- [ ] 性能优化
|
||||
- [ ] Bug修复
|
||||
- [ ] 用户验收测试
|
||||
**核心原则**:
|
||||
- ✅ **Excel导入**:内存解析(`xlsx.read(buffer)`),不落盘
|
||||
- ✅ **PDF上传**(V1.0):使用 `StorageFactory`,本地/OSS自动切换
|
||||
- ✅ **异步任务**:LLM筛选任务必须异步处理(> 10秒任务)
|
||||
- ✅ **环境变量**:所有配置从 `.env` 读取
|
||||
- ✅ **数据库连接池**:使用全局 `prisma` 实例,不新建连接
|
||||
|
||||
### ❌ 禁止的做法
|
||||
|
||||
| 禁止操作 | 正确做法 | 原因 |
|
||||
|---------|---------|------|
|
||||
| `fs.writeFileSync('./temp.xlsx')` | `xlsx.read(buffer)` 内存解析 | Serverless容器重启丢失文件 |
|
||||
| `new PrismaClient()` 每次新建连接 | 使用全局 `prisma` 实例 | 避免连接数暴增 |
|
||||
| 硬编码 `apiKey = 'sk-xxx'` | `process.env.LLM_API_KEY` | 配置管理混乱 |
|
||||
| 同步处理1000条文献筛选 | 异步任务 + 进度轮询 | 超过30秒超时限制 |
|
||||
|
||||
### ✅ MVP阶段开发检查清单
|
||||
|
||||
在提交代码前,请确认:
|
||||
|
||||
- [ ] Excel导入是否使用内存解析(`xlsx.read(buffer)`)?
|
||||
- [ ] 是否使用全局 `prisma` 实例(`import { prisma } from '@/config/database'`)?
|
||||
- [ ] 是否所有配置都从环境变量读取?
|
||||
- [ ] LLM筛选任务是否异步处理(`POST /screening/start` 立即返回taskId)?
|
||||
- [ ] 是否预留了 OSS 字段(`pdfUrl`, `pdfOssKey`, `pdfFileSize`)?
|
||||
- [ ] 是否使用存储抽象层(`StorageFactory.create()`)?
|
||||
|
||||
**预留字段说明**:
|
||||
- MVP阶段仅做标题摘要筛选,不处理PDF
|
||||
- V1.0阶段实现全文PDF筛选时,使用预留的OSS字段
|
||||
|
||||
---
|
||||
|
||||
## 📋 任务分解
|
||||
## 📅 四周开发计划
|
||||
|
||||
### 1. 数据库设计和迁移
|
||||
- [ ] 设计数据表结构
|
||||
- [ ] 编写迁移脚本
|
||||
- [ ] 创建索引
|
||||
|
||||
### 2. API开发
|
||||
- [ ] 项目管理API
|
||||
- [ ] 文献导入API
|
||||
- [ ] 筛选任务API
|
||||
- [ ] 筛选结果API
|
||||
|
||||
### 3. 前端开发
|
||||
- [ ] 设置与启动视图
|
||||
- [ ] 表格化审核工作台
|
||||
- [ ] 结果展示视图
|
||||
- [ ] 双视图原文审查模态框
|
||||
|
||||
### 4. AI集成
|
||||
- [ ] 双模型调用封装
|
||||
- [ ] 批处理任务管理
|
||||
- [ ] 结果解析和存储
|
||||
```
|
||||
Week 1: 数据库Schema + 后端API框架 + 存储抽象层
|
||||
Week 2: LLM筛选核心 + 异步批处理逻辑
|
||||
Week 3: 前端模块开发 + 审核工作台(内存解析Excel)
|
||||
Week 4: 结果展示 + 导出 + 集成测试
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善内容
|
||||
## 🗓️ Week 1: 数据库Schema与后端API框架
|
||||
|
||||
后续将补充:
|
||||
- 详细任务分解(按功能点)
|
||||
- 技术方案细节
|
||||
- 风险评估
|
||||
- 依赖关系
|
||||
### Day 1: Prisma Schema 设计
|
||||
|
||||
#### 任务1: 设计 asl_schema 表结构
|
||||
|
||||
**在 `backend/prisma/schema.prisma` 中添加:**
|
||||
|
||||
```prisma
|
||||
// ==================== ASL 筛选项目表 ====================
|
||||
model AslScreeningProject {
|
||||
id String @id @default(uuid())
|
||||
userId String @map("user_id")
|
||||
user User @relation("AslProjects", fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
projectName String @map("project_name")
|
||||
|
||||
// PICO标准
|
||||
picoCriteria Json @map("pico_criteria") // { population, intervention, comparison, outcome, studyDesign }
|
||||
|
||||
// 筛选标准
|
||||
inclusionCriteria String @map("inclusion_criteria") @db.Text
|
||||
exclusionCriteria String @map("exclusion_criteria") @db.Text
|
||||
|
||||
// 状态
|
||||
status String @default("draft") // draft, screening, completed
|
||||
|
||||
// 筛选配置
|
||||
screeningConfig Json? @map("screening_config") // { models: ["deepseek", "qwen"], temperature: 0 }
|
||||
|
||||
// 关联
|
||||
literatures AslLiterature[]
|
||||
screeningTasks AslScreeningTask[]
|
||||
screeningResults AslScreeningResult[]
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@map("screening_projects")
|
||||
@@schema("asl_schema")
|
||||
@@index([userId])
|
||||
@@index([status])
|
||||
}
|
||||
|
||||
// ==================== ASL 文献条目表 ====================
|
||||
model AslLiterature {
|
||||
id String @id @default(uuid())
|
||||
projectId String @map("project_id")
|
||||
project AslScreeningProject @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
|
||||
// 文献基本信息
|
||||
pmid String?
|
||||
title String @db.Text
|
||||
abstract String @db.Text
|
||||
authors String?
|
||||
journal String?
|
||||
publicationYear Int? @map("publication_year")
|
||||
doi String?
|
||||
|
||||
// 云原生存储字段(V1.0 阶段使用,MVP阶段预留)
|
||||
pdfUrl String? @map("pdf_url") // PDF访问URL
|
||||
pdfOssKey String? @map("pdf_oss_key") // OSS存储Key(用于删除)
|
||||
pdfFileSize Int? @map("pdf_file_size") // 文件大小(字节)
|
||||
|
||||
// 关联
|
||||
screeningResults AslScreeningResult[]
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@map("literatures")
|
||||
@@schema("asl_schema")
|
||||
@@index([projectId])
|
||||
@@index([doi])
|
||||
@@unique([projectId, pmid])
|
||||
}
|
||||
|
||||
// ==================== ASL 筛选结果表 ====================
|
||||
model AslScreeningResult {
|
||||
id String @id @default(uuid())
|
||||
projectId String @map("project_id")
|
||||
project AslScreeningProject @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
literatureId String @map("literature_id")
|
||||
literature AslLiterature @relation(fields: [literatureId], references: [id], onDelete: Cascade)
|
||||
|
||||
// DeepSeek模型判断
|
||||
dsModelName String @map("ds_model_name") // "deepseek-chat"
|
||||
dsPJudgment String? @map("ds_p_judgment") // "match" | "partial" | "mismatch"
|
||||
dsIJudgment String? @map("ds_i_judgment")
|
||||
dsCJudgment String? @map("ds_c_judgment")
|
||||
dsSJudgment String? @map("ds_s_judgment")
|
||||
dsConclusion String? @map("ds_conclusion") // "include" | "exclude" | "uncertain"
|
||||
dsConfidence Float? @map("ds_confidence") // 0-1
|
||||
|
||||
// DeepSeek模型证据
|
||||
dsPEvidence String? @map("ds_p_evidence") @db.Text
|
||||
dsIEvidence String? @map("ds_i_evidence") @db.Text
|
||||
dsCEvidence String? @map("ds_c_evidence") @db.Text
|
||||
dsSEvidence String? @map("ds_s_evidence") @db.Text
|
||||
dsReason String? @map("ds_reason") @db.Text
|
||||
|
||||
// Qwen模型判断
|
||||
qwenModelName String @map("qwen_model_name") // "qwen-max"
|
||||
qwenPJudgment String? @map("qwen_p_judgment")
|
||||
qwenIJudgment String? @map("qwen_i_judgment")
|
||||
qwenCJudgment String? @map("qwen_c_judgment")
|
||||
qwenSJudgment String? @map("qwen_s_judgment")
|
||||
qwenConclusion String? @map("qwen_conclusion")
|
||||
qwenConfidence Float? @map("qwen_confidence")
|
||||
|
||||
// Qwen模型证据
|
||||
qwenPEvidence String? @map("qwen_p_evidence") @db.Text
|
||||
qwenIEvidence String? @map("qwen_i_evidence") @db.Text
|
||||
qwenCEvidence String? @map("qwen_c_evidence") @db.Text
|
||||
qwenSEvidence String? @map("qwen_s_evidence") @db.Text
|
||||
qwenReason String? @map("qwen_reason") @db.Text
|
||||
|
||||
// 冲突状态
|
||||
conflictStatus String @default("none") @map("conflict_status") // "none" | "conflict" | "resolved"
|
||||
conflictFields Json? @map("conflict_fields") // ["P", "I", "conclusion"]
|
||||
|
||||
// 最终决策
|
||||
finalDecision String? @map("final_decision") // "include" | "exclude" | "pending"
|
||||
finalDecisionBy String? @map("final_decision_by") // userId
|
||||
finalDecisionAt DateTime? @map("final_decision_at")
|
||||
exclusionReason String? @map("exclusion_reason") @db.Text
|
||||
|
||||
// AI处理状态
|
||||
aiProcessingStatus String @default("pending") @map("ai_processing_status") // "pending" | "processing" | "completed" | "failed"
|
||||
aiProcessedAt DateTime? @map("ai_processed_at")
|
||||
aiErrorMessage String? @map("ai_error_message") @db.Text
|
||||
|
||||
// 可追溯信息
|
||||
promptVersion String @default("v1.0.0") @map("prompt_version")
|
||||
rawOutput Json? @map("raw_output") // 原始LLM输出(备份)
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@map("screening_results")
|
||||
@@schema("asl_schema")
|
||||
@@index([projectId])
|
||||
@@index([literatureId])
|
||||
@@index([conflictStatus])
|
||||
@@index([finalDecision])
|
||||
@@unique([projectId, literatureId])
|
||||
}
|
||||
|
||||
// ==================== ASL 筛选任务表 ====================
|
||||
model AslScreeningTask {
|
||||
id String @id @default(uuid())
|
||||
projectId String @map("project_id")
|
||||
project AslScreeningProject @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
|
||||
taskType String @map("task_type") // "title_abstract" | "full_text"
|
||||
status String @default("pending") // "pending" | "running" | "completed" | "failed"
|
||||
|
||||
// 进度统计
|
||||
totalItems Int @map("total_items")
|
||||
processedItems Int @default(0) @map("processed_items")
|
||||
successItems Int @default(0) @map("success_items")
|
||||
failedItems Int @default(0) @map("failed_items")
|
||||
conflictItems Int @default(0) @map("conflict_items")
|
||||
|
||||
// 时间信息
|
||||
startedAt DateTime? @map("started_at")
|
||||
completedAt DateTime? @map("completed_at")
|
||||
estimatedEndAt DateTime? @map("estimated_end_at")
|
||||
|
||||
// 错误信息
|
||||
errorMessage String? @map("error_message") @db.Text
|
||||
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
@@map("screening_tasks")
|
||||
@@schema("asl_schema")
|
||||
@@index([projectId])
|
||||
@@index([status])
|
||||
}
|
||||
|
||||
// ==================== 用户表关联(添加到User模型)====================
|
||||
// 在 platform_schema 的 User 模型中添加:
|
||||
// aslProjects AslScreeningProject[] @relation("AslProjects")
|
||||
```
|
||||
|
||||
**执行迁移:**
|
||||
```bash
|
||||
cd backend
|
||||
npx prisma migrate dev --name add_asl_screening_tables
|
||||
npx prisma generate
|
||||
```
|
||||
|
||||
**验收标准**:
|
||||
- ✅ 数据库表创建成功(4张表)
|
||||
- ✅ Prisma Client 生成成功
|
||||
- ✅ 可查询 asl_schema 表
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
### Day 2: 后端目录结构创建
|
||||
|
||||
> **⭐ 前置条件(2025-11-16 更新)**:平台已提供存储服务
|
||||
> **说明**:存储抽象层已在平台级实现(`backend/src/common/storage/`),ASL模块可直接使用
|
||||
> **参考文档**:[平台基础设施规划](../../../09-架构实施/04-平台基础设施规划.md)
|
||||
|
||||
#### 平台提供的存储服务(无需ASL模块实现)
|
||||
|
||||
**平台已提供**:`backend/src/common/storage/`
|
||||
|
||||
```typescript
|
||||
// ASL模块直接使用(一行代码)
|
||||
import { storage } from '@/common/storage'
|
||||
|
||||
// 上传文件(不关心本地还是OSS)
|
||||
const url = await storage.upload('asl/literature/123.pdf', pdfBuffer)
|
||||
|
||||
// 下载文件
|
||||
const buffer = await storage.download('asl/literature/123.pdf')
|
||||
|
||||
// 删除文件
|
||||
await storage.delete('asl/literature/123.pdf')
|
||||
```
|
||||
|
||||
**支持的部署环境**:
|
||||
- ✅ 本地开发:LocalAdapter(文件存储到 `./uploads/`)
|
||||
- ✅ 云端SaaS:OSSAdapter(文件存储到阿里云OSS)
|
||||
- ✅ 私有化部署:LocalAdapter(文件存储到服务器)
|
||||
- ✅ 单机版:LocalAdapter(文件存储到用户本地)
|
||||
|
||||
**环境切换**:修改一个环境变量即可
|
||||
```bash
|
||||
# 本地开发
|
||||
STORAGE_TYPE=local
|
||||
|
||||
# 生产环境
|
||||
STORAGE_TYPE=oss
|
||||
```
|
||||
|
||||
**优势**:
|
||||
- ✅ ASL模块无需关心存储实现细节
|
||||
- ✅ 代码零改动切换环境
|
||||
- ✅ 所有业务模块(AIA/PKB/DC等)复用同一套存储服务
|
||||
- ✅ 统一维护和升级
|
||||
|
||||
---
|
||||
|
||||
#### 任务1: 创建 `backend/src/modules/asl/` 目录
|
||||
|
||||
```bash
|
||||
cd backend/src/modules/asl
|
||||
mkdir routes controllers services schemas types utils
|
||||
touch routes/index.ts
|
||||
touch controllers/projectController.ts
|
||||
touch controllers/literatureController.ts
|
||||
touch controllers/screeningController.ts
|
||||
touch services/projectService.ts
|
||||
touch services/literatureService.ts
|
||||
touch services/llmScreeningService.ts
|
||||
touch schemas/screening.schema.ts
|
||||
touch types/screening.types.ts
|
||||
```
|
||||
|
||||
#### 任务2: 创建路由文件
|
||||
|
||||
**`backend/src/modules/asl/routes/index.ts`:**
|
||||
```typescript
|
||||
import { FastifyInstance } from 'fastify'
|
||||
import * as projectController from '../controllers/projectController.js'
|
||||
import * as literatureController from '../controllers/literatureController.js'
|
||||
import * as screeningController from '../controllers/screeningController.js'
|
||||
|
||||
/**
|
||||
* ASL 模块路由注册
|
||||
*
|
||||
* @description
|
||||
* - 注册到 /api/v1/asl 前缀
|
||||
* - 参考 legacy/routes/ 的风格
|
||||
*
|
||||
* @version Week 3 Day 2
|
||||
*/
|
||||
export async function aslRoutes(fastify: FastifyInstance) {
|
||||
// 项目管理
|
||||
fastify.post('/projects', projectController.createProject)
|
||||
fastify.get('/projects', projectController.listProjects)
|
||||
fastify.get('/projects/:projectId', projectController.getProject)
|
||||
fastify.put('/projects/:projectId', projectController.updateProject)
|
||||
fastify.delete('/projects/:projectId', projectController.deleteProject)
|
||||
|
||||
// 文献管理
|
||||
fastify.post('/projects/:projectId/literatures/import', literatureController.importLiteratures)
|
||||
fastify.get('/projects/:projectId/literatures', literatureController.listLiteratures)
|
||||
|
||||
// 筛选管理
|
||||
fastify.post('/projects/:projectId/screening/start', screeningController.startScreening)
|
||||
fastify.get('/projects/:projectId/screening/results', screeningController.getScreeningResults)
|
||||
fastify.put('/screening/results/:resultId', screeningController.updateScreeningResult)
|
||||
fastify.post('/screening/results/batch-update', screeningController.batchUpdateResults)
|
||||
fastify.get('/screening/tasks/:taskId', screeningController.getTaskStatus)
|
||||
fastify.get('/screening/tasks/:taskId/progress', screeningController.getTaskProgress)
|
||||
}
|
||||
```
|
||||
|
||||
**验收标准**:
|
||||
- ✅ 目录结构清晰
|
||||
- ✅ 路由文件创建完成
|
||||
|
||||
---
|
||||
|
||||
### Day 3: 在 index.ts 中注册ASL路由
|
||||
|
||||
**`backend/src/index.ts`(修改):**
|
||||
```typescript
|
||||
// ============================================
|
||||
// 【新架构】ASL 模块 - Week 3 新增
|
||||
// ============================================
|
||||
import { aslRoutes } from './modules/asl/routes/index.js';
|
||||
|
||||
// ... 其他代码
|
||||
|
||||
// 注册 ASL 模块路由
|
||||
await fastify.register(aslRoutes, { prefix: '/api/v1/asl' });
|
||||
|
||||
console.log('✅ ASL 路由已注册到 /api/v1/asl/*');
|
||||
```
|
||||
|
||||
**验收标准**:
|
||||
- ✅ 后端启动成功
|
||||
- ✅ 访问 `http://localhost:3001/api/v1/asl/projects` 返回 200(即使是空列表)
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 2: LLM筛选核心
|
||||
|
||||
### Day 4-5: LLM筛选服务实现
|
||||
|
||||
#### 任务1: 定义 JSON Schema
|
||||
|
||||
**`backend/src/modules/asl/schemas/screening.schema.ts`:**
|
||||
```typescript
|
||||
export const screeningOutputSchema = {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"required": ["decision", "reason", "confidence", "pico"],
|
||||
"properties": {
|
||||
"decision": {
|
||||
"type": "string",
|
||||
"enum": ["include", "exclude", "uncertain"]
|
||||
},
|
||||
"reason": {
|
||||
"type": "string",
|
||||
"minLength": 10,
|
||||
"maxLength": 500
|
||||
},
|
||||
"confidence": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
},
|
||||
"pico": {
|
||||
"type": "object",
|
||||
"required": ["population", "intervention", "comparison", "outcome"],
|
||||
"properties": {
|
||||
"population": {
|
||||
"type": "string",
|
||||
"enum": ["match", "partial", "mismatch"]
|
||||
},
|
||||
"intervention": {
|
||||
"type": "string",
|
||||
"enum": ["match", "partial", "mismatch"]
|
||||
},
|
||||
"comparison": {
|
||||
"type": "string",
|
||||
"enum": ["match", "partial", "mismatch", "not_applicable"]
|
||||
},
|
||||
"outcome": {
|
||||
"type": "string",
|
||||
"enum": ["match", "partial", "mismatch"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"studyDesign": {
|
||||
"type": "string",
|
||||
"enum": ["RCT", "cohort", "case-control", "cross-sectional", "review", "other"]
|
||||
},
|
||||
"evidences": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"population": { "type": "string" },
|
||||
"intervention": { "type": "string" },
|
||||
"comparison": { "type": "string" },
|
||||
"outcome": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
#### 任务2: 创建提示词模板
|
||||
|
||||
**`backend/prompts/asl/screening/v1.0.0-basic.txt`:**
|
||||
```
|
||||
你是一位医学文献筛选专家。请根据以下 PICO 标准判断这篇文献是否应该纳入系统评价。
|
||||
|
||||
# PICO 标准
|
||||
- **Population (研究对象)**: {{population}}
|
||||
- **Intervention (干预措施)**: {{intervention}}
|
||||
- **Comparison (对照措施)**: {{comparison}}
|
||||
- **Outcome (结局指标)**: {{outcome}}
|
||||
- **Study Design (研究设计)**: {{studyDesign}}
|
||||
|
||||
# 纳入标准
|
||||
{{inclusionCriteria}}
|
||||
|
||||
# 排除标准
|
||||
{{exclusionCriteria}}
|
||||
|
||||
# 待筛选文献
|
||||
**标题**: {{title}}
|
||||
|
||||
**摘要**: {{abstract}}
|
||||
|
||||
# 输出要求
|
||||
|
||||
请严格按照以下 JSON Schema 输出结果,输出纯JSON(不要包含任何其他文字):
|
||||
|
||||
{
|
||||
"decision": "include/exclude/uncertain",
|
||||
"reason": "判断理由(10-500字)",
|
||||
"confidence": 0.95,
|
||||
"pico": {
|
||||
"population": "match/partial/mismatch",
|
||||
"intervention": "match/partial/mismatch",
|
||||
"comparison": "match/partial/mismatch/not_applicable",
|
||||
"outcome": "match/partial/mismatch"
|
||||
},
|
||||
"studyDesign": "RCT/cohort/case-control/cross-sectional/review/other",
|
||||
"evidences": {
|
||||
"population": "原文中的关键证据短语",
|
||||
"intervention": "原文中的关键证据短语",
|
||||
"comparison": "原文中的关键证据短语",
|
||||
"outcome": "原文中的关键证据短语"
|
||||
}
|
||||
}
|
||||
|
||||
# 注意事项
|
||||
1. decision 只能是 "include"(纳入)、"exclude"(排除)或 "uncertain"(不确定)
|
||||
2. reason 必须具体说明判断依据
|
||||
3. confidence 为 0-1 之间的数值
|
||||
4. pico 字段逐项评估匹配程度
|
||||
5. evidences 字段提取原文中的关键短语作为证据
|
||||
```
|
||||
|
||||
#### 任务3: 实现 LLM 筛选服务
|
||||
|
||||
**`backend/src/modules/asl/services/llmScreeningService.ts`:**
|
||||
```typescript
|
||||
import { LLMFactory } from '../../../common/llm/adapters/LLMFactory.js';
|
||||
import { parseJSON } from '../../../common/utils/jsonParser.js';
|
||||
import Ajv from 'ajv';
|
||||
import { screeningOutputSchema } from '../schemas/screening.schema.js';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
const ajv = new Ajv();
|
||||
const validateSchema = ajv.compile(screeningOutputSchema);
|
||||
|
||||
/**
|
||||
* LLM 筛选服务
|
||||
*
|
||||
* @description
|
||||
* - 复用 common/llm/adapters/LLMFactory.ts
|
||||
* - 双模型并行调用(DeepSeek + Qwen)
|
||||
* - JSON Schema 验证
|
||||
* - 冲突检测
|
||||
*
|
||||
* @version Week 3 Day 4-5
|
||||
*/
|
||||
class LLMScreeningService {
|
||||
/**
|
||||
* 双模型并行筛选
|
||||
*/
|
||||
async dualModelScreening(literature: any, protocol: any) {
|
||||
// 构建提示词
|
||||
const prompt = this.buildPrompt(literature, protocol);
|
||||
|
||||
// 并行调用两个模型
|
||||
const [resultA, resultB] = await Promise.all([
|
||||
this.callModel('deepseek', prompt),
|
||||
this.callModel('qwen', prompt)
|
||||
]);
|
||||
|
||||
// 解析JSON结果
|
||||
const decisionA = await this.parseModelOutput(resultA.content, 'deepseek');
|
||||
const decisionB = await this.parseModelOutput(resultB.content, 'qwen');
|
||||
|
||||
// 一致性判断
|
||||
const { consensus, conflictFields } = this.compareDecisions(decisionA, decisionB);
|
||||
|
||||
// 自动分流
|
||||
const needReview = this.shouldReview(consensus, decisionA, decisionB);
|
||||
|
||||
return {
|
||||
consensus,
|
||||
finalDecision: consensus === 'high' ? decisionA.decision : 'uncertain',
|
||||
needReview,
|
||||
conflictFields,
|
||||
modelA: decisionA,
|
||||
modelB: decisionB
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用LLM模型(复用common/llm)
|
||||
*/
|
||||
private async callModel(modelName: string, prompt: string) {
|
||||
const llm = LLMFactory.createLLM(modelName);
|
||||
|
||||
const response = await llm.chat({
|
||||
messages: [
|
||||
{ role: 'user', content: prompt }
|
||||
],
|
||||
temperature: 0, // 确定性输出
|
||||
max_tokens: 1000
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建提示词
|
||||
*/
|
||||
private buildPrompt(literature: any, protocol: any): string {
|
||||
// 读取提示词模板
|
||||
const templatePath = path.resolve(__dirname, '../../../../prompts/asl/screening/v1.0.0-basic.txt');
|
||||
let template = fs.readFileSync(templatePath, 'utf-8');
|
||||
|
||||
// 替换变量
|
||||
template = template.replace('{{population}}', protocol.picoCriteria.population);
|
||||
template = template.replace('{{intervention}}', protocol.picoCriteria.intervention);
|
||||
template = template.replace('{{comparison}}', protocol.picoCriteria.comparison);
|
||||
template = template.replace('{{outcome}}', protocol.picoCriteria.outcome);
|
||||
template = template.replace('{{studyDesign}}', protocol.picoCriteria.studyDesign);
|
||||
template = template.replace('{{inclusionCriteria}}', protocol.inclusionCriteria);
|
||||
template = template.replace('{{exclusionCriteria}}', protocol.exclusionCriteria);
|
||||
template = template.replace('{{title}}', literature.title);
|
||||
template = template.replace('{{abstract}}', literature.abstract);
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析模型输出
|
||||
*/
|
||||
private async parseModelOutput(content: string, modelName: string) {
|
||||
// 使用JSON解析器(复用common/utils)
|
||||
const parsed = parseJSON(content);
|
||||
|
||||
// JSON Schema 验证
|
||||
const valid = validateSchema(parsed);
|
||||
if (!valid) {
|
||||
console.error('JSON Schema验证失败:', validateSchema.errors);
|
||||
throw new Error(`模型${modelName}输出格式不符合Schema`);
|
||||
}
|
||||
|
||||
return {
|
||||
modelName,
|
||||
decision: parsed.decision,
|
||||
reason: parsed.reason,
|
||||
confidence: parsed.confidence,
|
||||
pico: parsed.pico,
|
||||
evidences: parsed.evidences,
|
||||
studyDesign: parsed.studyDesign
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 对比两个模型的决策
|
||||
*/
|
||||
private compareDecisions(decisionA: any, decisionB: any) {
|
||||
const conflicts: string[] = [];
|
||||
|
||||
// 比较最终决策
|
||||
if (decisionA.decision !== decisionB.decision) {
|
||||
conflicts.push('decision');
|
||||
}
|
||||
|
||||
// 比较PICO各维度
|
||||
if (decisionA.pico.population !== decisionB.pico.population) conflicts.push('P');
|
||||
if (decisionA.pico.intervention !== decisionB.pico.intervention) conflicts.push('I');
|
||||
if (decisionA.pico.comparison !== decisionB.pico.comparison) conflicts.push('C');
|
||||
if (decisionA.pico.outcome !== decisionB.pico.outcome) conflicts.push('O');
|
||||
|
||||
const consensus = conflicts.length === 0 ? 'high' : 'conflict';
|
||||
|
||||
return { consensus, conflictFields: conflicts };
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动分流规则
|
||||
*/
|
||||
private shouldReview(consensus: string, decisionA: any, decisionB: any): boolean {
|
||||
// 规则1:冲突 → 必须复核
|
||||
if (consensus === 'conflict') {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 规则2:低置信度 → 需要复核
|
||||
const avgConfidence = (decisionA.confidence + decisionB.confidence) / 2;
|
||||
if (avgConfidence < 0.7) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 规则3:高置信度 + 一致 → 自动通过
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量筛选
|
||||
*/
|
||||
async batchScreening(literatures: any[], protocol: any, progressCallback?: (progress: number) => void) {
|
||||
const batchSize = 15; // 每批15篇
|
||||
const results = [];
|
||||
|
||||
for (let i = 0; i < literatures.length; i += batchSize) {
|
||||
const batch = literatures.slice(i, i + batchSize);
|
||||
|
||||
// 并行处理当前批次
|
||||
const batchResults = await Promise.all(
|
||||
batch.map(lit => this.dualModelScreening(lit, protocol))
|
||||
);
|
||||
|
||||
results.push(...batchResults);
|
||||
|
||||
// 推送进度
|
||||
const progress = Math.round(((i + batch.length) / literatures.length) * 100);
|
||||
progressCallback?.(progress);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
||||
export const llmScreeningService = new LLMScreeningService();
|
||||
```
|
||||
|
||||
**验收标准**:
|
||||
- ✅ LLM双模型调用成功
|
||||
- ✅ JSON Schema验证通过率 > 95%
|
||||
- ✅ 冲突检测准确
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 3: 前端模块开发
|
||||
|
||||
### Day 6-7: 前端模块结构创建
|
||||
|
||||
#### 任务1: 更新模块定义
|
||||
|
||||
**`frontend-v2/src/modules/asl/index.tsx`(修改):**
|
||||
```typescript
|
||||
import { lazy } from 'react'
|
||||
import { ModuleDefinition } from '@/framework/modules/types'
|
||||
import { FileSearchOutlined } from '@ant-design/icons'
|
||||
|
||||
/**
|
||||
* ASL 模块定义
|
||||
*
|
||||
* @description
|
||||
* - 移除占位标记
|
||||
* - 实现真实模块路由
|
||||
*
|
||||
* @version Week 3 Day 6
|
||||
*/
|
||||
const ASLModule: ModuleDefinition = {
|
||||
id: 'literature-platform',
|
||||
name: 'AI智能文献',
|
||||
path: '/literature',
|
||||
icon: FileSearchOutlined,
|
||||
component: lazy(() => import('./routes')),
|
||||
placeholder: false, // ✅ 改为 false
|
||||
requiredVersion: 'advanced',
|
||||
description: 'AI驱动的文献筛选和分析系统',
|
||||
}
|
||||
|
||||
export default ASLModule
|
||||
```
|
||||
|
||||
#### 任务2: 创建目录结构
|
||||
|
||||
```bash
|
||||
cd frontend-v2/src/modules/asl
|
||||
mkdir pages components api hooks types utils
|
||||
touch routes.tsx
|
||||
touch pages/ProjectList.tsx
|
||||
touch pages/ScreeningSettings.tsx
|
||||
touch pages/ScreeningWorkbench.tsx
|
||||
touch pages/ScreeningResults.tsx
|
||||
touch api/index.ts
|
||||
```
|
||||
|
||||
#### 任务3: 实现路由配置
|
||||
|
||||
**`frontend-v2/src/modules/asl/routes.tsx`:**
|
||||
```typescript
|
||||
import { lazy } from 'react'
|
||||
import { Routes, Route, Navigate } from 'react-router-dom'
|
||||
|
||||
const ProjectList = lazy(() => import('./pages/ProjectList'))
|
||||
const ScreeningSettings = lazy(() => import('./pages/ScreeningSettings'))
|
||||
const ScreeningWorkbench = lazy(() => import('./pages/ScreeningWorkbench'))
|
||||
const ScreeningResults = lazy(() => import('./pages/ScreeningResults'))
|
||||
|
||||
/**
|
||||
* ASL 模块路由
|
||||
*
|
||||
* @description
|
||||
* - /literature - 项目列表
|
||||
* - /literature/project/:id/settings - 设置与启动
|
||||
* - /literature/project/:id/workbench - 审核工作台
|
||||
* - /literature/project/:id/results - 初筛结果
|
||||
*
|
||||
* @version Week 3 Day 6
|
||||
*/
|
||||
export default function ASLRoutes() {
|
||||
return (
|
||||
<Routes>
|
||||
<Route index element={<ProjectList />} />
|
||||
<Route path="project/:projectId">
|
||||
<Route path="settings" element={<ScreeningSettings />} />
|
||||
<Route path="workbench" element={<ScreeningWorkbench />} />
|
||||
<Route path="results" element={<ScreeningResults />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
**验收标准**:
|
||||
- ✅ 顶部导航显示"AI智能文献"(不再是占位)
|
||||
- ✅ 点击后进入项目列表页(即使是空列表)
|
||||
|
||||
---
|
||||
|
||||
### Day 8-10: 实现核心页面
|
||||
|
||||
(由于篇幅限制,核心实现代码请参考任务分解文档)
|
||||
|
||||
**验收标准**:
|
||||
- ✅ Excel上传功能正常
|
||||
- ✅ 审核工作台可展示筛选结果
|
||||
- ✅ 双视图模态框可弹出
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 4: 集成测试与验收
|
||||
|
||||
### Day 11-14: 端到端测试
|
||||
|
||||
(详细测试计划见任务分解文档)
|
||||
|
||||
**验收标准**:
|
||||
- ✅ 完整流程:上传 → 筛选 → 复核 → 导出
|
||||
- ✅ 准确率 ≥ 85%
|
||||
- ✅ 性能达标(100篇 < 10分钟)
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [开发里程碑](./01-开发里程碑.md)
|
||||
- [任务分解(Todo List)](./03-任务分解.md)
|
||||
- [质量保障策略](../02-技术设计/06-质量保障与可追溯策略.md)
|
||||
- [技术选型](../02-技术设计/07-文献处理技术选型.md)
|
||||
- [API设计规范](../02-技术设计/02-API设计规范.md)
|
||||
- [前后端模块化架构设计-V2](../../../00-系统总体设计/前后端模块化架构设计-V2.md)
|
||||
|
||||
---
|
||||
|
||||
**更新日志**:
|
||||
- 2025-11-16: V3.0 重写,基于真实架构(Frontend-v2 + Backend + asl_schema)
|
||||
- 2025-11-16: V2.0 重写,详细到每天的任务和代码示例
|
||||
- 2025-10-29: V1.0 创建,初始版本
|
||||
|
||||
@@ -1,24 +1,942 @@
|
||||
# 任务分解
|
||||
# ASL 模块任务分解(To-do List)
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **文档版本:** V3.0
|
||||
> **创建日期:** 2025-11-16
|
||||
> **适用阶段:** MVP(标题摘要初筛)
|
||||
> **预计周期:** 4 周
|
||||
> **最后更新:** 2025-11-16
|
||||
> **⭐ 重要:基于真实架构(Frontend-v2 + Backend + asl_schema)**
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善
|
||||
## 📋 使用说明
|
||||
|
||||
本文档内容待规划完善,目前仅作为占位文档。
|
||||
本文档是 **ASL 标题摘要初筛模块** 的详细任务分解清单,基于 **真实的架构基础**:
|
||||
- ✅ Frontend-v2(顶部导航 + 模块注册)- Week 2 已完成
|
||||
- ✅ Backend 增量演进(legacy/ + common/ + modules/)- Week 2 已完成
|
||||
- ✅ 数据库 10个Schema隔离 - Week 1 已完成
|
||||
|
||||
**任务状态标记**:
|
||||
- `[ ]` - 待开始
|
||||
- `[🔄]` - 进行中
|
||||
- `[✅]` - 已完成
|
||||
- `[❌]` - 已取消/跳过
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
## 🌥️ 云原生开发要求(2025-11-16 新增)
|
||||
|
||||
> **⭐ 重要提醒**:所有任务必须遵循云原生开发规范
|
||||
> **详细规范**:[云原生开发规范](../../../04-开发规范/08-云原生开发规范.md)
|
||||
|
||||
### 核心要求
|
||||
|
||||
| 要求 | 说明 |
|
||||
|------|------|
|
||||
| ✅ **存储抽象层** | 使用 `StorageFactory`,支持本地/OSS切换 |
|
||||
| ✅ **内存解析** | Excel导入使用 `xlsx.read(buffer)`,不落盘 |
|
||||
| ✅ **异步任务** | LLM筛选必须异步处理(> 10秒) |
|
||||
| ✅ **环境变量** | 所有配置从 `.env` 读取 |
|
||||
| ✅ **数据库连接池** | 使用全局 `prisma` 实例 |
|
||||
| ✅ **OSS字段预留** | `pdfUrl`, `pdfOssKey`, `pdfFileSize` |
|
||||
|
||||
### 每日检查清单
|
||||
|
||||
提交代码前必须确认:
|
||||
- [ ] 是否使用存储抽象层?
|
||||
- [ ] 是否避免文件落盘?
|
||||
- [ ] 是否使用全局 prisma 实例?
|
||||
- [ ] 是否所有配置都从环境变量读取?
|
||||
- [ ] 长时间任务是否异步处理?
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 1: 数据库Schema与后端API框架(Day 1-5)
|
||||
|
||||
### Day 1: Prisma Schema 设计
|
||||
|
||||
#### 数据库任务
|
||||
|
||||
- [ ] **T1.1.1** 设计 asl_schema 表结构
|
||||
- 文件:`backend/prisma/schema.prisma`
|
||||
- 新增4个模型:
|
||||
- `AslScreeningProject`(筛选项目表)
|
||||
- `AslLiterature`(文献条目表)
|
||||
- `AslScreeningResult`(筛选结果表)
|
||||
- `AslScreeningTask`(筛选任务表)
|
||||
- 使用 `@@schema("asl_schema")` 指定Schema
|
||||
- **⭐ 新增要求(云原生)**:在 `AslLiterature` 中添加 OSS 字段
|
||||
- `pdfUrl String? @map("pdf_url")` - PDF访问URL
|
||||
- `pdfOssKey String? @map("pdf_oss_key")` - OSS存储Key
|
||||
- `pdfFileSize Int? @map("pdf_file_size")` - 文件大小(字节)
|
||||
- 说明:MVP阶段预留,V1.0阶段使用
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
- 参考:`02-标题摘要初筛开发计划.md` Week 1 Day 1
|
||||
|
||||
- [ ] **T1.1.2** 在 User 模型中添加关联
|
||||
```prisma
|
||||
// backend/prisma/schema.prisma - User模型添加
|
||||
aslProjects AslScreeningProject[] @relation("AslProjects")
|
||||
```
|
||||
- 预计耗时:10 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.1.3** 运行 Prisma 迁移
|
||||
```bash
|
||||
cd backend
|
||||
npx prisma migrate dev --name add_asl_screening_tables
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.1.4** 生成 Prisma Client
|
||||
```bash
|
||||
npx prisma generate
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.1.5** 验证数据库表创建
|
||||
- 使用 DBeaver 连接数据库
|
||||
- 检查 asl_schema 下的4个表
|
||||
- 检查索引和外键
|
||||
- 预计耗时:15 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 1 验收标准**:
|
||||
- ✅ asl_schema 4张表创建成功
|
||||
- ✅ Prisma Client 生成无错误
|
||||
- ✅ 可查询 asl_schema 表
|
||||
|
||||
---
|
||||
|
||||
### Day 2: 后端目录结构创建
|
||||
|
||||
> **⭐ 前置条件(2025-11-16 更新)**:平台已提供存储服务
|
||||
> **说明**:存储抽象层已在平台级实现(`backend/src/common/storage/`),ASL模块可直接使用
|
||||
> **参考文档**:[平台基础设施规划](../../../09-架构实施/04-平台基础设施规划.md)
|
||||
|
||||
#### 平台服务说明(ASL模块无需实现)
|
||||
|
||||
**平台已提供以下服务**:
|
||||
|
||||
| 服务 | 路径 | 使用方式 | 说明 |
|
||||
|------|------|---------|------|
|
||||
| 存储服务 | `common/storage/` | `import { storage } from '@/common/storage'` | 文件上传下载(本地/OSS) |
|
||||
| 日志系统 | `common/logging/` | `import { logger } from '@/common/logging'` | 标准化日志输出 |
|
||||
| 异步任务 | `common/jobs/` | `import { jobQueue } from '@/common/jobs'` | 长时间任务处理 |
|
||||
| 缓存服务 | `common/cache/` | `import { cache } from '@/common/cache'` | 分布式缓存 |
|
||||
| 数据库 | `config/database.ts` | `import { prisma } from '@/config/database'` | 全局Prisma实例 |
|
||||
|
||||
**示例代码**:
|
||||
```typescript
|
||||
// ASL模块直接使用平台服务
|
||||
import { storage } from '@/common/storage'
|
||||
import { logger } from '@/common/logging'
|
||||
import { jobQueue } from '@/common/jobs'
|
||||
import { prisma } from '@/config/database'
|
||||
|
||||
// 上传文件
|
||||
const url = await storage.upload('asl/literature/123.pdf', pdfBuffer)
|
||||
|
||||
// 记录日志
|
||||
logger.info('Literature uploaded', { projectId, url })
|
||||
|
||||
// 创建异步任务
|
||||
const job = await jobQueue.push('asl:screening', { projectId })
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T1.2.1** 创建 ASL 模块目录结构
|
||||
```bash
|
||||
cd backend/src/modules
|
||||
mkdir -p asl/{routes,controllers,services,schemas,types,utils}
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.2.2** 创建路由文件
|
||||
- `routes/index.ts` - 路由注册
|
||||
- 实现占位函数(返回404或空数组)
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.2.3** 创建控制器文件
|
||||
- `controllers/projectController.ts` - 项目控制器
|
||||
- `controllers/literatureController.ts` - 文献控制器
|
||||
- `controllers/screeningController.ts` - 筛选控制器
|
||||
- 创建占位函数(每个控制器5-7个函数)
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.2.4** 创建服务层文件
|
||||
- `services/projectService.ts` - 项目业务逻辑
|
||||
- `services/literatureService.ts` - 文献业务逻辑
|
||||
- `services/llmScreeningService.ts` - LLM筛选服务
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.2.5** 创建类型定义文件
|
||||
```typescript
|
||||
// types/screening.types.ts
|
||||
export interface Literature { ... }
|
||||
export interface ScreeningResult { ... }
|
||||
export interface Protocol { ... }
|
||||
```
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 2 验收标准**:
|
||||
- ✅ ASL 模块目录结构完整
|
||||
- ✅ 所有占位文件创建完成
|
||||
- ✅ 可正常使用平台服务(storage/logger/prisma等)
|
||||
|
||||
---
|
||||
|
||||
### Day 3: 注册ASL路由
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T1.3.1** 实现 `routes/index.ts`
|
||||
- 注册所有API路由
|
||||
- 参考 `legacy/routes/` 的风格
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
- 参考:`02-标题摘要初筛开发计划.md` Week 1 Day 2
|
||||
|
||||
- [ ] **T1.3.2** 在 `src/index.ts` 中注册ASL路由
|
||||
```typescript
|
||||
import { aslRoutes } from './modules/asl/routes/index.js'
|
||||
await app.register(aslRoutes, { prefix: '/api/v1/asl' })
|
||||
console.log('✅ ASL 路由已注册到 /api/v1/asl/*')
|
||||
```
|
||||
- 预计耗时:10 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.3.3** 测试路由可访问性
|
||||
```bash
|
||||
# 启动后端服务
|
||||
cd backend && npm run dev
|
||||
# 测试健康检查
|
||||
curl http://localhost:3001/api/v1/asl/projects
|
||||
```
|
||||
- 预计耗时:10 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 3 验收标准**:
|
||||
- ✅ 后端服务正常启动
|
||||
- ✅ ASL路由注册成功
|
||||
- ✅ API可访问(返回空数组或404)
|
||||
|
||||
---
|
||||
|
||||
### Day 4-5: 实现基础API
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T1.4.1** 实现 `projectService.ts`
|
||||
- `createProject(userId, data)` - 创建项目
|
||||
- `listProjects(userId)` - 获取项目列表
|
||||
- `getProject(projectId)` - 获取项目详情
|
||||
- 使用 Prisma Client 操作 asl_schema
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.4.2** 实现 `projectController.ts`
|
||||
- `createProject` - 控制器
|
||||
- `listProjects` - 控制器
|
||||
- `getProject` - 控制器
|
||||
- 请求验证、响应格式化
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.4.3** 实现 `literatureService.ts`
|
||||
- `importBatch(projectId, literatures)` - 批量导入
|
||||
- `listLiteratures(projectId, page, pageSize)` - 分页查询
|
||||
- 去重逻辑(基于DOI和标题)
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.4.4** 实现 `literatureController.ts`
|
||||
- `importLiteratures` - 导入控制器
|
||||
- `listLiteratures` - 列表控制器
|
||||
- Excel数据验证
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T1.4.5** Postman 测试
|
||||
- 创建 Postman 测试集合
|
||||
- 测试所有已实现的API
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 4-5 验收标准**:
|
||||
- ✅ 项目管理API可调用
|
||||
- ✅ 文献导入API可调用
|
||||
- ✅ 数据正确保存到 asl_schema
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 2: LLM筛选核心(Day 6-10)
|
||||
|
||||
### Day 6: JSON Schema 与提示词设计
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T2.1.1** 定义 JSON Schema
|
||||
- 文件:`backend/src/modules/asl/schemas/screening.schema.ts`
|
||||
- 定义输出结构(decision, reason, confidence, pico)
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发 + AI工程师
|
||||
|
||||
- [ ] **T2.1.2** 安装验证库
|
||||
```bash
|
||||
cd backend
|
||||
npm install ajv
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.1.3** 编写 Schema 验证函数
|
||||
- 使用 `Ajv` 验证
|
||||
- 错误信息格式化
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.1.4** 设计提示词模板 v1.0.0
|
||||
- 文件:`backend/prompts/asl/screening/v1.0.0-basic.txt`
|
||||
- 包含:PICO标准、纳排标准、输出格式
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:AI工程师 + 医学专家
|
||||
|
||||
- [ ] **T2.1.5** 人工测试提示词
|
||||
- 手动调用 LLM(使用 10 篇样本)
|
||||
- 评估输出质量
|
||||
- 迭代优化提示词
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:AI工程师
|
||||
|
||||
**Day 6 验收标准**:
|
||||
- ✅ JSON Schema 定义完成
|
||||
- ✅ 提示词人工测试准确率 ≥ 80%
|
||||
|
||||
---
|
||||
|
||||
### Day 7: LLM 服务封装
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T2.2.1** 创建 `llmScreeningService.ts`
|
||||
- 预计耗时:10 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.2** 实现 `callModel` 方法
|
||||
- 调用 `LLMFactory.createLLM()`(复用 common/llm)
|
||||
- 设置参数(temperature: 0)
|
||||
- 错误处理
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.3** 实现 `parseModelOutput` 方法
|
||||
- JSON 解析(使用 `common/utils/jsonParser.js`)
|
||||
- Schema 验证
|
||||
- 格式化为 `ModelDecision`
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.4** 实现 `compareDecisions` 方法
|
||||
- 对比两个模型的 PICO 判断
|
||||
- 识别冲突字段
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.5** 实现 `shouldReview` 方法
|
||||
- 自动分流规则
|
||||
- 置信度阈值(< 0.7)
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.6** 实现 `dualModelScreening` 方法
|
||||
- 并行调用两个模型(`Promise.all`)
|
||||
- 汇总结果
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.2.7** 单元测试
|
||||
- 测试 JSON 解析
|
||||
- 测试冲突检测
|
||||
- 测试分流规则
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 7 验收标准**:
|
||||
- ✅ 可成功调用 DeepSeek 和 Qwen3
|
||||
- ✅ JSON Schema 验证通过率 > 95%
|
||||
- ✅ 冲突检测准确
|
||||
|
||||
---
|
||||
|
||||
### Day 8: 批量筛选任务管理
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T2.3.1** 实现 `batchScreening` 方法
|
||||
- 分组逻辑(15篇/组)
|
||||
- 并行处理(`Promise.all`)
|
||||
- 进度计算
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.3.2** 实现任务创建
|
||||
- `screeningService.createTask`
|
||||
- 初始化任务记录(AslScreeningTask表)
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.3.3** 实现任务状态更新
|
||||
- `screeningService.updateTaskProgress`
|
||||
- 更新 processedItems, successItems 等
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.3.4** 实现结果保存
|
||||
- `screeningService.saveResults`
|
||||
- 批量保存到 `AslScreeningResult` 表
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.3.5** 错误处理和重试
|
||||
- 单篇失败不影响整体
|
||||
- 记录错误信息
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 8 验收标准**:
|
||||
- ✅ 可批量处理 100 篇文献
|
||||
- ✅ 任务状态正确记录
|
||||
- ✅ 结果正确保存到数据库
|
||||
|
||||
---
|
||||
|
||||
### Day 9: 筛选 API 开发
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T2.4.1** 实现启动筛选 API
|
||||
- `POST /api/v1/asl/projects/:id/screening/start`
|
||||
- 创建任务
|
||||
- **⭐ 云原生要求**:异步执行筛选(立即返回taskId,后台处理)
|
||||
- 避免请求超时(SAE默认30秒超时限制)
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
- 参考:[云原生开发规范 - 原则5](../../../04-开发规范/08-云原生开发规范.md)
|
||||
|
||||
- [ ] **T2.4.2** 实现进度查询 API
|
||||
- `GET /api/v1/asl/screening/tasks/:taskId/progress`
|
||||
- 返回实时进度
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.4.3** 实现结果查询 API
|
||||
- `GET /api/v1/asl/projects/:id/screening/results`
|
||||
- 支持过滤(conflictOnly, finalDecision)
|
||||
- 分页
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.4.4** 实现更新决策 API
|
||||
- `PUT /api/v1/asl/screening/results/:id`
|
||||
- `POST /api/v1/asl/screening/results/batch-update`
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.4.5** Postman 测试
|
||||
- 创建测试集合
|
||||
- 测试各种场景
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
**Day 9 验收标准**:
|
||||
- ✅ API 调用成功
|
||||
- ✅ 任务可异步执行
|
||||
- ✅ 进度查询实时准确
|
||||
|
||||
---
|
||||
|
||||
### Day 10: 后端集成测试
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T2.5.1** 端到端测试(50篇文献)
|
||||
- 导入文献 → 启动筛选 → 查询结果
|
||||
- 预计耗时:30 分钟执行 + 1小时分析
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.5.2** 性能测试
|
||||
- 测试 100 篇文献筛选时间
|
||||
- 目标:< 10 分钟
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T2.5.3** 质量评估
|
||||
- 计算准确率(对比金标准,如果有)
|
||||
- 计算双模型一致率
|
||||
- 计算冲突率
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:AI工程师
|
||||
|
||||
- [ ] **T2.5.4** 修复 Bug
|
||||
- 根据测试结果修复
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
**Week 2 总验收标准**:
|
||||
- ✅ 可成功筛选 100 篇文献
|
||||
- ✅ 准确率 ≥ 85%
|
||||
- ✅ 双模型一致率 ≥ 80%
|
||||
- ✅ 性能达标(100篇 < 10分钟)
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 3: 前端模块开发(Day 11-15)
|
||||
|
||||
### Day 11: 前端模块结构创建
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T3.1.1** 更新 `modules/asl/index.tsx`
|
||||
- 移除 `placeholder: true` 标记
|
||||
- 改为 `placeholder: false`
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.1.2** 创建 ASL 子目录
|
||||
```bash
|
||||
cd frontend-v2/src/modules/asl
|
||||
mkdir pages components api hooks types utils
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.1.3** 创建路由配置 `routes.tsx`
|
||||
- 定义4个子路由
|
||||
- 使用 `lazy()` 懒加载
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.1.4** 创建4个主页面(占位)
|
||||
- `pages/ProjectList.tsx`
|
||||
- `pages/ScreeningSettings.tsx`
|
||||
- `pages/ScreeningWorkbench.tsx`
|
||||
- `pages/ScreeningResults.tsx`
|
||||
- 每个页面显示"开发中"占位
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.1.5** 测试路由
|
||||
- 启动前端:`cd frontend-v2 && npm run dev`
|
||||
- 访问 `http://localhost:3000/literature`
|
||||
- 确认顶部导航显示"AI智能文献"
|
||||
- 预计耗时:10 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
**Day 11 验收标准**:
|
||||
- ✅ 顶部导航显示"AI智能文献"(不再是占位)
|
||||
- ✅ 点击后进入项目列表页
|
||||
|
||||
---
|
||||
|
||||
### Day 12: Excel 上传功能
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T3.2.1** 安装依赖
|
||||
```bash
|
||||
cd frontend-v2
|
||||
npm install xlsx
|
||||
```
|
||||
- 预计耗时:5 分钟
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.2.2** 创建 `ExcelUploader` 组件
|
||||
- 文件选择(`antd Upload`)
|
||||
- 文件类型验证(.xls, .xlsx)
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.2.3** 实现 Excel 解析逻辑
|
||||
- 使用 `xlsx` 库解析
|
||||
- **⭐ 云原生要求**:内存解析 `xlsx.read(buffer)`,禁止落盘
|
||||
- 字段映射(Title → title)
|
||||
- 数据验证(必填字段)
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:前端开发
|
||||
- 参考:[云原生开发规范 - 禁止做法2](../../../04-开发规范/08-云原生开发规范.md)
|
||||
|
||||
- [ ] **T3.2.4** 实现去重逻辑
|
||||
- 基于 DOI 去重
|
||||
- 基于标题去重(标准化)
|
||||
- 去重统计展示
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.2.5** 实现文献预览表格
|
||||
- 使用 `Ant Design Table`
|
||||
- 显示:标题、摘要(截断)、作者、年份、期刊
|
||||
- 分页(50条/页)
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
**Day 12 验收标准**:
|
||||
- ✅ 可成功上传 Excel 文件
|
||||
- ✅ 解析后数据正确展示
|
||||
- ✅ 去重功能正常
|
||||
|
||||
---
|
||||
|
||||
### Day 13: API 客户端封装
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T3.3.1** 创建 API 客户端
|
||||
- `api/index.ts`
|
||||
- 使用 `axios` 或 `fetch`
|
||||
- 复用 `shared/api/client` 配置
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.3.2** 实现项目 API
|
||||
- `createProject(data)`
|
||||
- `listProjects()`
|
||||
- `getProject(id)`
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.3.3** 实现文献 API
|
||||
- `importLiteratures(projectId, data)`
|
||||
- `listLiteratures(projectId, page, pageSize)`
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.3.4** 实现筛选 API
|
||||
- `startScreening(projectId)`
|
||||
- `getScreeningResults(projectId, filters)`
|
||||
- `updateScreeningResult(resultId, data)`
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.3.5** 前后端联调
|
||||
- 测试所有API调用
|
||||
- 错误处理
|
||||
- Loading 状态
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:前端开发 + 后端开发
|
||||
|
||||
**Day 13 验收标准**:
|
||||
- ✅ API 客户端可正常调用后端
|
||||
- ✅ 上传Excel后数据保存到数据库
|
||||
|
||||
---
|
||||
|
||||
### Day 14-15: 审核工作台(核心UI)
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T3.4.1** 实现 `ScreeningTable` 组件
|
||||
- 双行表格结构(主行 + 展开行)
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.4.2** 实现表头
|
||||
- 第一行:DS 判断、Qwen 判断(合并单元格)
|
||||
- 第二行:P、I、C、S、结论
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.4.3** 实现主行
|
||||
- 展开/收起按钮
|
||||
- 文献ID、研究ID、来源
|
||||
- DS和Qwen的PICO判断(✓/✗/?)
|
||||
- 冲突状态
|
||||
- 最终决策下拉框
|
||||
- 预计耗时:3 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.4.4** 实现展开行
|
||||
- 显示DS和Qwen的证据短语
|
||||
- 格式化展示
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.4.5** 实现冲突高亮
|
||||
- 冲突行背景色变红
|
||||
- 冲突字段标记
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T3.4.6** 实现双视图原文审查模态框
|
||||
- 使用 `Ant Design Modal`
|
||||
- 左侧:摘要展示 + 高亮证据
|
||||
- 右侧:双模型详情(Tab切换)
|
||||
- 预计耗时:3 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
**Day 14-15 验收标准**:
|
||||
- ✅ 审核工作台完整可用
|
||||
- ✅ 表格可正确展示筛选结果
|
||||
- ✅ 冲突项高亮显示
|
||||
- ✅ 双视图模态框可弹出
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ Week 4: 结果展示与集成测试(Day 16-20)
|
||||
|
||||
### Day 16: 结果统计与展示
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T4.1.1** 实现统计概览卡片
|
||||
- 总数、纳入、排除、待定
|
||||
- 使用 `Ant Design Statistic`
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T4.1.2** 实现 PRISMA 式排除总结
|
||||
- 按排除原因分组统计
|
||||
- 柱状图展示
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T4.1.3** 实现结果列表 Tab 页
|
||||
- 纳入 Tab
|
||||
- 排除 Tab
|
||||
- 待定 Tab
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
- [ ] **T4.1.4** 实现结果表格
|
||||
- 列:文献ID、研究ID、标题、决策、理由
|
||||
- 可展开查看摘要
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
**Day 16 验收标准**:
|
||||
- ✅ 统计数据正确展示
|
||||
- ✅ PRISMA 排除总结清晰
|
||||
- ✅ 结果列表可正常查看
|
||||
|
||||
---
|
||||
|
||||
### Day 17: Excel 导出功能
|
||||
|
||||
#### 后端任务
|
||||
|
||||
- [ ] **T4.2.1** 后端实现导出逻辑
|
||||
- 使用 `exceljs` 库
|
||||
- 生成 Excel 文件
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T4.2.2** 实现导出 API
|
||||
- `GET /api/v1/asl/projects/:id/screening/results/export`
|
||||
- 支持过滤参数(导出全部/仅纳入/仅排除)
|
||||
- 预计耗时:1.5 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
#### 前端任务
|
||||
|
||||
- [ ] **T4.2.3** 前端实现导出按钮
|
||||
- 调用导出 API
|
||||
- 下载文件
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:前端开发
|
||||
|
||||
**Day 17 验收标准**:
|
||||
- ✅ 可成功导出 Excel
|
||||
- ✅ 导出格式规范
|
||||
- ✅ 数据完整准确
|
||||
|
||||
---
|
||||
|
||||
### Day 18: 完整流程测试
|
||||
|
||||
#### 集成测试任务
|
||||
|
||||
- [ ] **T4.3.1** 端到端完整流程测试
|
||||
- 上传 → 筛选 → 复核 → 导出
|
||||
- 使用真实的 199 篇测试数据
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:全栈开发 + 测试
|
||||
|
||||
- [ ] **T4.3.2** 异常场景测试
|
||||
- 网络中断
|
||||
- API 错误
|
||||
- 数据格式错误
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:测试
|
||||
|
||||
- [ ] **T4.3.3** 性能测试
|
||||
- 500 篇文献筛选
|
||||
- 大文件导出
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:测试
|
||||
|
||||
- [ ] **T4.3.4** 修复 Bug
|
||||
- 记录和修复所有发现的问题
|
||||
- 预计耗时:3 小时
|
||||
- 负责人:全栈开发
|
||||
|
||||
**Day 18 验收标准**:
|
||||
- ✅ 完整流程无阻塞
|
||||
- ✅ 异常处理完善
|
||||
- ✅ 性能达标
|
||||
|
||||
---
|
||||
|
||||
### Day 19: 质量验收
|
||||
|
||||
#### 质量验收任务
|
||||
|
||||
- [ ] **T4.4.1** 准确率测试
|
||||
- 使用金标准数据集(199 篇)
|
||||
- 计算准确率、召回率、F1
|
||||
- 目标:准确率 ≥ 85%
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:AI工程师 + 医学专家
|
||||
|
||||
- [ ] **T4.4.2** 双模型一致性测试
|
||||
- 计算一致率
|
||||
- 目标:≥ 80%
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:AI工程师
|
||||
|
||||
- [ ] **T4.4.3** JSON Schema 验证率测试
|
||||
- 统计验证通过率
|
||||
- 目标:≥ 95%
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T4.4.4** 人工复核队列测试
|
||||
- 统计需人工复核的比例
|
||||
- 目标:≤ 20%
|
||||
- 预计耗时:30 分钟
|
||||
- 负责人:AI工程师
|
||||
|
||||
- [ ] **T4.4.5** 根据测试结果优化
|
||||
- 调整提示词
|
||||
- 调整分流阈值
|
||||
- 预计耗时:3 小时
|
||||
- 负责人:AI工程师
|
||||
|
||||
**Day 19 验收标准**:
|
||||
- ✅ 准确率 ≥ 85%
|
||||
- ✅ 双模型一致率 ≥ 80%
|
||||
- ✅ JSON Schema 验证通过率 ≥ 95%
|
||||
- ✅ 人工复核队列 ≤ 20%
|
||||
|
||||
---
|
||||
|
||||
### Day 20: 文档与交付
|
||||
|
||||
#### 文档任务
|
||||
|
||||
- [ ] **T4.5.1** 编写用户手册
|
||||
- 功能介绍
|
||||
- 操作步骤
|
||||
- 常见问题
|
||||
- 预计耗时:3 小时
|
||||
- 负责人:产品经理
|
||||
|
||||
- [ ] **T4.5.2** 编写技术文档
|
||||
- 架构设计
|
||||
- API 文档
|
||||
- 数据库设计
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:后端开发
|
||||
|
||||
- [ ] **T4.5.3** 编写测试报告
|
||||
- 测试用例
|
||||
- 测试结果
|
||||
- 质量指标
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:测试
|
||||
|
||||
- [ ] **T4.5.4** 代码审查
|
||||
- 代码规范检查
|
||||
- 安全性检查
|
||||
- 性能检查
|
||||
- 预计耗时:2 小时
|
||||
- 负责人:技术 Leader
|
||||
|
||||
- [ ] **T4.5.5** 准备演示环境
|
||||
- 部署到测试环境
|
||||
- 准备演示数据
|
||||
- 预计耗时:1 小时
|
||||
- 负责人:运维
|
||||
|
||||
**Day 20 验收标准**:
|
||||
- ✅ 文档完整
|
||||
- ✅ 代码质量合格
|
||||
- ✅ 测试报告完整
|
||||
- ✅ 演示环境就绪
|
||||
|
||||
---
|
||||
|
||||
## 📊 总体验收清单
|
||||
|
||||
### 功能完整性
|
||||
|
||||
- [ ] ✅ 用户可上传 Excel 文件
|
||||
- [ ] ✅ Excel 格式验证正常
|
||||
- [ ] ✅ 文献去重功能正常
|
||||
- [ ] ✅ AI 双模型筛选可运行
|
||||
- [ ] ✅ 冲突自动检测和标记
|
||||
- [ ] ✅ 人工复核界面完整
|
||||
- [ ] ✅ 批量操作功能正常
|
||||
- [ ] ✅ 结果统计正确展示
|
||||
- [ ] ✅ Excel 导出功能正常
|
||||
- [ ] ✅ ASL模块在顶部导航显示并可点击
|
||||
|
||||
### 质量指标
|
||||
|
||||
- [ ] ✅ 准确率 ≥ 85%
|
||||
- [ ] ✅ 双模型一致率 ≥ 80%
|
||||
- [ ] ✅ JSON Schema 验证通过率 ≥ 95%
|
||||
- [ ] ✅ 人工复核队列 ≤ 20%
|
||||
|
||||
### 性能指标
|
||||
|
||||
- [ ] ✅ 100 篇文献筛选 ≤ 10 分钟
|
||||
- [ ] ✅ Excel 上传响应 ≤ 3 秒
|
||||
- [ ] ✅ 页面加载 ≤ 2 秒
|
||||
|
||||
### 架构验证
|
||||
|
||||
- [ ] ✅ ASL模块正确注册到 moduleRegistry.ts
|
||||
- [ ] ✅ 后端路由注册到 /api/v1/asl/*
|
||||
- [ ] ✅ 数据保存到 asl_schema
|
||||
- [ ] ✅ 复用 common/llm 成功
|
||||
- [ ] ✅ Prisma Client 正常工作
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [开发里程碑](./01-开发里程碑.md)
|
||||
- [标题摘要初筛开发计划](./02-标题摘要初筛开发计划.md)
|
||||
- [质量保障策略](../02-技术设计/06-质量保障与可追溯策略.md)
|
||||
- [技术选型](../02-技术设计/07-文献处理技术选型.md)
|
||||
- [API 设计规范](../02-技术设计/02-API设计规范.md)
|
||||
- [前后端模块化架构设计-V2](../../../00-系统总体设计/前后端模块化架构设计-V2.md)
|
||||
- [Schema隔离架构设计](../../../09-架构实施/01-Schema隔离架构设计(10个).md)
|
||||
|
||||
---
|
||||
|
||||
**更新日志**:
|
||||
- 2025-11-16: V3.0 完全重写,基于真实架构(Frontend-v2 + Backend + asl_schema),详细到每个任务
|
||||
- 2025-11-16: V2.0 完全重写,详细到每个任务(预计耗时、负责人、验收标准)
|
||||
- 2025-10-29: V1.0 创建,初始占位符
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# 请将您的测试数据放在此目录
|
||||
|
||||
## 所需文件:
|
||||
- literature-list-199.xlsx
|
||||
- picos-criteria.txt
|
||||
- gold-standard.json
|
||||
|
||||
|
||||
|
||||
|
||||
416
docs/03-业务模块/ASL-AI智能文献/[AI对接] ASL模块快速上下文.md
Normal file
416
docs/03-业务模块/ASL-AI智能文献/[AI对接] ASL模块快速上下文.md
Normal file
@@ -0,0 +1,416 @@
|
||||
# ASL模块开发 - AI对接快速上下文
|
||||
|
||||
> **创建日期:** 2025-11-16
|
||||
> **适用对象:** 新的AI编程助手、新开发人员
|
||||
> **目的:** 5分钟快速了解项目状态,立即开始工作
|
||||
> **版本:** V1.0
|
||||
|
||||
---
|
||||
|
||||
## 📍 项目定位
|
||||
|
||||
**AIclinicalresearch** 是一个医学科研AI平台,当前正在开发 **ASL(AI智能文献)** 模块。
|
||||
|
||||
**ASL模块功能**:AI驱动的医学文献筛选和数据提取系统(类似Cochrane系统评价流程)
|
||||
|
||||
---
|
||||
|
||||
## ✅ 当前状态(2025-11-16)
|
||||
|
||||
### 已完成的基础工作
|
||||
|
||||
| 工作项 | 状态 | 完成时间 |
|
||||
|--------|------|---------|
|
||||
| 数据库Schema隔离(10个Schema) | ✅ 完成 | Week 1 (11月初) |
|
||||
| Frontend-v2架构(顶部导航+模块注册) | ✅ 完成 | Week 2 Day 6-7 |
|
||||
| Backend增量演进(legacy/common/modules) | ✅ 完成 | Week 2 Day 8-9 |
|
||||
| ASL开发计划文档(3个) | ✅ 完成 | 2025-11-16 |
|
||||
| **ASL模块代码** | 🚧 未开始 | 待Week 3 |
|
||||
|
||||
### 架构现状
|
||||
|
||||
```
|
||||
Frontend-v2(新) Backend(混合) Database(隔离)
|
||||
↓ ↓ ↓
|
||||
顶部导航 + 6模块 legacy/ + common/ 10个独立Schema
|
||||
ASL占位 + modules/asl/ asl_schema空
|
||||
|
||||
✅ 架构已就绪 ✅ LLM可复用 🚧 表结构待定义
|
||||
✅ 路由框架完成 ✅ 工具可复用 🚧 Prisma模型待添加
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 下一步任务
|
||||
|
||||
### MVP阶段(4周):标题摘要初筛
|
||||
|
||||
**交付目标**:
|
||||
- Excel文献导入 → AI双模型筛选(DeepSeek+Qwen3) → 人工复核 → 导出结果
|
||||
- 准确率 ≥ 85%
|
||||
- 成本 ≤ ¥50/1000篇
|
||||
|
||||
**开发顺序**:
|
||||
```
|
||||
Week 1: Prisma Schema设计(4张表) + 后端API框架 + 路由注册
|
||||
Week 2: LLM筛选核心(双模型并行 + JSON Schema + 冲突检测)
|
||||
Week 3: 前端模块开发(3个页面 + 审核工作台)
|
||||
Week 4: 集成测试与验收(准确率测试 + 性能测试)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 必读文档(5个,按顺序)
|
||||
|
||||
### 1️⃣ 理解架构(必读)
|
||||
**`docs/00-系统总体设计/前后端模块化架构设计-V2.md`**
|
||||
- 📍 位置:第51-519行
|
||||
- 🎯 重点:「📸 当前架构真实状态(2025-11-14)」章节
|
||||
- ⏱️ 阅读时间:10分钟
|
||||
- 📌 关键信息:
|
||||
- Frontend-v2 目录结构(`framework/` + `modules/`)
|
||||
- Backend 目录结构(`legacy/` + `common/` + `modules/`)
|
||||
- 10个Schema列表
|
||||
- API路由规范(`/api/v1/asl/*`)
|
||||
|
||||
### 2️⃣ 理解数据库(必读)
|
||||
**`docs/09-架构实施/01-Schema隔离架构设计(10个).md`**
|
||||
- 🎯 重点:asl_schema 当前为空Schema,需在Week 3 Day 1定义表结构
|
||||
- ⏱️ 阅读时间:5分钟
|
||||
- 📌 关键信息:
|
||||
- 10个Schema名称和用途
|
||||
- asl_schema 占位说明
|
||||
- Prisma multiSchema配置
|
||||
|
||||
### 3️⃣ 执行任务清单(核心)
|
||||
**`docs/03-业务模块/ASL-AI智能文献/04-开发计划/03-任务分解.md`**
|
||||
- 🎯 重点:80+个详细任务,每个有ID、耗时、验收标准
|
||||
- ⏱️ 阅读时间:15分钟
|
||||
- 📌 关键信息:
|
||||
- 第一个任务:T1.1.1 - 设计Prisma Schema
|
||||
- Week 1-4 每天的任务清单
|
||||
- 每个任务的验收标准
|
||||
|
||||
### 4️⃣ 技术实现细节(参考)
|
||||
**`docs/03-业务模块/ASL-AI智能文献/04-开发计划/02-标题摘要初筛开发计划.md`**
|
||||
- 🎯 重点:Week 1 Day 1 包含完整的Prisma Schema代码(可直接复制)
|
||||
- ⏱️ 阅读时间:20分钟
|
||||
- 📌 关键信息:
|
||||
- 完整的Prisma Schema定义(4个模型)
|
||||
- LLM筛选服务代码示例
|
||||
- 提示词模板示例
|
||||
|
||||
### 5️⃣ 质量保障策略(重要)
|
||||
**`docs/03-业务模块/ASL-AI智能文献/02-技术设计/06-质量保障与可追溯策略.md`**
|
||||
- 🎯 重点:双模型验证、JSON Schema、置信度评分、自动分流规则
|
||||
- ⏱️ 阅读时间:10分钟
|
||||
|
||||
---
|
||||
|
||||
## 🚀 立即行动(第一步)
|
||||
|
||||
### Step 1: 设计数据库Schema
|
||||
```bash
|
||||
# 1. 打开文件
|
||||
code backend/prisma/schema.prisma
|
||||
|
||||
# 2. 添加4个模型(参考 02-标题摘要初筛开发计划.md Week 1 Day 1)
|
||||
# - AslScreeningProject
|
||||
# - AslLiterature
|
||||
# - AslScreeningResult
|
||||
# - AslScreeningTask
|
||||
# 注意:每个模型必须添加 @@schema("asl_schema")
|
||||
|
||||
# 3. 在User模型中添加关联
|
||||
# aslProjects AslScreeningProject[] @relation("AslProjects")
|
||||
|
||||
# 4. 运行迁移
|
||||
cd backend
|
||||
npx prisma migrate dev --name add_asl_screening_tables
|
||||
npx prisma generate
|
||||
```
|
||||
|
||||
### Step 2: 创建后端目录
|
||||
```bash
|
||||
cd backend/src/modules
|
||||
mkdir -p asl/{routes,controllers,services,schemas,types,utils}
|
||||
```
|
||||
|
||||
### Step 3: 注册路由
|
||||
在 `backend/src/index.ts` 中添加:
|
||||
```typescript
|
||||
import { aslRoutes } from './modules/asl/routes/index.js'
|
||||
await app.register(aslRoutes, { prefix: '/api/v1/asl' })
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 关键架构路径
|
||||
|
||||
### Frontend-v2(真实)
|
||||
```
|
||||
frontend-v2/src/
|
||||
├── framework/
|
||||
│ ├── layout/
|
||||
│ │ ├── MainLayout.tsx # ✅ 顶部导航布局
|
||||
│ │ └── TopNavigation.tsx # ✅ 6个模块导航
|
||||
│ └── modules/
|
||||
│ └── moduleRegistry.ts # ✅ 模块注册中心
|
||||
│
|
||||
└── modules/asl/
|
||||
├── index.tsx # 🚧 需移除 placeholder: true
|
||||
└── routes.tsx # 🚧 待创建
|
||||
```
|
||||
|
||||
### Backend(真实)
|
||||
```
|
||||
backend/src/
|
||||
├── common/ # ✅ 可复用
|
||||
│ ├── llm/adapters/
|
||||
│ │ ├── LLMFactory.ts # ✅ 调用DeepSeek+Qwen3
|
||||
│ │ ├── DeepSeekAdapter.ts
|
||||
│ │ └── QwenAdapter.ts
|
||||
│ └── utils/
|
||||
│ └── jsonParser.js # ✅ JSON解析工具
|
||||
│
|
||||
├── legacy/ # ✅ 现有业务(不动)
|
||||
│ ├── routes/ # 7个路由文件
|
||||
│ └── services/
|
||||
│
|
||||
└── modules/ # 🚧 新模块开发区
|
||||
└── asl/ # 🚧 空目录(待创建)
|
||||
├── routes/index.ts # 注册到 /api/v1/asl
|
||||
├── controllers/
|
||||
├── services/
|
||||
│ └── llmScreeningService.ts # 复用common/llm
|
||||
└── schemas/
|
||||
```
|
||||
|
||||
### Database(真实)
|
||||
```prisma
|
||||
// backend/prisma/schema.prisma
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
schemas = [
|
||||
"platform_schema", # ✅ users表
|
||||
"aia_schema", # ✅ 5张表(AI问答)
|
||||
"pkb_schema", # ✅ 5张表(知识库)
|
||||
"asl_schema", # 🚧 空Schema(Week 3定义4张表)
|
||||
// ...其他6个预留Schema
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 MVP验收标准
|
||||
|
||||
### 功能
|
||||
- [ ] Excel上传 → 解析 → 导入
|
||||
- [ ] AI双模型筛选(DeepSeek + Qwen3)
|
||||
- [ ] 冲突检测和标记
|
||||
- [ ] 人工复核界面
|
||||
- [ ] 结果导出
|
||||
|
||||
### 质量指标
|
||||
- [ ] 准确率 ≥ 85%
|
||||
- [ ] 双模型一致率 ≥ 80%
|
||||
- [ ] JSON Schema验证通过率 ≥ 95%
|
||||
- [ ] 人工复核队列 ≤ 20%
|
||||
|
||||
### 性能指标
|
||||
- [ ] 100篇文献筛选 ≤ 10分钟
|
||||
- [ ] Excel上传响应 ≤ 3秒
|
||||
|
||||
---
|
||||
|
||||
## 🔑 技术要点速查
|
||||
|
||||
### 复用现有能力
|
||||
```typescript
|
||||
// ✅ LLM调用(已实现)
|
||||
import { LLMFactory } from '../../../common/llm/adapters/LLMFactory.js'
|
||||
const llm = LLMFactory.createLLM('deepseek') // 或 'qwen'
|
||||
|
||||
// ✅ JSON解析(已实现)
|
||||
import { parseJSON } from '../../../common/utils/jsonParser.js'
|
||||
const result = parseJSON(llmOutput)
|
||||
|
||||
// ✅ 数据库操作(Prisma)
|
||||
import { prisma } from '../../../config/database.js'
|
||||
await prisma.aslScreeningProject.create({ data: {...} })
|
||||
```
|
||||
|
||||
### 前端模块注册
|
||||
```typescript
|
||||
// frontend-v2/src/modules/asl/index.tsx
|
||||
const ASLModule: ModuleDefinition = {
|
||||
id: 'literature-platform',
|
||||
name: 'AI智能文献',
|
||||
path: '/literature',
|
||||
placeholder: false, // ← 改为 false
|
||||
requiredVersion: 'advanced',
|
||||
component: lazy(() => import('./routes')),
|
||||
}
|
||||
```
|
||||
|
||||
### 后端路由注册
|
||||
```typescript
|
||||
// backend/src/index.ts
|
||||
import { aslRoutes } from './modules/asl/routes/index.js'
|
||||
await app.register(aslRoutes, { prefix: '/api/v1/asl' })
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 常见陷阱
|
||||
|
||||
| 陷阱 | 正确做法 |
|
||||
|------|---------|
|
||||
| ❌ 创建新架构 | ✅ 在 Frontend-v2 和 Backend/modules/ 下开发 |
|
||||
| ❌ 表放在 public schema | ✅ 必须使用 `@@schema("asl_schema")` |
|
||||
| ❌ 重新实现LLM调用 | ✅ 复用 `common/llm/adapters/LLMFactory.ts` |
|
||||
| ❌ 不更新moduleRegistry | ✅ 必须在 `moduleRegistry.ts` 注册 |
|
||||
| ❌ 忽略编码规范 | ✅ 参考 `docs/04-开发规范/06-Git提交规范.md` |
|
||||
|
||||
---
|
||||
|
||||
## 📞 关键文件路径速查
|
||||
|
||||
### 开发计划文档
|
||||
```
|
||||
docs/03-业务模块/ASL-AI智能文献/04-开发计划/
|
||||
├── 01-开发里程碑.md ⭐ MVP/V1.0/V2.0三阶段路线图
|
||||
├── 02-标题摘要初筛开发计划.md ⭐⭐ 包含完整代码示例
|
||||
└── 03-任务分解.md ⭐⭐⭐ 80+个详细任务清单(立即执行)
|
||||
```
|
||||
|
||||
### 架构设计文档
|
||||
```
|
||||
docs/00-系统总体设计/
|
||||
└── 前后端模块化架构设计-V2.md ⭐ 第51-519行:当前架构真实状态
|
||||
|
||||
docs/09-架构实施/
|
||||
└── 01-Schema隔离架构设计(10个).md ⭐ 10个Schema全景
|
||||
```
|
||||
|
||||
### 技术设计文档
|
||||
```
|
||||
docs/03-业务模块/ASL-AI智能文献/02-技术设计/
|
||||
├── 06-质量保障与可追溯策略.md 双模型、JSON Schema、分流规则
|
||||
└── 07-文献处理技术选型.md Excel、PDF、Unpaywall API
|
||||
```
|
||||
|
||||
### 需求与原型
|
||||
```
|
||||
docs/03-业务模块/ASL-AI智能文献/
|
||||
├── 01-需求分析/
|
||||
│ ├── AI智能文献PRD(1)-产品概览.md
|
||||
│ ├── AI智能文献PRD(2)-初筛与复筛.md
|
||||
│ └── AI智能文献PRD(3)-提取与分析模块.md
|
||||
└── 03-UI设计/
|
||||
├── AI智能文献-标题摘要初筛原型.html # 原型图
|
||||
└── AI智能文献-全文复筛.html
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔥 立即开始(3步走)
|
||||
|
||||
### 第1步:阅读核心文档(20分钟)
|
||||
1. 打开 `前后端模块化架构设计-V2.md`,阅读第51-519行
|
||||
2. 打开 `03-任务分解.md`,了解80+个任务清单
|
||||
3. 打开 `02-标题摘要初筛开发计划.md`,查看Week 1 Day 1的Prisma Schema代码
|
||||
|
||||
### 第2步:执行第一个任务(30分钟)
|
||||
**任务ID:T1.1.1** - 设计Prisma Schema
|
||||
1. 打开 `backend/prisma/schema.prisma`
|
||||
2. 复制 `02-标题摘要初筛开发计划.md` 中Week 1 Day 1的完整Prisma代码
|
||||
3. 添加4个模型:AslScreeningProject、AslLiterature、AslScreeningResult、AslScreeningTask
|
||||
4. 运行迁移:`cd backend && npx prisma migrate dev --name add_asl_screening_tables`
|
||||
5. 生成Client:`npx prisma generate`
|
||||
|
||||
### 第3步:创建后端目录(10分钟)
|
||||
```bash
|
||||
cd backend/src/modules
|
||||
mkdir -p asl/{routes,controllers,services,schemas,types,utils}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 快速问答
|
||||
|
||||
**Q1:前端是左侧导航还是顶部导航?**
|
||||
A:✅ 顶部导航(Frontend-v2使用TopNavigation.tsx,显示6个模块)
|
||||
|
||||
**Q2:后端代码放在哪里?**
|
||||
A:✅ `backend/src/modules/asl/`(新模块标准位置)
|
||||
|
||||
**Q3:数据库表放在哪个Schema?**
|
||||
A:✅ 必须使用 `@@schema("asl_schema")`,不能放在public
|
||||
|
||||
**Q4:如何调用LLM?**
|
||||
A:✅ 复用 `common/llm/adapters/LLMFactory.ts`,已支持DeepSeek和Qwen3
|
||||
|
||||
**Q5:如何注册前端模块?**
|
||||
A:✅ 更新 `frontend-v2/src/modules/asl/index.tsx`,移除 `placeholder: true`
|
||||
|
||||
**Q6:API路由前缀是什么?**
|
||||
A:✅ `/api/v1/asl/*`(在 `backend/src/index.ts` 中注册)
|
||||
|
||||
**Q7:第一个任务是什么?**
|
||||
A:✅ T1.1.1 - 在 `backend/prisma/schema.prisma` 中定义4个模型
|
||||
|
||||
---
|
||||
|
||||
## 📊 技术栈速查
|
||||
|
||||
| 层级 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| 前端 | React + TypeScript + Ant Design | 19 + 5.x |
|
||||
| 后端 | Node.js + Fastify + Prisma | 20 + 4.x + 6.17.0 |
|
||||
| 数据库 | PostgreSQL | 15.x |
|
||||
| LLM | DeepSeek-V3 + Qwen3-72B | via CloseAI |
|
||||
|
||||
---
|
||||
|
||||
## 🎬 工作流
|
||||
|
||||
```
|
||||
1. 阅读 → 2. 设计Prisma Schema → 3. 创建后端目录 → 4. 实现API → 5. 前端开发 → 6. 测试
|
||||
(20min) (2hr) (30min) (2天) (1周) (1周)
|
||||
|
||||
参考:03-任务分解.md 中的详细清单
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 最后提醒
|
||||
|
||||
1. **不要从零开始**:Frontend-v2和Backend架构已完成,直接在此基础上开发
|
||||
2. **复用common层**:LLM、JSON解析、文档提取都可复用
|
||||
3. **遵循Schema隔离**:所有ASL表必须在 `asl_schema` 中
|
||||
4. **参考任务清单**:`03-任务分解.md` 有80+个任务,逐个执行
|
||||
5. **代码在文档中**:`02-标题摘要初筛开发计划.md` 包含完整代码示例,可直接复制
|
||||
|
||||
---
|
||||
|
||||
## 📞 求助指南
|
||||
|
||||
遇到问题时,优先查看:
|
||||
1. 架构问题 → `前后端模块化架构设计-V2.md`
|
||||
2. 数据库问题 → `Schema隔离架构设计(10个).md`
|
||||
3. 任务不清楚 → `03-任务分解.md`
|
||||
4. 代码不会写 → `02-标题摘要初筛开发计划.md`(有示例)
|
||||
5. 质量不达标 → `06-质量保障与可追溯策略.md`
|
||||
|
||||
---
|
||||
|
||||
**文档路径**:`AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/[AI对接] ASL模块快速上下文.md`
|
||||
**下次更新**:ASL模块MVP开发完成后
|
||||
**维护者**:AI助手 + 开发团队
|
||||
|
||||
---
|
||||
|
||||
**🎉 祝开发顺利!从 T1.1.1 开始吧!**
|
||||
|
||||
Reference in New Issue
Block a user