Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-21-用户体验优化.md
HaHafeng 1b53ab9d52 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%)
2026-01-14 19:15:01 +08:00

7.5 KiB
Raw Blame History

用户体验优化报告

日期: 2025-11-21
任务: 审核工作å<C593>°UX优åŒ
**状�*: �已完�


📋 优化内容

1. 进度显示优化 �

问题

  • è¿åº¦æ<EFBFBD>¡ä»Ž0%ç´æŽ¥è·³åˆ°100%
  • çœä¸<EFBFBD>到中间过ç¨?
  • 用户体验ä¸<EFBFBD>å<EFBFBD>好,等待时没有å<EFBFBD><EFBFBD>é¦?

原å åˆ†æž<EFBFBD>

  1. **å‰<C3A5>端轮询间隔太长**ï¼?ç§?æ¬?
  2. **å<>Žç«¯æ´æ°é¢çއä½?*:æ¯<C3A6>10æ<30>¡æ´æ°ä¸€æ¬?

对于å°é‡<EFBFBD>æ‡çŒ®ï¼?-20篇),æ¯<C3A6>10æ<30>¡æ´æ°æ„<C3A6>å³ç<C2B3>€å‡ ä¹Žçœä¸<C3A4>到中间过ç¨ã€?

解决方案

å‰<EFBFBD>ç«¯ä¼˜åŒ (useScreeningTask.ts):

// 修改�
pollingInterval = 2000  // 2ç§?

// 修改å<C2B9>?
pollingInterval = 1000  // 1ç§ï¼Œæ´å<C2B4>Šæ—?

å<EFBFBD>Žç«¯ä¼˜åŒ (screeningService.ts):

// 修改å‰<C3A5>:æ¯?0æ<30>¡æ´æ°ä¸€æ¬?
if (processedCount % 10 === 0 || processedCount === literatures.length) {
  await prisma.aslScreeningTask.update({ ... });
}

// 修改å<C2B9>Žï¼šæ¯?æ<>¡æ´æ°ä¸€æ¬?
await prisma.aslScreeningTask.update({
  where: { id: taskId },
  data: {
    processedItems: processedCount,
    successItems: successCount,
    conflictItems: conflictCount,
    failedItems: processedCount - successCount,
  },
});

效果�

  • âœ?æ¯<C3A6>处ç<E2809E>†å®Œ1篇æ‡çŒ®ï¼Œç«å<E280B9>³æ´æ°æ•°æ<C2B0>®åº?
  • âœ?å‰<C3A5>端æ¯?秒轮询一æ¬?
  • âœ?用户能看到平滑的进度增长

2. 添加模åžå¤„ç<E2809E>†æ•°é‡<C3A9>显示 â­?

需�

在è¿åº¦æ<EFBFBD>¡ä¸æ¹æ˜¾ç¤ºï¼?

  • DeepSeek 处ç<E2809E>†äº†å‡ ç¯?
  • Qwen-Max 处ç<E2809E>†äº†å‡ ç¯?

实现

å‰<EFBFBD>端 (ScreeningWorkbench.tsx):

{task && (
  <>
    <div className="text-sm text-gray-500 mt-2">
      已处ç<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> 
      已处ç<EFBFBD>?{task.processedItems} ç¯?· 
      <Tag color="purple" className="text-xs">Qwen-Max</Tag> 
      已处ç<EFBFBD>?{task.processedItems} ç¯?
    </div>
  </>
)}

显示效果�

已处ç<EFBFBD>? 3 / 5 ç¯?· æˆ<C3A6>功: 3 · 冲çª<C3A7>: 1 · 失败: 0
[DeepSeek-V3] 已处ç<E2809E>?3 ç¯?· [Qwen-Max] 已处ç<E2809E>?3 ç¯?

说明�

  • å<EFBFBD>Œæ¨¡åžæ˜¯å¹¶è¡Œå¤„ç<EFBFBD>†ï¼Œæ‰€ä»¥ä¸¤ä¸ªæ¨¡åžçš„处ç<EFBFBD>†æ•°é‡<EFBFBD>å§ç»ˆç¸å<EFBFBD>Œ
  • 使用ä¸<EFBFBD>å<EFBFBD>Œé¢œè‰²çš„Tag区分模åžï¼ˆè“<EFBFBD>è‰?紫色ï¼?

