feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
This commit is contained in:
@@ -2,24 +2,24 @@
|
||||
|
||||
**日期**: 2025-11-21
|
||||
**任务**: å°†Mock AI替æ<C2BF>¢ä¸ºçœŸå®žLLM调用
|
||||
**状态**: ✅ 完成
|
||||
**状æ€?*: âœ?完æˆ<C3A6>
|
||||
|
||||
---
|
||||
|
||||
## 📋 背景
|
||||
|
||||
### 之前的状态
|
||||
- ✅ 已完成 Prompt 设计(v1.0.0-MVP)
|
||||
- ✅ 已实现 `llmScreeningService.ts`(真实LLM调用)
|
||||
- ✅ 已完成测试框架和质量验证
|
||||
- ❌ **问题**: `screeningService.ts` 中使用 `mockAIScreening` 生成假数据
|
||||
### 之å‰<EFBFBD>的状æ€?
|
||||
- �已完�Prompt 设计(v1.0.0-MVP�
|
||||
- �已实�`llmScreeningService.ts`(真实LLM调用�
|
||||
- âœ?已完æˆ<C3A6>测试框架和质é‡<C3A9>验è¯<C3A8>
|
||||
- â<EFBFBD>?**问题**: `screeningService.ts` ä¸ä½¿ç”?`mockAIScreening` 生æˆ<EFBFBD>å<EFBFBD>‡æ•°æ<EFBFBD>?
|
||||
|
||||
### 用户需求
|
||||
从"设置与启动"页面上传真实文献数据后,**使用真实的 DeepSeek 和 Qwen API 进行筛选**,而不是模拟数据。
|
||||
### 用户需�
|
||||
ä»?设置与å<C5BD>¯åŠ?页é<C2B5>¢ä¸Šä¼ 真实文献数æ<C2B0>®å<C2AE>Žï¼Œ**使用真实çš?DeepSeek å’?Qwen API 进行ç›é€?*,而ä¸<C3A4>是模拟数æ<C2B0>®ã€?
|
||||
|
||||
---
|
||||
|
||||
## ✅ 完成内容
|
||||
## âœ?完æˆ<C3A6>内容
|
||||
|
||||
### 1. 修改 `screeningService.ts`
|
||||
|
||||
@@ -34,10 +34,10 @@ import { llmScreeningService } from './llmScreeningService.js';
|
||||
|
||||
**替æ<C2BF>¢å¤„ç<E2809E>†é€»è¾‘**:
|
||||
```typescript
|
||||
// ❌ 旧代码(Mock)
|
||||
// â<EFBFBD>?旧代ç <C3A7>(Mockï¼?
|
||||
const result = await mockAIScreening(projectId, literature);
|
||||
|
||||
// ✅ 新代码(真实LLM)
|
||||
// âœ?新代ç <C3A7>(真实LLMï¼?
|
||||
const screeningResult = await llmScreeningService.dualModelScreening(
|
||||
literature.id,
|
||||
literature.title,
|
||||
@@ -87,7 +87,7 @@ const screeningResult = await llmScreeningService.dualModelScreening(
|
||||
// DeepSeek结果
|
||||
dsModelName: screeningResult.deepseekModel,
|
||||
dsPJudgment: screeningResult.deepseek.judgment.P,
|
||||
// ... 完整的字段映射
|
||||
// ... å®Œæ•´çš„å—æ®µæ˜ å°?
|
||||
};
|
||||
```
|
||||
|
||||
@@ -97,65 +97,65 @@ const screeningResult = await llmScreeningService.dualModelScreening(
|
||||
|
||||
### 用户æ“<C3A6>作æµ<C3A6>程
|
||||
```
|
||||
1. 访问"设置与启动"页面
|
||||
↓
|
||||
1. 访问"设置与å<C5BD>¯åŠ?页é<C2B5>¢
|
||||
�
|
||||
2. 填写 PICOS æ ‡å‡†
|
||||
↓
|
||||
�
|
||||
3. ä¸Šä¼ Excel 文献列表(例如:199篇)
|
||||
↓
|
||||
�
|
||||
4. 点击"开始AIåˆ<C3A5>ç›"
|
||||
↓
|
||||
5. 后端自动处理:
|
||||
�
|
||||
5. å<EFBFBD>Žç«¯è‡ªåЍ处ç<EFBFBD>†ï¼?
|
||||
a. 创建项目
|
||||
b. 导入文献
|
||||
c. 启动筛选任务
|
||||
↓
|
||||
c. å<EFBFBD>¯åЍç›é€‰ä»»åŠ?
|
||||
�
|
||||
6. 真实LLM处ç<E2809E>†ï¼ˆæ¯<C3A6>篇约10-15秒)
|
||||
a. 调用 DeepSeek API
|
||||
b. 调用 Qwen API
|
||||
c. 对比结果,检测冲突
|
||||
c. 对比结果,检测冲�
|
||||
d. ä¿<C3A4>å˜åˆ°æ•°æ<C2B0>®åº“
|
||||
↓
|
||||
7. 前端自动跳转到"审核工作台"
|
||||
↓
|
||||
8. 显示真实的AI筛选结果
|
||||
�
|
||||
7. å‰<EFBFBD>端自动跳转åˆ?å®¡æ ¸å·¥ä½œå<C593>?
|
||||
�
|
||||
8. 显示真实的AIç›é€‰ç»“æž?
|
||||
```
|
||||
|
||||
### 技术流程
|
||||
### 技术æµ<EFBFBD>ç¨?
|
||||
|
||||
```
|
||||
å‰<EFBFBD>端: TitleScreeningSettings.tsx
|
||||
↓ POST /api/v1/asl/literatures/import
|
||||
�POST /api/v1/asl/literatures/import
|
||||
|
||||
å<EFBFBD>Žç«¯: literatureController.ts
|
||||
↓ importLiteratures()
|
||||
↓ startScreeningTask()
|
||||
�importLiteratures()
|
||||
�startScreeningTask()
|
||||
|
||||
å<EFBFBD>Žç«¯: screeningService.ts
|
||||
↓ processLiteraturesInBackground()
|
||||
↓ for each literature:
|
||||
↓ llmScreeningService.dualModelScreening()
|
||||
�processLiteraturesInBackground()
|
||||
�for each literature:
|
||||
�llmScreeningService.dualModelScreening()
|
||||
|
||||
å<EFBFBD>Žç«¯: llmScreeningService.ts
|
||||
↓ Promise.all([
|
||||
�Promise.all([
|
||||
screenWithModel('deepseek-chat', ...),
|
||||
screenWithModel('qwen-max', ...),
|
||||
])
|
||||
|
||||
å<EFBFBD>Žç«¯: LLMFactory
|
||||
↓ getAdapter('deepseek-v3')
|
||||
↓ getAdapter('qwen3-72b')
|
||||
�getAdapter('deepseek-v3')
|
||||
�getAdapter('qwen3-72b')
|
||||
|
||||
真实API调用
|
||||
↓ DeepSeek API
|
||||
↓ Qwen API
|
||||
�DeepSeek API
|
||||
�Qwen API
|
||||
|
||||
结果ä¿<EFBFBD>å˜
|
||||
↓ AslScreeningResult 表
|
||||
�AslScreeningResult �
|
||||
|
||||
å‰<EFBFBD>端: ScreeningWorkbench.tsx
|
||||
↓ GET /api/v1/asl/projects/:projectId/screening-results
|
||||
↓ 显示真实结果
|
||||
�GET /api/v1/asl/projects/:projectId/screening-results
|
||||
�显示真实结果
|
||||
```
|
||||
|
||||
---
|
||||
@@ -165,46 +165,46 @@ const screeningResult = await llmScreeningService.dualModelScreening(
|
||||
### å<>•篇文献处ç<E2809E>†æ—¶é—´
|
||||
| æ¥éª¤ | 耗时(串行) |
|
||||
|-----|------------|
|
||||
| DeepSeek API 调用 | 5-10秒 |
|
||||
| Qwen API 调用 | 5-10秒 |
|
||||
| 结果保存 | 0.1秒 |
|
||||
| **总计** | **10-20秒** |
|
||||
| DeepSeek API 调用 | 5-10�|
|
||||
| Qwen API 调用 | 5-10�|
|
||||
| 结果ä¿<EFBFBD>å˜ | 0.1ç§?|
|
||||
| **总计** | **10-20�* |
|
||||
|
||||
### 批量处理时间(199篇)
|
||||
### 批é‡<EFBFBD>处ç<EFBFBD>†æ—¶é—´ï¼?99篇)
|
||||
| 模å¼<C3A5> | 耗时 | 说明 |
|
||||
|-----|------|-----|
|
||||
| **串行处ç<E2809E>†** | 33-66分钟 | 当å‰<C3A5>实现(é<CB86>¿å…<C3A5>APIé™<C3A9>æµ<C3A6>)|
|
||||
| 并发处理(3个) | 11-22分钟 | 可选优化(需测试) |
|
||||
| 并发处理(10个) | 3-7分钟 | 风险:可能触发API限额 |
|
||||
| å¹¶å<EFBFBD>‘处ç<EFBFBD>†ï¼?个) | 11-22分钟 | å<>¯é€‰ä¼˜åŒ–(需测试ï¼?|
|
||||
| å¹¶å<EFBFBD>‘处ç<EFBFBD>†ï¼?0个) | 3-7分钟 | 风险:å<C5A1>¯èƒ½è§¦å<C2A6>‘APIé™<C3A9>é¢<C3A9> |
|
||||
|
||||
**当å‰<C3A5>ç–ç•¥**: 串行处ç<E2809E>†ï¼ˆç¨³å®šä¼˜å…ˆï¼‰
|
||||
|
||||
---
|
||||
|
||||
## 🎯 与Mock数据的对比
|
||||
## 🎯 与Mockæ•°æ<C2B0>®çš„对æ¯?
|
||||
|
||||
### Mock 数据(旧)
|
||||
### Mock æ•°æ<EFBFBD>®ï¼ˆæ—§ï¼?
|
||||
```javascript
|
||||
// ❌ 假数据
|
||||
// â<EFBFBD>?å<>‡æ•°æ<C2B0>?
|
||||
dsPEvidence: "模拟è¯<C3A8>æ<EFBFBD>®: ç ”ç©¶äººç¾¤ä¸ŽPICOä¸çš„Pæ ‡å‡†åŒ¹é…<C3A9>"
|
||||
dsReason: "基于标题和摘要分析,该文献符合纳入标准。"
|
||||
dsConclusion: randomConclusion() // 随机!
|
||||
dsReason: "åŸºäºŽæ ‡é¢˜å’Œæ‘˜è¦<EFBFBD>分æž<EFBFBD>,该文献符å<EFBFBD>ˆçº³å…¥æ ‡å‡†ã€?
|
||||
dsConclusion: randomConclusion() // éš<EFBFBD>机ï¼?
|
||||
|
||||
// 特点:
|
||||
- 1秒完成199篇
|
||||
// 特点�
|
||||
- 1秒完�99�
|
||||
- è¯<C3A8>æ<EFBFBD>®éƒ½æ˜¯"模拟è¯<C3A8>æ<EFBFBD>®"
|
||||
- 判æ–结果éš<C3A9>机生æˆ<C3A6>
|
||||
```
|
||||
|
||||
### 真实LLM(新)
|
||||
### 真实LLM(新�
|
||||
```javascript
|
||||
// ✅ 真实数据
|
||||
// âœ?真实数æ<C2B0>®
|
||||
dsPEvidence: "This study included adult patients with type 2 diabetes mellitus aged 18 years or older, which matches the population criteria."
|
||||
dsReason: "The study population consists of T2DM patients, the intervention is an SGLT2 inhibitor (empagliflozin), the comparator is placebo, and the study design is a randomized controlled trial. All PICO criteria are met. The study reports on cardiovascular outcomes including MACE, heart failure hospitalization, and cardiovascular death, which are the outcomes of interest."
|
||||
dsConclusion: "include" // AI真实判断!
|
||||
dsConclusion: "include" // AI真实判æ–ï¼?
|
||||
|
||||
// 特点:
|
||||
- 33-66分钟完成199篇
|
||||
// 特点�
|
||||
- 33-66分钟完æˆ<EFBFBD>199ç¯?
|
||||
- è¯<C3A8>æ<EFBFBD>®å¼•用文献原文
|
||||
- 判æ–基于Prompt v1.0.0-MVP
|
||||
- 准确率:60%(首次测试)
|
||||
@@ -222,12 +222,12 @@ node check-data.mjs
|
||||
|
||||
### 预期输出(真实数æ<C2B0>®ï¼‰
|
||||
```
|
||||
🔬 筛选结果样本:
|
||||
🔬 ç›é€‰ç»“æžœæ ·æœ?
|
||||
[1] 文献: Assessment of Thrombectomy versus Combined...
|
||||
DeepSeek: include (P:match, I:partial, C:mismatch, S:match)
|
||||
Qwen: exclude (P:mismatch, I:mismatch, C:partial, S:match)
|
||||
冲突状态: conflict
|
||||
是否有证据: DeepSeek=true, Qwen=true ✅
|
||||
冲çª<EFBFBD>状æ€? conflict
|
||||
是å<EFBFBD>¦æœ‰è¯<EFBFBD>æ<EFBFBD>? DeepSeek=true, Qwen=true âœ?
|
||||
|
||||
è¯<C3A8>æ<EFBFBD>®ç¤ºä¾‹:
|
||||
- dsPEvidence: "The study population consists of..."
|
||||
@@ -245,17 +245,17 @@ node check-data.mjs
|
||||
- ä¸<C3A4>å<EFBFBD>ˆæ ¼çš„输出会被拒ç»<C3A7>
|
||||
|
||||
2. **错误处ç<E2809E>†**:
|
||||
- 单篇文献失败不影响整体任务
|
||||
- å<EFBFBD>•篇文献失败ä¸<EFBFBD>å½±å“<EFBFBD>整体任åŠ?
|
||||
- 详细错误日志记录
|
||||
|
||||
3. **进度追踪**:
|
||||
- 每10篇更新一次进度
|
||||
- 实时统计成功/冲突/失败数
|
||||
- �0篇更新一次进�
|
||||
- 实时统计æˆ<EFBFBD>功/冲çª<C3A7>/失败æ•?
|
||||
|
||||
4. **可追溯性**:
|
||||
- 记录原始LLM输出(`rawOutput`)
|
||||
- 记录Prompt版本(`promptVersion`)
|
||||
- 记录处理时间(`aiProcessedAt`)
|
||||
4. **å<EFBFBD>¯è¿½æº¯æ€?*:
|
||||
- 记录原始LLM输出(`rawOutput`�
|
||||
- 记录Prompt版本(`promptVersion`�
|
||||
- 记录处ç<EFBFBD>†æ—¶é—´ï¼ˆ`aiProcessedAt`ï¼?
|
||||
|
||||
---
|
||||
|
||||
@@ -264,8 +264,8 @@ node check-data.mjs
|
||||
### Step 1: 准备测试数æ<C2B0>®
|
||||
```
|
||||
使用现有测试文件:
|
||||
- PICOS: docs/.../测试案例的PICOS、纳入标准、排除标准.txt
|
||||
- Excel: docs/.../Test Cases.xlsx (199篇文献)
|
||||
- PICOS: docs/.../测试案例的PICOSã€<EFBFBD>çº³å…¥æ ‡å‡†ã€<EFBFBD>æŽ’é™¤æ ‡å‡?txt
|
||||
- Excel: docs/.../Test Cases.xlsx (199篇文�
|
||||
```
|
||||
|
||||
### Step 2: 执行测试
|
||||
@@ -274,8 +274,8 @@ node check-data.mjs
|
||||
3. 访问: `http://localhost:3001`
|
||||
4. 填写PICOS + ä¸Šä¼ Excel
|
||||
5. 点击"开始AIåˆ<C3A5>ç›"
|
||||
6. **等待30-60分钟**(199篇×20秒)
|
||||
7. 查看审核工作台
|
||||
6. **ç‰å¾…30-60分钟**ï¼?99篇Ã?0秒)
|
||||
7. æŸ¥çœ‹å®¡æ ¸å·¥ä½œå<EFBFBD>?
|
||||
|
||||
### Step 3: 验è¯<C3A8>结果
|
||||
```bash
|
||||
@@ -284,18 +284,18 @@ node check-data.mjs
|
||||
```
|
||||
|
||||
**检查项**:
|
||||
- [ ] 所有文献都有筛选结果
|
||||
- [ ] 证据不再是"模拟证据"
|
||||
- [ ] 所有文献都有ç›é€‰ç»“æž?
|
||||
- [ ] è¯<EFBFBD>æ<EFBFBD>®ä¸<EFBFBD>å†<EFBFBD>æ˜?模拟è¯<C3A8>æ<EFBFBD>®"
|
||||
- [ ] è¯<C3A8>æ<EFBFBD>®åŒ…å<E280A6>«æ–‡çŒ®åŽŸæ–‡å¼•ç”¨
|
||||
- [ ] 判æ–ç<C2AD>†ç”±è¯¦ç»†ä¸”符å<C2A6>ˆé€»è¾‘
|
||||
- [ ] 冲突检测准确(conclusion不同)
|
||||
- [ ] 冲çª<EFBFBD>检测准确(conclusionä¸<EFBFBD>å<EFBFBD>Œï¼?
|
||||
|
||||
---
|
||||
|
||||
## âš ï¸<C3AF> 注æ„<C3A6>事项
|
||||
|
||||
### API密钥é…<C3A9>ç½®
|
||||
确保环境变量已配置:
|
||||
ç¡®ä¿<EFBFBD>环境å<EFBFBD>˜é‡<EFBFBD>å·²é…<EFBFBD>ç½?
|
||||
```bash
|
||||
# .env
|
||||
DEEPSEEK_API_KEY=sk-xxxxx
|
||||
@@ -306,33 +306,33 @@ QWEN_API_KEY=sk-xxxxx
|
||||
- DeepSeek: 60 RPM(æ¯<C3A6>分钟请求数)
|
||||
- Qwen: 60 RPM
|
||||
|
||||
**当前策略**: 串行处理,不会触发限流
|
||||
**当å‰<EFBFBD>ç–ç•¥**: 串行处ç<E2809E>†ï¼Œä¸<C3A4>会触å<C2A6>‘é™<C3A9>æµ?
|
||||
|
||||
### æˆ<C3A6>本估算
|
||||
- DeepSeek: ~$0.001/次 × 199 = **$0.20**
|
||||
- Qwen: ~$0.001/次 × 199 = **$0.20**
|
||||
- **总计**: **$0.40** / 次完整测试
|
||||
- DeepSeek: ~$0.001/�× 199 = **$0.20**
|
||||
- Qwen: ~$0.001/�× 199 = **$0.20**
|
||||
- **总计**: **$0.40** / 次完整测�
|
||||
|
||||
---
|
||||
|
||||
## 💡 优化建议
|
||||
|
||||
### 短期优化(Week 2 - Day 4-5)
|
||||
1. **并发控制**: 改为3个并发(33分钟 → 11分钟)
|
||||
2. **进度显示**: 前端轮询显示进度百分比
|
||||
3. **错误重试**: 失败的文献自动重试1次
|
||||
### çŸæœŸä¼˜åŒ–(Week 2 - Day 4-5ï¼?
|
||||
1. **å¹¶å<EFBFBD>‘控制**: 改为3个并å<C2B6>‘(33分钟 â†?11分钟ï¼?
|
||||
2. **进度显示**: å‰<C3A5>端轮询显示进度百分æ¯?
|
||||
3. **错误é‡<EFBFBD>试**: 失败的文献自动é‡<C3A9>è¯?æ¬?
|
||||
|
||||
### 中期优化(Week 3)
|
||||
### 䏿œŸä¼˜åŒ–(Week 3ï¼?
|
||||
1. **消æ<CB86>¯é˜Ÿåˆ—**: 使用Bull Queue异æ¥å¤„ç<E2809E>†
|
||||
2. **批量优化**: 使用批量API接口(如果有)
|
||||
3. **缓存机制**: 相同文献不重复筛选
|
||||
2. **批é‡<EFBFBD>优化**: 使用批é‡<C3A9>API接å<C2A5>£ï¼ˆå¦‚果有ï¼?
|
||||
3. **ç¼“å˜æœºåˆ¶**: 相å<C2B8>Œæ–‡çŒ®ä¸<C3A4>é‡<C3A9>å¤<C3A5>ç›é€?
|
||||
|
||||
---
|
||||
|
||||
## ðŸ“<C5B8> 相关文件
|
||||
|
||||
### 修改的文件
|
||||
- `backend/src/modules/asl/services/screeningService.ts` ⭐
|
||||
### 修改的文�
|
||||
- `backend/src/modules/asl/services/screeningService.ts` â?
|
||||
|
||||
### ä¾<C3A4>赖的文件(已å˜åœ¨ï¼‰
|
||||
- `backend/src/modules/asl/services/llmScreeningService.ts`
|
||||
@@ -348,30 +348,30 @@ QWEN_API_KEY=sk-xxxxx
|
||||
|
||||
## 🎉 æˆ<C3A6>果总结
|
||||
|
||||
### 已实现
|
||||
✅ 真实LLM调用替换Mock数据
|
||||
✅ 从项目读取PICOS标准
|
||||
✅ 双模型并行筛选
|
||||
✅ 冲突检测与标记
|
||||
✅ 完整的日志追踪
|
||||
✅ 错误处理机制
|
||||
### 已实�
|
||||
âœ?真实LLM调用替æ<C2BF>¢Mockæ•°æ<C2B0>®
|
||||
âœ?从项目读å<C2BB>–PICOSæ ‡å‡†
|
||||
âœ?å<>Œæ¨¡åž‹å¹¶è¡Œç›é€?
|
||||
âœ?冲çª<C3A7>æ£€æµ‹ä¸Žæ ‡è®°
|
||||
�完整的日志追�
|
||||
âœ?错误处ç<E2809E>†æœºåˆ¶
|
||||
|
||||
### 待优化
|
||||
⚠️ 处理时间较长(30-60分钟)
|
||||
⚠️ 串行处理(可改为并发)
|
||||
⚠️ 前端进度显示(需优化轮询频率)
|
||||
### 待优�
|
||||
âš ï¸<EFBFBD> 处ç<E2809E>†æ—¶é—´è¾ƒé•¿ï¼?0-60分钟ï¼?
|
||||
âš ï¸<EFBFBD> 串行处ç<E2809E>†ï¼ˆå<CB86>¯æ”¹ä¸ºå¹¶å<C2B6>‘ï¼?
|
||||
âš ï¸<EFBFBD> å‰<C3A5>端进度显示(需优化轮询频率ï¼?
|
||||
|
||||
---
|
||||
|
||||
## 🔗 参考文档
|
||||
## 🔗 å<>‚考文æ¡?
|
||||
|
||||
- [Prompt设计与测试完成报告](./2025-11-18-Prompt设计与测试完成报告.md)
|
||||
- [Prompt设计与测试完æˆ<EFBFBD>报告](./2025-11-18-Prompt设计与测试完æˆ<C3A6>报å‘?md)
|
||||
- [å<EFBFBD>’䏿•°æ<EFBFBD>®æ³›åŒ–测试报告](./2025-11-18-å<>’䏿•°æ<C2B0>®æ³›åŒ–测试报告.md)
|
||||
- [任务分解](../04-开发计划/03-任务分解.md)
|
||||
- [任务分解](../04-å¼€å<E282AC>‘计åˆ?03-任务分解.md)
|
||||
|
||||
---
|
||||
|
||||
**报告人**: AI Assistant
|
||||
**报告�*: AI Assistant
|
||||
**日期**: 2025-11-21
|
||||
**版本**: v1.0.0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user