docs: complete documentation system (250+ files)
- System architecture and design documentation - Business module docs (ASL/AIA/PKB/RVW/DC/SSA/ST) - ASL module complete design (quality assurance, tech selection) - Platform layer and common capabilities docs - Development standards and API specifications - Deployment and operations guides - Project management and milestone tracking - Architecture implementation reports - Documentation templates and guides
This commit is contained in:
202
docs/03-业务模块/ASL-AI智能文献/02-技术设计/01-数据库设计.md
Normal file
202
docs/03-业务模块/ASL-AI智能文献/02-技术设计/01-数据库设计.md
Normal file
@@ -0,0 +1,202 @@
|
||||
# AI智能文献模块 - 数据库设计
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-10-29
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档说明
|
||||
|
||||
本文档描述AI智能文献模块的数据库设计,包括数据表结构、关系设计、索引设计等。
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ 核心数据表
|
||||
|
||||
### 1. 文献筛选项目表 (literature_screening_projects)
|
||||
|
||||
```sql
|
||||
CREATE TABLE literature_screening_projects (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id),
|
||||
project_name VARCHAR(255) NOT NULL,
|
||||
protocol_id UUID, -- 研究方案ID(未来关联)
|
||||
|
||||
-- PICO标准
|
||||
pico_criteria JSONB, -- PICO结构化数据
|
||||
|
||||
-- 筛选标准
|
||||
inclusion_criteria TEXT,
|
||||
exclusion_criteria TEXT,
|
||||
|
||||
-- 状态
|
||||
status VARCHAR(50) DEFAULT 'draft', -- draft, screening, completed
|
||||
|
||||
-- 筛选配置
|
||||
screening_config JSONB, -- 筛选配置(双模型选择等)
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
### 2. 文献条目表 (literature_items)
|
||||
|
||||
```sql
|
||||
CREATE TABLE literature_items (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
project_id UUID NOT NULL REFERENCES literature_screening_projects(id) ON DELETE CASCADE,
|
||||
|
||||
-- 文献基本信息
|
||||
pmid VARCHAR(50),
|
||||
title TEXT,
|
||||
authors TEXT,
|
||||
journal VARCHAR(255),
|
||||
publication_year INTEGER,
|
||||
doi VARCHAR(255),
|
||||
abstract TEXT,
|
||||
|
||||
-- 文件信息
|
||||
full_text_file_path VARCHAR(500),
|
||||
full_text_status VARCHAR(50), -- not_required, pending, downloaded, uploaded, failed
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
UNIQUE(project_id, pmid)
|
||||
);
|
||||
```
|
||||
|
||||
### 3. 标题摘要初筛结果表 (title_abstract_screening_results)
|
||||
|
||||
```sql
|
||||
CREATE TABLE title_abstract_screening_results (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
project_id UUID NOT NULL REFERENCES literature_screening_projects(id) ON DELETE CASCADE,
|
||||
literature_item_id UUID NOT NULL REFERENCES literature_items(id) ON DELETE CASCADE,
|
||||
|
||||
-- DS模型判断
|
||||
ds_p_judgment VARCHAR(10), -- ✓, ✗, ?
|
||||
ds_i_judgment VARCHAR(10),
|
||||
ds_c_judgment VARCHAR(10),
|
||||
ds_s_judgment VARCHAR(10),
|
||||
ds_conclusion VARCHAR(20), -- include, exclude
|
||||
|
||||
-- DS模型证据
|
||||
ds_p_evidence TEXT,
|
||||
ds_i_evidence TEXT,
|
||||
ds_c_evidence TEXT,
|
||||
ds_s_evidence TEXT,
|
||||
|
||||
-- Q3模型判断
|
||||
q3_p_judgment VARCHAR(10),
|
||||
q3_i_judgment VARCHAR(10),
|
||||
q3_c_judgment VARCHAR(10),
|
||||
q3_s_judgment VARCHAR(10),
|
||||
q3_conclusion VARCHAR(20),
|
||||
|
||||
-- Q3模型证据
|
||||
q3_p_evidence TEXT,
|
||||
q3_i_evidence TEXT,
|
||||
q3_c_evidence TEXT,
|
||||
q3_s_evidence TEXT,
|
||||
|
||||
-- 冲突状态
|
||||
conflict_status VARCHAR(20) DEFAULT 'none', -- none, conflict, resolved
|
||||
|
||||
-- 最终决策
|
||||
final_decision VARCHAR(20), -- include, exclude, pending
|
||||
final_decision_by UUID REFERENCES users(id),
|
||||
final_decision_at TIMESTAMP,
|
||||
exclusion_reason TEXT,
|
||||
|
||||
-- AI处理状态
|
||||
ai_processing_status VARCHAR(50) DEFAULT 'pending', -- pending, processing, completed, failed
|
||||
ai_processed_at TIMESTAMP,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
UNIQUE(project_id, literature_item_id)
|
||||
);
|
||||
```
|
||||
|
||||
### 4. 筛选任务表 (screening_tasks)
|
||||
|
||||
```sql
|
||||
CREATE TABLE screening_tasks (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
project_id UUID NOT NULL REFERENCES literature_screening_projects(id) ON DELETE CASCADE,
|
||||
|
||||
task_type VARCHAR(50) NOT NULL, -- title_abstract, full_text
|
||||
status VARCHAR(50) DEFAULT 'pending', -- pending, running, completed, failed
|
||||
|
||||
total_items INTEGER,
|
||||
processed_items INTEGER DEFAULT 0,
|
||||
success_items INTEGER DEFAULT 0,
|
||||
failed_items INTEGER DEFAULT 0,
|
||||
|
||||
started_at TIMESTAMP,
|
||||
completed_at TIMESTAMP,
|
||||
error_message TEXT,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 数据关系图
|
||||
|
||||
```
|
||||
literature_screening_projects (1) ──< (N) literature_items
|
||||
literature_screening_projects (1) ──< (N) title_abstract_screening_results
|
||||
literature_items (1) ──< (1) title_abstract_screening_results
|
||||
literature_screening_projects (1) ──< (N) screening_tasks
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 索引设计
|
||||
|
||||
```sql
|
||||
-- 文献条目表索引
|
||||
CREATE INDEX idx_literature_items_project_id ON literature_items(project_id);
|
||||
CREATE INDEX idx_literature_items_pmid ON literature_items(pmid);
|
||||
|
||||
-- 筛选结果表索引
|
||||
CREATE INDEX idx_screening_results_project_id ON title_abstract_screening_results(project_id);
|
||||
CREATE INDEX idx_screening_results_item_id ON title_abstract_screening_results(literature_item_id);
|
||||
CREATE INDEX idx_screening_results_conflict ON title_abstract_screening_results(conflict_status);
|
||||
CREATE INDEX idx_screening_results_decision ON title_abstract_screening_results(final_decision);
|
||||
|
||||
-- 任务表索引
|
||||
CREATE INDEX idx_screening_tasks_project_id ON screening_tasks(project_id);
|
||||
CREATE INDEX idx_screening_tasks_status ON screening_tasks(status);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善内容
|
||||
|
||||
后续将补充:
|
||||
- 全文复筛相关表结构
|
||||
- 数据提取相关表结构
|
||||
- 数据迁移方案
|
||||
- 数据字典
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
238
docs/03-业务模块/ASL-AI智能文献/02-技术设计/02-API设计规范.md
Normal file
238
docs/03-业务模块/ASL-AI智能文献/02-技术设计/02-API设计规范.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# AI智能文献模块 - API设计规范
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-10-29
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档说明
|
||||
|
||||
本文档描述AI智能文献模块的API设计规范,包括接口定义、请求响应格式、错误处理等。
|
||||
|
||||
---
|
||||
|
||||
## 🔌 API设计原则
|
||||
|
||||
1. **RESTful设计**: 遵循RESTful API设计规范
|
||||
2. **统一响应格式**: 统一的成功/错误响应结构
|
||||
3. **分页支持**: 列表接口支持分页
|
||||
4. **版本控制**: API版本化管理
|
||||
5. **认证授权**: 所有接口需要JWT认证
|
||||
|
||||
---
|
||||
|
||||
## 📡 核心API接口
|
||||
|
||||
### 1. 项目管理
|
||||
|
||||
#### 创建筛选项目
|
||||
```
|
||||
POST /api/literature/projects
|
||||
Request Body:
|
||||
{
|
||||
"projectName": "string",
|
||||
"picoCriteria": {...},
|
||||
"inclusionCriteria": "string",
|
||||
"exclusionCriteria": "string"
|
||||
}
|
||||
Response:
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "uuid",
|
||||
"projectName": "string",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取项目列表
|
||||
```
|
||||
GET /api/literature/projects?page=1&pageSize=10
|
||||
```
|
||||
|
||||
#### 获取项目详情
|
||||
```
|
||||
GET /api/literature/projects/:projectId
|
||||
```
|
||||
|
||||
#### 更新项目
|
||||
```
|
||||
PUT /api/literature/projects/:projectId
|
||||
```
|
||||
|
||||
#### 删除项目
|
||||
```
|
||||
DELETE /api/literature/projects/:projectId
|
||||
```
|
||||
|
||||
### 2. 文献管理
|
||||
|
||||
#### 导入文献(Excel)
|
||||
```
|
||||
POST /api/literature/projects/:projectId/items/import
|
||||
Content-Type: multipart/form-data
|
||||
Body: file (Excel文件)
|
||||
Response:
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"importedCount": 100,
|
||||
"items": [...]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取文献列表
|
||||
```
|
||||
GET /api/literature/projects/:projectId/items?page=1&pageSize=50
|
||||
```
|
||||
|
||||
#### 获取文献详情
|
||||
```
|
||||
GET /api/literature/projects/:projectId/items/:itemId
|
||||
```
|
||||
|
||||
### 3. 标题摘要初筛
|
||||
|
||||
#### 启动筛选任务
|
||||
```
|
||||
POST /api/literature/projects/:projectId/screening/start
|
||||
Request Body:
|
||||
{
|
||||
"screeningType": "title_abstract",
|
||||
"modelConfig": {
|
||||
"ds": true,
|
||||
"q3": true
|
||||
}
|
||||
}
|
||||
Response:
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"taskId": "uuid",
|
||||
"status": "running"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取筛选结果
|
||||
```
|
||||
GET /api/literature/projects/:projectId/screening/results
|
||||
Query Params:
|
||||
- page: 页码
|
||||
- pageSize: 每页数量
|
||||
- conflictOnly: 只显示冲突项
|
||||
- decision: include/exclude/pending
|
||||
```
|
||||
|
||||
#### 更新最终决策
|
||||
```
|
||||
PUT /api/literature/projects/:projectId/screening/results/:resultId
|
||||
Request Body:
|
||||
{
|
||||
"finalDecision": "include", // include/exclude
|
||||
"exclusionReason": "string" // 排除时必填
|
||||
}
|
||||
```
|
||||
|
||||
#### 批量更新决策
|
||||
```
|
||||
POST /api/literature/projects/:projectId/screening/results/batch-update
|
||||
Request Body:
|
||||
{
|
||||
"itemIds": ["uuid1", "uuid2", ...],
|
||||
"finalDecision": "include",
|
||||
"exclusionReason": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 任务管理
|
||||
|
||||
#### 获取任务状态
|
||||
```
|
||||
GET /api/literature/projects/:projectId/tasks/:taskId
|
||||
Response:
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"id": "uuid",
|
||||
"status": "running", // pending/running/completed/failed
|
||||
"totalItems": 100,
|
||||
"processedItems": 45,
|
||||
"progress": 45
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 任务进度流式推送(SSE)
|
||||
```
|
||||
GET /api/literature/projects/:projectId/tasks/:taskId/progress
|
||||
Accept: text/event-stream
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 响应格式规范
|
||||
|
||||
### 成功响应
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {...}
|
||||
}
|
||||
```
|
||||
|
||||
### 错误响应
|
||||
```json
|
||||
{
|
||||
"code": 400,
|
||||
"message": "错误描述",
|
||||
"error": {
|
||||
"code": "ERROR_CODE",
|
||||
"details": "..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 分页响应
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"items": [...],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"total": 100,
|
||||
"totalPages": 5
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善内容
|
||||
|
||||
后续将补充:
|
||||
- 完整的API文档(所有接口详细说明)
|
||||
- 请求/响应示例
|
||||
- 错误码定义
|
||||
- 接口测试用例
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
155
docs/03-业务模块/ASL-AI智能文献/02-技术设计/03-前端组件设计.md
Normal file
155
docs/03-业务模块/ASL-AI智能文献/02-技术设计/03-前端组件设计.md
Normal file
@@ -0,0 +1,155 @@
|
||||
# AI智能文献模块 - 前端组件设计
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-10-29
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档说明
|
||||
|
||||
本文档描述AI智能文献模块的前端组件设计,包括组件结构、组件接口、交互设计等。
|
||||
|
||||
---
|
||||
|
||||
## 🧩 组件架构
|
||||
|
||||
### 标题摘要初筛模块组件结构
|
||||
|
||||
```
|
||||
LiteratureScreeningModule/
|
||||
├── TitleAbstractScreening/
|
||||
│ ├── SetupView/ # 设置与启动视图
|
||||
│ │ ├── CriteriaReference.tsx # 标准参考面板
|
||||
│ │ ├── CriteriaAdjustment.tsx # 临时调整标准
|
||||
│ │ ├── LiteratureImport.tsx # 文献导入组件
|
||||
│ │ └── StartScreeningButton.tsx # 启动筛选按钮
|
||||
│ │
|
||||
│ ├── ReviewTableView/ # 表格化审核工作台 ⭐核心
|
||||
│ │ ├── ScreeningTable.tsx # 主表格组件
|
||||
│ │ ├── TableHeader.tsx # 表头(双行结构)
|
||||
│ │ ├── TableRow.tsx # 表格行
|
||||
│ │ ├── ExpandableRow.tsx # 可展开行(证据展示)
|
||||
│ │ ├── JudgmentCell.tsx # 判断单元格(✓/✗/?)
|
||||
│ │ ├── ConflictIndicator.tsx # 冲突状态指示器
|
||||
│ │ └── DecisionSelector.tsx # 最终决策选择器
|
||||
│ │
|
||||
│ ├── EvidenceModal/ # 双视图原文审查模态框
|
||||
│ │ ├── ModalContainer.tsx # 模态框容器
|
||||
│ │ ├── AbstractView.tsx # 左侧:摘要视图
|
||||
│ │ ├── EvidenceView.tsx # 右侧:证据视图
|
||||
│ │ └── HighlightedText.tsx # 高亮文本组件
|
||||
│ │
|
||||
│ ├── ResultView/ # 结果展示视图
|
||||
│ │ ├── StatisticsCards.tsx # 统计卡片
|
||||
│ │ ├── PrismaSummary.tsx # PRISMA式排除总结
|
||||
│ │ ├── ResultTabs.tsx # 结果Tab页
|
||||
│ │ └── ResultTable.tsx # 结果表格
|
||||
│ │
|
||||
│ └── shared/ # 共享组件
|
||||
│ ├── ProtocolOverview.tsx # 研究方案概览面板
|
||||
│ ├── BatchOperation.tsx # 批量操作组件
|
||||
│ └── ExportButton.tsx # 导出按钮
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 核心组件设计
|
||||
|
||||
### 1. ScreeningTable (表格化审核工作台)
|
||||
|
||||
**组件职责**:
|
||||
- 展示文献列表和筛选结果
|
||||
- 支持展开/收起查看证据
|
||||
- 支持点击判断查看详情
|
||||
- 支持批量操作
|
||||
|
||||
**Props接口**:
|
||||
```typescript
|
||||
interface ScreeningTableProps {
|
||||
projectId: string;
|
||||
items: LiteratureItem[];
|
||||
results: ScreeningResult[];
|
||||
onDecisionChange: (itemId: string, decision: string) => void;
|
||||
onBatchUpdate: (itemIds: string[], decision: string) => void;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. EvidenceModal (双视图原文审查模态框)
|
||||
|
||||
**组件职责**:
|
||||
- 左侧显示摘要/全文
|
||||
- 右侧显示AI判断和证据
|
||||
- 支持文本高亮
|
||||
- 支持查看引用来源
|
||||
|
||||
**Props接口**:
|
||||
```typescript
|
||||
interface EvidenceModalProps {
|
||||
visible: boolean;
|
||||
itemId: string;
|
||||
dimension: 'P' | 'I' | 'C' | 'S';
|
||||
onClose: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
### 3. ReviewTableView (审核工作台主视图)
|
||||
|
||||
**组件职责**:
|
||||
- 整合表格和模态框
|
||||
- 管理筛选状态
|
||||
- 处理用户交互
|
||||
|
||||
---
|
||||
|
||||
## 🔄 状态管理
|
||||
|
||||
### 使用Zustand管理筛选状态
|
||||
|
||||
```typescript
|
||||
interface ScreeningStore {
|
||||
currentProject: Project | null;
|
||||
items: LiteratureItem[];
|
||||
results: ScreeningResult[];
|
||||
selectedItems: string[];
|
||||
loading: boolean;
|
||||
|
||||
// Actions
|
||||
loadProject: (projectId: string) => Promise<void>;
|
||||
updateDecision: (itemId: string, decision: string) => Promise<void>;
|
||||
batchUpdate: (itemIds: string[], decision: string) => Promise<void>;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 响应式设计
|
||||
|
||||
### 表格布局适配
|
||||
- **桌面端**: 完整表格显示
|
||||
- **平板端**: 可横向滚动,关键列固定
|
||||
- **移动端**: 卡片式布局替代表格
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善内容
|
||||
|
||||
后续将补充:
|
||||
- 详细组件接口定义
|
||||
- 组件交互流程图
|
||||
- 样式设计规范
|
||||
- 组件使用示例
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
24
docs/03-业务模块/ASL-AI智能文献/02-技术设计/04-AI模型集成设计.md
Normal file
24
docs/03-业务模块/ASL-AI智能文献/02-技术设计/04-AI模型集成设计.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# AI模型集成设计
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善
|
||||
|
||||
本文档内容待规划完善,目前仅作为占位文档。
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
24
docs/03-业务模块/ASL-AI智能文献/02-技术设计/05-文件处理设计.md
Normal file
24
docs/03-业务模块/ASL-AI智能文献/02-技术设计/05-文件处理设计.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# 文件处理设计
|
||||
|
||||
> **文档版本:** v1.0
|
||||
> **创建日期:** 2025-10-29
|
||||
> **维护者:** AI智能文献开发团队
|
||||
|
||||
---
|
||||
|
||||
## ⏳ 待完善
|
||||
|
||||
本文档内容待规划完善,目前仅作为占位文档。
|
||||
|
||||
---
|
||||
|
||||
**文档版本:** v1.0
|
||||
**最后更新:** 2025-10-29
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
949
docs/03-业务模块/ASL-AI智能文献/02-技术设计/06-质量保障与可追溯策略.md
Normal file
949
docs/03-业务模块/ASL-AI智能文献/02-技术设计/06-质量保障与可追溯策略.md
Normal file
@@ -0,0 +1,949 @@
|
||||
# ASL 质量保障与可追溯策略
|
||||
|
||||
> **文档版本:** V1.0
|
||||
> **创建日期:** 2025-11-15
|
||||
> **适用模块:** AI 智能文献(ASL)
|
||||
> **目标:** 分阶段提升文献筛选、数据提取的准确率、质量控制和可追溯性
|
||||
|
||||
---
|
||||
|
||||
## 📋 文档概述
|
||||
|
||||
本文档定义了 ASL 模块在 **MVP → V1.0 → V2.0** 三个阶段中,如何逐步提升:
|
||||
1. **提取准确率**:从基础可用 → 高质量 → 医学级标准
|
||||
2. **质量控制**:从人工抽查 → 自动验证 → 智能仲裁
|
||||
3. **可追溯性**:从基本记录 → 完整证据链 → 审计级日志
|
||||
|
||||
### 核心设计原则
|
||||
|
||||
| 原则 | 说明 |
|
||||
|------|------|
|
||||
| **成本可控** | MVP 阶段优先使用 DeepSeek + Qwen3,成本敏感 |
|
||||
| **质量可升级** | 可切换到 GPT-5-Pro + Claude-4.5 高端组合 |
|
||||
| **分步实施** | 避免过度设计,每个阶段交付可用功能 |
|
||||
| **医学场景优化** | 针对英文医学文献的特点优化策略 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 三阶段路线图
|
||||
|
||||
```
|
||||
MVP (4周) V1.0 (6周) V2.0 (8周)
|
||||
├─ 基础双模型验证 ├─ 智能质量控制 ├─ 医学级质量保障
|
||||
├─ JSON Schema 约束 ├─ 分段提取优化 ├─ 多模型共识仲裁
|
||||
├─ 置信度评分 ├─ 证据链完整追溯 ├─ 自动质量审计
|
||||
├─ 人工复核机制 ├─ 规则引擎验证 ├─ 提示词版本管理
|
||||
└─ 基本追溯日志 └─ Few-shot 示例库 └─ HITL 智能分流
|
||||
↓ ↓ ↓
|
||||
可用 高质量 医学级
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 MVP 阶段(4 周)
|
||||
|
||||
### 目标定位
|
||||
|
||||
- **准确率目标**:≥ 85%
|
||||
- **成本预算**:筛选 1000 篇文献 ≤ ¥50
|
||||
- **交付标准**:基础功能可用,支持双模型对比
|
||||
|
||||
### 一、模型选择策略
|
||||
|
||||
#### 1.1 主力模型组合(成本优先)
|
||||
|
||||
| 角色 | 模型 | Model ID | 用途 | 成本 |
|
||||
|------|------|---------|------|------|
|
||||
| **模型 A** | DeepSeek-V3 | `deepseek-chat` | 快速初筛 | ¥0.001/1K tokens |
|
||||
| **模型 B** | Qwen3-72B | `qwen-max` | 交叉验证 | ¥0.004/1K tokens |
|
||||
|
||||
**切换选项**(质量优先):
|
||||
- **高端组合**:GPT-5-Pro (`gpt-5-pro`) + Claude-4.5-Sonnet (`claude-sonnet-4-5-20250929`)
|
||||
- **成本增加**:约 3-5 倍
|
||||
- **准确率提升**:85% → 92%+
|
||||
|
||||
#### 1.2 模型调用策略
|
||||
|
||||
```typescript
|
||||
// 双模型并行调用
|
||||
async function dualModelScreening(
|
||||
literature: Literature,
|
||||
protocol: Protocol
|
||||
) {
|
||||
// 并行调用两个模型
|
||||
const [resultA, resultB] = await Promise.all([
|
||||
llmService.chat('deepseek', buildPrompt(literature, protocol)),
|
||||
llmService.chat('qwen', buildPrompt(literature, protocol))
|
||||
]);
|
||||
|
||||
// 解析 JSON 结果
|
||||
const decisionA = parseJSON(resultA.content);
|
||||
const decisionB = parseJSON(resultB.content);
|
||||
|
||||
// 一致性判断
|
||||
if (decisionA.decision === decisionB.decision) {
|
||||
return {
|
||||
finalDecision: decisionA.decision,
|
||||
consensus: 'high',
|
||||
needReview: false,
|
||||
models: [decisionA, decisionB]
|
||||
};
|
||||
}
|
||||
|
||||
// 冲突 → 人工复核
|
||||
return {
|
||||
finalDecision: 'uncertain',
|
||||
consensus: 'conflict',
|
||||
needReview: true,
|
||||
models: [decisionA, decisionB]
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 二、核心技术策略
|
||||
|
||||
#### 2.1 ✅ 双模型交叉验证
|
||||
|
||||
**实施方案**:
|
||||
- 所有筛选任务同时调用两个模型
|
||||
- 自动对比结果,标记差异
|
||||
- 一致率作为质量指标(目标 ≥ 80%)
|
||||
|
||||
**代码示例**:
|
||||
```typescript
|
||||
interface DualModelResult {
|
||||
consensus: 'high' | 'conflict';
|
||||
finalDecision: 'include' | 'exclude' | 'uncertain';
|
||||
needReview: boolean;
|
||||
models: ModelDecision[];
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 ✅ JSON Schema 约束
|
||||
|
||||
**实施方案**:
|
||||
- 定义严格的输出格式
|
||||
- 使用枚举限制取值
|
||||
- 区分必填/可选字段
|
||||
|
||||
**Schema 定义**:
|
||||
```json
|
||||
{
|
||||
"$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", "other"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**提示词模板**:
|
||||
```typescript
|
||||
const prompt = `
|
||||
你是一位医学文献筛选专家。请根据以下 PICO 标准判断这篇文献是否应该纳入系统评价。
|
||||
|
||||
# PICO 标准
|
||||
- Population: ${protocol.population}
|
||||
- Intervention: ${protocol.intervention}
|
||||
- Comparison: ${protocol.comparison}
|
||||
- Outcome: ${protocol.outcome}
|
||||
|
||||
# 文献信息
|
||||
标题: ${literature.title}
|
||||
摘要: ${literature.abstract}
|
||||
|
||||
# 输出要求
|
||||
请严格按照以下 JSON Schema 输出结果:
|
||||
|
||||
${JSON.stringify(schema, null, 2)}
|
||||
|
||||
注意:
|
||||
1. decision 只能是 "include"、"exclude" 或 "uncertain"
|
||||
2. reason 必须具体说明判断依据(10-500字)
|
||||
3. confidence 为 0-1 之间的数值,表示你的判断把握
|
||||
4. pico 字段逐项评估匹配程度
|
||||
`;
|
||||
```
|
||||
|
||||
#### 2.3 ✅ 置信度评分
|
||||
|
||||
**实施方案**:
|
||||
- 要求模型对每个判断给出置信度(0-1)
|
||||
- 置信度 < 0.7 自动标记为需人工复核
|
||||
- 记录置信度分布,优化阈值
|
||||
|
||||
**自动分流规则**:
|
||||
```typescript
|
||||
function autoTriage(result: DualModelResult) {
|
||||
const avgConfidence = (
|
||||
result.models[0].confidence +
|
||||
result.models[1].confidence
|
||||
) / 2;
|
||||
|
||||
// 规则1:冲突 → 必须复核
|
||||
if (result.consensus === 'conflict') {
|
||||
return { needReview: true, priority: 'high' };
|
||||
}
|
||||
|
||||
// 规则2:低置信度 → 需要复核
|
||||
if (avgConfidence < 0.7) {
|
||||
return { needReview: true, priority: 'medium' };
|
||||
}
|
||||
|
||||
// 规则3:高置信度 + 一致 → 自动通过
|
||||
return { needReview: false, priority: 'low' };
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4 ✅ 基础可追溯
|
||||
|
||||
**实施方案**:
|
||||
- 保存原始提示词和模型输出
|
||||
- 记录模型版本和时间戳
|
||||
- 关联人工复核记录
|
||||
|
||||
**数据库设计**:
|
||||
```prisma
|
||||
model ScreeningResult {
|
||||
id String @id @default(uuid())
|
||||
literatureId String
|
||||
protocolId String
|
||||
|
||||
// 模型A结果
|
||||
modelAName String // "deepseek-chat"
|
||||
modelAOutput Json // 原始JSON输出
|
||||
modelAConfidence Float
|
||||
|
||||
// 模型B结果
|
||||
modelBName String // "qwen-max"
|
||||
modelBOutput Json
|
||||
modelBConfidence Float
|
||||
|
||||
// 最终决策
|
||||
finalDecision String // "include"/"exclude"/"uncertain"
|
||||
consensus String // "high"/"conflict"
|
||||
needReview Boolean
|
||||
|
||||
// 人工复核
|
||||
reviewedBy String?
|
||||
reviewedAt DateTime?
|
||||
reviewDecision String?
|
||||
reviewNotes String?
|
||||
|
||||
// 可追溯信息
|
||||
promptTemplate String @db.Text // 使用的提示词模板
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@map("asl_screening_results")
|
||||
}
|
||||
```
|
||||
|
||||
### 三、MVP 成本预算
|
||||
|
||||
**场景:筛选 1000 篇文献**
|
||||
|
||||
| 项目 | DeepSeek | Qwen3 | 合计 |
|
||||
|------|----------|-------|------|
|
||||
| 输入 tokens(平均) | 800 | 800 | - |
|
||||
| 输出 tokens(平均) | 200 | 200 | - |
|
||||
| 单次成本 | ¥0.001 | ¥0.004 | ¥0.005 |
|
||||
| **1000 篇总成本** | ¥1 | ¥4 | **¥5** |
|
||||
|
||||
**冲突率 20% 人工复核**:
|
||||
- 自动通过:800 篇 × ¥0.005 = ¥4
|
||||
- 人工复核:200 篇 × 2 分钟 = 6.7 小时
|
||||
- **总成本**:¥4 + 人工成本
|
||||
|
||||
### 四、MVP 验收标准
|
||||
|
||||
| 指标 | 目标 | 验证方法 |
|
||||
|------|------|----------|
|
||||
| 双模型一致率 | ≥ 80% | 统计报表 |
|
||||
| JSON Schema 验证通过率 | ≥ 95% | 自动检查 |
|
||||
| 人工复核队列占比 | ≤ 20% | 系统统计 |
|
||||
| 提取结果可追溯 | 100% | 审计检查 |
|
||||
| 成本控制 | ≤ ¥50/1000 篇 | 账单监控 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 V1.0 阶段(6 周)
|
||||
|
||||
### 目标定位
|
||||
|
||||
- **准确率目标**:≥ 90%
|
||||
- **成本预算**:筛选 1000 篇文献 ≤ ¥80
|
||||
- **交付标准**:高质量输出,智能质量控制
|
||||
|
||||
### 一、模型策略优化
|
||||
|
||||
#### 1.1 成本优化策略
|
||||
|
||||
**核心思路**:80% 用低成本模型,20% 高价值任务用顶级模型
|
||||
|
||||
```typescript
|
||||
async function smartScreening(literature: Literature, protocol: Protocol) {
|
||||
// 第一阶段:快速初筛(DeepSeek)
|
||||
const quickResult = await llmService.chat('deepseek', buildPrompt(...));
|
||||
const quickDecision = parseJSON(quickResult.content);
|
||||
|
||||
// 如果高置信度 + 明确结论 → 直接采纳
|
||||
if (
|
||||
quickDecision.confidence > 0.85 &&
|
||||
quickDecision.decision !== 'uncertain'
|
||||
) {
|
||||
return {
|
||||
finalDecision: quickDecision.decision,
|
||||
strategy: 'cost-optimized',
|
||||
models: [quickDecision]
|
||||
};
|
||||
}
|
||||
|
||||
// 否则 → 启用高端模型复核
|
||||
const detailedResult = await llmService.chat('gpt5', buildPrompt(...));
|
||||
return {
|
||||
finalDecision: detailedResult.decision,
|
||||
strategy: 'quality-assured',
|
||||
models: [quickDecision, detailedResult]
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
**预期成本节省**:
|
||||
- 80% 任务用 DeepSeek:800 × ¥0.001 = ¥0.8
|
||||
- 20% 任务用 GPT-5:200 × ¥0.10 = ¥20
|
||||
- **总成本**:¥20.8(相比全用 GPT-5 节省 80%)
|
||||
|
||||
### 二、核心技术增强
|
||||
|
||||
#### 2.1 ✅ Few-shot 示例库
|
||||
|
||||
**实施方案**:
|
||||
- 人工标注 20-30 个高质量示例
|
||||
- 针对不同研究类型分类(RCT、队列、病例对照)
|
||||
- 动态选择相似示例嵌入提示词
|
||||
|
||||
**示例格式**:
|
||||
```json
|
||||
{
|
||||
"examples": [
|
||||
{
|
||||
"title": "Effect of aspirin on cardiovascular events in patients with diabetes",
|
||||
"abstract": "...",
|
||||
"goldStandard": {
|
||||
"decision": "include",
|
||||
"reason": "RCT研究,人群为糖尿病患者(匹配P),干预为阿司匹林(匹配I),对照为安慰剂(匹配C),结局为心血管事件(匹配O)",
|
||||
"pico": {
|
||||
"population": "match",
|
||||
"intervention": "match",
|
||||
"comparison": "match",
|
||||
"outcome": "match"
|
||||
},
|
||||
"studyDesign": "RCT"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**提示词增强**:
|
||||
```typescript
|
||||
const promptWithExamples = `
|
||||
# 参考示例
|
||||
|
||||
以下是 3 个标注好的示例,帮助你理解判断标准:
|
||||
|
||||
${examples.map((ex, i) => `
|
||||
## 示例 ${i + 1}
|
||||
标题: ${ex.title}
|
||||
摘要: ${ex.abstract}
|
||||
判断: ${ex.goldStandard.decision}
|
||||
理由: ${ex.goldStandard.reason}
|
||||
`).join('\n')}
|
||||
|
||||
# 待筛选文献
|
||||
标题: ${literature.title}
|
||||
摘要: ${literature.abstract}
|
||||
|
||||
请参考上述示例,输出你的判断结果(JSON格式)。
|
||||
`;
|
||||
```
|
||||
|
||||
#### 2.2 ✅ 分段提取
|
||||
|
||||
**实施方案**:
|
||||
- 针对全文数据提取,按章节分段处理
|
||||
- 每段独立提取,减少上下文混淆
|
||||
- 最后合并结果,交叉验证一致性
|
||||
|
||||
**分段策略**:
|
||||
```typescript
|
||||
async function segmentedExtraction(fullText: string, protocol: Protocol) {
|
||||
// 分段
|
||||
const sections = {
|
||||
methods: extractSection(fullText, 'methods'),
|
||||
results: extractSection(fullText, 'results'),
|
||||
tables: extractTables(fullText),
|
||||
};
|
||||
|
||||
// 并行提取
|
||||
const [methodsData, resultsData, tablesData] = await Promise.all([
|
||||
extractFromMethods(sections.methods, protocol),
|
||||
extractFromResults(sections.results, protocol),
|
||||
extractFromTables(sections.tables, protocol),
|
||||
]);
|
||||
|
||||
// 合并结果
|
||||
return mergeExtractionResults([methodsData, resultsData, tablesData]);
|
||||
}
|
||||
```
|
||||
|
||||
**提取示例(方法学部分)**:
|
||||
```typescript
|
||||
const methodsPrompt = `
|
||||
请从以下方法学部分提取研究设计信息:
|
||||
|
||||
# 方法学原文
|
||||
${methodsSection}
|
||||
|
||||
# 提取字段
|
||||
- 研究设计类型(RCT/cohort/case-control等)
|
||||
- 样本量(干预组/对照组)
|
||||
- 纳入标准
|
||||
- 排除标准
|
||||
- 随机化方法(如适用)
|
||||
- 盲法(如适用)
|
||||
|
||||
# 输出格式(JSON)
|
||||
${methodsSchema}
|
||||
`;
|
||||
```
|
||||
|
||||
#### 2.3 ✅ 规则引擎验证
|
||||
|
||||
**实施方案**:
|
||||
- 定义业务规则,自动检查逻辑错误
|
||||
- 数值范围验证
|
||||
- 必填字段完整性检查
|
||||
|
||||
**验证规则**:
|
||||
```typescript
|
||||
const validationRules = [
|
||||
{
|
||||
name: '样本量合理性',
|
||||
check: (data) => {
|
||||
const total = data.sampleSize.intervention + data.sampleSize.control;
|
||||
return total >= 10 && total <= 100000;
|
||||
},
|
||||
errorMessage: '样本量超出合理范围(10-100000)'
|
||||
},
|
||||
{
|
||||
name: 'P值范围',
|
||||
check: (data) => {
|
||||
return data.pValue >= 0 && data.pValue <= 1;
|
||||
},
|
||||
errorMessage: 'P值必须在0-1之间'
|
||||
},
|
||||
{
|
||||
name: '必填字段完整性',
|
||||
check: (data) => {
|
||||
const required = ['studyDesign', 'sampleSize', 'primaryOutcome'];
|
||||
return required.every(field => data[field] != null);
|
||||
},
|
||||
errorMessage: '缺少必填字段'
|
||||
}
|
||||
];
|
||||
|
||||
function validateExtraction(data: ExtractionResult): ValidationReport {
|
||||
const errors = [];
|
||||
for (const rule of validationRules) {
|
||||
if (!rule.check(data)) {
|
||||
errors.push(rule.errorMessage);
|
||||
}
|
||||
}
|
||||
return {
|
||||
isValid: errors.length === 0,
|
||||
errors
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4 ✅ 完整证据链
|
||||
|
||||
**实施方案**:
|
||||
- 记录原文引用位置(页码、段落、句子)
|
||||
- 保存模型完整输出(含中间推理)
|
||||
- 关联所有人工修改记录
|
||||
|
||||
**数据库增强**:
|
||||
```prisma
|
||||
model ExtractionResult {
|
||||
id String @id @default(uuid())
|
||||
|
||||
// 提取内容
|
||||
extractedData Json
|
||||
|
||||
// 证据链(新增)
|
||||
evidenceChain Json // {
|
||||
// "sampleSize": {
|
||||
// "value": 150,
|
||||
// "source": {
|
||||
// "page": 3,
|
||||
// "paragraph": 2,
|
||||
// "text": "A total of 150 patients were enrolled..."
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// 模型信息
|
||||
modelName String
|
||||
modelVersion String
|
||||
promptVersion String // "v1.2.0"
|
||||
rawOutput String @db.Text // 原始输出(含CoT推理)
|
||||
|
||||
// 修改历史
|
||||
revisions ExtractionRevision[]
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
@@map("asl_extraction_results")
|
||||
}
|
||||
|
||||
model ExtractionRevision {
|
||||
id String @id @default(uuid())
|
||||
extractionId String
|
||||
|
||||
fieldName String // 修改的字段
|
||||
oldValue Json
|
||||
newValue Json
|
||||
reason String // 修改理由
|
||||
|
||||
revisedBy String
|
||||
revisedAt DateTime @default(now())
|
||||
|
||||
extraction ExtractionResult @relation(fields: [extractionId], references: [id])
|
||||
@@map("asl_extraction_revisions")
|
||||
}
|
||||
```
|
||||
|
||||
### 三、V1.0 成本预算
|
||||
|
||||
**场景:筛选 1000 篇 + 提取 200 篇全文**
|
||||
|
||||
| 任务 | 策略 | 成本 |
|
||||
|------|------|------|
|
||||
| 标题摘要筛选 | 80% DeepSeek + 20% GPT-5 | ¥21 |
|
||||
| 全文数据提取 | 分段提取(GPT-5) | ¥60 |
|
||||
| **总成本** | - | **¥81** |
|
||||
|
||||
### 四、V1.0 验收标准
|
||||
|
||||
| 指标 | 目标 | 验证方法 |
|
||||
|------|------|----------|
|
||||
| 提取准确率 | ≥ 90% | 人工抽查 50 篇 |
|
||||
| Few-shot 示例库 | ≥ 20 个 | 人工标注 |
|
||||
| 规则引擎覆盖率 | ≥ 80% | 代码审查 |
|
||||
| 证据链完整性 | 100% | 审计检查 |
|
||||
| 成本控制 | ≤ ¥80/项目 | 账单监控 |
|
||||
|
||||
---
|
||||
|
||||
## 🏆 V2.0 阶段(8 周)
|
||||
|
||||
### 目标定位
|
||||
|
||||
- **准确率目标**:≥ 95%(医学级)
|
||||
- **成本预算**:按需配置
|
||||
- **交付标准**:自动化质量审计,符合临床研究规范
|
||||
|
||||
### 一、医学级质量保障
|
||||
|
||||
#### 1.1 ✅ 三模型共识仲裁
|
||||
|
||||
**实施方案**:
|
||||
- 双模型冲突时,自动启用第三方仲裁
|
||||
- 三模型投票决策
|
||||
- 记录仲裁过程
|
||||
|
||||
```typescript
|
||||
async function threeModelArbitration(
|
||||
literature: Literature,
|
||||
protocol: Protocol
|
||||
) {
|
||||
// 第一轮:双模型
|
||||
const [resultA, resultB] = await Promise.all([
|
||||
llmService.chat('deepseek', buildPrompt(...)),
|
||||
llmService.chat('qwen', buildPrompt(...))
|
||||
]);
|
||||
|
||||
// 如果一致,直接返回
|
||||
if (resultA.decision === resultB.decision) {
|
||||
return { finalDecision: resultA.decision, arbitration: false };
|
||||
}
|
||||
|
||||
// 冲突 → 启用 Claude 仲裁
|
||||
console.log('检测到冲突,启用 Claude-4.5 仲裁...');
|
||||
const resultC = await llmService.chat('claude', buildPrompt(...));
|
||||
|
||||
// 三模型投票
|
||||
const votes = [resultA.decision, resultB.decision, resultC.decision];
|
||||
const voteCount = {
|
||||
include: votes.filter(v => v === 'include').length,
|
||||
exclude: votes.filter(v => v === 'exclude').length,
|
||||
uncertain: votes.filter(v => v === 'uncertain').length,
|
||||
};
|
||||
|
||||
// 多数决
|
||||
const winner = Object.entries(voteCount)
|
||||
.sort((a, b) => b[1] - a[1])[0][0];
|
||||
|
||||
return {
|
||||
finalDecision: winner,
|
||||
arbitration: true,
|
||||
votes: { resultA, resultB, resultC },
|
||||
consensus: voteCount[winner] >= 2 ? 'strong' : 'weak'
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
**成本控制**:
|
||||
- 仅在冲突时启用仲裁(预计 10-15%)
|
||||
- 单次仲裁额外成本:¥0.021(Claude-4.5)
|
||||
|
||||
#### 1.2 ✅ HITL 智能分流
|
||||
|
||||
**实施方案**:
|
||||
- 基于规则的智能优先级排序
|
||||
- 高价值/高风险任务优先人工复核
|
||||
- 低风险任务自动化处理
|
||||
|
||||
**分流规则**:
|
||||
```typescript
|
||||
function intelligentTriage(result: ScreeningResult): TriageDecision {
|
||||
let priority = 0;
|
||||
let needReview = false;
|
||||
|
||||
// 规则1:三模型仍不一致 → 最高优先级
|
||||
if (result.arbitration && result.consensus === 'weak') {
|
||||
priority = 100;
|
||||
needReview = true;
|
||||
}
|
||||
// 规则2:RCT 研究 → 中等优先级
|
||||
else if (result.studyDesign === 'RCT') {
|
||||
priority = 70;
|
||||
needReview = result.confidence < 0.9;
|
||||
}
|
||||
// 规则3:关键结局指标 → 高优先级
|
||||
else if (result.outcome.includes('mortality')) {
|
||||
priority = 80;
|
||||
needReview = result.confidence < 0.85;
|
||||
}
|
||||
// 规则4:高置信度 + 一致 → 自动通过
|
||||
else if (result.confidence > 0.95 && result.consensus === 'high') {
|
||||
priority = 10;
|
||||
needReview = false;
|
||||
}
|
||||
|
||||
return { priority, needReview };
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.3 ✅ 提示词版本管理
|
||||
|
||||
**实施方案**:
|
||||
- Git 管理提示词模板
|
||||
- 版本号标记(语义化版本)
|
||||
- A/B 测试不同版本效果
|
||||
|
||||
**目录结构**:
|
||||
```
|
||||
backend/prompts/asl/
|
||||
├── screening/
|
||||
│ ├── v1.0.0-basic.txt
|
||||
│ ├── v1.1.0-with-examples.txt
|
||||
│ └── v1.2.0-cot.txt
|
||||
├── extraction/
|
||||
│ ├── v1.0.0-methods.txt
|
||||
│ └── v1.1.0-methods-segmented.txt
|
||||
└── changelog.md
|
||||
```
|
||||
|
||||
**版本记录**:
|
||||
```prisma
|
||||
model PromptVersion {
|
||||
id String @id @default(uuid())
|
||||
|
||||
name String // "screening-v1.2.0"
|
||||
content String @db.Text
|
||||
version String // "1.2.0"
|
||||
changelog String // "增加 Few-shot 示例"
|
||||
|
||||
// 性能指标
|
||||
accuracy Float? // 0.92
|
||||
usageCount Int @default(0)
|
||||
|
||||
isActive Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@map("asl_prompt_versions")
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.4 ✅ 自动质量审计
|
||||
|
||||
**实施方案**:
|
||||
- 定期批量抽查(10%)
|
||||
- 自动生成质量报告
|
||||
- 异常检测和告警
|
||||
|
||||
**审计报表**:
|
||||
```typescript
|
||||
interface QualityAuditReport {
|
||||
period: { start: Date; end: Date };
|
||||
totalTasks: number;
|
||||
sampledTasks: number;
|
||||
|
||||
metrics: {
|
||||
accuracy: number; // 准确率
|
||||
interRaterAgreement: number; // 人机一致性
|
||||
falsePositiveRate: number; // 假阳性率
|
||||
falseNegativeRate: number; // 假阴性率
|
||||
};
|
||||
|
||||
modelPerformance: {
|
||||
deepseek: { accuracy: number; avgConfidence: number };
|
||||
qwen: { accuracy: number; avgConfidence: number };
|
||||
gpt5: { accuracy: number; avgConfidence: number };
|
||||
};
|
||||
|
||||
issues: {
|
||||
type: string;
|
||||
count: number;
|
||||
examples: string[];
|
||||
}[];
|
||||
|
||||
recommendations: string[];
|
||||
}
|
||||
```
|
||||
|
||||
### 二、高级提示词工程
|
||||
|
||||
#### 2.1 ✅ Chain of Thought (CoT)
|
||||
|
||||
**实施方案**:
|
||||
- 要求模型输出推理过程
|
||||
- 分步骤判断 PICO 匹配度
|
||||
- 最后给出综合结论
|
||||
|
||||
**提示词示例**:
|
||||
```
|
||||
请按照以下步骤判断这篇文献是否应该纳入:
|
||||
|
||||
# Step 1: 研究设计判断
|
||||
- 识别研究类型(RCT/队列/病例对照等)
|
||||
- 判断是否符合纳入标准
|
||||
|
||||
# Step 2: PICO 逐项评估
|
||||
- Population: 详细分析人群是否匹配
|
||||
- Intervention: 详细分析干预措施是否匹配
|
||||
- Comparison: 详细分析对照是否匹配
|
||||
- Outcome: 详细分析结局指标是否匹配
|
||||
|
||||
# Step 3: 综合判断
|
||||
- 汇总以上分析
|
||||
- 给出最终决策(include/exclude/uncertain)
|
||||
- 评估置信度(0-1)
|
||||
|
||||
# 输出格式
|
||||
{
|
||||
"reasoning": {
|
||||
"studyDesign": "这是一项...",
|
||||
"population": "人群匹配度分析...",
|
||||
"intervention": "干预措施分析...",
|
||||
"comparison": "对照分析...",
|
||||
"outcome": "结局指标分析..."
|
||||
},
|
||||
"decision": "include",
|
||||
"confidence": 0.95,
|
||||
"reason": "基于以上分析..."
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 ✅ 动态示例选择
|
||||
|
||||
**实施方案**:
|
||||
- 计算待筛选文献与示例库的语义相似度
|
||||
- 动态选择最相似的 3-5 个示例
|
||||
- 嵌入提示词
|
||||
|
||||
```typescript
|
||||
async function selectSimilarExamples(
|
||||
literature: Literature,
|
||||
examplePool: Example[]
|
||||
): Promise<Example[]> {
|
||||
// 使用嵌入模型计算相似度
|
||||
const literatureEmbedding = await getEmbedding(
|
||||
`${literature.title} ${literature.abstract}`
|
||||
);
|
||||
|
||||
const similarities = examplePool.map(ex => ({
|
||||
example: ex,
|
||||
similarity: cosineSimilarity(literatureEmbedding, ex.embedding)
|
||||
}));
|
||||
|
||||
// 返回最相似的 5 个
|
||||
return similarities
|
||||
.sort((a, b) => b.similarity - a.similarity)
|
||||
.slice(0, 5)
|
||||
.map(s => s.example);
|
||||
}
|
||||
```
|
||||
|
||||
### 三、V2.0 成本预算
|
||||
|
||||
**场景:高质量系统评价项目(筛选 5000 篇 + 提取 300 篇)**
|
||||
|
||||
| 任务 | 策略 | 成本 |
|
||||
|------|------|------|
|
||||
| 标题摘要筛选 | 成本优化 + 15% 仲裁 | ¥120 |
|
||||
| 全文数据提取 | GPT-5 + Claude 双模型 | ¥350 |
|
||||
| 质量审计 | 10% 抽查 | ¥30 |
|
||||
| **总成本** | - | **¥500** |
|
||||
|
||||
### 四、V2.0 验收标准
|
||||
|
||||
| 指标 | 目标 | 验证方法 |
|
||||
|------|------|----------|
|
||||
| 提取准确率 | ≥ 95% | 人工抽查 100 篇 |
|
||||
| 人机一致性 | ≥ 90% | Cohen's Kappa |
|
||||
| 假阳性率 | ≤ 5% | 统计分析 |
|
||||
| 假阴性率 | ≤ 3% | 统计分析 |
|
||||
| 提示词版本管理 | 100% | Git 历史 |
|
||||
| 自动化审计 | 每周 1 次 | 系统报表 |
|
||||
|
||||
---
|
||||
|
||||
## 📊 三阶段对比总结
|
||||
|
||||
| 维度 | MVP | V1.0 | V2.0 |
|
||||
|------|-----|------|------|
|
||||
| **准确率** | 85% | 90% | 95% |
|
||||
| **模型组合** | DeepSeek + Qwen3 | 成本优化策略 | 三模型仲裁 |
|
||||
| **质量控制** | 双模型验证 | 规则引擎 + Few-shot | HITL + 自动审计 |
|
||||
| **可追溯性** | 基本日志 | 完整证据链 | 审计级记录 |
|
||||
| **成本/1000 篇** | ¥5 | ¥21 | ¥24 + 仲裁 |
|
||||
| **开发周期** | 4 周 | 6 周 | 8 周 |
|
||||
| **适用场景** | 快速验证 | 常规项目 | 高质量发表 |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 实施路径
|
||||
|
||||
### 阶段 1: MVP 开发(Week 1-4)
|
||||
|
||||
**Week 1**:基础架构
|
||||
- [ ] LLM 服务封装(DeepSeek + Qwen3)
|
||||
- [ ] JSON Schema 定义
|
||||
- [ ] 数据库表设计
|
||||
|
||||
**Week 2**:核心功能
|
||||
- [ ] 双模型并行调用
|
||||
- [ ] 一致性判断逻辑
|
||||
- [ ] 人工复核队列
|
||||
|
||||
**Week 3**:前端开发
|
||||
- [ ] 筛选工作台
|
||||
- [ ] 冲突对比视图
|
||||
- [ ] 人工复核界面
|
||||
|
||||
**Week 4**:测试验收
|
||||
- [ ] 功能测试
|
||||
- [ ] 准确率评估
|
||||
- [ ] 成本监控
|
||||
|
||||
### 阶段 2: V1.0 增强(Week 5-10)
|
||||
|
||||
**Week 5-6**:智能优化
|
||||
- [ ] 成本优化策略
|
||||
- [ ] Few-shot 示例库
|
||||
- [ ] 动态示例选择
|
||||
|
||||
**Week 7-8**:质量控制
|
||||
- [ ] 分段提取
|
||||
- [ ] 规则引擎
|
||||
- [ ] 证据链完整化
|
||||
|
||||
**Week 9-10**:测试优化
|
||||
- [ ] A/B 测试
|
||||
- [ ] 准确率提升
|
||||
- [ ] 文档完善
|
||||
|
||||
### 阶段 3: V2.0 完善(Week 11-18)
|
||||
|
||||
**Week 11-13**:高级功能
|
||||
- [ ] 三模型仲裁
|
||||
- [ ] HITL 智能分流
|
||||
- [ ] 提示词版本管理
|
||||
|
||||
**Week 14-16**:质量审计
|
||||
- [ ] 自动审计系统
|
||||
- [ ] 质量报表
|
||||
- [ ] 异常检测
|
||||
|
||||
**Week 17-18**:发布准备
|
||||
- [ ] 全量测试
|
||||
- [ ] 医学专家验证
|
||||
- [ ] 文档和培训
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [CloseAI 集成指南](../../../02-通用能力层/01-LLM大模型网关/03-CloseAI集成指南.md)
|
||||
- [AI 模型集成设计](./04-AI模型集成设计.md)
|
||||
- [数据库设计](./01-数据库设计.md)
|
||||
- [API 设计规范](./02-API设计规范.md)
|
||||
|
||||
---
|
||||
|
||||
**更新日志**:
|
||||
- 2025-11-15: 创建文档,定义 MVP/V1.0/V2.0 三阶段策略
|
||||
|
||||
1024
docs/03-业务模块/ASL-AI智能文献/02-技术设计/07-文献处理技术选型.md
Normal file
1024
docs/03-业务模块/ASL-AI智能文献/02-技术设计/07-文献处理技术选型.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user