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

@@ -2,44 +2,44 @@
**日期**: 2025-11-21
**任务**: 审核工作å<C593>°UX优åŒ
**状态**: ✅ 已完成
**状�*: �已完�
---
## 📋 优化内容
### 1. 进度显示优化 ⭐
### 1. 进度显示优化 �
#### 问题
- è¿åº¦æ<C2A6>¡ä»Ž0%ç´æŽ¥è·³åˆ°100%
- 看不到中间过程
- 用户体验不友好,等待时没有反馈
- çœä¸<EFBFBD>到中间过ç¨?
- 用户体验ä¸<EFBFBD>å<EFBFBD>好,等待时没有å<EFBFBD><EFBFBD>é¦?
#### 原å åˆ†æž<C3A6>
1. **前端轮询间隔太长**2秒/次
2. **后端更新频率低**每10条更新一次
1. **å‰<EFBFBD>端轮询间隔太长**ï¼?ç§?æ¬?
2. **å<EFBFBD>Žç«¯æ´æ°é¢çއä½?*:æ¯<C3A6>10æ<30>¡æ´æ°ä¸€æ¬?
对于少量文献5-20篇每10条更新意味着几乎看不到中间过程。
对于å°é‡<EFBFBD>æ‡çŒ®ï¼?-20篇),æ¯<C3A6>10æ<30>¡æ´æ°æ„<C3A6>å³ç<C2B3>€å‡ ä¹Žçœä¸<C3A4>到中间过ç¨ã€?
#### 解决方案
**å‰<C3A5>端优åŒ** (`useScreeningTask.ts`):
```typescript
// 修改前
pollingInterval = 2000 // 2
// 修改�
pollingInterval = 2000 // 2ç§?
// 修改后
pollingInterval = 1000 // 1秒,更及时
// 修改å<EFBFBD>?
pollingInterval = 1000 // 1ç§ï¼Œæ´å<EFBFBD>Šæ—?
```
**å<>Žç«¯ä¼˜åŒ** (`screeningService.ts`):
```typescript
// 修改前每10条更新一次
// 修改å‰<EFBFBD>:æ¯?0æ<30>¡æ´æ°ä¸€æ¬?
if (processedCount % 10 === 0 || processedCount === literatures.length) {
await prisma.aslScreeningTask.update({ ... });
}
// 修改后每1条更新一次
// 修改å<EFBFBD>Žï¼šæ¯?æ<>¡æ´æ°ä¸€æ¬?
await prisma.aslScreeningTask.update({
where: { id: taskId },
data: {
@@ -51,19 +51,19 @@ await prisma.aslScreeningTask.update({
});
```
**效果**
- ✅ 每处理完1篇文献立即更新数据库
- ✅ 前端每1秒轮询一次
- ✅ 用户能看到平滑的进度增长
**效果**�
- âœ?æ¯<C3A6>处ç<E2809E>†å®Œ1篇æ‡çŒ®ï¼Œç«å<E280B9>³æ´æ°æ•°æ<C2B0>®åº?
- âœ?å‰<C3A5>端æ¯?秒轮询一æ¬?
- �用户能看到平滑的进度增长
---
### 2. 添加模型处理数量显示 ⭐
### 2. 添加模åžå¤„ç<EFBFBD>†æ•°é‡<EFBFBD>显示 â­?
#### 需求
在进度条下方显示:
- DeepSeek 处理了几篇
- Qwen-Max 处理了几篇
#### 需�
在è¿åº¦æ<EFBFBD>¡ä¸æ¹æ˜¾ç¤ºï¼?
- DeepSeek 处ç<EFBFBD>†äº†å‡ ç¯?
- Qwen-Max 处ç<EFBFBD>†äº†å‡ ç¯?
#### 实现
@@ -72,82 +72,82 @@ await prisma.aslScreeningTask.update({
{task && (
<>
<div className="text-sm text-gray-500 mt-2">
: {task.processedItems} / {task.totalItems} ·
å·²å¤ç<EFBFBD>? {task.processedItems} / {task.totalItems} ç¯?·
æˆ<EFBFBD>功: {task.successItems} ·
å²çª<EFBFBD>: {task.conflictItems} ·
失败: {task.failedItems}
</div>
<div className="text-xs text-gray-400 mt-1">
<Tag color="blue" className="text-xs">DeepSeek-V3</Tag>
{task.processedItems} ·
å·²å¤ç<EFBFBD>?{task.processedItems} ç¯?·
<Tag color="purple" className="text-xs">Qwen-Max</Tag>
{task.processedItems}
å·²å¤ç<EFBFBD>?{task.processedItems} ç¯?
</div>
</>
)}
```
**显示效果**
**显示效果**�
```
已处理: 3 / 5 篇 · 成功: 3 · 冲突: 1 · 失败: 0
[DeepSeek-V3] 已处理 3 篇 · [Qwen-Max] 已处理 3 篇
已处ç<EFBFBD>? 3 / 5 ç¯?· æˆ<C3A6>功: 3 · 冲çª<EFBFBD>: 1 · 失败: 0
[DeepSeek-V3] 已处ç<EFBFBD>?3 ç¯?· [Qwen-Max] 已处ç<E2809E>?3 ç¯?
```
**说明**
**说明**�
- å<>Œæ¨¡åžæ˜¯å¹¶è¡Œå¤„ç<E2809E>†ï¼Œæ‰€ä»¥ä¸¤ä¸ªæ¨¡åžçš„处ç<E2809E>†æ•°é‡<C3A9>å§ç»ˆç¸å<C2B8>Œ
- 使用不同颜色的Tag区分模型蓝色/紫色)
- 使用ä¸<EFBFBD>å<EFBFBD>Œé¢œè‰²çš„Tag区分模åžï¼ˆè“<EFBFBD>è‰?紫色ï¼?
---
### 3. 修复列表显示顺序 ⭐
### 3. ä¿®å¤<EFBFBD>列表显示顺åº<EFBFBD> â­?
#### 问题
- Excel顺åº<C3A5>:aã€<C3A3>bã€<C3A3>cã€<C3A3>d
- 设置与启动预览a、b、c、d ✅
- 审核工作台显示d、c、b、a ❌ **反了!**
- 设置与å<EFBFBD>¯åŠ¨é¢„è§ˆï¼šaã€<EFBFBD>bã€<EFBFBD>cã€<EFBFBD>d âœ?
- 审核工作å<EFBFBD>°æ˜¾ç¤ºï¼šdã€<EFBFBD>cã€<EFBFBD>bã€<EFBFBD>a â<>?**å<><C3A5>了ï¼?*
#### 原因
后端查询使用了 `orderBy: { createdAt: 'desc' }`(降序),导致最新创建的排在前面。
å<EFBFBD>Žç«¯æŸ¥è¯¢ä½¿ç”¨äº?`orderBy: { createdAt: 'desc' }`(é™<EFBFBD>åº<EFBFBD>),导致最æ°åˆå»ºçš„æŽåœ¨å‰<EFBFBD>é<EFBFBD>¢ã€?
由于æ‡çŒ®æ˜¯æŒ‰Excel顺åº<EFBFBD>ä¾<EFBFBD>次导入的:
```
a(最早创建) → b → c → d最晚创建
a(最早创建) â†?b â†?c â†?d(最晚åˆå»ºï¼‰
```
é™<EFBFBD>åº<EFBFBD>æŽåˆ—å<EFBFBD>Žï¼š
```
d最晚创建排第1 → c → b → a最早创建排最后
d(最晚åˆå»ºï¼ŒæŽç¬¬1ï¼?â†?c â†?b â†?a(最早åˆå»ºï¼ŒæŽæœ€å<E282AC>Žï¼‰
```
#### 解决方案
**å<>Žç«¯** (`screeningController.ts`):
```typescript
// 修改前
// 修改�
orderBy: [
{ conflictStatus: 'desc' },
{ createdAt: 'desc' }, // ❌ 降序,最新的在前
{ createdAt: 'desc' }, // â<EFBFBD>?é™<C3A9>åº<C3A5>,最æ°çš„在å‰<C3A5>
]
// 修改后
// 修改å<EFBFBD>?
orderBy: [
{ conflictStatus: 'desc' }, // ä¿<C3A4>æŒ<C3A6>冲çª<C3A7>çš„æŽå‰<C3A5>é<EFBFBD>¢
{ createdAt: 'asc' }, // ✅ 升序保持Excel原始顺序
{ createdAt: 'asc' }, // âœ?å<>‡åº<C3A5>,ä¿<C3A4>æŒ<C3A6>Excel原å§é¡ºåº<C3A5>
]
```
**排序逻辑**
1. **优先级1**:冲突状态(conflict > none
**æŽåº<EFBFBD>逻è¾**ï¼?
1. **优先çº?**:冲çª<C3A7>状æ€<C3A6>(conflict > noneï¼?
- 有冲çª<C3A7>çš„æ‡çŒ®æŽåœ¨å‰<C3A5>é<EFBFBD>¢
- æ¹ä¾¿ç”¨æˆ·ä¼˜å…ˆå¤„ç<E2809E>†å†²çª<C3A7>
2. **优先级2**:创建时间(升序)
2. **优先çº?**:åˆå»ºæ—¶é—´ï¼ˆå<CB86>‡åº<C3A5>ï¼?
- ä¿<C3A4>æŒ<C3A6>Excel原å§é¡ºåº<C3A5>
- 符å<C2A6>ˆç”¨æˆ·é¢„期
**效果**
**效果**�
```
审核工作台显示a、b、c、d ✅
如果c有冲突c、a、b、d
审核工作å<EFBFBD>°æ˜¾ç¤ºï¼šaã€<EFBFBD>bã€<EFBFBD>cã€<EFBFBD>d âœ?
ï¼ˆå¦æžœc有冲çª<EFBFBD>:cã€<EFBFBD>aã€<EFBFBD>bã€<EFBFBD>dï¼?
```
---
@@ -156,86 +156,86 @@ orderBy: [
### 进度显示
| 方面 | 优化前 | 优化后 |
| æ¹é<EFBFBD>¢ | 优化å‰?| 优åŒå<E28093>?|
|-----|-------|--------|
| 轮询间隔 | 2秒 | 1秒 |
| 后端更新 | 每10条 | 每1条 |
| 用户体验 | 0% → 等待 → 100% | 0% 20% 40% 60% 80% 100% |
| 模型信息 | 无 | 显示DeepSeekQwen处理数 |
| 轮询间隔 | 2�| 1�|
| å<EFBFBD>Žç«¯æ´æ° | æ¯?0æ<30>?| æ¯?æ<>?|
| 用户体验 | 0% �等待 �100% | 0% �20% �40% �60% �80% �100% |
| 模åžä¿¡æ<EFBFBD>¯ | æ—?| 显示DeepSeekå’ŒQwen处ç<EFBFBD>†æ•?|
### 列表顺åº<C3A5>
| 场景 | 优化前 | 优化后 |
| 场景 | 优化å‰?| 优åŒå<E28093>?|
|-----|-------|--------|
| Excel顺åº<C3A5> | a, b, c, d | a, b, c, d |
| 预览顺åº<C3A5> | a, b, c, d | a, b, c, d |
| 审核工作台 | d, c, b, a | a, b, c, d |
| 审核工作å<EFBFBD>?| d, c, b, a â<EFBFBD>?| a, b, c, d âœ?|
---
## 🔧 修改æ‡ä»¶æ¸…å<E280A6>
### å‰<C3A5>端
1. `frontend-v2/src/modules/asl/hooks/useScreeningTask.ts`
- 轮询间隔2秒 → 1秒
1. �`frontend-v2/src/modules/asl/hooks/useScreeningTask.ts`
- 轮询间隔���1�
2. `frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx`
2. �`frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx`
- 添加模åžå¤„ç<E2809E>†æ•°é‡<C3A9>显示
### å<>Žç«¯
3. `backend/src/modules/asl/services/screeningService.ts`
- 进度更新每10条 → 每1条
3. �`backend/src/modules/asl/services/screeningService.ts`
- è¿åº¦æ´æ°ï¼šæ¯<EFBFBD>10æ<EFBFBD>?â†?æ¯?æ<>?
4. `backend/src/modules/asl/controllers/screeningController.ts`
- 排序:`createdAt: 'desc'` `createdAt: 'asc'`
4. �`backend/src/modules/asl/controllers/screeningController.ts`
- æŽåº<EFBFBD>:`createdAt: 'desc'` â†?`createdAt: 'asc'`
---
## 🧪 æµè¯•验è¯<C3A8>
### 测试场景
1. 上传5篇文献
1. 上传5篇æ‡çŒ?
2. 点击"å¼€å§AIåˆ<C3A5>ç­"
3. 观察审核工作台
3. è§å¯Ÿå®¡æ ¸å·¥ä½œå<EFBFBD>?
### 预期效果
#### 1. 进度显示
```
åˆ<EFBFBD>å§: 0%
10秒后: 20% ← ✅ 能看到进度!
10ç§å<EFBFBD>Ž: 20% â†?âœ?能çœåˆ°è¿åº¦ï¼<C3AF>
20ç§å<EFBFBD>Ž: 40%
30ç§å<EFBFBD>Ž: 60%
40ç§å<EFBFBD>Ž: 80%
50ç§å<EFBFBD>Ž: 100%
底部显示:
已处理: 3 / 5 篇 · 成功: 3 · 冲突: 1 · 失败: 0
[DeepSeek-V3] 已处理 3 篇 · [Qwen-Max] 已处理 3 篇
已处ç<EFBFBD>? 3 / 5 ç¯?· æˆ<C3A6>功: 3 · 冲çª<EFBFBD>: 1 · 失败: 0
[DeepSeek-V3] 已处ç<EFBFBD>?3 ç¯?· [Qwen-Max] 已处ç<E2809E>?3 ç¯?
```
#### 2. 列表顺åº<C3A5>
```
Excel: æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®C, æ‡çŒ®D, æ‡çŒ®E
审核工作台: 文献A, 文献B, 文献C, 文献D, 文献E ✅
审核工作å<EFBFBD>? æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®C, æ‡çŒ®D, æ‡çŒ®E âœ?
ï¼ˆå¦æžœæ‡çŒ®C有冲çª<EFBFBD>)
审核工作台: 文献C, 文献A, 文献B, 文献D, 文献E ✅
审核工作å<EFBFBD>? æ‡çŒ®C, æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®D, æ‡çŒ®E âœ?
```
---
## 💡 技术细节
## 💡 技术细�
### 为什么每1条就更新
**权衡**
- **优点**:实时反馈,用户体验好
### 为什么æ¯<EFBFBD><EFBFBD>¡å°±æ´æ°ï¼?
**æ<EFBFBD>ƒè¡¡**ï¼?
- **优点**:实时å<C2B6><C3A5>馈,用户体验å¥?
- **缺点**:数æ<C2B0>®åº“写入é¢ç¹<C3A7>
- **评估**对于少量文献5-200篇数据库压力可接受
- **评估**:对于å°é‡<C3A9>æ‡çŒ®ï¼ˆ5-200篇),数æ<C2B0>®åº“åŽåŠå<E280BA>¯æŽ¥å<C2A5>?
**如果文献数量很大**1000+篇),可以优化为:
**妿žœæ‡çŒ®æ•°é‡<EFBFBD>很大**ï¼?000+篇),å<C592>¯ä»¥ä¼˜åŒä¸ºï¼?
```typescript
// 动态调整更新频率
// 动æ€<EFBFBD>è°ƒæ•´æ´æ°é¢çŽ?
const updateInterval = literatures.length > 500 ? 10 : 1;
if (processedCount % updateInterval === 0 || processedCount === literatures.length) {
await prisma.aslScreeningTask.update({ ... });
@@ -243,15 +243,15 @@ if (processedCount % updateInterval === 0 || processedCount === literatures.leng
```
### 为什么轮询间隔是1ç§ï¼Ÿ
**权衡**
- **优点**:及时更新,延迟小
**æ<EFBFBD>ƒè¡¡**ï¼?
- **优点**:å<C5A1>Šæ—¶æ´æ°ï¼Œå»¶è¿Ÿå°?
- **缺点**:API调用é¢ç¹<C3A7>
- **评估**
- **评估**�
- æ¯<C3A6>次API调用耗时 < 100ms
- ç­é€‰è¿‡ç¨æŒ<C3A6>续时间:1-30分éŸ
- API调用次数60-1800次可接受
- API调用次数ï¼?0-1800次(å<CB86>¯æŽ¥å<C2A5>—)
**如果需要优化**,可以使用 WebSocket 实时推送:
**妿žœéœ€è¦<EFBFBD>优åŒ?*,å<C592>¯ä»¥ä½¿ç”?WebSocket 实时推é€<C3A9>:
```typescript
// 未æ<C2AA>¥ä¼˜åŒæ¹æ¡ˆ
socket.on('screening-progress', (data) => {
@@ -261,7 +261,7 @@ socket.on('screening-progress', (data) => {
---
## 📝 关于浏览器警告
## ðŸ“<EFBFBD> 关于æµ<C3A6>览器警å?
### è­¦åŠä¿¡æ<C2A1>¯
```
@@ -270,18 +270,18 @@ socket.on('screening-progress', (data) => {
```
### 说明
- 这是Chrome性能提示不是错误
- 这是Chrome性能æ<EFBFBD><EFBFBD>示,ä¸<EFBFBD>是错è¯?
- 表示æŸ<C3A6>个setTimeout处ç<E2809E>†å‡½æ•°æ‰§è¡Œæ—¶é—´è¾ƒé•¿
- 通常由React大é‡<C3A9>DOMæ´æ°å¼•èµ·
### 是å<C2AF>¦éœ€è¦<C3A8>优åŒï¼Ÿ
**短期**:不需要
- 不影响功能
**短期**:ä¸<C3A4>需è¦?
- ä¸<EFBFBD>å½±å“<EFBFBD>功èƒ?
- 用户体验正常
- 处理时间在可接受范围内(< 300ms
- 处ç<EFBFBD>†æ—¶é—´åœ¨å<EFBFBD>¯æŽ¥å<EFBFBD>—范å´å†…(< 300msï¼?
**长期**:可以优化
1. 使用 `React.memo` 减少重渲染
**长期**:å<C5A1>¯ä»¥ä¼˜åŒ?
1. 使用 `React.memo` å‡<EFBFBD>å°é‡<EFBFBD>渲æŸ?
2. 使用虚拟列表(如果文献很多)
3. 优化大型组件的渲染逻辑
@@ -291,8 +291,8 @@ socket.on('screening-progress', (data) => {
### 短期(å<CB86>¯é€‰ï¼‰
1. 添加"æšå<E2809A>œ"按é®ï¼ˆæšå<E2809A>œç­é€‰ä»»åŠ¡ï¼‰
2. 添加"估计剩余时间"(基于已处理速度)
3. 显示当前正在处理的文献标题
2. 添加"估计剩余时间"(基于已处ç<E2809E>†é€Ÿåº¦ï¼?
3. 显示当å‰<EFBFBD>正在处ç<EFBFBD>†çš„æ‡çŒ®æ ‡é¢?
### 中期
1. 使用WebSocketæ¿ä»£è½®è¯¢ï¼ˆå®žæ—¶æŽ¨é€<C3A9>)
@@ -300,26 +300,26 @@ socket.on('screening-progress', (data) => {
3. 支æŒ<C3A6>任务å<C2A1>消
### 长期
1. 分布式处理多个worker并行
1. 分布å¼<EFBFBD>处ç<EFBFBD>†ï¼ˆå¤šä¸ªworker并行ï¼?
2. æ­ç¹ç»­ä¼ ï¼ˆä»»åС䏭æ­å<C2AD>Žå<C5BD>¯æ<C2AF>¢å¤<C3A5>)
3. 性能监控和分析
3. 性能监控和分�
---
## 📊 性能数æ<C2B0>®
### 优化前后对比5篇文献
### 优åŒå‰<EFBFBD>å<EFBFBD>Žå¯¹æ¯”ï¼?篇文献)
| 指标 | 优化前 | 优化后 | 改善 |
| 指标 | 优化å‰?| 优åŒå<E28093>?| 改善 |
|-----|-------|--------|-----|
| 进度可见性 | 0% 100% | 0→20→40→60→80→100% | ✅ 5倍提升 |
| 反馈延迟 | ~20| ~1秒 | ✅ 20倍提升 |
| 列表顺序 | 反向 | 正确 | ✅ 修复 |
| 信息完整性 | 基本 | 详细(含模型数) | ✅ 提升 |
| è¿åº¦å<EFBFBD>¯è§<EFBFBD>æ€?| 0% â†?100% | 0â†?0â†?0â†?0â†?0â†?00% | âœ?5å€<C3A5>æ<EFBFBD><C3A6>å<EFBFBD>?|
| å<EFBFBD><EFBFBD>馈延迟 | ~20ç§?| ~1ç§?| âœ?20å€<C3A5>æ<EFBFBD><C3A6>å<EFBFBD>?|
| 列表顺åº<EFBFBD> | å<><C3A5>å<EFBFBD> | 正确 | âœ?ä¿®å¤<C3A5> |
| ä¿¡æ<EFBFBD>¯å®Œæ•´æ€?| 基本 | 详细(å<CB86>«æ¨¡åžæ•°ï¼‰ | âœ?æ<><C3A6>å<EFBFBD> |
---
**报告人**: AI Assistant
**报告�*: AI Assistant
**日期**: 2025-11-21
**版本**: v1.0.0