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:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,9 +1,9 @@
# 字段映射问题修å¤<C3A5>报åŠ
**日期**: 2025-11-21
**问题**: 真实LLM筛选失败成功0/20
**问题**: 真实LLMç­é€‰å¤±è´¥ï¼ˆæˆ<EFBFBD>功ï¼?/20ï¼?
**原因**: 字段å<C2B5><C3A5>ä¸<C3A4>匹é…<C3A9>
**状态**: ✅ 已修复
**状�*: �已修�
---
@@ -11,16 +11,16 @@
### 症状
```
任务状态: completed
任务状� completed
进度: 20/20
成功: 0
æˆ<EFBFBD>功: 0 â<EFBFBD>?
筛选结果数: 0
```
**表现**
- 任务瞬间完成1秒
- 所有文献处理失败
- 没有保存任何筛选结果
**表现**�
- 任务瞬间完æˆ<EFBFBD>ï¼?秒)
- 所有æ‡çŒ®å¤„ç<EFBFBD>†å¤±è´?
- 没有ä¿<EFBFBD>存任何ç­é€‰ç»“æž?
---
@@ -28,11 +28,11 @@
### 问题1: PICOS字段å<C2B5><C3A5>ä¸<C3A4>匹é…<C3A9>
**前端/数据库格式** (`TitleScreeningSettings.tsx`):
**å‰<EFBFBD>端/æ•°æ<C2B0>®åº“æ ¼å¼?* (`TitleScreeningSettings.tsx`):
```typescript
picoCriteria: {
P: '2型糖尿病患者...',
I: 'SGLT2抑制剂...',
P: '2型糖尿病患�..',
I: 'SGLT2抑制�..',
C: '安慰剂或常规治疗...',
O: '心血管结局...',
S: 'RCT'
@@ -43,15 +43,15 @@ picoCriteria: {
```typescript
// 实际上支æŒ<C3A6>两ç§<C3A7>æ ¼å¼<C3A5>,但优先使用短格å¼<C3A5>
picoCriteria: {
P: '...', //
I: '...', //
C: '...', //
O: '...', //
S: '...' //
P: '...', // �
I: '...', // �
C: '...', // �
O: '...', // �
S: '...' // �
}
```
**诊断**:前端使用 P/I/C/O/S 格式,但 `screeningService.ts` 直接传递了数据库的原始格式,未做映射。
**诊断**:å‰<C3A5>端使ç”?P/I/C/O/S æ ¼å¼<C3A5>,但 `screeningService.ts` ç´æŽ¥ä¼ é€äº†æ•°æ<C2B0>®åº“çš„åŽŸå§æ ¼å¼<C3A5>,未å<C2AA>šæ˜ å°„ã€?
---
@@ -67,24 +67,24 @@ models: ['DeepSeek-V3', 'Qwen-Max']
models: ['deepseek-chat', 'qwen-max']
```
**原因**前端使用展示名称后端需要API名称。
**原因**:å‰<C3A5>端使用展示å<C2BA><C3A5>称,å<C592>Žç«¯éœ€è¦<C3A8>APIå<49><C3A5>ç§°ã€?
---
### 问题3: 缺å°å­—段验è¯<C3A8>
文献可能缺少 `title` `abstract`导致LLM调用失败。
æ‡çŒ®å<EFBFBD>¯èƒ½ç¼ºå° `title` æˆ?`abstract`,导致LLM调用失败ã€?
---
## ✅ 修复方案
## âœ?ä¿®å¤<C3A5>æ¹æ¡ˆ
### ä¿®å¤<C3A5>1: 添加PICOS字段映射
**文件**: `backend/src/modules/asl/services/screeningService.ts`
```typescript
// 🔧 修复:字段名映射(数据库格式 → LLM服务格式
// 🔧 ä¿®å¤<C3A5>:字段å<C2B5><C3A5>映射(数æ<C2B0>®åº“æ ¼å¼<C3A5> â†?LLMæœ<C3A6>务格å¼<C3A5>ï¼?
const rawPicoCriteria = project.picoCriteria as any;
const picoCriteria = {
P: rawPicoCriteria?.P || rawPicoCriteria?.population || '',
@@ -95,22 +95,22 @@ const picoCriteria = {
};
```
**优势**
- ✅ 兼容两种格式(P/I/C/O/S population/intervention/...
- ✅ 防御性编程,避免undefined
**优势**�
- âœ?兼容两ç§<C3A7>æ ¼å¼<C3A5>(P/I/C/O/S æˆ?population/intervention/...ï¼?
- âœ?防御性ç¼ç¨ï¼Œé<C592>¿å…<C3A5>undefined
---
### 修复2: 添加模型名映射
### ä¿®å¤<EFBFBD>2: 添加模åžå<E280B9><C3A5>映å°?
```typescript
// 🔧 修复:模型名映射(前端格式 → API格式
// 🔧 ä¿®å¤<C3A5>:模åžå<E280B9><C3A5>映射(å‰<C3A5>端格å¼?â†?APIæ ¼å¼<C3A5>ï¼?
const MODEL_NAME_MAP: Record<string, string> = {
'DeepSeek-V3': 'deepseek-chat',
'Qwen-Max': 'qwen-max',
'GPT-4o': 'gpt-4o',
'Claude-4.5': 'claude-sonnet-4.5',
'deepseek-chat': 'deepseek-chat', // 兼容直接使用API名
'deepseek-chat': 'deepseek-chat', // å…¼å®¹ç´æŽ¥ä½¿ç”¨APIå<EFBFBD>?
'qwen-max': 'qwen-max',
// ... 更多映射
};
@@ -119,8 +119,8 @@ const rawModels = screeningConfig?.models || ['deepseek-chat', 'qwen-max'];
const models = rawModels.map((m: string) => MODEL_NAME_MAP[m] || m);
```
**映射表**
| 前端展示名 | API名称 |
**映射�*�
| å‰<EFBFBD>端展示å<EFBFBD>?| APIå<49><C3A5>ç§° |
|-----------|---------|
| DeepSeek-V3 | deepseek-chat |
| Qwen-Max | qwen-max |
@@ -132,7 +132,7 @@ const models = rawModels.map((m: string) => MODEL_NAME_MAP[m] || m);
### ä¿®å¤<C3A5>3: 添加æ‡çŒ®éªŒè¯<C3A8>
```typescript
// 🔧 验证:必须有标题和摘要
// 🔧 验è¯<C3A8>ï¼šå¿…é¡»æœ‰æ ‡é¢˜åŒæ˜è¦?
if (!literature.title || !literature.abstract) {
logger.warn('Skipping literature without title or abstract', {
literatureId: literature.id,
@@ -150,62 +150,62 @@ if (!literature.title || !literature.abstract) {
### ä¿®å¤<C3A5>4: 增强调试日志
```typescript
console.log('\n🚀 开始真实LLM筛选:');
console.log('\n🚀 å¼€å§çœŸå®žLLMç­é€?');
console.log(' 任务ID:', taskId);
console.log(' 项ç®ID:', projectId);
console.log(' 文献数:', literatures.length);
console.log(' 模型(映射后):', models); // ⭐ 显示映射后的值
console.log(' PICOS-P:', picoCriteria.P?.substring(0, 50) || '(空)');
console.log(' PICOS-I:', picoCriteria.I?.substring(0, 50) || '(空)');
console.log(' PICOS-C:', picoCriteria.C?.substring(0, 50) || '(空)');
console.log(' 纳入标准:', inclusionCriteria?.substring(0, 50) || '(空)');
console.log(' 排除标准:', exclusionCriteria?.substring(0, 50) || '(空)');
console.log(' 文献�', literatures.length);
console.log(' 模åžï¼ˆæ˜ å°„å<EFBFBD>Žï¼?', models); // â­?显示映射å<E2809E>Žçš„å€?
console.log(' PICOS-P:', picoCriteria.P?.substring(0, 50) || '(ç©?');
console.log(' PICOS-I:', picoCriteria.I?.substring(0, 50) || '(ç©?');
console.log(' PICOS-C:', picoCriteria.C?.substring(0, 50) || '(ç©?');
console.log(' 纳入标准:', inclusionCriteria?.substring(0, 50) || '(�');
console.log(' 排除标准:', exclusionCriteria?.substring(0, 50) || '(�');
```
---
## 🧪 测试步骤
### 1. 重启后端(必须!)
### 1. é‡<EFBFBD>å<EFBFBD>¯å<EFBFBD>Žç«¯ï¼ˆå¿…é¡»ï¼<EFBFBD>ï¼?
```bash
# 停止当前后端(Ctrl+C
# å<EFBFBD>œæ­¢å½“å‰<EFBFBD>å<EFBFBD>Žç«¯ï¼ˆCtrl+Cï¼?
cd D:\MyCursor\AIclinicalresearch\backend
npm run dev
```
### 2. 测试(小规模)
### 2. æµè¯•(å°<EFBFBD>规模ï¼?
1. 访问å‰<C3A5>端
2. 填写PICOS
3. **上传5篇文献**(先测试小规模)
3. **上传5篇æ‡çŒ?*(先æµè¯•å°<C3A5>规模)
4. 点击"å¼€å§AIåˆ<C3A5>ç­"
### 3. 查看后端控制台
### 3. 查çœå<EFBFBD>Žç«¯æŽ§åˆ¶å<EFBFBD>?
**应该看到**
**应该看到**�
```
🚀 开始真实LLM筛选:
🚀 å¼€å§çœŸå®žLLMç­é€?
任务ID: xxx
文献数: 5
模型(映射后): [ 'deepseek-chat', 'qwen-max' ]
PICOS-P: 2型糖尿病患者...
PICOS-I: SGLT2抑制剂...
PICOS-C: 安慰剂...
文献� 5
模åžï¼ˆæ˜ å°„å<EFBFBD>Žï¼? [ 'deepseek-chat', 'qwen-max' ]
PICOS-P: 2型糖尿病患�..
PICOS-I: SGLT2抑制�..
PICOS-C: 安慰�..
纳入标准: æˆ<C3A6>人2åžç³å°¿ç—…...
排除标准: 综述、系统评价...
排除标准: 综述ã€<C3A3>系统评ä»?..
­‰å¾…10-20ç§]
✅ 文献 1/5 处理成功
âœ?文献 1/5 处ç<E2809E>†æˆ<C3A6>功
DS: include / Qwen: include
冲突: 否
冲çª<EFBFBD>: å<>?
­‰å¾…10-20ç§]
✅ 文献 2/5 处理成功
âœ?文献 2/5 处ç<E2809E>†æˆ<C3A6>功
DS: exclude / Qwen: exclude
冲突: 否
冲çª<EFBFBD>: å<>?
...
```
@@ -213,25 +213,25 @@ npm run dev
## 📊 预期效果
### 修复前
- ⏱️ 1秒完成20篇
- ❌ 成功0
- ❌ 筛选结果数0
### ä¿®å¤<EFBFBD>å‰?
- â<EFBFBD>±ï¸<EFBFBD> 1ç§å®Œæˆ?0ç¯?
- â<EFBFBD>ˆ<C3A6>功ï¼?
- â<EFBFBD>?筛选结果数ï¼?
### 修复后
- ⏱️ 50-100秒完成5篇每篇10-20秒
- ✅ 成功5
- ✅ 筛选结果数5
- ✅ 证据包含真实的AI分析
- ✅ 证据不包含"模拟证据"
### ä¿®å¤<EFBFBD>å<EFBFBD>?
- â<EFBFBD>±ï¸<EFBFBD> 50-100秒完æˆ?篇(æ¯<C3A6>篇10-20ç§ï¼‰
- âœ?æˆ<C3A6>功ï¼?
- �筛选结果数�
- âœ?è¯<C3A8>æ<EFBFBD>®åŒ…å<E280A6>«çœŸå®žçš„AI分æž<C3A6>
- âœ?è¯<C3A8>æ<EFBFBD>®ä¸<C3A4>包å<E280A6>?模æŸè¯<C3A8>æ<EFBFBD>®"
---
## 🔧 修改文件
- `backend/src/modules/asl/services/screeningService.ts`
- �`backend/src/modules/asl/services/screeningService.ts`
- 添加PICOS字段映射
- 添加模型名映射
- 添加模åžå<EFBFBD><EFBFBD>映å°?
- 添加æ‡çŒ®éªŒè¯<C3A8>
- 增强调试日志
@@ -239,42 +239,42 @@ npm run dev
## 💡 ç»<C3A7>验教训
### 1. 前后端数据格式一致性
- 前端使用的展示格式 ≠ 后端API格式
### 1. å‰<EFBFBD>å<EFBFBD>Žç«¯æ•°æ<EFBFBD>®æ ¼å¼<EFBFBD>一致æ€?
- å‰<EFBFBD>端使用的展示格å¼?â‰?å<>Žç«¯APIæ ¼å¼<C3A5>
- 需è¦<C3A8>åœ¨é†æˆ<C3A6>å±å<E2809A>šæ˜ å°„
### 2. 防御性编程
- 使用 `||` 提供默认值
### 2. 防御性编�
- 使用 `||` æ<EFBFBD><EFBFBD>ä¾é»˜è®¤å€?
- 验è¯<C3A8>必需字段
- 兼容多ç§<C3A7>æ ¼å¼<C3A5>
### 3. 调试日志的重要性
### 3. 调试日志的é‡<EFBFBD>è¦<EFBFBD>æ€?
- 显示映射å<E2809E>Žçš„值(ä¸<C3A4>是原å§å€¼ï¼‰
- 输出所有关键参数
- 帮助快速定位问题
- 输出所有关键å<EFBFBD>æ•?
- 帮助快速定ä½<EFBFBD>é—®é¢?
---
## 🎯 å<>Žç»­ä¼˜åŒ
### 短期
1. ✅ 字段映射(已完成)
2. ✅ 模型名映射(已完成)
3. ✅ 验证必需字段(已完成)
1. âœ?字段映射(已完æˆ<C3A6>ï¼?
2. âœ?模åžå<E280B9><C3A5>映射(已完æˆ<C3A6>)
3. âœ?验è¯<C3A8>必需字段(已完æˆ<C3A6>ï¼?
### 中期
1. 统一前后端数据格式(使用 TypeScript 接口)
2. 添加数据格式验证中间件
1. 统一å‰<EFBFBD>å<EFBFBD>Žç«¯æ•°æ<EFBFBD>®æ ¼å¼<EFBFBD>(使用 TypeScript 接å<EFBFBD>£ï¼?
2. 添加数æ<EFBFBD>®æ ¼å¼<EFBFBD>验è¯<EFBFBD>中间ä»?
3. 改è¿é”™è¯¯æ<C2AF><C3A6>示
### 长期
1. 使用 tRPC GraphQL 确保类型安全
2. 自动化测试覆盖
1. 使用 tRPC æˆ?GraphQL ç¡®ä¿<EFBFBD>ç±»åžå®‰å…¨
2. 自动化测试覆�
3. Schema验è¯<C3A8>
---
**报告人**: AI Assistant
**报告�*: AI Assistant
**日期**: 2025-11-21
**版本**: v1.0.0