3. ä¿®å¤<C3A5>列表显示顺åº<C3A5> â­?

问题

  • Excel顺åº<EFBFBD>:aã€<EFBFBD>bã€<EFBFBD>cã€<EFBFBD>d
  • 设置与å<EFBFBD>¯åŠ¨é¢„è§ˆï¼šaã€<EFBFBD>bã€<EFBFBD>cã€<EFBFBD>d âœ?
  • 审核工作å<EFBFBD>°æ˜¾ç¤ºï¼šdã€<EFBFBD>cã€<EFBFBD>bã€<EFBFBD>a â<>?*å<EFBFBD><EFBFBD>了ï¼?

原因

å<EFBFBD>Žç«¯æŸ¥è¯¢ä½¿ç”¨äº?orderBy: { createdAt: 'desc' }(é™<EFBFBD>åº<EFBFBD>),导致最æ°åˆå»ºçš„æŽåœ¨å‰<EFBFBD>é<EFBFBD>¢ã€?

由于æ‡çŒ®æ˜¯æŒ‰Excel顺åº<EFBFBD>ä¾<EFBFBD>次导入的:

a(最早åˆå»ºï¼‰ â†?b â†?c â†?d(最晚åˆå»ºï¼‰

é™<EFBFBD>åº<EFBFBD>æŽåˆ—å<EFBFBD>Žï¼š

d(最晚åˆå»ºï¼ŒæŽç¬¬1ï¼?â†?c â†?b â†?a(最早åˆå»ºï¼ŒæŽæœ€å<E282AC>Žï¼‰

解决方案

å<EFBFBD>Žç«¯ (screeningController.ts):

// 修改�
orderBy: [
  { conflictStatus: 'desc' },
  { createdAt: 'desc' },  // â<>?é™<C3A9>åº<C3A5>,最æ°çš„在å‰<C3A5>
]

// 修改å<C2B9>?
orderBy: [
  { conflictStatus: 'desc' },  // ä¿<C3A4>æŒ<C3A6>冲çª<C3A7>çš„æŽå‰<C3A5>é<EFBFBD>¢
  { createdAt: 'asc' },        // âœ?å<>‡åº<C3A5>,ä¿<C3A4>æŒ<C3A6>Excel原å§é¡ºåº<C3A5>
]

**æŽåº<C3A5>逻è¾**ï¼?

  1. **优先çº?**:冲çª<C3A7>状æ€<C3A6>(conflict > noneï¼?
    • 有冲çª<EFBFBD>çš„æ‡çŒ®æŽåœ¨å‰<EFBFBD>é<EFBFBD>¢
    • æ¹ä¾¿ç”¨æˆ·ä¼˜å…ˆå¤„ç<EFBFBD>†å†²çª<EFBFBD>
  2. **优先çº?**:åˆå»ºæ—¶é—´ï¼ˆå<CB86>‡åº<C3A5>ï¼?
    • ä¿<EFBFBD>æŒ<EFBFBD>Excel原å§é¡ºåº<EFBFBD>
    • 符å<EFBFBD>ˆç”¨æˆ·é¢„期

效果�

审核工作å<EFBFBD>°æ˜¾ç¤ºï¼šaã€<EFBFBD>bã€<EFBFBD>cã€<EFBFBD>d  âœ?
ï¼ˆå¦æžœc有冲çª<C3A7>:cã€<C3A3>aã€<C3A3>bã€<C3A3>dï¼?

📊 优化效果对比

进度显示

æ¹é<EFBFBD>¢ 优化å‰? 优åŒå<EFBFBD>?
轮询间隔 2� 1�
å<EFBFBD>Žç«¯æ´æ° æ¯?0æ<30>? æ¯?æ<>?
用户体验 0% �等待 �100% 0% �20% �40% �60% �80% �100%
模åžä¿¡æ<EFBFBD>¯ æ—? 显示DeepSeekåŒQwen处ç<EFBFBD>†æ•?

列表顺åº<EFBFBD>

场景 优化å‰? 优åŒå<EFBFBD>?
Excel顺åº<EFBFBD> a, b, c, d a, b, c, d
预览顺åº<EFBFBD> a, b, c, d a, b, c, d
审核工作å<EFBFBD>? d, c, b, a â<>? a, b, c, d âœ?

🔧 修改æ‡ä»¶æ¸…å<E280A6>

å‰<EFBFBD>端

  1. �frontend-v2/src/modules/asl/hooks/useScreeningTask.ts

    • 轮询间隔ï¼?ç§?â†?1ç§?
  2. �frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx

    • 添加模åžå¤„ç<EFBFBD>†æ•°é‡<EFBFBD>显示

å<EFBFBD>Žç«¯

  1. �backend/src/modules/asl/services/screeningService.ts

    • è¿åº¦æ´æ°ï¼šæ¯<EFBFBD>10æ<EFBFBD>?â†?æ¯?æ<>?
  2. �backend/src/modules/asl/controllers/screeningController.ts

    • æŽåº<EFBFBD>:createdAt: 'desc' â†?createdAt: 'asc'

🧪 æµè¯•验è¯<C3A8>

测试场景

  1. 上传5篇æ‡çŒ?
  2. 点击"å¼€å§AIåˆ<C3A5>ç­"
  3. è§å¯Ÿå®¡æ ¸å·¥ä½œå<EFBFBD>?

预期效果

1. 进度显示

åˆ<EFBFBD>å§: 0%
10ç§å<E28099>Ž: 20% â†?âœ?能çœåˆ°è¿åº¦ï¼<C3AF>
20ç§å<E28099>Ž: 40%
30ç§å<E28099>Ž: 60%
40ç§å<E28099>Ž: 80%
50ç§å<E28099>Ž: 100%

底部显示:
已处ç<E2809E>? 3 / 5 ç¯?· æˆ<C3A6>功: 3 · 冲çª<C3A7>: 1 · 失败: 0
[DeepSeek-V3] 已处ç<E2809E>?3 ç¯?· [Qwen-Max] 已处ç<E2809E>?3 ç¯?

2. 列表顺åº<C3A5>

Excel: æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®C, æ‡çŒ®D, æ‡çŒ®E
审核工作å<C593>? æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®C, æ‡çŒ®D, æ‡çŒ®E  âœ?

ï¼ˆå¦æžœæ‡çŒ®C有冲çª<C3A7>)
审核工作å<C593>? æ‡çŒ®C, æ‡çŒ®A, æ‡çŒ®B, æ‡çŒ®D, æ‡çŒ®E  âœ?

💡 技术细�

为什么æ¯<EFBFBD><EFBFBD>¡å°±æ´æ°ï¼?

**æ<>ƒè¡¡**ï¼?

  • 优点:实时å<EFBFBD><EFBFBD>馈,用户体验å¥?
  • 缺点:数æ<EFBFBD>®åº“写入é¢ç¹<EFBFBD>
  • **评估**:对于å°é‡<C3A9>æ‡çŒ®ï¼ˆ5-200篇),数æ<C2B0>®åº“åŽåŠå<E280BA>¯æŽ¥å<C2A5>?

**妿žœæ‡çŒ®æ•°é‡<C3A9>很大**ï¼?000+篇),å<C592>¯ä»¥ä¼˜åŒä¸ºï¼?

// 动æ€<C3A6>è°ƒæ•´æ´æ°é¢çŽ?
const updateInterval = literatures.length > 500 ? 10 : 1;
if (processedCount % updateInterval === 0 || processedCount === literatures.length) {
  await prisma.aslScreeningTask.update({ ... });
}

为什么轮询间隔是1ç§ï¼Ÿ

**æ<>ƒè¡¡**ï¼?

  • 优点:å<EFBFBD>Šæ—¶æ´æ°ï¼Œå»¶è¿Ÿå°?
  • 缺点:API调用é¢ç¹<EFBFBD>
  • **评估**ï¼?
    • æ¯<EFBFBD>次API调用耗时 < 100ms
    • ç­é€‰è¿‡ç¨æŒ<EFBFBD>续时间:1-30分éŸ
    • API调用次数ï¼?0-1800次(å<CB86>¯æŽ¥å<C2A5>—)

**妿žœéœ€è¦<C3A8>优åŒ?*,å<C592>¯ä»¥ä½¿ç”?WebSocket 实时推é€<C3A9>:

// 未æ<C2AA>¥ä¼˜åŒæ¹æ¡ˆ
socket.on('screening-progress', (data) => {
  setProgress(data.progress);
});

ðŸ“<EFBFBD> 关于æµ<C3A6>览器警å?

è­¦åŠä¿¡æ<EFBFBD>¯

[Violation]'setTimeout' handler took 72ms
[Violation]'setTimeout' handler took 269ms

说明

  • 这是Chrome性能æ<EFBFBD><EFBFBD>示,ä¸<EFBFBD>是错è¯?
  • 表示æŸ<EFBFBD>个setTimeout处ç<EFBFBD>†å‡½æ•°æ‰§è¡Œæ—¶é—´è¾ƒé•¿
  • 通常由React大é‡<EFBFBD>DOMæ´æ°å¼•èµ·

是å<EFBFBD>¦éœ€è¦<EFBFBD>优åŒï¼Ÿ

短期:ä¸<EFBFBD>需è¦?

  • ä¸<EFBFBD>å½±å“<EFBFBD>功èƒ?
  • 用户体验正常
  • 处ç<EFBFBD>†æ—¶é—´åœ¨å<EFBFBD>¯æŽ¥å<EFBFBD>—范å´å†…(< 300msï¼?

长期:å<EFBFBD>¯ä»¥ä¼˜åŒ?

  1. 使用 React.memo å‡<C3A5>å°é‡<C3A9>渲æŸ?
  2. 使用虚拟列表(如果文献很多)
  3. 优化大型组件的渲染逻辑

🎯 å<>Žç»­ä¼˜åŒå»ºè®®

短期(å<EFBFBD>¯é€‰ï¼‰

  1. 添加"æšå<E2809A>œ"按é®ï¼ˆæšå<E2809A>œç­é€‰ä»»åŠ¡ï¼‰
  2. 添加"估计剩余时间"(基于已处ç<E2809E>†é€Ÿåº¦ï¼?
  3. 显示当å‰<EFBFBD>正在处ç<EFBFBD>†çš„æ‡çŒ®æ ‡é¢?

中期

  1. 使用WebSocketæ¿ä»£è½®è¯¢ï¼ˆå®žæ—¶æŽ¨é€<EFBFBD>)
  2. 添加批é‡<EFBFBD>é‡<EFBFBD>试失败æ‡çŒ®åŠŸèƒ½
  3. 支æŒ<EFBFBD>任务å<EFBFBD>消

长期

  1. 分布å¼<EFBFBD>处ç<EFBFBD>†ï¼ˆå¤šä¸ªworker并行ï¼?
  2. æ­ç¹ç»­ä¼ ï¼ˆä»»åС䏭æ­å<EFBFBD>Žå<EFBFBD>¯æ<EFBFBD>¢å¤<EFBFBD>)
  3. 性能监控和分�

📊 性能数æ<C2B0>®

优åŒå‰<EFBFBD>å<EFBFBD>Žå¯¹æ¯”ï¼?篇文献)

指标 优化å‰? 优åŒå<EFBFBD>? 改善
è¿åº¦å<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> å<EFBFBD><EFBFBD>å<EFBFBD> 正确 âœ?ä¿®å¤<C3A5>
ä¿¡æ<EFBFBD>¯å®Œæ•´æ€? 基本 详细(å<EFBFBD>«æ¨¡åžæ•°ï¼‰ âœ?æ<><C3A6>å<EFBFBD>

**报告�*: AI Assistant
日期: 2025-11-21
版本: v1.0.0