# AI智能文献模块 - 当前状态与开发指南 > **文档版本:** v1.0 > **创建日期:** 2025-11-21 > **维护者:** AI智能文献开发团队 > **最后更新:** 2025-11-21 > **文档目的:** 反映模块真实状态,帮助新开发人员快速上手 --- ## 📋 文档说明 本文档是AI智能文献(ASL)模块的**真实状态快照**,记录实际的代码结构、已实现功能、技术栈和开发规范。 **与其他文档的关系**: - **本文档(00-模块当前状态)**:What is(真实状态) - **开发计划文档**:What to do(计划) - **开发记录文档**:What done(历史) - **技术设计文档**:How to do(设计) --- ## 🎯 模块概述 ### 核心功能 AI智能文献模块是一个基于大语言模型(LLM)的文献筛选系统,用于帮助研究人员根据PICOS标准自动筛选文献。 ### 当前状态 - **开发阶段**:✅ MVP已完成 - **主要功能**:标题摘要初筛(Title & Abstract Screening) - **模型支持**:DeepSeek-V3 + Qwen-Max 双模型筛选 - **部署状态**:✅ 本地开发环境运行正常 ### 关键里程碑 - ✅ 2025-11-18:Prompt v1.0.0-MVP完成,准确率60% - ✅ 2025-11-18:LLM集成与测试框架完成 - ✅ 2025-11-19:前端MVP(设置与启动、审核工作台)完成 - ✅ 2025-11-21:真实LLM集成完成(替换Mock数据) - ✅ 2025-11-21:用户体验优化(进度显示、列表排序) - ✅ 2025-11-21:**Week 4完成(结果展示与导出功能)** - 统计概览与PRISMA排除分析 - 初筛结果页面(混合方案) - Excel批量导出(云原生) --- ## 🏗️ 技术架构 ### 技术栈 #### 前端 ``` 框架: React 18 + TypeScript 5 路由: React Router DOM v6 状态管理: @tanstack/react-query (React Query v5) UI组件: Ant Design v5 样式: TailwindCSS v3 构建工具: Vite v5 ``` #### 后端 ``` 框架: Fastify v4 (Node.js 22) 数据库: PostgreSQL 16 + Prisma 5 LLM SDK: 自研 LLMFactory (统一适配层) 模型: DeepSeek-V3, Qwen-Max, GPT-4o, Claude-4.5 日志: Winston ``` #### 基础设施 ``` 数据库: PostgreSQL 16 with Schema isolation Schema: asl_schema (独立隔离) 用户表: platform_schema.users (共享) ``` --- ## 📂 真实代码结构 ### 前端代码结构 ``` frontend-v2/src/modules/asl/ ├── api/ │ └── index.ts # API客户端(所有后端调用) ├── components/ │ ├── ASLLayout.tsx # 左侧导航布局 │ ├── JudgmentBadge.tsx # PICOS判断Badge │ ├── ConclusionTag.tsx # 结论Tag(纳入/排除) │ └── DetailReviewDrawer.tsx # 详情+复核统一Drawer ├── hooks/ │ ├── useScreeningTask.ts # 任务进度轮询Hook │ └── useScreeningResults.ts # 筛选结果查询Hook ├── pages/ │ ├── TitleScreeningSettings.tsx # 设置与启动页面 │ ├── ScreeningWorkbench.tsx # 审核工作台页面 │ └── ScreeningResults.tsx # 初筛结果页面(占位) ├── types/ │ └── index.ts # TypeScript类型定义 ├── utils/ │ ├── excelUtils.ts # Excel导入/导出工具 │ └── tableTransform.ts # 表格数据转换(双行) └── index.tsx # 模块入口(路由配置) ``` ### 后端代码结构 ``` backend/src/modules/asl/ ├── controllers/ │ ├── projectController.ts # 项目管理API │ ├── literatureController.ts # 文献管理API │ └── screeningController.ts # 筛选相关API ├── services/ │ ├── screeningService.ts # 筛选任务服务(核心) │ └── llmScreeningService.ts # LLM调用服务 ├── schemas/ │ └── screening.schema.ts # Prompt生成与JSON Schema ├── types/ │ └── index.ts # TypeScript类型定义 └── routes/ └── index.ts # 路由注册 backend/prisma/ └── schema.prisma # 数据库Schema定义 backend/prompts/asl/screening/ ├── v1.0.0-mvp.txt # 标准Prompt(当前使用) ├── v1.1.0-lenient.txt # 宽松模式 └── v1.1.0-strict.txt # 严格模式 backend/scripts/ └── test-llm-screening.ts # LLM测试脚本 ``` --- ## 🔌 API端点(真实) ### 基础URL ``` 开发环境: http://localhost:3001/api/v1/asl ``` ### 项目管理 ```http POST /projects # 创建项目 GET /projects # 获取项目列表 GET /projects/:projectId # 获取项目详情 ``` ### 文献管理 ```http POST /literatures/import # 导入文献(JSON格式) POST /literatures/import/excel # 导入Excel文献 GET /projects/:projectId/literatures # 获取文献列表 DELETE /literatures/:literatureId # 删除文献 ``` ### 筛选相关 ```http GET /projects/:projectId/screening-task # 获取任务进度 GET /projects/:projectId/screening-results # 获取筛选结果 GET /screening-results/:resultId # 获取结果详情 POST /screening-results/:resultId/review # 提交人工复核 ``` ### 关键参数说明 #### 创建项目 ```typescript { projectName: string; picoCriteria: { P: string; // 人群 I: string; // 干预 C: string; // 对照 O: string; // 结局 S: string; // 研究设计 }; inclusionCriteria: string; exclusionCriteria: string; screeningConfig?: { models: ['DeepSeek-V3', 'Qwen-Max']; style: 'standard' | 'lenient' | 'strict'; }; } ``` #### 获取筛选结果 ``` Query参数: - page: 页码(默认1) - pageSize: 每页数量(默认50) - filter: all | conflict | included | excluded | reviewed ``` --- ## 🗄️ 数据库结构(真实) ### Schema: asl_schema #### 1. screening_projects(筛选项目) ```sql 主键: id (UUID) 外键: user_id → platform_schema.users(id) 关键字段: - project_name: 项目名称 - pico_criteria: JSONB(格式:{P, I, C, O, S}) - inclusion_criteria: TEXT - exclusion_criteria: TEXT - screening_config: JSONB(格式:{models, style}) - status: 'draft' | 'screening' | 'completed' 索引: user_id, status ``` #### 2. literatures(文献) ```sql 主键: id (UUID) 外键: project_id → screening_projects(id) CASCADE 关键字段: - title: TEXT(必需) - abstract: TEXT(必需) - authors, journal, publication_year, pmid, doi 索引: project_id, pmid, doi 唯一约束: (project_id, pmid), (project_id, doi) ``` #### 3. screening_results(筛选结果) ```sql 主键: id (UUID) 外键: - project_id → screening_projects(id) CASCADE - literature_id → literatures(id) CASCADE 关键字段: DeepSeek结果: - ds_*_judgment: 'match' | 'partial' | 'mismatch' - ds_*_evidence: TEXT(P/I/C/S的证据) - ds_conclusion: 'include' | 'exclude' | 'uncertain' - ds_confidence: FLOAT(0-1) - ds_reason: TEXT Qwen结果: 同上(qwen_*) 冲突检测: - conflict_status: 'none' | 'conflict' | 'resolved' - conflict_fields: JSONB 人工复核: - final_decision: 'include' | 'exclude' | NULL - final_decision_by: 用户ID - final_decision_at: TIMESTAMP - exclusion_reason: TEXT 索引: project_id, literature_id, conflict_status, final_decision 唯一约束: (project_id, literature_id) ``` #### 4. screening_tasks(筛选任务) ```sql 主键: id (UUID) 外键: project_id → screening_projects(id) CASCADE 关键字段: - task_type: 'title_abstract' | 'full_text' - status: 'pending' | 'running' | 'completed' | 'failed' - total_items: INT - processed_items: INT - success_items: INT - conflict_items: INT - failed_items: INT - started_at, completed_at: TIMESTAMP 索引: project_id, status ``` --- ## 🤖 LLM集成(真实实现) ### LLM调用流程 ``` 前端: 点击"开始AI初筛" ↓ 后端: literatureController.importLiteratures() ↓ 后端: screeningService.startScreeningTask() ↓ 后端: screeningService.processLiteraturesInBackground() ↓ (for each literature) 后端: llmScreeningService.dualModelScreening() ↓ 后端: LLMFactory.getAdapter(model).chat() ↓ 真实API: DeepSeek API / Qwen API ↓ 后端: JSON解析 + Schema验证 ↓ 后端: 保存到 screening_results 表 ↓ 后端: 更新 screening_tasks 进度 ↓ 前端: useScreeningTask 轮询(1秒/次) ↓ 前端: 显示进度条和结果 ``` ### 字段映射关系 #### PICOS字段 ```typescript // 前端/数据库格式 picoCriteria: { P, I, C, O, S } // LLM服务兼容格式 picoCriteria: { P || population, I || intervention, C || comparison, O || outcome, S || studyDesign } // 映射位置: screeningService.ts (Line 82-92) ``` #### 模型名称 ```typescript // 前端展示名 → API名称 const MODEL_NAME_MAP = { 'DeepSeek-V3': 'deepseek-chat', 'Qwen-Max': 'qwen-max', 'GPT-4o': 'gpt-4o', 'Claude-4.5': 'claude-sonnet-4.5', }; // 映射位置: screeningService.ts (Line 97-110) ``` ### LLM配置 #### 模型参数 ```typescript { temperature: 0, // 固定,确保结果一致性 top_p: 1.0, max_tokens: 2048, } ``` #### Prompt版本 ``` 当前使用: v1.0.0-mvp.txt 位置: backend/prompts/asl/screening/v1.0.0-mvp.txt 准确率: 60%(首次测试) 一致率: 70-100% ``` #### 处理性能 ``` 单篇文献耗时: 10-20秒(DeepSeek + Qwen并行) 5篇文献: 约50-100秒 199篇文献: 约33-66分钟(串行处理) 进度更新: 每1条更新数据库 前端轮询: 1秒/次 ``` --- ## ✅ 已完成功能 ### 1. 标题摘要初筛 - 设置与启动 ⭐ #### 功能清单 - ✅ PICOS标准录入(P/I/C/O/S两栏布局) - ✅ 纳入/排除标准录入(侧边对称布局) - ✅ Excel模板下载(包含字段说明) - ✅ Excel文件上传 - ✅ Excel解析(内存中,支持中英文表头) - ✅ 文献去重(DOI优先,标题辅助) - ✅ 文献预览表格(固定列宽,Tooltip显示全文) - ✅ 启动AI初筛按钮 - ✅ 自动跳转到审核工作台 #### 关键代码 ```typescript // 文件: frontend-v2/src/modules/asl/pages/TitleScreeningSettings.tsx // 核心功能: PICOS表单 + Excel上传 + 文献预览 + 提交 // Excel处理 import { downloadExcelTemplate, processExcelFile } from '../utils/excelUtils'; // API调用 const projectResponse = await aslApi.createProject({ ... }); const importResponse = await aslApi.importLiteratures({ ... }); navigate('/literature/screening/title/workbench', { state: { projectId } }); ``` ### 2. 标题摘要初筛 - 审核工作台 ⭐ #### 功能清单 - ✅ 任务进度显示(轮询,1秒/次) - ✅ 进度条实时更新(平滑增长) - ✅ 模型处理数量显示(DeepSeek + Qwen) - ✅ 双行表格(DeepSeek上行,Qwen下行) - ✅ PICOS判断Badge(匹配/部分/不匹配) - ✅ 结论Tag(纳入/排除/不确定) - ✅ 冲突文献高亮(红色背景) - ✅ 点击标题展开证据(双模型对比) - ✅ 统一复核Drawer(左侧详情+右侧复核) - ✅ 人工复核提交 - ✅ 筛选Tab(全部/冲突/已纳入/已排除/已复核) - ✅ 分页(后端分页,20条/页) #### 关键代码 ```typescript // 文件: frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx // 核心功能: 双行表格 + 进度轮询 + 展开行 + 复核Drawer // 轮询进度 const { task, progress, isRunning } = useScreeningTask({ projectId, pollingInterval: 1000 }); // 查询结果 const { results } = useScreeningResults({ projectId, page, pageSize, filter }); // 双行转换 const tableData = transformToDoubleRows(results); // 展开行 expandable={{ expandedRowRender: (record) => { /* 双模型证据对比 */ }, expandedRowKeys, onExpandedRowsChange: (keys) => setExpandedRowKeys([...keys]), }} ``` ### 3. 后端LLM集成 ⭐ #### 功能清单 - ✅ 双模型并行筛选(DeepSeek + Qwen) - ✅ JSON结构化输出(带Schema验证) - ✅ 冲突检测(结论不一致) - ✅ 串行处理(避免API限流) - ✅ 进度实时更新(每1条) - ✅ 错误处理与重试 - ✅ 字段映射(PICOS, 模型名) - ✅ 文献验证(标题+摘要必需) - ✅ 详细日志输出 #### 关键代码 ```typescript // 文件: backend/src/modules/asl/services/screeningService.ts // 核心功能: 任务管理 + 字段映射 + LLM调用 // 字段映射 const picoCriteria = { P: rawPicoCriteria?.P || rawPicoCriteria?.population || '', I: rawPicoCriteria?.I || rawPicoCriteria?.intervention || '', // ... C, O, S }; const MODEL_NAME_MAP = { 'DeepSeek-V3': 'deepseek-chat', 'Qwen-Max': 'qwen-max', // ... }; // LLM调用 const screeningResult = await llmScreeningService.dualModelScreening( literature.id, literature.title, literature.abstract, picoCriteria, inclusionCriteria, exclusionCriteria, [models[0], models[1]], screeningConfig?.style || 'standard' ); ``` ### 4. LLM服务层 ⭐ #### 功能清单 - ✅ 统一LLM适配器(LLMFactory) - ✅ 支持4个模型(DeepSeek, Qwen, GPT, Claude) - ✅ Prompt生成(基于模板) - ✅ JSON解析(容错,支持中文引号) - ✅ Schema验证(AJV) - ✅ 双模型并行调用 - ✅ 批量筛选(并发控制) #### 关键代码 ```typescript // 文件: backend/src/modules/asl/services/llmScreeningService.ts // 核心功能: LLM调用 + JSON解析 + Schema验证 async dualModelScreening(...) { const [result1, result2] = await Promise.all([ this.screenWithModel(model1, ...), this.screenWithModel(model2, ...), ]); // 冲突检测(只检测conclusion) const hasConflict = result1.conclusion !== result2.conclusion; // 最终决策 let finalDecision = hasConflict ? 'pending' : result1.conclusion; return { deepseek: result1, qwen: result2, hasConflict, finalDecision }; } ``` ### 5. 标题摘要初筛 - 初筛结果 ⭐ **Week 4 新增** #### 功能清单 - ✅ 统计概览卡片(总数、已纳入、已排除、待复核) - ✅ 待复核提示(当有冲突时显示) - ✅ PRISMA排除原因统计(柱状图展示) - ✅ 结果列表Tab(全部/已纳入/已排除/待复核) - ✅ 混合方案表格(AI共识 + 人工最终决策) - ✅ 点击标题展开详细判断(双模型证据对比) - ✅ 批量选择与导出(3种导出方式) - ✅ Excel导出(前端生成,云原生) #### 混合方案设计 **核心特点**: - 明确区分AI决策和人工决策 - 排除原因逻辑清晰(纳入不显示原因) - 状态标签准确(4种状态) - 无逻辑矛盾 **表格列设计**: | 列名 | 宽度 | 说明 | |------|------|------| | # | 50px | 序号 | | 文献标题 | 300px | 可点击展开 | | AI共识 | 100px | DS+QW是否一致 | | 排除原因 | 140px | 智能显示 | | 人工最终决策 | 120px | 标注推翻AI/与AI一致 | | 状态 | 90px | 4种状态 | | 操作 | 70px | 展开/收起 | **总宽度**:870px(无需横向滚动) #### 关键代码 ```typescript // 文件: frontend-v2/src/modules/asl/pages/ScreeningResults.tsx // 核心功能: 统计展示 + 混合方案表格 + Excel导出 // 统计数据获取(云原生:后端聚合) const { data: statsData } = useQuery({ queryKey: ['projectStatistics', projectId], queryFn: () => aslApi.getProjectStatistics(projectId), }); // Excel导出(云原生:前端生成,零文件落盘) exportScreeningResults(data.items, { filter, projectName: `项目${projectId.slice(0, 8)}`, }); ``` ### 6. 统计API ⭐ **Week 4 新增** #### 功能清单 - ✅ 后端聚合统计(Prisma并行查询) - ✅ 统计总数、已纳入、已排除、待复核、冲突、已复核 - ✅ 分析排除原因(从AI判断中提取) - ✅ 计算各类百分比 - ✅ 云原生:后端聚合,减少网络传输 #### 关键代码 ```typescript // 文件: backend/src/modules/asl/controllers/screeningController.ts // 核心功能: 统计聚合 + 排除原因分析 // ⭐ 云原生:使用Prisma聚合查询(并行执行) const [total, included, excluded, pending, conflict, reviewed] = await Promise.all([ prisma.aslScreeningResult.count({ where: { projectId } }), prisma.aslScreeningResult.count({ where: { projectId, finalDecision: 'include' } }), // ... 更多并行查询 ]); // 返回统计数据(从MB级降到KB级) return { total, included, excluded, pending, conflict, reviewed, exclusionReasons, includedRate, excludedRate, pendingRate, }; ``` --- ## ⚠️ 已知问题与限制 ### 1. 功能限制 - ⚠️ 仅实现标题摘要初筛(全文复筛未开发) - ⚠️ 串行处理,处理时间较长(199篇约30-60分钟) - ⚠️ 无任务暂停/取消功能 - ⚠️ 无断点续传(中断后需重新开始) - ⚠️ 准确率60%(需要Prompt优化) ### 2. 技术债务 - ⚠️ 浏览器警告:`setTimeout handler took >50ms`(性能优化) - ⚠️ 前端轮询(建议改为WebSocket) - ⚠️ 缺少单元测试(E2E测试) - ⚠️ Excel后端导出优化(当数据量>5000条时) ### 3. 用户体验 - ⚠️ 无估计剩余时间 - ⚠️ 无当前处理文献标题显示 - ⚠️ 批量修改决策功能未实现 ### 4. 生产环境未就绪 - ⚠️ 使用默认测试用户(无真实认证) - ⚠️ 无消息队列(异步任务) - ⚠️ 无错误重试机制 - ⚠️ 无成本控制(API调用) - ⚠️ 无监控和告警 **详细技术债务清单**:[技术债务清单](./06-技术债务/技术债务清单.md) --- ## 🚀 快速上手指南 ### 环境要求 ``` Node.js: v22.18.0+ PostgreSQL: 16+ npm: 10+ ``` ### 1. 初始化数据库 ```bash cd backend npm install npx prisma generate npx prisma migrate dev ``` ### 2. 配置环境变量 创建 `backend/.env`: ```bash # 数据库 DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=asl_schema" # LLM API密钥 DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxx QWEN_API_KEY=sk-xxxxxxxxxxxxxx # 可选 GPT_API_KEY=sk-xxxxxxxxxxxxxx CLAUDE_API_KEY=sk-xxxxxxxxxxxxxx ``` ### 3. 启动后端 ```bash cd backend npm run dev ``` 应该看到: ``` ✅ Fastify server listening on http://0.0.0.0:3001 ✅ Database connected ✅ ASL module routes registered at /api/v1/asl ``` ### 4. 启动前端 ```bash cd frontend-v2 npm install npm run dev ``` 应该看到: ``` VITE v5.x.x ready in xxx ms ➜ Local: http://localhost:3000 ``` ### 5. 测试流程 1. 访问 `http://localhost:3001` 2. 点击顶部 **"AI智能文献"** 3. 自动跳转到 **"设置与启动"** 4. 填写PICOS标准(复制测试数据) 5. 下载Excel模板(或使用现有) 6. 上传Excel(建议先测试5篇) 7. 点击 **"开始AI初筛"** 8. 等待10-100秒(取决于文献数) 9. 查看 **"审核工作台"** 10. 点击标题展开查看证据 11. 点击"复核"提交人工决策 ### 6. 查看后端日志 ``` 🚀 开始真实LLM筛选: 任务ID: xxx 文献数: 5 模型(映射后): [ 'deepseek-chat', 'qwen-max' ] PICOS-P: 2型糖尿病患者... ✅ 文献 1/5 处理成功 DS: include / Qwen: exclude 冲突: 是 ``` --- ## 🧪 测试指南 ### 1. LLM质量测试 ```bash cd backend # 方式1: 使用测试脚本 npm run test:llm # 方式2: 直接运行 npx ts-node scripts/test-llm-screening.ts ``` **测试数据**: - 位置:`backend/scripts/test-samples/asl-test-literatures.json` - 数量:10篇(6篇应排除,3篇应纳入,1篇边界) - PICOS:SGLT2抑制剂系统综述 **预期输出**: ``` 准确率: 60% 一致率: 70-100% JSON验证率: 100% 平均耗时: 10-15秒/篇 ``` ### 2. API测试 ```bash # 创建项目 curl -X POST http://localhost:3001/api/v1/asl/projects \ -H "Content-Type: application/json" \ -d '{ "projectName": "测试项目", "picoCriteria": {"P":"成人","I":"药物A","C":"安慰剂","O":"结局","S":"RCT"}, "inclusionCriteria": "英文", "exclusionCriteria": "综述" }' # 获取项目列表 curl http://localhost:3001/api/v1/asl/projects ``` ### 3. 前端E2E测试 **手动测试清单**: - [ ] PICOS表单提交 - [ ] Excel模板下载 - [ ] Excel文件上传(正常) - [ ] Excel文件上传(错误格式) - [ ] 文献预览显示 - [ ] 去重逻辑(相同DOI) - [ ] 启动AI初筛 - [ ] 进度条更新 - [ ] 自动跳转 - [ ] 表格显示 - [ ] 列排序 - [ ] 筛选Tab切换 - [ ] 展开行 - [ ] 复核Drawer - [ ] 提交复核 ### 4. 数据库验证 ```sql -- 查看最新项目 SELECT * FROM asl_schema.screening_projects ORDER BY created_at DESC LIMIT 1; -- 查看筛选任务 SELECT * FROM asl_schema.screening_tasks WHERE project_id = 'xxx'; -- 查看筛选结果 SELECT id, ds_conclusion, qwen_conclusion, conflict_status, SUBSTRING(ds_p_evidence, 1, 50) as ds_evidence FROM asl_schema.screening_results WHERE project_id = 'xxx' LIMIT 5; ``` --- ## 📚 开发规范 ### 1. 代码风格 #### TypeScript ```typescript // 使用接口而非类型别名(对外API) export interface ScreeningResult { ... } // 严格类型检查 const picoCriteria: PicoCriteria = { ... }; // 使用可选链和空值合并 const models = config?.models ?? ['deepseek-chat', 'qwen-max']; ``` #### React ```typescript // 使用函数组件 export function ScreeningWorkbench() { ... } // 自定义Hook命名以use开头 export function useScreeningTask() { ... } // Props接口命名以Props结尾 interface ScreeningWorkbenchProps { ... } ``` ### 2. 命名约定 ``` 文件名: PascalCase (组件) 或 camelCase (工具) ✅ ScreeningWorkbench.tsx ✅ excelUtils.ts 组件名: PascalCase ✅ function DetailReviewDrawer() 变量/函数: camelCase ✅ const screeningResult = ... ✅ function processLiteratures() 常量: UPPER_SNAKE_CASE ✅ const MODEL_NAME_MAP = ... 类型/接口: PascalCase ✅ interface ScreeningResult ``` ### 3. 注释规范 ```typescript /** * 筛选任务轮询Hook * * @param projectId - 项目ID * @param pollingInterval - 轮询间隔(毫秒),默认1000 * @returns 任务状态和进度信息 */ export function useScreeningTask() { ... } // 🔧 修复:字段名映射(前端格式 → LLM格式) const picoCriteria = { ... }; // ⚠️ 注意:双模型是并行处理 await Promise.all([...]); ``` ### 4. 错误处理 ```typescript // 后端 try { const result = await llmScreeningService.dualModelScreening(...); } catch (error) { logger.error('Failed to process literature', { literatureId: literature.id, error: error instanceof Error ? error.message : 'Unknown error', stack: error instanceof Error ? error.stack : undefined, }); // 输出到控制台 console.error('\n❌ 文献处理失败:', error); } // 前端 try { await aslApi.createProject(...); } catch (error) { message.error(`操作失败: ${(error as Error).message}`); } ``` ### 5. Git提交规范 遵循 [Git提交规范](../../04-开发规范/06-Git提交规范.md): ```bash feat: 添加审核工作台进度显示优化 fix: 修复列表显示顺序反向问题 refactor: 重构字段映射逻辑 docs: 更新模块状态文档 test: 添加LLM筛选质量测试 chore: 更新依赖版本 ``` --- ## 🔗 相关文档 ### 核心文档 1. **本文档(00-模块当前状态)**:模块真实状态快照 2. [数据库设计](./02-技术设计/01-数据库设计.md):数据表结构 3. [API设计规范](./02-技术设计/02-API设计规范.md):接口定义 4. [开发计划](./04-开发计划/03-任务分解.md):功能清单与计划 ### 开发记录 - [2025-11-21 真实LLM集成](./05-开发记录/2025-11-21-真实LLM集成完成报告.md) - [2025-11-21 字段映射修复](./05-开发记录/2025-11-21-字段映射问题修复.md) - [2025-11-21 用户体验优化](./05-开发记录/2025-11-21-用户体验优化.md) - [2025-11-19 Week2-Day2完成](./05-开发记录/2025-11-19-Week2-Day2完成报告.md) - [2025-11-18 Prompt设计与测试](./05-开发记录/2025-11-18-Prompt设计与测试完成报告.md) ### 测试文档 - [测试数据](./05-测试文档/03-测试数据/):PICOS示例、Excel模板 --- ## 💡 开发建议 ### 对新开发人员 1. **先了解业务**:阅读 [开发计划](./04-开发计划/02-标题摘要初筛开发计划.md) 2. **再看代码**:按照本文档的代码结构阅读 3. **动手测试**:跑一遍完整流程 4. **查看日志**:理解后端处理逻辑 5. **阅读Prompt**:理解LLM如何工作 ### 对AI助手 1. **优先阅读本文档**:了解真实状态 2. **参考开发记录**:了解历史问题和解决方案 3. **查看测试数据**:了解实际使用场景 4. **检查字段映射**:注意前后端格式差异 5. **理解限制**:不要承诺未实现的功能 ### 常见陷阱 1. ❌ **PICOS格式混淆**:前端用P/I/C/O/S,不是population/intervention 2. ❌ **模型名称错误**:前端用DeepSeek-V3,API用deepseek-chat 3. ❌ **结果查询时机**:任务未完成时查询结果为空 4. ❌ **轮询间隔过长**:用户体验差 5. ❌ **文献缺少摘要**:LLM调用会失败 --- ## 📊 性能指标(实测) ### 处理速度 ``` 单篇文献: 10-20秒(DeepSeek + Qwen并行) 5篇文献: 50-100秒 20篇文献: 200-400秒(3-7分钟) 199篇文献: 2000-4000秒(33-66分钟) ``` ### 准确率(v1.0.0-MVP) ``` 准确率: 60% 一致率: 70-100% JSON验证率: 100% 需人工复核率: 20-30%(冲突) ``` ### 前端性能 ``` 轮询间隔: 1秒 数据更新延迟: <1秒 表格渲染: <100ms(20条记录) Drawer打开: <50ms ``` ### 数据库性能 ``` 项目创建: <50ms 文献导入(199篇): <500ms 筛选结果查询(分页): <100ms 进度更新: <50ms ``` --- ## 🎯 下一步开发计划 ### 短期(Week 3-4) 1. ⏳ Prompt优化(提升准确率到85%+) 2. ⏳ 添加任务暂停/取消功能 3. ⏳ 实现并发处理(3-5个并发) 4. ⏳ 添加估计剩余时间显示 ### 中期(Month 2) 1. ⏳ 全文复筛功能 2. ⏳ 用户自定义边界情况 3. ⏳ WebSocket实时推送 4. ⏳ 数据导出(Excel/PDF) ### 长期(Month 3+) 1. ⏳ 多用户支持(真实认证) 2. ⏳ 消息队列(Bull/RabbitMQ) 3. ⏳ 分布式处理 4. ⏳ 成本控制和监控 --- **文档维护者**:AI智能文献开发团队 **更新周期**:每个重要功能完成后更新 **反馈方式**:提交Issue或Pull Request --- **最后更新**:2025-11-21(Week 4完成) **文档状态**:✅ 反映真实状态 **下次更新时机**:Prompt优化完成 或 并发处理实现 **本次更新内容**: - ✅ 新增"初筛结果页面"功能清单 - ✅ 新增"统计API"功能清单 - ✅ 更新关键里程碑(Week 4完成) - ✅ 更新技术债务说明