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%)
37 KiB
AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD> - 敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?
*<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦嚗? v1.4
*<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>嚗? 2025-11-21
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? <EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2025-12-13 <20><> *Postgres-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>惩<EFBFBD><E683A9>?
*<EFBFBD>滚之餈𥕦<EFBFBD>嚗? Platform-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>?- <20>箄<EFBFBD><E7AE84>峕芋撘誩<E69298><E8AAA9><EFBFBD><EFBFBD><EFBFBD>遙<EFBFBD>⊥<EFBFBD><E28AA5><EFBFBD><EFBFBD><EFBFBD>鱏<EFBFBD>寧賒隡? *<EFBFBD><EFBFBD>﹝<EFBFBD>桃<EFBFBD>嚗? <20>齿<EFBFBD>璅∪<E79285><E288AA>笔<EFBFBD><E7AC94>嗆<EFBFBD><E59786><EFBFBD>撣桀𨭌<E6A180>啣<EFBFBD><E595A3>睲犖<E79DB2>睃翰<E79D83>煺<EFBFBD><E785BA>?
<EFBFBD><EFBFBD> <20><>﹝霂湔<E99C82>
<EFBFBD>祆<EFBFBD>獢<EFBFBD>糓AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃嚗㇁SL嚗㗇芋<EFBFBD>㛖<EFBFBD>**<2A>笔<EFBFBD><E7AC94>嗆<EFBFBD><E59786>翰<EFBFBD>?*嚗諹扇敶訫<E695B6><E8A8AB><EFBFBD><EFBFBD>隞<EFBFBD><E99A9E>蝏𤘪<E89D8F><F0A498AA><EFBFBD>歇摰䂿緵<E482BF>蠘<EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD><E88880><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><F0A48FB8><EFBFBD><EFBFBD>? 銝𤾸<EFBFBD>隞𡝗<EFBFBD>獢<EFBFBD><EFBFBD><EFBFBD>喟頂嚗?- **<2A>祆<EFBFBD>獢<EFBFBD><E78DA2>00-璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>**嚗阳hat is嚗<73><E59A97>摰䂿𠶖<E482BF><F0A0B696><EFBFBD>
- **撘<><E69298>𤏸恣<F0A48FB8>埝<EFBFBD>獢?*嚗阳hat to do嚗<6F>恣<EFBFBD>𡜐<EFBFBD>
- **撘<><E69298>𤏸扇敶閙<E695B6>獢?*嚗阳hat done嚗<65><E59A97><EFBFBD>莎<EFBFBD>
- **<2A><><EFBFBD>航挽霈⊥<E99C88>獢?*嚗䥅ow to do嚗<6F>挽霈∴<E99C88>
<EFBFBD>㴓 璅∪<E79285>璁<EFBFBD>膩
<EFBFBD>詨<EFBFBD><EFBFBD>蠘<EFBFBD>
AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD><EFBFBD>臭<EFBFBD>銝芸抅鈭𤾸之霂剛<EFBFBD>璅∪<EFBFBD>嚗𡿨LM嚗厩<EFBFBD><EFBFBD><EFBFBD>讃蝑偦<EFBFBD>厩頂蝏<EFBFBD><EFBFBD><EFBFBD>其<EFBFBD>撣桀𨭌<EFBFBD>𠉛弦鈭箏<EFBFBD><EFBFBD>寞旿PICOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>芸𢆡蝑偦<EFBFBD>㗇<EFBFBD><EFBFBD>柴<EFBFBD>?
敶枏<EFBFBD><EFBFBD>嗆<EFBFBD>?- **撘<><E69298>煾𧫴畾?*嚗𡄻<E59A97>?<3F><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>MVP撌脣<E6928C><E884A3>琜<EFBFBD><E7909C>冽<EFBFBD>憭滨<E686AD><E6BBA8>𡒊垢撌脣<E6928C><E884A3>琜<EFBFBD>敺<EFBFBD><E695BA>蝡臬<E89DA1><E887AC>?- **撌脣<E6928C><E884A3>𣂼<EFBFBD><F0A382BC>?*嚗? - <20>?<3F><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>嚗㇍itle & Abstract Screening嚗? 摰峕㟲瘚<E39FB2><E7989A>
- <EFBFBD>?<3F>冽<EFBFBD>憭滨<E686AD><E6BBA8>𡒊垢嚗㇄ay 2-5嚗? LLM<4C>滚𦛚 + API + Excel撖澆枂
- **撘<><E69298>睲葉<E79DB2>蠘<EFBFBD>**嚗? - <20>银 <20>冽<EFBFBD>憭滨<E686AD><E6BBA8>滨垢UI嚗㇄ay 6-8嚗屸<E59A97>霈?.5憭抬<EFBFBD>
- **璅∪<E79285><E288AA>舀<EFBFBD>**嚗鋽eepSeek-V3 + Qwen-Max <20>峕芋<E5B395>讠<EFBFBD><E8AEA0>?- **<2A>函蔡<E587BD>嗆<EFBFBD>?*嚗尠<E59A97> <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><E68693>銵峕迤撣?
<EFBFBD><EFBFBD> Postgres-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>𩤃<EFBFBD>2025-12-13摰峕<E691B0>嚗?
<EFBFBD>寥<EFBFBD>删𤌍<EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>舀<EFBFBD>2-24撠𤩺𧒄<F0A4A9BA><F0A79284>鵭<EFBFBD>園𡢿隞餃𦛚嚗?000蝭<30><E89DAD><EFBFBD>桃<EFBFBD><E6A183>㚁<EFBFBD>
- 摰硺<EFBFBD><EFBFBD>滚鍳<EFBFBD>𦒘遙<EFBFBD>∪虾<EFBFBD>W<EFBFBD>嚗<EFBFBD>鱏<EFBFBD>寧賒隡𩤃<EFBFBD>
- <EFBFBD>園<EFBFBD>憭𡝗<EFBFBD><EFBFBD>穿<EFBFBD>雿輻鍂 Postgres嚗䔶<E59A97><E494B6><EFBFBD>閬?Redis嚗? *<EFBFBD>詨<EFBFBD>摰䂿緵嚗?
-
*<EFBFBD>箄<EFBFBD><EFBFBD>峕芋撘誩<EFBFBD><EFBFBD>? <20>㴓
- <EFBFBD><EFBFBD><EFBFBD>潘<EFBFBD>50蝭<EFBFBD><EFBFBD><EFBFBD>? - 撠譍遙<E8AD8D>∴<EFBFBD><50蝭<30><E89DAD>嚗𡁶凒<F0A181B6>亙<EFBFBD><E4BA99><EFBFBD><EFBFBD>敹恍<E695B9>笔<EFBFBD>摨䈑<E691A8><1<><31><EFBFBD>嚗? - 憭找遙<E689BE>∴<EFBFBD><E288B4>?0蝭<30><E89DAD>嚗𡁻<E59A97><F0A181BB>堒<EFBFBD><E5A092><EFBFBD><EFBFBD><EFBFBD>舫<EFBFBD><E888AB>折<EFBFBD>嚗<EFBFBD>𣈲<EFBFBD><F0A388B2>鱏<EFBFBD>寧賒隡𩤃<E99AA1>
-
隞餃𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>箏<EFBFBD> <20>𣑐
- 100蝭?<3F>?2銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
- 1000蝭?<3F>?20銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
- <EFBFBD>芸𢆡<EFBFBD>刻<EFBFBD><EFBFBD>寞活憭批<EFBFBD>
-
<EFBFBD>剔<EFBFBD>蝏凋<EFBFBD><EFBFBD>箏<EFBFBD> <20><>
- 瘥?0蝭<30><E89DAD><EFBFBD>桐<EFBFBD>摮䀝<E691AE>甈⊥鱏<E28AA5>? - <20>剔<EFBFBD><E58994>唳旿摮睃<E691AE><E79D83>?
platform_schema.job.data嚗īg-boss嚗? - 摰硺<E691B0><E7A1BA>滚鍳<E6BB9A>舘䌊<E88898>其<EFBFBD>銝𦠜活雿滨蔭蝏抒賒
- 瘥?0蝭<30><E89DAD><EFBFBD>桐<EFBFBD>摮䀝<E691AE>甈⊥鱏<E28AA5>? - <20>剔<EFBFBD><E58994>唳旿摮睃<E691AE><E79D83>?
-
Platform撅<EFBFBD><EFBFBD>銝<EFBFBD>蝞∠<EFBFBD> <20><>儭? - 隞餃𦛚蝞∠<E89D9E>靽⊥<E99DBD>銝滚<E98A9D><E6BB9A>典銁
asl_schema.screening_tasks- 蝏煺<EFBFBD>摮睃<EFBFBD><EFBFBD>?
platform_schema.job.data嚗㇇SONB嚗? - 雿輻鍂CheckpointService<20>滢<EFBFBD> job.data嚗<61><E59A97><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂嚗? <EFBFBD>寥<EFBFBD>䭾<EFBFBD>隞塚<EFBFBD>
- 蝏煺<EFBFBD>摮睃<EFBFBD><EFBFBD>?
screeningService.ts嚗𡁏溶<EFBFBD>䭾惣<EFBFBD>賡<EFBFBD><EFBFBD>澆ế<EFBFBD>哨<EFBFBD><EFBFBD>券<EFBFBD><EFBFBD>鸌甈∩遙<EFBFBD>∪<EFBFBD> pg-bossscreeningWorker.ts嚗𡁏鸌甈∪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餉<EFBFBD>嚗峕鱏<EFBFBD>寧賒隡惩<EFBFBD><EFBFBD>?-CheckpointService.ts嚗𡁏<EFBFBD>雿?job.data嚗䔶<E59A97>靘肽<E99D98>銝𡁜𦛚銵? *瘚贝<EFBFBD>撉諹<EFBFBD>嚗?- <EFBFBD>?撠譍遙<E8AD8D>∴<EFBFBD>7蝭<37><E89DAD>- <20>湔𦻖璅∪<E79285>瘚贝<E7989A><E8B49D>朞<EFBFBD>
- <EFBFBD>?憭找遙<E689BE>∴<EFBFBD>100蝭<30><E89DAD>- <20>笔<EFBFBD>璅∪<E79285>瘚贝<E7989A><E8B49D>朞<EFBFBD>
- <EFBFBD>?隞餃𦛚<E9A483><F0A69B9A><EFBFBD><EFBFBD>餉<EFBFBD>撉諹<E69289><E8ABB9>朞<EFBFBD>
- <EFBFBD>?Platform-Only <20>嗆<EFBFBD>撉諹<E69289><E8ABB9>朞<EFBFBD>
*<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚嚗?
- <EFBFBD>𩤃<EFBFBD> Phase 8 <20>券𢒰瘚贝<E7989A>嚗<EFBFBD>鱏<EFBFBD>寧賒隡惩<E99AA1><E683A9>𥟇<EFBFBD>霂𨰻<E99C82>?000蝭<30><E89DAD><EFBFBD>桀<EFBFBD><E6A180>湔<EFBFBD>蝔页<E89D94>
- <EFBFBD>𩤃<EFBFBD> Phase 9 SAE <20>函蔡撉諹<E69289>
<EFBFBD>喲睸<EFBFBD>𣬚<EFBFBD>蝣?
**<2A><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>嚗<EFBFBD>歇摰峕<E691B0>嚗?*:
- <EFBFBD>?2025-11-18嚗䥪rompt v1.0.0-MVP摰峕<E691B0>嚗<EFBFBD><E59A97>蝖桃<E89D96>60%
- <EFBFBD>?2025-11-18嚗匁LM<4C><4D><EFBFBD>銝擧<E98A9D>霂閙<E99C82><E99699>嗅<EFBFBD><E59785>?- <20>?2025-11-19嚗𡁜<E59A97>蝡烘VP嚗<50>挽蝵桐<E89DB5><E6A190>臬𢆡<E887AC><F0A286A1>恣<EFBFBD>詨極雿𨅯蝱嚗匧<E59A97><E58CA7>?- <20>?2025-11-21嚗𡁶<E59A97>摰掹LM<4C><4D><EFBFBD>摰峕<E691B0>嚗<EFBFBD>𤜯<EFBFBD>﹪ock<63>唳旿嚗?- <20>?2025-11-21嚗𡁶鍂<F0A181B6>瑚<EFBFBD>撉䔶<E69289><E494B6>吔<EFBFBD>餈𥕦漲<F0A595A6>曄內<E69B84><E585A7><EFBFBD>銵冽<E98AB5>摨𧶏<E691A8>
- <EFBFBD>?2025-11-21嚗?Week 4摰峕<E691B0>嚗<EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD>蝷箔<E89DB7>撖澆枂<E6BE86>蠘<EFBFBD>嚗?
- 蝏蠘恣璁<EFBFBD><EFBFBD>銝窰RISMA<EFBFBD>㘾膄<EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>萘<EFBFBD>蝏𤘪<EFBFBD>憿菟𢒰嚗<EFBFBD>毽<EFBFBD><EFBFBD>䲮獢<EFBFBD><EFBFBD>
- Excel<EFBFBD>寥<EFBFBD>撖澆枂嚗<EFBFBD><EFBFBD><EFBFBD>毺<EFBFBD>嚗? <EFBFBD>冽<EFBFBD>憭滨<EFBFBD>嚗<EFBFBD><EFBFBD>蝡臬歇摰峕<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD>𡢅<EFBFBD>:
- <EFBFBD>?2025-11-22嚗?Day 2-3摰峕<E691B0>嚗𡿨LM<4C>滚𦛚銝𡡞<E98A9D>霂<EFBFBD>頂蝏<E9A082><E89D8F>*
- <EFBFBD>鞟內霂滚極蝔衤<EFBFBD>蝟鳴<EFBFBD>System/User Prompt + JSON Schema嚗? - PromptBuilder<65>滚𦛚嚗<F0A69B9A>𢆡<EFBFBD><F0A286A1>rompt蝏<74><E89D8F>嚗? - LLM12FieldsService嚗𠃊ougat隡睃<E99AA1> + <20>峕芋<E5B395>?+ 3撅<33>SON閫<4E><E996AB>嚗? - <20>餃郎<E9A483>餉<EFBFBD>撉諹<E69289><E8ABB9>剁<EFBFBD>5<EFBFBD>∟<EFBFBD><E2889F>辷<EFBFBD>
- 霂<EFBFBD>旿<EFBFBD>暸<EFBFBD>霂<EFBFBD>膥嚗<EFBFBD><EFBFBD><EFBFBD>典<EFBFBD><EFBFBD>湔<EFBFBD>改<EFBFBD>
- <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚𧢲<EFBFBD><EFBFBD>∴<EFBFBD><EFBFBD>峕芋<EFBFBD>见笆瘥䈑<EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD>銝𤾸捆<EFBFBD>嗘<EFBFBD><EFBFBD>?- <20>?2025-11-23嚗?Day 4銝𠰴<E98A9D>摰峕<E691B0>嚗<EFBFBD>㺭<EFBFBD>桀<EFBFBD>霈曇恣銝舘<E98A9D>蝘鳴<E89D98>*
- <EFBFBD>唳旿摨廍chema霈曇恣嚗<EFBFBD><EFBFBD><EFBFBD>毺<EFBFBD><EFBFBD>嗆<EFBFBD>嚗? - 靽格㺿 literatures 銵剁<E98AB5>+13銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>畾蛛<E795BE>
- <EFBFBD>𥕦遣 fulltext_screening_tasks 銵? - <20>𥕦遣 fulltext_screening_results 銵? - <20>见𢆡SQL餈<4C>宏<EFBFBD>𡁏𧋦嚗<F0A78BA6><E59A97><EFBFBD>冽<EFBFBD>銵䕘<E98AB5>銝滚蔣<E6BB9A>滚<EFBFBD>隞𡝗芋<F0A19D97>梹<EFBFBD>
- <EFBFBD>唳旿摨栞<EFBFBD>蝘餌𠶖<EFBFBD><EFBFBD><EFBFBD>獢<EFBFBD><EFBFBD>霂衣<EFBFBD>霈啣<EFBFBD>Schema<EFBFBD>𠉛氖<EFBFBD><EFBFBD><EFBFBD>嚗?- <20>?2025-11-23嚗?Day 4銝见<E98A9D>摰峕<E691B0>嚗<EFBFBD>鸌憭<E9B88C><E686AD><EFBFBD>滚𦛚嚗?
- FulltextScreeningService嚗<EFBFBD>鸌<EFBFBD>誩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餉<EFBFBD>嚗?16銵䕘<E98AB5>
- 撘<EFBFBD>郊隞餃𦛚蝞∠<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD><EFBFBD>LM靚<EFBFBD>鍂嚗? - 撟嗅<E6929F><E59785>批<EFBFBD>嚗ī-queue嚗? - 餈𥕦漲頝蠘葵<E8A098>屸<EFBFBD>霂臬<E99C82><E887AC>?- <20>?2025-11-23嚗?Day 5摰峕<E691B0>嚗<EFBFBD><E59A97>蝡涉PI撘<49><E69298>𡢅<EFBFBD>*
- FulltextScreeningController嚗?銝芣瓲敹<E793B2>PI嚗?52銵䕘<E98AB5>
- ExcelExporter<EFBFBD>滚𦛚嚗?-Sheet<65>亙<EFBFBD><E4BA99><EFBFBD><EFBFBD>嚗?52銵䕘<E98AB5>
- Zod<EFBFBD><EFBFBD>㺭撉諹<EFBFBD>
- 頝舐眏瘜典<EFBFBD>嚗?api/v1/asl/fulltext-screening嚗? - 31銝析EST Client瘚贝<E7989A><E8B49D>其<EFBFBD>
- API<EFBFBD><EFBFBD>﹝<EFBFBD>湔鰵<EFBFBD>釘3.0
- PDF<EFBFBD>𣂼<EFBFBD>fallback<EFBFBD>箏<EFBFBD>
- <EFBFBD>银 2025-11-24嚗?Day 6-8敺<38><E695BA><EFBFBD>𡢅<EFBFBD><F0A1A285>滨垢UI嚗?
- 4銝芣瓲敹<EFBFBD>△<EFBFBD>g<EFBFBD>霈曄蔭<EFBFBD><EFBFBD><EFBFBD>摨艾<EFBFBD><EFBFBD>極雿𨅯蝱<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頣<EFBFBD>
- PDF銝𠹺<EFBFBD><EFBFBD>屸<EFBFBD>閫<EFBFBD><EFBFBD><EFBFBD>? - <20>峕芋<E5B395>见ế<E8A781>剖笆瘥牐I
- 摰墧𧒄餈𥕦漲<EFBFBD>烐綉嚗<EFBFBD>蔭霂X㦤<EFBFBD>塚<EFBFBD>
- 霂衣<EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>鍦歇<EFBFBD>嗅<EFBFBD>
<EFBFBD><EFBFBD>儭?<3F><><EFBFBD>舀沲<E88880>?
<EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD>
<EFBFBD>滨垢
獢<EFBFBD>沲: React 18 + TypeScript 5
頝舐眏: React Router DOM v6
<0A>嗆<EFBFBD><E59786>恣<EFBFBD>? @tanstack/react-query (React Query v5)
UI蝏<49>辣: Ant Design v5
<0A>瑕<EFBFBD>: TailwindCSS v3
<0A><>遣撌亙<E6928C>: Vite v5
<EFBFBD>𡒊垢
獢<EFBFBD>沲: Fastify v4 (Node.js 22)
<0A>唳旿摨? PostgreSQL 16 + Prisma 5
LLM SDK: <20>芰<EFBFBD> LLMFactory (蝏煺<E89D8F><E785BA><EFBFBD><EFBFBD>撅?
璅∪<E79285>: DeepSeek-V3, Qwen-Max, GPT-4o, Claude-4.5
<0A>亙<EFBFBD>: Winston
<EFBFBD>箇<EFBFBD>霈暹鴌
<EFBFBD>唳旿摨? PostgreSQL 16 with Schema isolation
Schema: asl_schema (<28>祉<EFBFBD><E7A589>𠉛氖)
<0A>冽<EFBFBD>銵? platform_schema.users (<28>曹澈)
<EFBFBD><EFBFBD> <20>笔<EFBFBD>隞<EFBFBD><E99A9E>蝏𤘪<E89D8F>
<EFBFBD>滨垢隞<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>
frontend-v2/src/modules/asl/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> api/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # API摰X<E691B0>蝡荔<E89DA1><E88D94><EFBFBD><EFBFBD>匧<EFBFBD>蝡航<E89DA1><E888AA>剁<EFBFBD>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> components/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ASLLayout.tsx # 撌虫儒撖潸⏛撣<E28F9B><E692A3>
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> JudgmentBadge.tsx # PICOS<4F>斗鱏Badge
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ConclusionTag.tsx # 蝏栞捏Tag嚗<67>熙<EFBFBD>?<3F>㘾膄嚗?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> DetailReviewDrawer.tsx # 霂行<E99C82>+憭齿瓲蝏煺<E89D8F>Drawer
<0A>鎿<EFBFBD><E98EBF><EFBFBD> hooks/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> useScreeningTask.ts # 隞餃𦛚餈𥕦漲頧株砭Hook
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> useScreeningResults.ts # 蝑偦<E89D91>厩<EFBFBD><E58EA9>𨀣䰻霂%ook
<0A>鎿<EFBFBD><E98EBF><EFBFBD> pages/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> TitleScreeningSettings.tsx # 霈曄蔭銝𤾸鍳<F0A4BEB8>券△<E588B8>?<3F>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ScreeningWorkbench.tsx # 摰⊥瓲撌乩<E6928C><E4B9A9>圈△<E59C88>?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> ScreeningResults.tsx # <20>萘<EFBFBD>蝏𤘪<E89D8F>憿菟𢒰嚗<F0A292B0><E59A97>雿㵪<E99BBF>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> types/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # TypeScript蝐餃<E89D90>摰帋<E691B0>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> utils/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> excelUtils.ts # Excel撖澆<E69296>/撖澆枂撌亙<E6928C>
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> tableTransform.ts # 銵冽聢<E586BD>唳旿頧祆揢嚗<E68FA2><E59A97>銵䕘<E98AB5>
<0A>婙<EFBFBD><E5A999><EFBFBD> index.tsx # 璅∪<E79285><E288AA>亙藁嚗<E89781>楝<EFBFBD>梢<EFBFBD>蝵殷<E89DB5>
<EFBFBD>𡒊垢隞<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>
backend/src/modules/asl/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> controllers/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projectController.ts # 憿寧𤌍蝞∠<E89D9E>API
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> literatureController.ts # <20><>讃蝞∠<E89D9E>API
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> screeningController.ts # 蝑偦<E89D91>厩㮾<E58EA9>莧PI嚗<49><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> services/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> screeningService.ts # 蝑偦<E89D91>劐遙<E58A90>⊥<EFBFBD><E28AA5>∴<EFBFBD><E288B4>詨<EFBFBD>嚗?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> llmScreeningService.ts # LLM靚<4D>鍂<EFBFBD>滚𦛚嚗<F0A69B9A><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> schemas/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> screening.schema.ts # Prompt<70><74><EFBFBD>銝𥣡SON Schema嚗<61><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> types/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # TypeScript蝐餃<E89D90>摰帋<E691B0>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> routes/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # 頝舐眏瘜典<E7989C>
<0A>?<3F>鎿<EFBFBD><E98EBF><EFBFBD> common/ # <20>?<3F>冽<EFBFBD>憭滨<E686AD><E6BBA8>𡁶鍂<F0A181B6>賢<EFBFBD>撅<EFBFBD><E69285>NEW嚗?<3F>? <20>鎿<EFBFBD><E98EBF><EFBFBD> pdf/ # PDF摮睃<E691AE>銝擧<E98A9D><E693A7>?<3F>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> types.ts
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PDFStorageService.ts
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PDFStorageFactory.ts
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> adapters/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DifyPDFStorageAdapter.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> OSSPDFStorageAdapter.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> llm/ # LLM 12摮埈挾<E59F88>滚𦛚嚗<F0A69B9A>瓲敹<E793B2><E695B9>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> types.ts
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PromptBuilder.ts # <20>冽<EFBFBD><E586BD>rompt蝏<74><E89D8F>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> LLM12FieldsService.ts # Nougat+<2B>峕芋<E5B395>?3撅<33>SON閫<4E><E996AB>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> integration-test.ts # 摰峕㟲<E5B395><E39FB2><EFBFBD>瘚贝<E7989A>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> quick-test.ts # 敹恍<E695B9><E6818D><EFBFBD>霂𤏪<E99C82>1蝭𤊿DF嚗?<3F>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> cached-result-test.ts # 摰寥<E691B0>撉諹<E69289>瘚贝<E7989A>
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> validation/ # 撉諹<E69289><E8ABB9>滚𦛚
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> MedicalLogicValidator.ts # <20>餃郎<E9A483>餉<EFBFBD>撉諹<E69289>嚗?<3F>∟<EFBFBD><E2889F>辷<EFBFBD>
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> EvidenceChainValidator.ts # 霂<>旿<EFBFBD>暸<EFBFBD>霂?<3F>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ConflictDetectionService.ts # <20>脩<EFBFBD>璉<EFBFBD>瘚?<3F>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> validation-test.ts
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> utils/
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> tokenCalculator.ts # Token霈∠<E99C88>銝擧<E98A9D><E693A7>砌摯蝞?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts
<0A>?<3F>婙<EFBFBD><E5A999><EFBFBD> fulltext-screening/ # <20>?<3F>冽<EFBFBD>憭滨<E686AD>璅∪<E79285>嚗𠃊EW嚗? <20>鎿<EFBFBD><E98EBF><EFBFBD> controllers/
<20>? <20>婙<EFBFBD><E5A999><EFBFBD> FulltextScreeningController.ts # 5銝芣瓲敹<E793B2>PI嚗?52銵䕘<E98AB5>
<20>鎿<EFBFBD><E98EBF><EFBFBD> services/
<20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> FulltextScreeningService.ts # <20>孵<EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD>∴<EFBFBD>716銵䕘<E98AB5>
<20>? <20>婙<EFBFBD><E5A999><EFBFBD> ExcelExporter.ts # Excel撖澆枂<E6BE86>滚𦛚嚗?52銵䕘<E98AB5>
<20>鎿<EFBFBD><E98EBF><EFBFBD> routes/
<20>? <20>婙<EFBFBD><E5A999><EFBFBD> fulltext-screening.ts # 頝舐眏瘜典<E7989C>嚗?3銵䕘<E98AB5>
<20>鎿<EFBFBD><E98EBF><EFBFBD> prompts/ # <20>鞟內霂滢<E99C82>蝟? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> system_prompt.md # System Prompt嚗?601摮㛖泵嚗? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> user_prompt_template.md # User Prompt璅⊥踎嚗?99銵䕘<E98AB5>
<20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> json_schema.json # JSON Schema嚗?2摮埈挾蝥行<E89DA5>嚗? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> cochrane_standards/ # Cochrane<6E><65><EFBFBD>嚗㇈VP<56><50><EFBFBD><EFBFBD>㰘蝸嚗? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> <20>𤩺㦤<F0A4A9BA>𡝗䲮瘜?md
<20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> <20>脫<EFBFBD>.md
<20>? <20>婙<EFBFBD><E5A999><EFBFBD> 蝏𤘪<E89D8F>摰峕㟲<E5B395>?md
<20>婙<EFBFBD><E5A999><EFBFBD> __tests__/ # 瘚贝<E7989A><E8B49D><EFBFBD>辣
<20>鎿<EFBFBD><E98EBF><EFBFBD> fulltext-screening-api.http # REST Client瘚贝<E7989A>嚗?1銝芰鍂靘页<E99D98>
<20>鎿<EFBFBD><E98EBF><EFBFBD> api-integration-test.ts # <20>芸𢆡<E88AB8>㚚<EFBFBD><E39A9A>鞉<EFBFBD>霂? <20>鎿<EFBFBD><E98EBF><EFBFBD> e2e-real-test.ts # 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82><F0A48FAA>笔<EFBFBD>PDF嚗? <20>婙<EFBFBD><E5A999><EFBFBD> e2e-real-test-v2.ts # 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82>蝞<EFBFBD><E89D9E>𣇉<EFBFBD>嚗?
backend/prisma/
<0A>婙<EFBFBD><E5A999><EFBFBD> schema.prisma # <20>唳旿摨廍chema摰帋<E691B0>
backend/prompts/asl/screening/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> v1.0.0-mvp.txt # <20><><EFBFBD>Prompt嚗<74><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> v1.1.0-lenient.txt # 摰賣𠹭璅∪<E79285>
<0A>婙<EFBFBD><E5A999><EFBFBD> v1.1.0-strict.txt # 銝交聢璅∪<E79285>
backend/scripts/
<0A>婙<EFBFBD><E5A999><EFBFBD> test-llm-screening.ts # LLM瘚贝<E7989A><E8B49D>𡁏𧋦嚗<F0A78BA6><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
<EFBFBD><EFBFBD> API蝡舐<E89DA1>嚗<EFBFBD><E59A97>摰痹<E691B0>
<EFBFBD>箇<EFBFBD>URL
撘<EFBFBD><EFBFBD>𤑳㴓憓? http://localhost:3001/api/v1/asl
憿寧𤌍蝞∠<EFBFBD>
POST /projects # <20>𥕦遣憿寧𤌍
GET /projects # <20>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒”
GET /projects/:projectId # <20>瑕<EFBFBD>憿寧𤌍霂行<E99C82>
<EFBFBD><EFBFBD>讃蝞∠<EFBFBD>
POST /literatures/import # 撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F>澆<EFBFBD>嚗?POST /literatures/import/excel # 撖澆<E69296>Excel<65><6C>讃
GET /projects/:projectId/literatures # <20>瑕<EFBFBD><E79195><EFBFBD>讃<EFBFBD>𡑒”
DELETE /literatures/:literatureId # <20>𣳇膄<F0A3B387><E88684>讃
蝑偦<EFBFBD>厩㮾<EFBFBD>喉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䁅<EFBFBD><EFBFBD>萘<EFBFBD>嚗?```http
GET /projects/:projectId/screening-task # <20>瑕<EFBFBD>隞餃𦛚餈𥕦漲 GET /projects/:projectId/screening-results # <20>瑕<EFBFBD>蝑偦<E89D91>厩<EFBFBD><E58EA9>?GET /screening-results/:resultId # <20>瑕<EFBFBD>蝏𤘪<E89D8F>霂行<E99C82> POST /screening-results/:resultId/review # <20>𣂷漱鈭箏極憭齿瓲
### <20>冽<EFBFBD>憭滨<E686AD>嚗𠃊EW - Day 5嚗?```http
POST /fulltext-screening/tasks # <20>𥕦遣<F0A595A6>冽<EFBFBD>憭滨<E686AD>隞餃𦛚
GET /fulltext-screening/tasks/:taskId/progress # <20>瑕<EFBFBD>隞餃𦛚餈𥕦漲
GET /fulltext-screening/tasks/:taskId/results # <20>瑕<EFBFBD>隞餃𦛚蝏𤘪<E89D8F>
PUT /fulltext-screening/results/:resultId/decision # <20>湔鰵鈭箏極<E7AE8F>喟<EFBFBD>
GET /fulltext-screening/tasks/:taskId/export # 撖澆枂Excel<65>亙<EFBFBD>
<EFBFBD>喲睸<EFBFBD><EFBFBD>㺭霂湔<EFBFBD>
<EFBFBD>𥕦遣憿寧𤌍
{
projectName: string;
picoCriteria: {
P: string; // 鈭箇黎
I: string; // 撟脤<E6929F>
C: string; // 撖寧<E69296>
O: string; // 蝏枏<E89D8F>
S: string; // <20>𠉛弦霈曇恣
};
inclusionCriteria: string;
exclusionCriteria: string;
screeningConfig?: {
models: ['DeepSeek-V3', 'Qwen-Max'];
style: 'standard' | 'lenient' | 'strict';
};
}
<EFBFBD>瑕<EFBFBD>蝑偦<EFBFBD>厩<EFBFBD><EFBFBD>?```
Query<EFBFBD><EFBFBD>㺭:
- page: 憿萇<E686BF>嚗<EFBFBD><E59A97>霈?嚗?- pageSize: 瘥誯△<E8AAAF>圈<EFBFBD>嚗<EFBFBD><E59A97>霈?0嚗?- filter: all | conflict | included | excluded | reviewed
---
## <20><>儭?<3F>唳旿摨梶<E691A8><E6A2B6><EFBFBD><EFBFBD><EFBFBD>笔<EFBFBD>嚗?
### Schema: asl_schema
#### 1. screening_projects嚗<73><E59A97><EFBFBD>厰★<E58EB0>殷<EFBFBD>
```sql
銝駁睸: id (UUID)
憭㚚睸: user_id <20>?platform_schema.users(id)
<0A>喲睸摮埈挾:
- project_name: 憿寧𤌍<E5AFA7>滨妍
- pico_criteria: JSONB嚗<42>聢撘𧶏<E69298>{P, I, C, O, S}嚗? - inclusion_criteria: TEXT
- exclusion_criteria: TEXT
- screening_config: JSONB嚗<42>聢撘𧶏<E69298>{models, style}嚗? - status: 'draft' | 'screening' | 'completed'
蝝W<E89D9D>: user_id, status
2. literatures嚗<73><E59A97><EFBFBD>殷<EFBFBD><E6AEB7>?撌脫<E6928C>撅?```sql
銝駁睸: id (UUID) 憭㚚睸: project_id <20>?screening_projects(id) CASCADE <0A><><EFBFBD><EFBFBD>䁅<EFBFBD>摮埈挾:
- title: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - abstract: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - authors, journal, publication_year, pmid, doi <0A>冽<EFBFBD>憭滨<E686AD>摮埈挾嚗?025-11-23<32>啣<EFBFBD>嚗?
- stage: TEXT嚗<54><E59A97><EFBFBD>賢𪂹<E8B3A2><F0AA82B9><EFBFBD>imported/title_screened/fulltext_pending/fulltext_screened嚗? - has_pdf: BOOLEAN嚗<4E>糓<EFBFBD>行<EFBFBD>PDF嚗? - pdf_storage_type, pdf_storage_ref, pdf_status, pdf_uploaded_at嚗㇊DF蝞∠<E89D9E>嚗? - full_text_storage_type, full_text_storage_ref, full_text_url嚗<6C><E59A97><EFBFBD>毺<EFBFBD>摮睃<E691AE>嚗? - full_text_format, full_text_source, full_text_token_count嚗<74><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿嚗?蝝W<E89D9D>: project_id, pmid, doi, stage, has_pdf, pdf_status <0A>臭<EFBFBD>蝥行<E89DA5>: (project_id, pmid), (project_id, doi)
#### 3. screening_tasks嚗<73><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC><EFBFBD>劐遙<E58A90>∴<EFBFBD>
```sql
銝駁睸: id (UUID)
憭㚚睸: project_id <20>?screening_projects(id) CASCADE
<0A>喲睸摮埈挾:
- status: 'pending' | 'running' | 'completed' | 'failed'
- total_items, processed_items, success_items, conflict_items
- started_at, completed_at
蝝W<E89D9D>: project_id, status
4. screening_results嚗<73><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC><EFBFBD>厩<EFBFBD><E58EA9>頣<EFBFBD>
銝駁睸: id (UUID)
憭㚚睸:
- project_id <EFBFBD>?screening_projects(id) CASCADE
- literature_id <EFBFBD>?literatures(id) CASCADE
<EFBFBD>喲睸摮埈挾:
DeepSeek蝏𤘪<EFBFBD>:
- ds_*_judgment: 'match' | 'partial' | 'mismatch'
- ds_*_evidence: TEXT嚗㇊/I/C/S<EFBFBD><EFBFBD><EFBFBD><EFBFBD>殷<EFBFBD>
- ds_conclusion: 'include' | 'exclude' | 'uncertain'
- ds_confidence: FLOAT(0-1)
- ds_reason: TEXT
Qwen蝏𤘪<EFBFBD>: <EFBFBD>䔶<EFBFBD>嚗íwen_*嚗? <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚?
- conflict_status: 'none' | 'conflict' | 'resolved'
- conflict_fields: JSONB
鈭箏極憭齿瓲:
- final_decision: 'include' | 'exclude' | NULL
- final_decision_by: <EFBFBD>冽<EFBFBD>ID
- final_decision_at: TIMESTAMP
- exclusion_reason: TEXT
蝝W<EFBFBD>: project_id, literature_id, conflict_status, final_decision
<EFBFBD>臭<EFBFBD>蝥行<EFBFBD>: (project_id, literature_id)
5. fulltext_screening_tasks嚗<73><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑𥕢遙<F0A595A2>∴<EFBFBD><E288B4>?<3F>啣遣
銝駁睸: id (UUID)
憭㚚睸: project_id <EFBFBD>?screening_projects(id) CASCADE
<EFBFBD>喲睸摮埈挾:
- model_a, model_b: TEXT嚗<EFBFBD><EFBFBD>璅∪<EFBFBD><EFBFBD>滨妍嚗? - prompt_version: TEXT嚗㇊rompt<EFBFBD><EFBFBD>𧋦嚗? - status: 'pending' | 'running' | 'completed' | 'failed'
- total_count, processed_count, success_count, failed_count, degraded_count
- total_tokens, total_cost: <EFBFBD>鞉𧋦蝏蠘恣
- started_at, completed_at, estimated_end_at
- error_message, error_stack
蝝W<EFBFBD>: project_id, status, created_at
6. fulltext_screening_results嚗<73><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑𤤿<E89D91><F0A4A4BF>頣<EFBFBD><E9A0A3>?<3F>啣遣
銝駁睸: id (UUID)
憭㚚睸:
- task_id <EFBFBD>?fulltext_screening_tasks(id) CASCADE
- project_id <EFBFBD>?screening_projects(id) CASCADE
- literature_id <EFBFBD>?literatures(id) CASCADE
<EFBFBD>喲睸摮埈挾:
Model A (DeepSeek-V3) 蝏𤘪<EFBFBD>:
- model_a_name, model_a_status, model_a_fields (JSONB)
- model_a_overall, model_a_processing_log, model_a_verification (JSONB)
- model_a_tokens, model_a_cost, model_a_error
Model B (Qwen-Max) 蝏𤘪<EFBFBD>: <EFBFBD>䔶<EFBFBD>嚗éodel_b_*嚗? 撉諹<EFBFBD>蝏𤘪<EFBFBD>:
- medical_logic_issues (JSONB): <EFBFBD>餃郎<EFBFBD>餉<EFBFBD>撉諹<EFBFBD>
- evidence_chain_issues (JSONB): 霂<EFBFBD>旿<EFBFBD>暸<EFBFBD>霂? <EFBFBD>脩<EFBFBD>璉<EFBFBD>瘚?
- is_conflict, conflict_severity, conflict_fields, conflict_details (JSONB)
- review_priority (0-100), review_deadline
鈭箏極憭齿瓲:
- final_decision: 'include' | 'exclude' | NULL
- final_decision_by, final_decision_at
- exclusion_reason, review_notes
憭<EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>?
- processing_status, is_degraded, degraded_model
<EFBFBD>航蕭皞舀<EFBFBD>?
- raw_output_a (JSONB), raw_output_b (JSONB), prompt_version
蝝W<EFBFBD>: task_id, project_id, literature_id, is_conflict, final_decision, review_priority
<EFBFBD>臭<EFBFBD>蝥行<EFBFBD>: (project_id, literature_id)
<EFBFBD>唳旿摨廍chema<EFBFBD>𠉛氖<EFBFBD>嗆<EFBFBD>?
**<2A>?摰<><E691B0>甇<EFBFBD>&**嚗?- <20><><EFBFBD>𡅅SL銵券<E98AB5><E588B8>?asl_schema 銝?- <20>䭾㺭<E4ADBE>格<EFBFBD>瞍誩<E79E8D> public schema
- Schema<EFBFBD>𠉛氖蝑𣇉裦<EFBFBD>扯<EFBFBD>銝交聢
- 霂西<EFBFBD>嚗靀<EFBFBD>唳旿摨栞<EFBFBD>蝘餌𠶖<EFBFBD><EFBFBD>秩<EFBFBD>筕(./05-撘<><E69298>𤏸扇敶?2025-11-23_<33>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696>秩<EFBFBD>?md)
<EFBFBD><EFBFBD> <20>唳旿瘚<E697BF><E7989A>嚗<EFBFBD><E59A97>摰痹<E691B0>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䁅<EFBFBD><EFBFBD>萘<EFBFBD>瘚<EFBFBD><EFBFBD>
<EFBFBD>冽<EFBFBD>銝𠹺<EFBFBD>Excel
<20>?閫<><E996AB>撟嗅紡<E59785>亙<EFBFBD> literatures 銵? <20>?<3F>𥕦遣 screening_task
<20>?<3F>𤾸蝱撘<E89DB1>郊憭<E9838A><E686AD>:
- <20>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9>剁<EFBFBD>DeepSeek + Qwen嚗? - 靽嘥<E99DBD><E598A5>?screening_results
- <20>脩<EFBFBD>璉<EFBFBD>瘚? - <20>湔鰵隞餃𦛚餈𥕦漲
<20>?<3F>滨垢頧株砭隞餃𦛚<E9A483>嗆<EFBFBD>? <20>?<3F>冽<EFBFBD>摰⊿<E691B0>蝏𤘪<E89D8F>嚗峕<E59A97>鈭支犖撌亙<E6928C><E4BA99>? <20>?撖澆枂Excel嚗<6C><E59A97>蝡舐<E89DA1><E88890>鞉<EFBFBD><E99E89>𡒊垢OSS嚗?```
### <20>冽<EFBFBD>憭滨<E686AD>瘚<EFBFBD><E7989A>嚗<EFBFBD>挽霈∩葉嚗?
<EFBFBD>冽<EFBFBD>銝𠹺<EFBFBD>PDF嚗<EFBFBD>鸌<EFBFBD>𧶏<EFBFBD> <0A>?PDF<44>𣂼<EFBFBD><F0A382BC>滚𦛚嚗𠃊ougat隡睃<E99AA1>嚗釶yMuPDF<44>滨漣嚗? <20>?<3F>湔鰵 literatures 銵剁<E98AB5><E58981>冽<EFBFBD>撘閧鍂摮埈挾嚗? <20>?<3F>𥕦遣 fulltext_screening_task <0A>?<3F>𤾸蝱撘<E89DB1>郊<EFBFBD>孵<EFBFBD><E5ADB5>?
- <EFBFBD>峕芋<EFBFBD>见僎銵諹<EFBFBD><EFBFBD>剁<EFBFBD>DeepSeek + Qwen嚗? - 12摮埈挾蝏𤘪<E89D8F><F0A498AA>𡝗<EFBFBD><F0A19D97>? - <20>餃郎<E9A483>餉<EFBFBD>撉諹<E69289> + 霂<>旿<EFBFBD>暸<EFBFBD>霂? - <20>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A>摮埈挾蝥批笆瘥䈑<E798A5>
- 靽嘥<EFBFBD><EFBFBD>?fulltext_screening_results
- <EFBFBD>湔鰵隞餃𦛚餈𥕦漲 <0A>?<3F>滨垢撅閧內蝏𤘪<E89D8F>嚗<EFBFBD><E59A97>閫<EFBFBD>㦛摰⊿<E691B0>嚗? <20>?<3F>冽<EFBFBD>憭齿瓲<E9BDBF>脩<EFBFBD>憿對<E686BF><E5B08D>𣂷漱<F0A382B7><E6BCB1>蝏<EFBFBD><E89D8F>蝑? <20>?撖澆枂Excel嚗?2摮埈挾霂衣<E99C82><E8A1A3>亙<EFBFBD>嚗? - total_items: INT
- processed_items: INT
- success_items: INT
- conflict_items: INT
- failed_items: INT
- started_at, completed_at: TIMESTAMP 蝝W<E89D9D>: project_id, status
---
## <20><> LLM<4C><4D><EFBFBD>嚗<EFBFBD><E59A97>摰𧼮<E691B0><F0A7BCAE>堆<EFBFBD>
### LLM靚<4D>鍂瘚<E98D82><E7989A>
<EFBFBD>滨垢: <20>孵稬"撘<>憪𧘹I<F0A798B9>萘<EFBFBD>" <0A>?<3F>𡒊垢: literatureController.importLiteratures() <0A>?<3F>𡒊垢: screeningService.startScreeningTask() <0A>?<3F>𡒊垢: screeningService.processLiteraturesInBackground() <0A>?(for each literature) <0A>𡒊垢: llmScreeningService.dualModelScreening() <0A>?<3F>𡒊垢: LLMFactory.getAdapter(model).chat() <0A>?<3F>笔<EFBFBD>API: DeepSeek API / Qwen API <0A>?<3F>𡒊垢: JSON閫<4E><E996AB> + Schema撉諹<E69289> <0A>?<3F>𡒊垢: 靽嘥<E99DBD><E598A5>?screening_results 銵? <20>?<3F>𡒊垢: <20>湔鰵 screening_tasks 餈𥕦漲 <0A>?<3F>滨垢: useScreeningTask 頧株砭嚗?蝘?甈∴<E79488> <0A>?<3F>滨垢: <20>曄內餈𥕦漲<F0A595A6>∪<EFBFBD>蝏𤘪<E89D8F>
### 摮埈挾<E59F88>惩<EFBFBD><E683A9>喟頂
#### PICOS摮埈挾
```typescript
// <20>滨垢/<2F>唳旿摨𤘪聢撘?picoCriteria: { P, I, C, O, S }
// LLM<4C>滚𦛚<E6BB9A>澆捆<E6BE86>澆<EFBFBD>
picoCriteria: {
P || population,
I || intervention,
C || comparison,
O || outcome,
S || studyDesign
}
// <20>惩<EFBFBD>雿滨蔭: screeningService.ts (Line 82-92)
璅∪<EFBFBD><EFBFBD>滨妍
// <20>滨垢撅閧內<E996A7>?<3F>?API<50>滨妍
const MODEL_NAME_MAP = {
'DeepSeek-V3': 'deepseek-chat',
'Qwen-Max': 'qwen-max',
'GPT-4o': 'gpt-4o',
'Claude-4.5': 'claude-sonnet-4.5',
};
// <20>惩<EFBFBD>雿滨蔭: screeningService.ts (Line 97-110)
LLM<EFBFBD>滨蔭
璅∪<EFBFBD><EFBFBD><EFBFBD>㺭
{
temperature: 0, // <20>箏<EFBFBD>嚗𣬚&靽萘<E99DBD><E89098>靝<EFBFBD><E99D9D>湔<EFBFBD>? top_p: 1.0,
max_tokens: 2048,
}
Prompt<EFBFBD><EFBFBD>𧋦
敶枏<EFBFBD>雿輻鍂: v1.0.0-mvp.txt
雿滨蔭: backend/prompts/asl/screening/v1.0.0-mvp.txt
<0A><>&<EFBFBD>? 60%嚗<><E59A97>甈⊥<E79488>霂𤏪<E99C82>
銝<><E98A9D>渡<EFBFBD>: 70-100%
憭<EFBFBD><EFBFBD><EFBFBD>扯<EFBFBD>
<EFBFBD>閧<EFBFBD><EFBFBD><EFBFBD>讃<EFBFBD>埈𧒄: 10-20蝘𡜐<E89D98>DeepSeek + Qwen撟嗉<E6929F>嚗?5蝭<35><E89DAD><EFBFBD>? 蝥?0-100蝘?199蝭<39><E89DAD><EFBFBD>? 蝥?3-66<36><36><EFBFBD>嚗<EFBFBD>葡銵<E891A1><E98AB5><EFBFBD><EFBFBD><EFBFBD>
餈𥕦漲<F0A595A6>湔鰵: 瘥?<3F>⊥凒<E28AA5>唳㺭<E594B3>桀<EFBFBD>
<0A>滨垢頧株砭: 1蝘?甈?```
---
## <20>?撌脣<E6928C><E884A3>𣂼<EFBFBD><F0A382BC>?
### 1. <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD> - 霈曄蔭銝𤾸鍳<F0A4BEB8>?潃?
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
- <20>?PICOS<4F><53><EFBFBD>敶訫<E695B6>嚗㇊/I/C/O/S銝斗<E98A9D>撣<EFBFBD><E692A3>嚗?- <20>?蝥喳<E89DA5>/<2F>㘾膄<E398BE><E88684><EFBFBD>敶訫<E695B6>嚗<EFBFBD>儒颲孵笆蝘啣<E89D98>撅<EFBFBD>嚗?- <20>?Excel璅⊥踎銝贝蝸嚗<E89DB8><E59A97><EFBFBD>怠<EFBFBD>畾菔秩<E88F94>𠬍<EFBFBD>
- <20>?Excel<65><6C>辣銝𠹺<E98A9D>
- <20>?Excel閫<6C><E996AB>嚗<EFBFBD><E59A97>摮䀝葉嚗峕𣈲<E5B395><F0A388B2>葉<EFBFBD>望<EFBFBD>銵典仍嚗?- <20>?<3F><>讃<EFBFBD>駁<EFBFBD>嚗㇄OI隡睃<E99AA1>嚗峕<E59A97>憸䁅<E686B8><E48185>抬<EFBFBD>
- <20>?<3F><>讃憸<E8AE83><E686B8>銵冽聢嚗<E881A2>𤐄摰𡁜<E691B0>摰踝<E691B0>Tooltip<69>曄內<E69B84>冽<EFBFBD>嚗?- <20>?<3F>臬𢆡AI<41>萘<EFBFBD><E89098>厰僼
- <20>?<3F>芸𢆡頝唾蓮<E594BE>啣恣<E595A3>詨極雿𨅯蝱
#### <20>喲睸隞<E79DB8><E99A9E>
```typescript
// <20><>辣: frontend-v2/src/modules/asl/pages/TitleScreeningSettings.tsx
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: PICOS銵典<E98AB5> + Excel銝𠹺<E98A9D> + <20><>讃憸<E8AE83><E686B8> + <20>𣂷漱
// Excel憭<6C><E686AD>
import { downloadExcelTemplate, processExcelFile } from '../utils/excelUtils';
// API靚<49>鍂
const projectResponse = await aslApi.createProject({ ... });
const importResponse = await aslApi.importLiteratures({ ... });
navigate('/literature/screening/title/workbench', { state: { projectId } });
2. <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD> - 摰⊥瓲撌乩<E6928C><E4B9A9>?潃?
<EFBFBD>蠘<EFBFBD>皜<EFBFBD><EFBFBD>
- <EFBFBD>?隞餃𦛚餈𥕦漲<F0A595A6>曄內嚗<E585A7>蔭霂g<E99C82>1蝘?甈∴<E79488>
- <EFBFBD>?餈𥕦漲<F0A595A6>∪<EFBFBD><E288AA>嗆凒<E59786>堆<EFBFBD>撟單<E6929F>憓鮋鵭嚗?- <20>?璅∪<E79285>憭<EFBFBD><E686AD><EFBFBD>圈<EFBFBD><E59C88>曄內嚗㇄eepSeek + Qwen嚗?- <20>?<3F>諹<EFBFBD>銵冽聢嚗㇄eepSeek銝𡃏<E98A9D>嚗熑wen銝贝<E98A9D>嚗?- <20>?PICOS<4F>斗鱏Badge嚗<65>龪<EFBFBD>?<3F>典<EFBFBD>/銝滚龪<E6BB9A>㵪<EFBFBD>
- <EFBFBD>?蝏栞捏Tag嚗<67>熙<EFBFBD>?<3F>㘾膄/銝滨&摰𡄯<E691B0>
- <EFBFBD>?<3F>脩<EFBFBD><E884A9><EFBFBD>讃擃䀝漁嚗<E6BC81>滯<EFBFBD>脰<EFBFBD><E884B0>荔<EFBFBD>
- <EFBFBD>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285>霂<EFBFBD>旿嚗<E697BF><E59A97>璅∪<E79285>撖寞<E69296>嚗?- <20>?蝏煺<E89D8F>憭齿瓲Drawer嚗<72>椰靘扯祕<E689AF>?<3F>喃儒憭齿瓲嚗?- <20>?鈭箏極憭齿瓲<E9BDBF>𣂷漱
- <EFBFBD>?蝑偦<E89D91>凤ab嚗<62><E59A97><EFBFBD>?<3F>脩<EFBFBD>/撌脩熙<E884A9>?撌脫<E6928C><E884AB>?撌脣<E6928C><E884A3>賂<EFBFBD>
- <EFBFBD>?<3F><>△嚗<E296B3><E59A97>蝡臬<E89DA1>憿蛛<E686BF>20<32>?憿蛛<E686BF>
<EFBFBD>喲睸隞<EFBFBD><EFBFBD>
// <20><>辣: frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: <20>諹<EFBFBD>銵冽聢 + 餈𥕦漲頧株砭 + 撅訫<E69285>銵?+ 憭齿瓲Drawer
// 頧株砭餈𥕦漲
const { task, progress, isRunning } = useScreeningTask({ projectId, pollingInterval: 1000 });
// <20>亥砭蝏𤘪<E89D8F>
const { results } = useScreeningResults({ projectId, page, pageSize, filter });
// <20>諹<EFBFBD>頧祆揢
const tableData = transformToDoubleRows(results);
// 撅訫<E69285>銵?expandable={{
expandedRowRender: (record) => { /* <20>峕芋<E5B395>贝<EFBFBD><E8B49D>桀笆瘥?*/ },
expandedRowKeys,
onExpandedRowsChange: (keys) => setExpandedRowKeys([...keys]),
}}
3. <20>𡒊垢LLM<4C><4D><EFBFBD> 潃?
<EFBFBD>蠘<EFBFBD>皜<EFBFBD><EFBFBD>
- <EFBFBD>?<3F>峕芋<E5B395>见僎銵𣬚<E98AB5><F0A3AC9A>㚁<EFBFBD>DeepSeek + Qwen嚗?- <20>?JSON蝏𤘪<E89D8F><F0A498AA>𤥁<EFBFBD><F0A4A581>綽<EFBFBD>撣吁chema撉諹<E69289>嚗?- <20>?<3F>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A>蝏栞捏銝滢<E98A9D><E6BBA2>湛<EFBFBD>
- <EFBFBD>?銝脰<E98A9D>憭<EFBFBD><E686AD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD>PI<50>鞉<EFBFBD>嚗?- <20>?餈𥕦漲摰墧𧒄<E5A2A7>湔鰵嚗<E9B0B5><E59A97>1<EFBFBD>∴<EFBFBD>
- <EFBFBD>?<3F>躰秤憭<E7A7A4><E686AD>銝𡡞<E98A9D>霂?- <20>?摮埈挾<E59F88>惩<EFBFBD>嚗㇊ICOS, 璅∪<E79285><E288AA>㵪<EFBFBD>
- <EFBFBD>?<3F><>讃撉諹<E69289>嚗<EFBFBD><E59A97>憸?<3F>䁅<EFBFBD>敹<EFBFBD><E695B9>嚗?- <20>?霂衣<E99C82><E8A1A3>亙<EFBFBD>颲枏枂
<EFBFBD>喲睸隞<EFBFBD><EFBFBD>
// <20><>辣: backend/src/modules/asl/services/screeningService.ts
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: 隞餃𦛚蝞∠<E89D9E> + 摮埈挾<E59F88>惩<EFBFBD> + LLM靚<4D>鍂
// 摮埈挾<E59F88>惩<EFBFBD>
const picoCriteria = {
P: rawPicoCriteria?.P || rawPicoCriteria?.population || '',
I: rawPicoCriteria?.I || rawPicoCriteria?.intervention || '',
// ... C, O, S
};
const MODEL_NAME_MAP = {
'DeepSeek-V3': 'deepseek-chat',
'Qwen-Max': 'qwen-max',
// ...
};
// LLM靚<4D>鍂
const screeningResult = await llmScreeningService.dualModelScreening(
literature.id,
literature.title,
literature.abstract,
picoCriteria,
inclusionCriteria,
exclusionCriteria,
[models[0], models[1]],
screeningConfig?.style || 'standard'
);
4. LLM<4C>滚𦛚撅?潃?
<EFBFBD>蠘<EFBFBD>皜<EFBFBD><EFBFBD>
- <EFBFBD>?蝏煺<E89D8F>LLM<4C><4D><EFBFBD><EFBFBD>剁<EFBFBD>LLMFactory嚗?- <20>?<3F>舀<EFBFBD>4銝芣芋<E88AA3>页<EFBFBD>DeepSeek, Qwen, GPT, Claude嚗?- <20>?Prompt<70><74><EFBFBD>嚗<EFBFBD>抅鈭擧芋<E693A7>選<EFBFBD>
- <EFBFBD>?JSON閫<4E><E996AB>嚗<EFBFBD>捆<EFBFBD>辷<EFBFBD><E8BEB7>舀<EFBFBD>銝剜<E98A9D>撘訫噡嚗?- <20>?Schema撉諹<E69289>嚗㇁JV嚗?- <20>?<3F>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9>?- <20>?<3F>寥<EFBFBD>蝑偦<E89D91>㚁<EFBFBD>撟嗅<E6929F><E59785>批<EFBFBD>嚗?
<EFBFBD>喲睸隞<EFBFBD><EFBFBD>
// <20><>辣: backend/src/modules/asl/services/llmScreeningService.ts
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: LLM靚<4D>鍂 + JSON閫<4E><E996AB> + Schema撉諹<E69289>
async dualModelScreening(...) {
const [result1, result2] = await Promise.all([
this.screenWithModel(model1, ...),
this.screenWithModel(model2, ...),
]);
// <20>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A><E9A1B5>芣<EFBFBD>瘚醶onclusion嚗? const hasConflict = result1.conclusion !== result2.conclusion;
// <20><>蝏<EFBFBD><E89D8F>蝑? let finalDecision = hasConflict ? 'pending' : result1.conclusion;
return { deepseek: result1, qwen: result2, hasConflict, finalDecision };
}
5. <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD> - <20>萘<EFBFBD>蝏𤘪<E89D8F> 潃?Week 4 <20>啣<EFBFBD>
<EFBFBD>蠘<EFBFBD>皜<EFBFBD><EFBFBD>
- <EFBFBD>?蝏蠘恣璁<E681A3><E79281><EFBFBD>∠<EFBFBD>嚗<EFBFBD><E59A97>餅㺭<E9A485><E3BAAD>歇蝥喳<E89DA5><E596B3><EFBFBD>歇<EFBFBD>㘾膄<E398BE><E88684><EFBFBD>憭齿瓲嚗?- <20>?敺<><E695BA><EFBFBD>豢<EFBFBD>蝷綽<E89DB7>敶𤘪<E695B6><F0A498AA>脩<EFBFBD><E884A9>嗆遬蝷綽<E89DB7>
- <EFBFBD>?PRISMA<4D>㘾膄<E398BE>笔<EFBFBD>蝏蠘恣嚗<E681A3><E59A97><EFBFBD>嗅㦛撅閧內嚗?- <20>?蝏𤘪<E89D8F><F0A498AA>𡑒”Tab嚗<62><E59A97><EFBFBD>?撌脩熙<E884A9>?撌脫<E6928C><E884AB>?敺<><E695BA><EFBFBD>賂<EFBFBD>
- <EFBFBD>?瘛瑕<E7989B><E79195>寞<EFBFBD>銵冽聢嚗㇁I<E38781>梯<EFBFBD> + 鈭箏極<E7AE8F><E6A5B5>蝏<EFBFBD><E89D8F>蝑吔<E89D91>
- <EFBFBD>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285>霂衣<E99C82><E8A1A3>斗鱏嚗<E9B18F><E59A97>璅∪<E79285>霂<EFBFBD>旿撖寞<E69296>嚗?- <20>?<3F>寥<EFBFBD><E5AFA5>㗇𥋘銝𤾸紡<F0A4BEB8>綽<EFBFBD>3蝘滚紡<E6BB9A>箸䲮撘𧶏<E69298>
- <EFBFBD>?Excel撖澆枂嚗<E69E82><E59A97>蝡舐<E89DA1><E88890>琜<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>
瘛瑕<EFBFBD><EFBFBD>寞<EFBFBD>霈曇恣
**<2A>詨<EFBFBD><E8A9A8>寧<EFBFBD>**嚗?- <20>𡒊&<F0A1928A>箏<EFBFBD>AI<41>喟<EFBFBD><E5969F>䔶犖撌亙<E6928C>蝑?- <20>㘾膄<E398BE>笔<EFBFBD><E7AC94>餉<EFBFBD>皜<EFBFBD>苊嚗<E88B8A>熙<EFBFBD>乩<EFBFBD><E4B9A9>曄內<E69B84>笔<EFBFBD>嚗?- <20>嗆<EFBFBD><E59786><EFBFBD>蝑曉<E89D91>蝖殷<E89D96>4蝘滨𠶖<E6BBA8><F0A0B696><EFBFBD>
- <EFBFBD>𣳇<EFBFBD>餉<EFBFBD><EFBFBD>𤤿㦛
**銵冽聢<E586BD>𡑒挽霈?*嚗?| <20>堒<EFBFBD> | 摰賢漲 | 霂湔<E99C82> | |------|------|------| | # | 50px | 摨誩噡 | | <20><>讃<EFBFBD><E8AE83><EFBFBD> | 300px | <20>舐<EFBFBD><E88890>餃<EFBFBD>撘<EFBFBD> | | AI<41>梯<EFBFBD> | 100px | DS+QW<51>臬炏銝<E7828F><E98A9D>?| | <20>㘾膄<E398BE>笔<EFBFBD> | 140px | <20>箄<EFBFBD><E7AE84>曄內 | | 鈭箏極<E7AE8F><E6A5B5>蝏<EFBFBD><E89D8F>蝑?| 120px | <20><>釣<EFBFBD>函蕃AI/銝垾I銝<49><E98A9D>?| | <20>嗆<EFBFBD>?| 90px | 4蝘滨𠶖<E6BBA8>?| | <20>滢<EFBFBD> | 70px | 撅訫<E69285>/<2F>嗉絲 |
**<2A>餃捐摨?*嚗?70px嚗<78><E59A97><EFBFBD><EFBFBD>璅芸<E79285>皛𡁜𢆡嚗?
<EFBFBD>喲睸隞<EFBFBD><EFBFBD>
// <20><>辣: frontend-v2/src/modules/asl/pages/ScreeningResults.tsx
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: 蝏蠘恣撅閧內 + 瘛瑕<E7989B><E79195>寞<EFBFBD>銵冽聢 + Excel撖澆枂
// 蝏蠘恣<E8A098>唳旿<E594B3>瑕<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA><EFBFBD><EFBFBD>
const { data: statsData } = useQuery({
queryKey: ['projectStatistics', projectId],
queryFn: () => aslApi.getProjectStatistics(projectId),
});
// Excel撖澆枂嚗<E69E82><E59A97><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡舐<E89DA1><E88890>琜<EFBFBD><E7909C>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>
exportScreeningResults(data.items, {
filter,
projectName: `憿寧𤌍${projectId.slice(0, 8)}`,
});
6. 蝏蠘恣API 潃?Week 4 <20>啣<EFBFBD>
<EFBFBD>蠘<EFBFBD>皜<EFBFBD><EFBFBD>
- <EFBFBD>?<3F>𡒊垢<F0A1928A>𡁜<EFBFBD>蝏蠘恣嚗㇊risma撟嗉<E6929F><E59789>亥砭嚗?- <20>?蝏蠘恣<E8A098>餅㺭<E9A485><E3BAAD>歇蝥喳<E89DA5><E596B3><EFBFBD>歇<EFBFBD>㘾膄<E398BE><E88684><EFBFBD>憭齿瓲<E9BDBF><E793B2><EFBFBD>蝒<EFBFBD><E89D92><EFBFBD>歇憭齿瓲
- <EFBFBD>?<3F><><EFBFBD><EFBFBD>㘾膄<E398BE>笔<EFBFBD>嚗<EFBFBD><E59A97>AI<41>斗鱏銝剜<E98A9D><E5899C>吔<EFBFBD>
- <EFBFBD>?霈∠<E99C88><E288A0><EFBFBD>掩<EFBFBD>曉<EFBFBD>瘥?- <20>?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗<EFBFBD><E59A97>撠𤑳<E692A0>蝏靝<E89D8F>颲?
<EFBFBD>喲睸隞<EFBFBD><EFBFBD>
// <20><>辣: backend/src/modules/asl/controllers/screeningController.ts
// <20>詨<EFBFBD><E8A9A8>蠘<EFBFBD>: 蝏蠘恣<E8A098>𡁜<EFBFBD> + <20>㘾膄<E398BE>笔<EFBFBD><E7AC94><EFBFBD><EFBFBD>
// 潃?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>雿輻鍂Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗<E7A0AD>僎銵峕<E98AB5>銵䕘<E98AB5>
const [total, included, excluded, pending, conflict, reviewed] =
await Promise.all([
prisma.aslScreeningResult.count({ where: { projectId } }),
prisma.aslScreeningResult.count({ where: { projectId, finalDecision: 'include' } }),
// ... <20>游<EFBFBD>撟嗉<E6929F><E59789>亥砭
]);
// 餈𥪜<E9A488>蝏蠘恣<E8A098>唳旿嚗<E697BF><E59A97>MB蝥折<E89DA5><E68A98>袁B蝥改<E89DA5>
return {
total, included, excluded, pending, conflict, reviewed,
exclusionReasons,
includedRate, excludedRate, pendingRate,
};
<EFBFBD>𩤃<EFBFBD> 撌脩䰻<E884A9>桅<EFBFBD>銝𡡞<E98A9D><F0A1A19E>?
1. <20>蠘<EFBFBD><E8A098>𣂼<EFBFBD>
- <EFBFBD>𩤃<EFBFBD> 隞<><E99A9E><EFBFBD>唳<EFBFBD>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91><F0A8A588>冽<EFBFBD>憭滨<E686AD><E6BBA8>芸<EFBFBD><E88AB8>𡢅<EFBFBD>
- <EFBFBD>𩤃<EFBFBD> 銝脰<E98A9D>憭<EFBFBD><E686AD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD>𧒄<EFBFBD>渲<EFBFBD><E6B8B2>選<EFBFBD>199蝭<39>漲30-60<36><30><EFBFBD>嚗?- <20>𩤃<EFBFBD> <20>牐遙<E78990>⊥<EFBFBD><E28AA5>?<3F>𡝗<EFBFBD><F0A19D97>蠘<EFBFBD>
- <EFBFBD>𩤃<EFBFBD> <20>䭾鱏<E4ADBE>寧賒隡𩤃<E99AA1>銝剜鱏<E5899C>𡡞<EFBFBD><F0A1A19E>齿鰵撘<E9B0B5>憪页<E686AA>
- <EFBFBD>𩤃<EFBFBD> <20><>&<EFBFBD>?0%嚗<><E59A97>閬<EFBFBD>rompt隡睃<E99AA1>嚗?
2. <20><><EFBFBD>臬<EFBFBD>箏𦛚
- <EFBFBD>𩤃<EFBFBD> 瘚讛<E7989A><E8AE9B>刻郎<E588BB>𠺪<EFBFBD>
setTimeout handler took >50ms嚗<EFBFBD><EFBFBD>扯<EFBFBD>隡睃<EFBFBD>嚗?- <20>𩤃<EFBFBD> <20>滨垢頧株砭嚗<E7A0AD>遣霈格㺿銝斡ebSocket嚗?- <20>𩤃<EFBFBD> 蝻箏<E89DBB><E7AE8F>訫<EFBFBD>瘚贝<E7989A>嚗𠄌2E瘚贝<E7989A>嚗?- <20>𩤃<EFBFBD> Excel<65>𡒊垢撖澆枂隡睃<E99AA1>嚗<EFBFBD><E59A97><EFBFBD>唳旿<E594B3>?5000<30>⊥𧒄嚗?
3. <20>冽<EFBFBD>雿㯄<E99BBF>
- <EFBFBD>𩤃<EFBFBD> <20>牐摯霈∪<E99C88>雿蹱𧒄<E8B9B1>?- <20>𩤃<EFBFBD> <20>惩<EFBFBD><E683A9>滚<EFBFBD><E6BB9A><EFBFBD><EFBFBD><EFBFBD>格<EFBFBD>憸䀹遬蝷?- <20>𩤃<EFBFBD> <20>寥<EFBFBD>靽格㺿<E6A0BC>喟<EFBFBD><E5969F>蠘<EFBFBD><E8A098>芸<EFBFBD><E88AB8>?
4. <20>煺漣<E785BA>臬<EFBFBD><E887AC>芸停蝏?- <20>𩤃<EFBFBD> 雿輻鍂暺䁅恕瘚贝<E7989A><E8B49D>冽<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>笔<EFBFBD>霈方<E99C88>嚗?- <20>𩤃<EFBFBD> <20>䭾<EFBFBD><E4ADBE>舫<EFBFBD><E888AB>梹<EFBFBD>撘<EFBFBD>郊隞餃𦛚嚗?- <20>𩤃<EFBFBD> <20>𣳇<EFBFBD>霂舫<E99C82>霂閙㦤<E99699>?- <20>𩤃<EFBFBD> <20>䭾<EFBFBD><E4ADBE>祆綉<E7A586>塚<EFBFBD>API靚<49>鍂嚗?- <20>𩤃<EFBFBD> <20>删<EFBFBD><E588A0>批<EFBFBD><E689B9>𡃏郎
**霂衣<E99C82><E8A1A3><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>**嚗靀<E59A97><E99D80><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>](./06-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/<2F><><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md)
<EFBFBD><EFBFBD> 敹恍<E695B9>煺<EFBFBD><E785BA>𧢲<EFBFBD><F0A7A2B2>?
<EFBFBD>臬<EFBFBD>閬<EFBFBD><EFBFBD>
Node.js: v22.18.0+
PostgreSQL: 16+
npm: 10+
1. <20>嘥<EFBFBD><E598A5>𡝗㺭<F0A19D97>桀<EFBFBD>
cd backend
npm install
npx prisma generate
npx prisma migrate dev
2. <20>滨蔭<E6BBA8>臬<EFBFBD><E887AC>㗛<EFBFBD>
<EFBFBD>𥕦遣 backend/.env:
# <20>唳旿摨?DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=asl_schema"
# LLM API撖<49>𤨎
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxx
QWEN_API_KEY=sk-xxxxxxxxxxxxxx
# <20>舫<EFBFBD>?GPT_API_KEY=sk-xxxxxxxxxxxxxx
CLAUDE_API_KEY=sk-xxxxxxxxxxxxxx
3. <20>臬𢆡<E887AC>𡒊垢
cd backend
npm run dev
摨磰砲<EFBFBD>见<EFBFBD>嚗?``` <0A>?Fastify server listening on http://0.0.0.0:3001 <0A>?Database connected <0A>?ASL module routes registered at /api/v1/asl
### 4. <20>臬𢆡<E887AC>滨垢
```bash
cd frontend-v2
npm install
npm run dev
摨磰砲<EFBFBD>见<EFBFBD>嚗?``` VITE v5.x.x ready in xxx ms <0A>? Local: http://localhost:3000
### 5. 瘚贝<E7989A>瘚<EFBFBD><E7989A>
1. 霈輸䔮 `http://localhost:3001`
2. <20>孵稬憿園<E686BF> **"AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃"**
3. <20>芸𢆡頝唾蓮<E594BE>?**"霈曄蔭銝𤾸鍳<F0A4BEB8>?**
4. 憛怠<E6869B>PICOS<4F><53><EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>嗆<EFBFBD>霂閙㺭<E99699>殷<EFBFBD>
5. 銝贝蝸Excel璅⊥踎嚗<E8B88E><E59A97>雿輻鍂<E8BCBB>唳<EFBFBD>嚗?6. 銝𠹺<E98A9D>Excel嚗<6C>遣霈桀<E99C88>瘚贝<E7989A>5蝭<35><E89DAD>
7. <20>孵稬 **"撘<>憪𧘹I<F0A798B9>萘<EFBFBD>"**
8. 蝑匧<E89D91>10-100蝘𡜐<E89D98><F0A19C90>硋<EFBFBD>鈭擧<E988AD><E693A7>格㺭嚗?9. <20>亦<EFBFBD> **"摰⊥瓲撌乩<E6928C><E4B9A9>?**
10. <20>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285><E8A8AB>亦<EFBFBD>霂<EFBFBD>旿
11. <20>孵稬"憭齿瓲"<22>𣂷漱鈭箏極<E7AE8F>喟<EFBFBD>
### 6. <20>亦<EFBFBD><E4BAA6>𡒊垢<F0A1928A>亙<EFBFBD>
<EFBFBD><EFBFBD> 撘<>憪讠<E686AA>摰掹LM蝑偦<E89D91>? 隞餃𦛚ID: xxx <0A><>讃<EFBFBD>? 5 璅∪<E79285>嚗<EFBFBD><E59A97>撠<EFBFBD><E692A0>嚗? [ 'deepseek-chat', 'qwen-max' ] PICOS-P: 2<>讠<EFBFBD>撠輻<E692A0><E8BCBB><EFBFBD><EFBFBD>?..
<EFBFBD>?<3F><>讃 1/5 憭<><E686AD><EFBFBD>𣂼<EFBFBD> DS: include / Qwen: exclude <0A>脩<EFBFBD>: <20>?```
<EFBFBD>妒 瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>
1. LLM韐券<E99F90>瘚贝<E7989A>
cd backend
# <20>孵<EFBFBD>1: 雿輻鍂瘚贝<E7989A><E8B49D>𡁏𧋦
npm run test:llm
# <20>孵<EFBFBD>2: <20>湔𦻖餈鞱<E9A488>
npx ts-node scripts/test-llm-screening.ts
瘚贝<EFBFBD><EFBFBD>唳旿嚗?- 雿滨蔭嚗䫤backend/scripts/test-samples/asl-test-literatures.json`
- <EFBFBD>圈<EFBFBD>嚗?0蝭<30><E89DAD>6蝭<36><E89DAD><EFBFBD>㘾膄嚗?蝭<><E89DAD>蝥喳<E89DA5>嚗?蝭<>器<EFBFBD>䕘<EFBFBD>
- PICOS嚗锭GLT2<EFBFBD>穃<EFBFBD><EFBFBD><EFBFBD>頂蝏毺遞餈?
憸<EFBFBD><EFBFBD>颲枏枂嚗?
<20><>&<EFBFBD>? 60% 銝<><E98A9D>渡<EFBFBD>: 70-100% JSON撉諹<E69289><E8ABB9>? 100% 撟喳<E6929F><E596B3>埈𧒄: 10-15蝘?蝭?
2. API瘚贝<E7989A>
# <20>𥕦遣憿寧𤌍
curl -X POST http://localhost:3001/api/v1/asl/projects \
-H "Content-Type: application/json" \
-d '{
"projectName": "瘚贝<E7989A>憿寧𤌍",
"picoCriteria": {"P":"<22>𣂷犖","I":"<22>舐<EFBFBD>A","C":"摰㗇<E691B0><E39787>?,"O":"蝏枏<E89D8F>","S":"RCT"},
"inclusionCriteria": "<22>望<EFBFBD>",
"exclusionCriteria": "蝏潸膩"
}'
# <20>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒”
curl http://localhost:3001/api/v1/asl/projects
3. <20>滨垢E2E瘚贝<E7989A>
**<2A>见𢆡瘚贝<E7989A>皜<EFBFBD><E79A9C>**嚗?- [ ] PICOS銵典<E98AB5><E585B8>𣂷漱
- Excel璅⊥踎銝贝蝸
- Excel<EFBFBD><EFBFBD>辣銝𠹺<EFBFBD>嚗<EFBFBD>迤撣賂<EFBFBD>
- Excel<EFBFBD><EFBFBD>辣銝𠹺<EFBFBD>嚗<EFBFBD><EFBFBD>霂舀聢撘𧶏<EFBFBD>
- <EFBFBD><EFBFBD>讃憸<EFBFBD><EFBFBD><EFBFBD>曄內
- <EFBFBD>駁<EFBFBD><EFBFBD>餉<EFBFBD>嚗<EFBFBD>㮾<EFBFBD>㷉OI嚗?- [ ] <20>臬𢆡AI<41>萘<EFBFBD>
- 餈𥕦漲<EFBFBD>⊥凒<EFBFBD>?- [ ] <20>芸𢆡頝唾蓮
- 銵冽聢<EFBFBD>曄內
- <EFBFBD>埈<EFBFBD>摨?- [ ] 蝑偦<E89D91>凤ab<61><62>揢
- 撅訫<EFBFBD>銵?- [ ] 憭齿瓲Drawer
- <EFBFBD>𣂷漱憭齿瓲
4. <20>唳旿摨㯄<E691A8>霂?
-- <20>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD>圈★<E59C88>?SELECT * FROM asl_schema.screening_projects
ORDER BY created_at DESC LIMIT 1;
-- <20>亦<EFBFBD>蝑偦<E89D91>劐遙<E58A90>?SELECT * FROM asl_schema.screening_tasks
WHERE project_id = 'xxx';
-- <20>亦<EFBFBD>蝑偦<E89D91>厩<EFBFBD><E58EA9>?SELECT
id,
ds_conclusion,
qwen_conclusion,
conflict_status,
SUBSTRING(ds_p_evidence, 1, 50) as ds_evidence
FROM asl_schema.screening_results
WHERE project_id = 'xxx'
LIMIT 5;
<EFBFBD><EFBFBD> 撘<><E69298>𤏸<EFBFBD><F0A48FB8>?
1. 隞<><E99A9E>憌擧聢
TypeScript
// 雿輻鍂<E8BCBB>亙藁<E4BA99>屸<EFBFBD>蝐餃<E89D90><E9A483>怠<EFBFBD>嚗<EFBFBD>笆憭䨝PI嚗?export interface ScreeningResult { ... }
// 銝交聢蝐餃<E89D90>璉<EFBFBD><E79289>?const picoCriteria: PicoCriteria = { ... };
// 雿輻鍂<E8BCBB>舫<EFBFBD>厰曎<E58EB0>𣬚征<F0A3AC9A>澆<EFBFBD>撟?const models = config?.models ?? ['deepseek-chat', 'qwen-max'];
React
// 雿輻鍂<E8BCBB>賣㺭蝏<E3BAAD>辣
export function ScreeningWorkbench() { ... }
// <20>芸<EFBFBD>銋鵎ook<6F>賢<EFBFBD>隞只se撘<65>憭?export function useScreeningTask() { ... }
// Props<70>亙藁<E4BA99>賢<EFBFBD>隞仙rops蝏枏偏
interface ScreeningWorkbenchProps { ... }
2. <20>賢<EFBFBD>蝥血<E89DA5>
<EFBFBD><EFBFBD>辣<EFBFBD>? PascalCase (蝏<>辣) <20>?camelCase (撌亙<E6928C>)
<20>?ScreeningWorkbench.tsx
<20>?excelUtils.ts
蝏<>辣<EFBFBD>? PascalCase
<20>?function DetailReviewDrawer()
<0A>㗛<EFBFBD>/<2F>賣㺭: camelCase
<20>?const screeningResult = ...
<20>?function processLiteratures()
撣賊<E692A3>: UPPER_SNAKE_CASE
<20>?const MODEL_NAME_MAP = ...
蝐餃<E89D90>/<2F>亙藁: PascalCase
<20>?interface ScreeningResult
3. 瘜券<E7989C>閫<EFBFBD><E996AB>
/**
* 蝑偦<E89D91>劐遙<E58A90>∟蔭霂%ook
*
* @param projectId - 憿寧𤌍ID
* @param pollingInterval - 頧株砭<E6A0AA>湧<EFBFBD>嚗<EFBFBD>神蝘𡜐<E89D98>嚗屸<E59A97>霈?000
* @returns 隞餃𦛚<E9A483>嗆<EFBFBD><E59786><EFBFBD>餈𥕦漲靽⊥<E99DBD>
*/
export function useScreeningTask() { ... }
// <20>圲 靽桀<E99DBD>嚗𡁜<E59A97>畾萄<E795BE><E89084>惩<EFBFBD>嚗<EFBFBD><E59A97>蝡舀聢撘?<3F>?LLM<4C>澆<EFBFBD>嚗?const picoCriteria = { ... };
// <20>𩤃<EFBFBD> 瘜冽<E7989C>嚗𡁜<E59A97>璅∪<E79285><E288AA>臬僎銵<E5838E><E98AB5><EFBFBD>?await Promise.all([...]);
4. <20>躰秤憭<E7A7A4><E686AD>
// <20>𡒊垢
try {
const result = await llmScreeningService.dualModelScreening(...);
} catch (error) {
logger.error('Failed to process literature', {
literatureId: literature.id,
error: error instanceof Error ? error.message : 'Unknown error',
stack: error instanceof Error ? error.stack : undefined,
});
// 颲枏枂<E69E8F>唳綉<E594B3>嗅蝱
console.error('\n<>?<3F><>讃憭<E8AE83><E686AD>憭梯揖:', error);
}
// <20>滨垢
try {
await aslApi.createProject(...);
} catch (error) {
message.error(`<60>滢<EFBFBD>憭梯揖: ${(error as Error).message}`);
}
5. Git<69>𣂷漱閫<E6BCB1><E996AB>
<EFBFBD>萄儐 Git<EFBFBD>𣂷漱閫<EFBFBD><EFBFBD>嚗?
feat: 瘛餃<E7989B>摰⊥瓲撌乩<E6928C><E4B9A9>啗<EFBFBD>摨行遬蝷箔<E89DB7><E7AE94>?fix: 靽桀<E99DBD><E6A180>𡑒”<F0A19192>曄內憿箏<E686BF><E7AE8F>滚<EFBFBD><E6BB9A>桅<EFBFBD>
refactor: <20>齿<EFBFBD>摮埈挾<E59F88>惩<EFBFBD><E683A9>餉<EFBFBD>
docs: <20>湔鰵璅∪<E79285><E288AA>嗆<EFBFBD><E59786><EFBFBD>獢?test: 瘛餃<E7989B>LLM蝑偦<E89D91>㕑捶<E39591>𤩺<EFBFBD>霂?chore: <20>湔鰵靘肽<E99D98><E882BD><EFBFBD>𧋦
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
<EFBFBD>詨<EFBFBD><EFBFBD><EFBFBD>﹝
- **<2A>祆<EFBFBD>獢<EFBFBD><E78DA2>00-璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>**嚗𡁏芋<F0A1818F>㛖<EFBFBD>摰䂿𠶖<E482BF><F0A0B696>翰<EFBFBD>?2. [<5B>唳旿摨栞挽霈((./02-<2D><><EFBFBD>航挽霈?01-<2D>唳旿摨栞挽霈?md)嚗𡁏㺭<F0A1818F>株”蝏𤘪<E89D8F>
- API霈曇恣閫<EFBFBD><EFBFBD>嚗𡁏𦻖<EFBFBD><EFBFBD><EFBFBD>銋?4. [撘<><E69298>𤏸恣<F0A48FB8>哋(./04-撘<><E69298>𤏸恣<F0A48FB8>?03-隞餃𦛚<E9A483><F0A69B9A>圾.md)嚗𡁜<E59A97><F0A1819C>賣<EFBFBD><E8B3A3>蓥<EFBFBD>霈∪<E99C88>
撘<EFBFBD><EFBFBD>𤏸扇敶?
<EFBFBD>冽<EFBFBD>憭滨<EFBFBD>:
- [2025-11-22 Day2-Day3 LLM<4C>滚𦛚銝𡡞<E98A9D>霂<EFBFBD>頂蝏笔<E89D8F><E7AC94>𩬅(./05-撘<><E69298>𤏸扇敶?2025-11-22_Day2-Day3_LLM<4C>滚𦛚銝𡡞<E98A9D>霂<EFBFBD>頂蝏笔<E89D8F><E7AC94>?md) 潃?**<2A><><EFBFBD>?*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䁅<EFBFBD><EFBFBD>萘<EFBFBD>:
- 2025-11-21 <20>笔<EFBFBD>LLM<4C><4D><EFBFBD>
- 2025-11-21 摮埈挾<E59F88>惩<EFBFBD>靽桀<E99DBD>
- 2025-11-21 <20>冽<EFBFBD>雿㯄<E99BBF>隡睃<E99AA1>
- 2025-11-19 Week2-Day2摰峕<E691B0>
- [2025-11-18 Prompt霈曇恣銝擧<E98A9D>霂騟(./05-撘<><E69298>𤏸扇敶?2025-11-18-Prompt霈曇恣銝擧<E98A9D>霂訫<E99C82><E8A8AB>鞉𥁒<E99E89>?md)
瘚贝<EFBFBD><EFBFBD><EFBFBD>﹝
- 瘚贝<EFBFBD><EFBFBD>唳旿嚗䥪ICOS蝷箔<EFBFBD><EFBFBD><EFBFBD>xcel璅⊥踎
<EFBFBD>働 撘<><E69298>穃遣霈?
撖寞鰵撘<EFBFBD><EFBFBD>睲犖<EFBFBD>?
- **<2A><><EFBFBD>閫<EFBFBD><E996AB><EFBFBD>?*嚗𡁻<E59A97>霂?[撘<><E69298>𤏸恣<F0A48FB8>哋(./04-撘<><E69298>𤏸恣<F0A48FB8>?02-<2D><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>撘<EFBFBD><E69298>𤏸恣<F0A48FB8>?md)
- **<2A>滨<EFBFBD>隞<EFBFBD><E99A9E>**嚗𡁏<E59A97><F0A1818F>扳𧋦<E689B3><F0A78BA6>﹝<EFBFBD><EFB99D>誨<EFBFBD><E8AAA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?3. **<2A>冽<EFBFBD>瘚贝<E7989A>**嚗朞<E59A97>銝<EFBFBD><E98A9D>滚<EFBFBD><E6BB9A>湔<EFBFBD>蝔?4. **<2A>亦<EFBFBD><E4BAA6>亙<EFBFBD>**嚗𡁶<E59A97>閫<EFBFBD><E996AB>蝡臬<E89DA1><E887AC><EFBFBD><EFBFBD>餉<EFBFBD>
- <EFBFBD><EFBFBD>粉Prompt嚗𡁶<EFBFBD>閫ΙLM憒<EFBFBD><EFBFBD>撌乩<EFBFBD>
撖農I<EFBFBD>拇<EFBFBD>
- **隡睃<E99AA1><E79D83><EFBFBD>粉<EFBFBD>祆<EFBFBD>獢?*嚗帋<E59A97>閫<EFBFBD><E996AB>摰䂿𠶖<E482BF>?2. **<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸扇敶?*嚗帋<E59A97>閫<EFBFBD><E996AB><EFBFBD>脤䔮憸睃<E686B8>閫<EFBFBD><E996AB><EFBFBD>寞<EFBFBD>
- <EFBFBD>亦<EFBFBD>瘚贝<EFBFBD><EFBFBD>唳旿嚗帋<EFBFBD>閫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝙<EFBFBD>典㦤<EFBFBD>?4. **璉<><E79289>亙<EFBFBD>畾菜<E795BE>撠?*嚗𡁏釣<F0A1818F>誩<EFBFBD><E8AAA9>𡒊垢<F0A1928A>澆<EFBFBD>撌桀<E6928C>
- **<2A><>圾<EFBFBD>𣂼<EFBFBD>**嚗帋<E59A97>閬<EFBFBD>㗁霂箸𧊋摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD>?
撣貉<EFBFBD><EFBFBD>琿𩐠
- <EFBFBD>?**PICOS<4F>澆<EFBFBD>瘛瑟<E7989B>**嚗𡁜<E59A97>蝡舐鍂P/I/C/O/S嚗䔶<E59A97><E494B6>皰opulation/intervention
- <EFBFBD>?璅∪<EFBFBD><EFBFBD>滨妍<EFBFBD>躰秤嚗𡁜<EFBFBD>蝡舐鍂DeepSeek-V3嚗淾PI<50>牡eepseek-chat
- <EFBFBD>?蝏𤘪<EFBFBD><EFBFBD>亥砭<EFBFBD>嗆㦤嚗帋遙<EFBFBD>⊥𧊋摰峕<EFBFBD><EFBFBD>嗆䰻霂Y<EFBFBD><EFBFBD>靝蛹蝛?4. <20>?頧株砭<EFBFBD>湧<EFBFBD>餈<EFBFBD>鵭嚗𡁶鍂<EFBFBD>瑚<EFBFBD>撉<EFBFBD>榆
- <EFBFBD>?**<2A><>讃蝻箏<E89DBB><E7AE8F>䁅<EFBFBD>**嚗匁LM靚<4D>鍂隡𡁜仃韐?
<EFBFBD><EFBFBD> <20>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>嚗<EFBFBD><E59A97>瘚页<E7989A>
憭<EFBFBD><EFBFBD><EFBFBD>笔漲
<EFBFBD>閧<EFBFBD><EFBFBD><EFBFBD>讃: 10-20蝘𡜐<E89D98>DeepSeek + Qwen撟嗉<E6929F>嚗?5蝭<35><E89DAD><EFBFBD>? 50-100蝘?20蝭<30><E89DAD><EFBFBD>? 200-400蝘𡜐<E89D98>3-7<><37><EFBFBD>嚗?199蝭<39><E89DAD><EFBFBD>? 2000-4000蝘𡜐<E89D98>33-66<36><36><EFBFBD>嚗?```
### <20><>&<EFBFBD><EFBC86><EFBFBD>v1.0.0-MVP嚗?```
<0A><>&<EFBFBD>? 60%
銝<><E98A9D>渡<EFBFBD>: 70-100%
JSON撉諹<E69289><E8ABB9>? 100%
<0A><>鈭箏極憭齿瓲<E9BDBF>? 20-30%嚗<><E59A97>蝒<EFBFBD><E89D92>
<EFBFBD>滨垢<EFBFBD>扯<EFBFBD>
頧株砭<EFBFBD>湧<EFBFBD>: 1蝘?<3F>唳旿<E594B3>湔鰵撱嗉<E692B1>: <1蝘?銵冽聢皜脫<E79A9C>: <100ms嚗?0<>∟扇敶𤏪<E695B6>
Drawer<65>枏<EFBFBD>: <50ms
<EFBFBD>唳旿摨𤘪<EFBFBD>扯<EFBFBD>
憿寧𤌍<EFBFBD>𥕦遣: <50ms
<0A><>讃撖澆<E69296>嚗?99蝭<39><E89DAD>: <500ms
蝑偦<E89D91>厩<EFBFBD><E58EA9>𨀣䰻霂g<E99C82><EFBD87><EFBFBD>△嚗? <100ms
餈𥕦漲<F0A595A6>湔鰵: <50ms
<EFBFBD>㴓 銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>?
敶枏<EFBFBD>Sprint嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑㛈VP嚗?1. <20>银 <EFBFBD>冽<EFBFBD>憭滨<EFBFBD> Day 4嚗𡁏鸌憭<EFBFBD><EFBFBD>隞餃𦛚<EFBFBD>滚𦛚嚗<EFBFBD><EFBFBD>銵䔶葉嚗?2. <20>?<EFBFBD>冽<EFBFBD>憭滨<EFBFBD> Day 5嚗𡁜<EFBFBD>蝡狹I撘<EFBFBD><EFBFBD>𡢅<EFBFBD>敺<EFBFBD><EFBFBD>憪页<EFBFBD>
- <EFBFBD>?<EFBFBD>冽<EFBFBD>憭滨<EFBFBD> Day 6嚗鋫PI<EFBFBD><EFBFBD><EFBFBD>銝舘<EFBFBD>靚<EFBFBD><EFBFBD>敺<EFBFBD><EFBFBD>憪页<EFBFBD>
<EFBFBD>剜<EFBFBD>隡睃<EFBFBD>嚗<EFBFBD><EFBFBD>憸䀹<EFBFBD>閬<EFBFBD><EFBFBD>蝑𨥈<EFBFBD>
- <EFBFBD>?Prompt隡睃<E99AA1>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>蝖桃<E89D96><E6A183>?5%+嚗?2. <20>?瘛餃<E7989B>隞餃𦛚<E9A483><F0A69B9A><EFBFBD>/<2F>𡝗<EFBFBD><F0A19D97>蠘<EFBFBD>
- <EFBFBD>?摰䂿緵撟嗅<E6929F>憭<EFBFBD><E686AD>嚗?-5銝芸僎<E88AB8>𡢅<EFBFBD>
- <EFBFBD>?瘛餃<E7989B>隡啗恣<E59597>拐<EFBFBD><E68B90>園𡢿<E59C92>曄內
銝剜<EFBFBD>嚗㇈onth 2嚗?1. <20>银 <20>冽<EFBFBD>憭滨<E686AD><E6BBA8>蠘<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>睲葉嚗?2. <20>?<3F>冽<EFBFBD><E586BD>唳旿<E594B3>𣂼<EFBFBD><F0A382BC>蠘<EFBFBD>
- <EFBFBD>?<3F>冽<EFBFBD><E586BD>芸<EFBFBD>銋㕑器<E39591>峕<EFBFBD><E5B395>?4. <20>?WebSocket摰墧𧒄<E5A2A7>券<EFBFBD>?
<EFBFBD>踵<EFBFBD>嚗㇈onth 3+嚗?1. <20>?憭𡁶鍂<F0A181B6>瑟𣈲<E7919F><F0A388B2><EFBFBD><EFBFBD>笔<EFBFBD>霈方<E99C88>嚗?2. <20>?瘨<><E798A8><EFBFBD>笔<EFBFBD>嚗㇂ull/RabbitMQ嚗?3. <20>?<3F><><EFBFBD>撘誩<E69298><E8AAA9>?4. <20>?<3F>鞉𧋦<E99E89>批<EFBFBD><E689B9>𣬚<EFBFBD><F0A3AC9A>?
**<2A><>﹝蝏湔擪<E6B994>?*嚗鋫I<E98BAB>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
**<2A>湔鰵<E6B994>冽<EFBFBD>**嚗𡁏<E59A97>銝芷<E98A9D>閬<EFBFBD><E996AC><EFBFBD>賢<EFBFBD><E8B3A2>𣂼<EFBFBD><F0A382BC>湔鰵
**<2A>漤<EFBFBD><E6BCA4>孵<EFBFBD>**嚗𡁏<E59A97>鈭儿ssue<75>鞛ull Request
**<2A><><EFBFBD>擧凒<E693A7>?*嚗?025-11-22嚗<32><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑?Day 2-3摰峕<E691B0>嚗? **<2A><>﹝<EFBFBD>嗆<EFBFBD>?*嚗尠<E59A97> <20>齿<EFBFBD><E9BDBF>笔<EFBFBD><E7AC94>嗆<EFBFBD>? 銝𧢲活<EFBFBD>湔鰵<EFBFBD>嗆㦤嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑㛈VP摰峕<EFBFBD> <20>?<3F><><EFBFBD><EFBFBD>䁅<EFBFBD>Prompt隡睃<E99AA1>摰峕<E691B0>
<EFBFBD>祆活<EFBFBD>湔鰵<EFBFBD><EFBFBD>捆嚗ǒ1.1嚗㚁<EFBFBD>
- <EFBFBD>?<3F>湔鰵敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD>撘<EFBFBD><E69298>𤏸<EFBFBD>摨佗<E691A8>
- <EFBFBD>?<3F>湔鰵<E6B994>喲睸<E596B2>𣬚<EFBFBD>蝣𡢅<E89DA3>Day 2-3摰峕<E691B0>嚗?- <20>?<3F>啣<EFBFBD><E595A3>𡒊垢隞<E59EA2><E99A9E>蝏𤘪<E89D8F>嚗Ếommon撅?+ fulltext-screening撅<67><E69285>
- <EFBFBD>?<3F>啣<EFBFBD>撘<EFBFBD><E69298>𤏸扇敶閖曎<E99696>伐<EFBFBD>Day 2-3撌乩<E6928C><E4B9A9>餌<EFBFBD>嚗?- <20>?<3F>湔鰵銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>𡜐<EFBFBD>敶枏<E695B6>Sprint嚗?