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%)
6.1 KiB
å—æ®µæ˜ 射问题修å¤<EFBFBD>报告
日期: 2025-11-21
问题: 真实LLMç›é€‰å¤±è´¥ï¼ˆæˆ<C3A6>功ï¼?/20ï¼?
**åŽŸå› **: å—æ®µå<C2B5><C3A5>ä¸<C3A4>匹é…<C3A9>
**状�*: �已修�
ðŸ”<EFBFBD> 问题诊æ–
症状
任务状� completed
进度: 20/20
æˆ<C3A6>功: 0 â<>?
ç›é€‰ç»“果数: 0
**表现**�
- 任务瞬间完æˆ<EFBFBD>ï¼?秒)
- 所有文献处ç<EFBFBD>†å¤±è´?
- 没有ä¿<EFBFBD>å˜ä»»ä½•ç›é€‰ç»“æž?
🎯 æ ¹æœ¬åŽŸå›
问题1: PICOSå—æ®µå<C2B5><C3A5>ä¸<C3A4>匹é…<C3A9>
*å‰<EFBFBD>端/æ•°æ<C2B0>®åº“æ ¼å¼? (TitleScreeningSettings.tsx):
picoCriteria: {
P: '2型糖尿病患�..',
I: 'SGLT2抑制�..',
C: '安慰剂或常规治疗...',
O: '心血管结局...',
S: 'RCT'
}
LLMæœ<EFBFBD>åŠ¡æœŸæœ›æ ¼å¼<EFBFBD> (llmScreeningService.ts):
// 实际上支æŒ<C3A6>两ç§<C3A7>æ ¼å¼<C3A5>ï¼Œä½†ä¼˜å…ˆä½¿ç”¨çŸæ ¼å¼<C3A5>
picoCriteria: {
P: '...', // �
I: '...', // �
C: '...', // �
O: '...', // �
S: '...' // �
}
诊æ–:å‰<EFBFBD>端使ç”?P/I/C/O/S æ ¼å¼<C3A5>,但 screeningService.ts ç›´æŽ¥ä¼ é€’äº†æ•°æ<C2B0>®åº“çš„åŽŸå§‹æ ¼å¼<C3A5>,未å<C2AA>šæ˜ å°„ã€?
问题2: 模型å<E280B9><C3A5>æ ¼å¼<C3A5>ä¸<C3A4>匹é…<C3A9>
å‰<EFBFBD>ç«¯æ ¼å¼<EFBFBD> (TitleScreeningSettings.tsx):
models: ['DeepSeek-V3', 'Qwen-Max']
LLMæœ<EFBFBD>åŠ¡æœŸæœ›æ ¼å¼<EFBFBD> (llmScreeningService.ts):
models: ['deepseek-chat', 'qwen-max']
**åŽŸå› **:å‰<C3A5>端使用展示å<C2BA><C3A5>称,å<C592>Žç«¯éœ€è¦<C3A8>APIå<49><C3A5>ç§°ã€?
问题3: ç¼ºå°‘å—æ®µéªŒè¯<C3A8>
文献å<EFBFBD>¯èƒ½ç¼ºå°‘ title æˆ?abstract,导致LLM调用失败ã€?
âœ?ä¿®å¤<C3A5>方案
ä¿®å¤<EFBFBD>1: æ·»åŠ PICOSå—æ®µæ˜ å°„
文件: backend/src/modules/asl/services/screeningService.ts
// 🔧 ä¿®å¤<C3A5>ï¼šå—æ®µå<C2B5><C3A5>æ˜ å°„ï¼ˆæ•°æ<C2B0>®åº“æ ¼å¼<C3A5> â†?LLMæœ<C3A6>åŠ¡æ ¼å¼<C3A5>ï¼?
const rawPicoCriteria = project.picoCriteria as any;
const picoCriteria = {
P: rawPicoCriteria?.P || rawPicoCriteria?.population || '',
I: rawPicoCriteria?.I || rawPicoCriteria?.intervention || '',
C: rawPicoCriteria?.C || rawPicoCriteria?.comparison || '',
O: rawPicoCriteria?.O || rawPicoCriteria?.outcome || '',
S: rawPicoCriteria?.S || rawPicoCriteria?.studyDesign || '',
};
**优势**�
- âœ?兼容两ç§<C3A7>æ ¼å¼<C3A5>(P/I/C/O/S æˆ?population/intervention/...ï¼?
- âœ?防御性编程,é<C592>¿å…<C3A5>undefined
ä¿®å¤<EFBFBD>2: æ·»åŠ æ¨¡åž‹å<E280B9><C3A5>æ˜ å°?
// 🔧 ä¿®å¤<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å<49>?
'qwen-max': 'qwen-max',
// ... æ›´å¤šæ˜ å°„
};
const rawModels = screeningConfig?.models || ['deepseek-chat', 'qwen-max'];
const models = rawModels.map((m: string) => MODEL_NAME_MAP[m] || m);
**æ˜ å°„è¡?*ï¼?
| å‰<EFBFBD>端展示å<EFBFBD>? | APIå<EFBFBD><EFBFBD>ç§° |
|---|---|
| DeepSeek-V3 | deepseek-chat |
| Qwen-Max | qwen-max |
| GPT-4o | gpt-4o |
| Claude-4.5 | claude-sonnet-4.5 |
ä¿®å¤<EFBFBD>3: æ·»åŠ æ–‡çŒ®éªŒè¯<C3A8>
// 🔧 验è¯<C3A8>ï¼šå¿…é¡»æœ‰æ ‡é¢˜å’Œæ‘˜è¦?
if (!literature.title || !literature.abstract) {
logger.warn('Skipping literature without title or abstract', {
literatureId: literature.id,
hasTitle: !!literature.title,
hasAbstract: !!literature.abstract,
});
console.log(`âš ï¸<C3AF> 跳过文献 ${processedCount + 1}: ç¼ºå°‘æ ‡é¢˜æˆ–æ‘˜è¦<C3A8>`);
processedCount++;
continue;
}
ä¿®å¤<EFBFBD>4: 增强调试日志
console.log('\n🚀 开始真实LLMç›é€?');
console.log(' 任务ID:', taskId);
console.log(' 项目ID:', projectId);
console.log(' 文献�', literatures.length);
console.log(' æ¨¡åž‹ï¼ˆæ˜ å°„å<E2809E>Žï¼?', 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. é‡<C3A9>å<EFBFBD>¯å<C2AF>Žç«¯ï¼ˆå¿…é¡»ï¼<C3AF>ï¼?
# å<>œæ¢å½“å‰<C3A5>å<EFBFBD>Žç«¯ï¼ˆCtrl+Cï¼?
cd D:\MyCursor\AIclinicalresearch\backend
npm run dev
2. 测试(å°<C3A5>规模ï¼?
- 访问å‰<EFBFBD>端
- 填写PICOS
- **ä¸Šä¼ 5篇文çŒ?*(先测试å°<C3A5>规模)
- 点击"开始AIåˆ<C3A5>ç›"
3. 查看å<E280B9>Žç«¯æŽ§åˆ¶å<C2B6>?
**应该看到**�
🚀 开始真实LLMç›é€?
任务ID: xxx
文献� 5
æ¨¡åž‹ï¼ˆæ˜ å°„å<E2809E>Žï¼? [ 'deepseek-chat', 'qwen-max' ]
PICOS-P: 2型糖尿病患�..
PICOS-I: SGLT2抑制�..
PICOS-C: 安慰�..
çº³å…¥æ ‡å‡†: æˆ<C3A6>人2型糖尿病...
æŽ’é™¤æ ‡å‡†: 综述ã€<C3A3>系统评ä»?..
[ç‰å¾…10-20ç§’]
âœ?文献 1/5 处ç<E2809E>†æˆ<C3A6>功
DS: include / Qwen: include
冲çª<C3A7>: å<>?
[ç‰å¾…10-20ç§’]
âœ?文献 2/5 处ç<E2809E>†æˆ<C3A6>功
DS: exclude / Qwen: exclude
冲çª<C3A7>: å<>?
...
📊 预期效果
ä¿®å¤<EFBFBD>å‰?
- â<EFBFBD>±ï¸<EFBFBD> 1秒完æˆ?0ç¯?
- â<EFBFBD>?æˆ<C3A6>功ï¼?
- â<EFBFBD>?ç›é€‰ç»“果数ï¼?
ä¿®å¤<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- æ·»åŠ PICOSå—æ®µæ˜ å°„
- æ·»åŠ æ¨¡åž‹å<EFBFBD><EFBFBD>æ˜ å°?
- æ·»åŠ æ–‡çŒ®éªŒè¯<EFBFBD>
- 增强调试日志
💡 ç»<C3A7>验教è®
1. å‰<C3A5>å<EFBFBD>Žç«¯æ•°æ<C2B0>®æ ¼å¼<C3A5>一致æ€?
- å‰<EFBFBD>ç«¯ä½¿ç”¨çš„å±•ç¤ºæ ¼å¼?â‰?å<>Žç«¯APIæ ¼å¼<C3A5>
- 需è¦<EFBFBD>在集æˆ<EFBFBD>层å<EFBFBD>šæ˜ å°„
2. 防御性编�
- 使用
||æ<><C3A6>供默认å€? - 验è¯<EFBFBD>å¿…éœ€å—æ®µ
- 兼容多ç§<EFBFBD>æ ¼å¼<EFBFBD>
3. 调试日志的é‡<C3A9>è¦<C3A8>æ€?
- æ˜¾ç¤ºæ˜ å°„å<EFBFBD>Žçš„值(ä¸<EFBFBD>是原始值)
- 输出所有关键å<EFBFBD>‚æ•?
- 帮助快速定ä½<EFBFBD>é—®é¢?
🎯 å<>Žç»ä¼˜åŒ–
çŸæœŸ
- âœ?å—æ®µæ˜ 射(已完æˆ<C3A6>ï¼?
- âœ?模型å<E280B9><C3A5>æ˜ å°„ï¼ˆå·²å®Œæˆ<C3A6>)
- âœ?验è¯<C3A8>å¿…éœ€å—æ®µï¼ˆå·²å®Œæˆ<C3A6>ï¼?
䏿œŸ
- 统一å‰<EFBFBD>å<EFBFBD>Žç«¯æ•°æ<EFBFBD>®æ ¼å¼<EFBFBD>(使用 TypeScript 接å<C2A5>£ï¼?
- æ·»åŠ æ•°æ<EFBFBD>®æ ¼å¼<EFBFBD>验è¯<EFBFBD>ä¸é—´ä»?
- 改进错误æ<EFBFBD><EFBFBD>示
长期
- 使用 tRPC æˆ?GraphQL ç¡®ä¿<C3A4>类型安全
- 自动化测试覆�
- Schema验è¯<EFBFBD>
**报告�*: AI Assistant
日期: 2025-11-21
版本: v1.0.0