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%)
1053 lines
37 KiB
Markdown
1053 lines
37 KiB
Markdown
# AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃璅∪<E79285> - 敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?
|
||
> **<2A><>﹝<EFBFBD><EFB99D>𧋦嚗?* v1.4
|
||
> **<2A>𥕦遣<F0A595A6>交<EFBFBD>嚗?* 2025-11-21
|
||
> **蝏湔擪<E6B994><E693AA><EFBFBD>** AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
|
||
> **<2A><><EFBFBD>擧凒<E693A7>堆<EFBFBD>** 2025-12-13 <20><> **Postgres-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>惩<EFBFBD><E683A9>?*
|
||
> **<2A>滚之餈𥕦<E9A488>嚗?* Platform-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>?- <20>箄<EFBFBD><E7AE84>峕芋撘誩<E69298><E8AAA9><EFBFBD><EFBFBD><EFBFBD>遙<EFBFBD>⊥<EFBFBD><E28AA5><EFBFBD><EFBFBD><EFBFBD>鱏<EFBFBD>寧賒隡?
|
||
> **<2A><>﹝<EFBFBD>桃<EFBFBD>嚗?* <20>齿<EFBFBD>璅∪<E79285><E288AA>笔<EFBFBD><E7AC94>嗆<EFBFBD><E59786><EFBFBD>撣桀𨭌<E6A180>啣<EFBFBD><E595A3>睲犖<E79DB2>睃翰<E79D83>煺<EFBFBD><E785BA>?
|
||
---
|
||
|
||
## <20><> <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>?
|
||
**銝𤾸<E98A9D>隞𡝗<E99A9E>獢<EFBFBD><E78DA2><EFBFBD>喟頂**嚗?- **<EFBFBD>祆<EFBFBD>獢<EFBFBD><EFBFBD>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>
|
||
|
||
---
|
||
|
||
## <20>㴓 璅∪<E79285>璁<EFBFBD>膩
|
||
|
||
### <20>詨<EFBFBD><E8A9A8>蠘<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>?
|
||
### 敶枏<E695B6><E69E8F>嗆<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>
|
||
- <20>?<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>?- **<EFBFBD>函蔡<EFBFBD>嗆<EFBFBD>?*嚗尠<E59A97> <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><E68693>銵峕迤撣?
|
||
### <20><> Postgres-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>𩤃<EFBFBD>2025-12-13摰峕<E691B0>嚗?
|
||
**<2A>寥<EFBFBD>删𤌍<E588A0><F0A48C8D><EFBFBD>**
|
||
- <20>舀<EFBFBD>2-24撠𤩺𧒄<F0A4A9BA><F0A79284>鵭<EFBFBD>園𡢿隞餃𦛚嚗?000蝭<30><E89DAD><EFBFBD>桃<EFBFBD><E6A183>㚁<EFBFBD>
|
||
- 摰硺<E691B0><E7A1BA>滚鍳<E6BB9A>𦒘遙<F0A69298>∪虾<E288AA>W<EFBFBD>嚗<EFBFBD>鱏<EFBFBD>寧賒隡𩤃<E99AA1>
|
||
- <20>園<EFBFBD>憭𡝗<E686AD><F0A19D97>穿<EFBFBD>雿輻鍂 Postgres嚗䔶<E59A97><E494B6><EFBFBD>閬?Redis嚗?
|
||
**<2A>詨<EFBFBD>摰䂿緵嚗?*
|
||
|
||
1. **<EFBFBD>箄<EFBFBD><EFBFBD>峕芋撘誩<EFBFBD><EFBFBD>?* <20>㴓
|
||
- <20><><EFBFBD>潘<EFBFBD>50蝭<30><E89DAD><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>
|
||
|
||
2. **隞餃𦛚<E9A483><F0A69B9A><EFBFBD><EFBFBD>箏<EFBFBD>** <20>𣑐
|
||
- 100蝭?<3F>?2銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
|
||
- 1000蝭?<3F>?20銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
|
||
- <20>芸𢆡<E88AB8>刻<EFBFBD><E588BB>寞活憭批<E686AD>
|
||
|
||
3. **<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>銝𦠜活雿滨蔭蝏抒賒
|
||
|
||
4. **Platform撅<6D><E69285>銝<EFBFBD>蝞∠<E89D9E>** <20><>儭? - 隞餃𦛚蝞∠<E89D9E>靽⊥<E99DBD>銝滚<E98A9D><E6BB9A>典銁 `asl_schema.screening_tasks`
|
||
- 蝏煺<E89D8F>摮睃<E691AE><E79D83>?`platform_schema.job.data`嚗㇇SONB嚗? - 雿輻鍂 `CheckpointService` <20>滢<EFBFBD> job.data嚗<61><E59A97><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂嚗?
|
||
**<2A>寥<EFBFBD>䭾<EFBFBD>隞塚<E99A9E>**
|
||
- `screeningService.ts`嚗𡁏溶<EFBFBD>䭾惣<EFBFBD>賡<EFBFBD><EFBFBD>澆ế<EFBFBD>哨<EFBFBD><EFBFBD>券<EFBFBD><EFBFBD>鸌甈∩遙<EFBFBD>∪<EFBFBD> pg-boss
|
||
- `screeningWorker.ts`嚗𡁏鸌甈∪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餉<EFBFBD>嚗峕鱏<EFBFBD>寧賒隡惩<EFBFBD><EFBFBD>?- `CheckpointService.ts`嚗𡁏<EFBFBD>雿?job.data嚗䔶<E59A97>靘肽<E99D98>銝𡁜𦛚銵?
|
||
**瘚贝<E7989A>撉諹<E69289>嚗?*
|
||
- <20>?撠譍遙<E8AD8D>∴<EFBFBD>7蝭<37><E89DAD>- <20>湔𦻖璅∪<E79285>瘚贝<E7989A><E8B49D>朞<EFBFBD>
|
||
- <20>?憭找遙<E689BE>∴<EFBFBD>100蝭<30><E89DAD>- <20>笔<EFBFBD>璅∪<E79285>瘚贝<E7989A><E8B49D>朞<EFBFBD>
|
||
- <20>?隞餃𦛚<E9A483><F0A69B9A><EFBFBD><EFBFBD>餉<EFBFBD>撉諹<E69289><E8ABB9>朞<EFBFBD>
|
||
- <20>?Platform-Only <20>嗆<EFBFBD>撉諹<E69289><E8ABB9>朞<EFBFBD>
|
||
|
||
**<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚嚗?*
|
||
- <20>𩤃<EFBFBD> Phase 8 <20>券𢒰瘚贝<E7989A>嚗<EFBFBD>鱏<EFBFBD>寧賒隡惩<E99AA1><E683A9>𥟇<EFBFBD>霂𨰻<E99C82>?000蝭<30><E89DAD><EFBFBD>桀<EFBFBD><E6A180>湔<EFBFBD>蝔页<E89D94>
|
||
- <20>𩤃<EFBFBD> Phase 9 SAE <20>函蔡撉諹<E69289>
|
||
|
||
### <20>喲睸<E596B2>𣬚<EFBFBD>蝣?
|
||
**<2A><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>嚗<EFBFBD>歇摰峕<E691B0>嚗?*:
|
||
- <20>?2025-11-18嚗䥪rompt v1.0.0-MVP摰峕<E691B0>嚗<EFBFBD><E59A97>蝖桃<E89D96>60%
|
||
- <20>?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>
|
||
- <20>?2025-11-21嚗?*Week 4摰峕<E691B0>嚗<EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD>蝷箔<E89DB7>撖澆枂<E6BE86>蠘<EFBFBD>嚗?*
|
||
- 蝏蠘恣璁<E681A3><E79281>銝窰RISMA<4D>㘾膄<E398BE><E88684><EFBFBD>
|
||
- <20>萘<EFBFBD>蝏𤘪<E89D8F>憿菟𢒰嚗<F0A292B0>毽<EFBFBD><E6AFBD>䲮獢<E4B2AE><E78DA2>
|
||
- Excel<65>寥<EFBFBD>撖澆枂嚗<E69E82><E59A97><EFBFBD>毺<EFBFBD>嚗?
|
||
**<2A>冽<EFBFBD>憭滨<E686AD>嚗<EFBFBD><E59A97>蝡臬歇摰峕<E691B0>嚗<EFBFBD><E59A97><EFBFBD>滨垢撘<E59EA2><E69298>𡢅<EFBFBD>**:
|
||
- <20>?2025-11-22嚗?*Day 2-3摰峕<E691B0>嚗𡿨LM<4C>滚𦛚銝𡡞<E98A9D>霂<EFBFBD>頂蝏<E9A082><E89D8F>**
|
||
- <20>鞟內霂滚極蝔衤<E89D94>蝟鳴<E89D9F>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>膥嚗<E886A5><E59A97><EFBFBD>典<EFBFBD><E585B8>湔<EFBFBD>改<EFBFBD>
|
||
- <20>脩<EFBFBD>璉<EFBFBD>瘚𧢲<E7989A><F0A7A2B2>∴<EFBFBD><E288B4>峕芋<E5B395>见笆瘥䈑<E798A5>
|
||
- <20><><EFBFBD>瘚贝<E7989A>銝𤾸捆<F0A4BEB8>嗘<EFBFBD><E59798>?- <20>?2025-11-23嚗?*Day 4銝𠰴<E98A9D>摰峕<E691B0>嚗<EFBFBD>㺭<EFBFBD>桀<EFBFBD>霈曇恣銝舘<E98A9D>蝘鳴<E89D98>**
|
||
- <20>唳旿摨廍chema霈曇恣嚗<E681A3><E59A97><EFBFBD>毺<EFBFBD><E6AFBA>嗆<EFBFBD>嚗? - 靽格㺿 literatures 銵剁<E98AB5>+13銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>畾蛛<E795BE>
|
||
- <20>𥕦遣 fulltext_screening_tasks 銵? - <20>𥕦遣 fulltext_screening_results 銵? - <20>见𢆡SQL餈<4C>宏<EFBFBD>𡁏𧋦嚗<F0A78BA6><E59A97><EFBFBD>冽<EFBFBD>銵䕘<E98AB5>銝滚蔣<E6BB9A>滚<EFBFBD>隞𡝗芋<F0A19D97>梹<EFBFBD>
|
||
- <20>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696><EFBFBD>獢<EFBFBD><E78DA2>霂衣<E99C82>霈啣<E99C88>Schema<6D>𠉛氖<F0A0899B><E6B096><EFBFBD>嚗?- <20>?2025-11-23嚗?*Day 4銝见<E98A9D>摰峕<E691B0>嚗<EFBFBD>鸌憭<E9B88C><E686AD><EFBFBD>滚𦛚嚗?*
|
||
- FulltextScreeningService嚗<65>鸌<EFBFBD>誩<EFBFBD><E8AAA9><EFBFBD><EFBFBD>餉<EFBFBD>嚗?16銵䕘<E98AB5>
|
||
- 撘<>郊隞餃𦛚蝞∠<E89D9E>嚗<EFBFBD><E59A97><EFBFBD>啣<EFBFBD><E595A3><EFBFBD>LM靚<4D>鍂嚗? - 撟嗅<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<65>滚𦛚嚗?-Sheet<65>亙<EFBFBD><E4BA99><EFBFBD><EFBFBD>嚗?52銵䕘<E98AB5>
|
||
- Zod<6F><64>㺭撉諹<E69289>
|
||
- 頝舐眏瘜典<E7989C>嚗?api/v1/asl/fulltext-screening嚗? - 31銝析EST Client瘚贝<E7989A><E8B49D>其<EFBFBD>
|
||
- API<50><49>﹝<EFBFBD>湔鰵<E6B994>釘3.0
|
||
- PDF<44>𣂼<EFBFBD>fallback<63>箏<EFBFBD>
|
||
- <20>银 2025-11-24嚗?*Day 6-8敺<38><E695BA><EFBFBD>𡢅<EFBFBD><F0A1A285>滨垢UI嚗?*
|
||
- 4銝芣瓲敹<E793B2>△<EFBFBD>g<EFBFBD>霈曄蔭<E69B84><E894AD><EFBFBD>摨艾<E691A8><E889BE>極雿𨅯蝱<F0A885AF><E89DB1><EFBFBD><EFBFBD>頣<EFBFBD>
|
||
- PDF銝𠹺<E98A9D><F0A0B9BA>屸<EFBFBD>閫<EFBFBD><E996AB><EFBFBD>? - <20>峕芋<E5B395>见ế<E8A781>剖笆瘥牐I
|
||
- 摰墧𧒄餈𥕦漲<F0A595A6>烐綉嚗<E7B689>蔭霂X㦤<EFBCB8>塚<EFBFBD>
|
||
- 霂衣<E99C82><E8A1A3>滨垢撘<E59EA2><E69298>𤏸恣<F0A48FB8>鍦歇<E98DA6>嗅<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20><>儭?<3F><><EFBFBD>舀沲<E88880>?
|
||
### <20><><EFBFBD>舀<EFBFBD>
|
||
|
||
#### <20>滨垢
|
||
```
|
||
獢<EFBFBD>沲: React 18 + TypeScript 5
|
||
頝舐眏: React Router DOM v6
|
||
<EFBFBD>嗆<EFBFBD><EFBFBD>恣<EFBFBD>? @tanstack/react-query (React Query v5)
|
||
UI蝏<EFBFBD>辣: Ant Design v5
|
||
<EFBFBD>瑕<EFBFBD>: TailwindCSS v3
|
||
<EFBFBD><EFBFBD>遣撌亙<EFBFBD>: Vite v5
|
||
```
|
||
|
||
#### <20>𡒊垢
|
||
```
|
||
獢<EFBFBD>沲: Fastify v4 (Node.js 22)
|
||
<EFBFBD>唳旿摨? PostgreSQL 16 + Prisma 5
|
||
LLM SDK: <20>芰<EFBFBD> LLMFactory (蝏煺<E89D8F><E785BA><EFBFBD><EFBFBD>撅?
|
||
璅∪<EFBFBD>: DeepSeek-V3, Qwen-Max, GPT-4o, Claude-4.5
|
||
<EFBFBD>亙<EFBFBD>: Winston
|
||
```
|
||
|
||
#### <20>箇<EFBFBD>霈暹鴌
|
||
```
|
||
<EFBFBD>唳旿摨? PostgreSQL 16 with Schema isolation
|
||
Schema: asl_schema (<28>祉<EFBFBD><E7A589>𠉛氖)
|
||
<EFBFBD>冽<EFBFBD>銵? platform_schema.users (<28>曹澈)
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> <20>笔<EFBFBD>隞<EFBFBD><E99A9E>蝏𤘪<E89D8F>
|
||
|
||
### <20>滨垢隞<E59EA2><E99A9E>蝏𤘪<E89D8F>
|
||
|
||
```
|
||
frontend-v2/src/modules/asl/
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> api/
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # API摰X<E691B0>蝡荔<E89DA1><E88D94><EFBFBD><EFBFBD>匧<EFBFBD>蝡航<E89DA1><E888AA>剁<EFBFBD>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> components/
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ASLLayout.tsx # 撌虫儒撖潸⏛撣<E28F9B><E692A3>
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> JudgmentBadge.tsx # PICOS<4F>斗鱏Badge
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ConclusionTag.tsx # 蝏栞捏Tag嚗<67>熙<EFBFBD>?<3F>㘾膄嚗?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> DetailReviewDrawer.tsx # 霂行<E99C82>+憭齿瓲蝏煺<E89D8F>Drawer
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> hooks/
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> useScreeningTask.ts # 隞餃𦛚餈𥕦漲頧株砭Hook
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> useScreeningResults.ts # 蝑偦<E89D91>厩<EFBFBD><E58EA9>𨀣䰻霂%ook
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> pages/
|
||
<EFBFBD>? <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>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> types/
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # TypeScript蝐餃<E89D90>摰帋<E691B0>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> utils/
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> excelUtils.ts # Excel撖澆<E69296>/撖澆枂撌亙<E6928C>
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> tableTransform.ts # 銵冽聢<E586BD>唳旿頧祆揢嚗<E68FA2><E59A97>銵䕘<E98AB5>
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> index.tsx # 璅∪<E79285><E288AA>亙藁嚗<E89781>楝<EFBFBD>梢<EFBFBD>蝵殷<E89DB5>
|
||
```
|
||
|
||
### <20>𡒊垢隞<E59EA2><E99A9E>蝏𤘪<E89D8F>
|
||
|
||
```
|
||
backend/src/modules/asl/
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> controllers/
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> projectController.ts # 憿寧𤌍蝞∠<E89D9E>API
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> literatureController.ts # <20><>讃蝞∠<E89D9E>API
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> screeningController.ts # 蝑偦<E89D91>厩㮾<E58EA9>莧PI嚗<49><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> services/
|
||
<EFBFBD>? <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>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> schemas/
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> screening.schema.ts # Prompt<70><74><EFBFBD>銝𥣡SON Schema嚗<61><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> types/
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # TypeScript蝐餃<E89D90>摰帋<E691B0>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> routes/
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts # 頝舐眏瘜典<E7989C>
|
||
<EFBFBD>?<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
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PDFStorageService.ts
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PDFStorageFactory.ts
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> adapters/
|
||
<EFBFBD>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DifyPDFStorageAdapter.ts
|
||
<EFBFBD>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> OSSPDFStorageAdapter.ts
|
||
<EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> llm/ # LLM 12摮埈挾<E59F88>滚𦛚嚗<F0A69B9A>瓲敹<E793B2><E695B9>
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> types.ts
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> PromptBuilder.ts # <20>冽<EFBFBD><E586BD>rompt蝏<74><E89D8F>
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> LLM12FieldsService.ts # Nougat+<2B>峕芋<E5B395>?3撅<33>SON閫<4E><E996AB>
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> index.ts
|
||
<EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> integration-test.ts # 摰峕㟲<E5B395><E39FB2><EFBFBD>瘚贝<E7989A>
|
||
<EFBFBD>? <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>
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> validation/ # 撉諹<E69289><E8ABB9>滚𦛚
|
||
<EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> MedicalLogicValidator.ts # <20>餃郎<E9A483>餉<EFBFBD>撉諹<E69289>嚗?<3F>∟<EFBFBD><E2889F>辷<EFBFBD>
|
||
<EFBFBD>? <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
|
||
<EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> __tests__/
|
||
<EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> validation-test.ts
|
||
<EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> utils/
|
||
<EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> tokenCalculator.ts # Token霈∠<E99C88>銝擧<E98A9D><E693A7>砌摯蝞?<3F>? <20>婙<EFBFBD><E5A999><EFBFBD> index.ts
|
||
<EFBFBD>?<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/
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> schema.prisma # <20>唳旿摨廍chema摰帋<E691B0>
|
||
|
||
backend/prompts/asl/screening/
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> v1.0.0-mvp.txt # <20><><EFBFBD>Prompt嚗<74><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> v1.1.0-lenient.txt # 摰賣𠹭璅∪<E79285>
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> v1.1.0-strict.txt # 銝交聢璅∪<E79285>
|
||
|
||
backend/scripts/
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> test-llm-screening.ts # LLM瘚贝<E7989A><E8B49D>𡁏𧋦嚗<F0A78BA6><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> API蝡舐<E89DA1>嚗<EFBFBD><E59A97>摰痹<E691B0>
|
||
|
||
### <20>箇<EFBFBD>URL
|
||
```
|
||
撘<EFBFBD><EFBFBD>𤑳㴓憓? http://localhost:3001/api/v1/asl
|
||
```
|
||
|
||
### 憿寧𤌍蝞∠<E89D9E>
|
||
```http
|
||
POST /projects # <EFBFBD>𥕦遣憿寧𤌍
|
||
GET /projects # <EFBFBD>瑕<EFBFBD>憿寧𤌍<EFBFBD>𡑒”
|
||
GET /projects/:projectId # <EFBFBD>瑕<EFBFBD>憿寧𤌍霂行<EFBFBD>
|
||
```
|
||
|
||
### <20><>讃蝞∠<E89D9E>
|
||
```http
|
||
POST /literatures/import # 撖澆<EFBFBD><EFBFBD><EFBFBD>讃嚗㇇SON<EFBFBD>澆<EFBFBD>嚗?POST /literatures/import/excel # 撖澆<EFBFBD>Excel<EFBFBD><EFBFBD>讃
|
||
GET /projects/:projectId/literatures # <EFBFBD>瑕<EFBFBD><EFBFBD><EFBFBD>讃<EFBFBD>𡑒”
|
||
DELETE /literatures/:literatureId # <EFBFBD>𣳇膄<EFBFBD><EFBFBD>讃
|
||
```
|
||
|
||
### 蝑偦<E89D91>厩㮾<E58EA9>喉<EFBFBD><E59689><EFBFBD><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<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>
|
||
```
|
||
|
||
### <20>喲睸<E596B2><E79DB8>㺭霂湔<E99C82>
|
||
|
||
#### <20>𥕦遣憿寧𤌍
|
||
```typescript
|
||
{
|
||
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';
|
||
};
|
||
}
|
||
```
|
||
|
||
#### <20>瑕<EFBFBD>蝑偦<E89D91>厩<EFBFBD><E58EA9>?```
|
||
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)
|
||
<EFBFBD>喲睸摮埈挾:
|
||
- 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<EFBFBD>: user_id, status
|
||
```
|
||
|
||
#### 2. literatures嚗<73><E59A97><EFBFBD>殷<EFBFBD><E6AEB7>?撌脫<E6928C>撅?```sql
|
||
銝駁睸: id (UUID)
|
||
憭㚚睸: project_id <20>?screening_projects(id) CASCADE
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䁅<EFBFBD>摮埈挾:
|
||
- title: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - abstract: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - authors, journal, publication_year, pmid, doi
|
||
<EFBFBD>冽<EFBFBD>憭滨<EFBFBD>摮埈挾嚗?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
|
||
<EFBFBD>臭<EFBFBD>蝥行<EFBFBD>: (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
|
||
<EFBFBD>喲睸摮埈挾:
|
||
- status: 'pending' | 'running' | 'completed' | 'failed'
|
||
- total_items, processed_items, success_items, conflict_items
|
||
- started_at, completed_at
|
||
蝝W<EFBFBD>: project_id, status
|
||
```
|
||
|
||
#### 4. screening_results嚗<73><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC><EFBFBD>厩<EFBFBD><E58EA9>頣<EFBFBD>
|
||
```sql
|
||
銝駁睸: 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>啣遣
|
||
```sql
|
||
銝駁睸: 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>啣遣
|
||
```sql
|
||
銝駁睸: 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)
|
||
```
|
||
|
||
### <20>唳旿摨廍chema<6D>𠉛氖<F0A0899B>嗆<EFBFBD>?
|
||
**<2A>?摰<><E691B0>甇<EFBFBD>&**嚗?- <20><><EFBFBD>𡅅SL銵券<E98AB5><E588B8>?`asl_schema` 銝?- <20>䭾㺭<E4ADBE>格<EFBFBD>瞍誩<E79E8D> `public` schema
|
||
- Schema<6D>𠉛氖蝑𣇉裦<F0A38789>扯<EFBFBD>銝交聢
|
||
- 霂西<E99C82>嚗靀<E59A97>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696>秩<EFBFBD>筕(./05-撘<><E69298>𤏸扇敶?2025-11-23_<33>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696>秩<EFBFBD>?md)
|
||
|
||
---
|
||
|
||
## <20><> <20>唳旿瘚<E697BF><E7989A>嚗<EFBFBD><E59A97>摰痹<E691B0>
|
||
|
||
### <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>瘚<EFBFBD><E7989A>
|
||
|
||
```
|
||
<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>
|
||
<20>?PDF<44>𣂼<EFBFBD><F0A382BC>滚𦛚嚗𠃊ougat隡睃<E99AA1>嚗釶yMuPDF<44>滨漣嚗? <20>?<3F>湔鰵 literatures 銵剁<E98AB5><E58981>冽<EFBFBD>撘閧鍂摮埈挾嚗? <20>?<3F>𥕦遣 fulltext_screening_task
|
||
<20>?<3F>𤾸蝱撘<E89DB1>郊<EFBFBD>孵<EFBFBD><E5ADB5>?
|
||
- <20>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9>剁<EFBFBD>DeepSeek + Qwen嚗? - 12摮埈挾蝏𤘪<E89D8F><F0A498AA>𡝗<EFBFBD><F0A19D97>? - <20>餃郎<E9A483>餉<EFBFBD>撉諹<E69289> + 霂<>旿<EFBFBD>暸<EFBFBD>霂? - <20>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A>摮埈挾蝥批笆瘥䈑<E798A5>
|
||
- 靽嘥<E99DBD><E598A5>?fulltext_screening_results
|
||
- <20>湔鰵隞餃𦛚餈𥕦漲
|
||
<20>?<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<EFBFBD>: project_id, status
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> LLM<4C><4D><EFBFBD>嚗<EFBFBD><E59A97>摰𧼮<E691B0><F0A7BCAE>堆<EFBFBD>
|
||
|
||
### LLM靚<4D>鍂瘚<E98D82><E7989A>
|
||
|
||
```
|
||
<EFBFBD>滨垢: <20>孵稬"撘<>憪𧘹I<F0A798B9>萘<EFBFBD>"
|
||
<20>?<3F>𡒊垢: literatureController.importLiteratures()
|
||
<20>?<3F>𡒊垢: screeningService.startScreeningTask()
|
||
<20>?<3F>𡒊垢: screeningService.processLiteraturesInBackground()
|
||
<20>?(for each literature)
|
||
<EFBFBD>𡒊垢: llmScreeningService.dualModelScreening()
|
||
<20>?<3F>𡒊垢: LLMFactory.getAdapter(model).chat()
|
||
<20>?<3F>笔<EFBFBD>API: DeepSeek API / Qwen API
|
||
<20>?<3F>𡒊垢: JSON閫<4E><E996AB> + Schema撉諹<E69289>
|
||
<20>?<3F>𡒊垢: 靽嘥<E99DBD><E598A5>?screening_results 銵? <20>?<3F>𡒊垢: <20>湔鰵 screening_tasks 餈𥕦漲
|
||
<20>?<3F>滨垢: useScreeningTask 頧株砭嚗?蝘?甈∴<E79488>
|
||
<20>?<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)
|
||
```
|
||
|
||
#### 璅∪<E79285><E288AA>滨妍
|
||
```typescript
|
||
// <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<4C>滨蔭
|
||
|
||
#### 璅∪<E79285><E288AA><EFBFBD>㺭
|
||
```typescript
|
||
{
|
||
temperature: 0, // <20>箏<EFBFBD>嚗𣬚&靽萘<E99DBD><E89098>靝<EFBFBD><E99D9D>湔<EFBFBD>? top_p: 1.0,
|
||
max_tokens: 2048,
|
||
}
|
||
```
|
||
|
||
#### Prompt<70><74>𧋦
|
||
```
|
||
敶枏<EFBFBD>雿輻鍂: v1.0.0-mvp.txt
|
||
雿滨蔭: backend/prompts/asl/screening/v1.0.0-mvp.txt
|
||
<EFBFBD><EFBFBD>&<EFBFBD>? 60%嚗<><E59A97>甈⊥<E79488>霂𤏪<E99C82>
|
||
銝<EFBFBD><EFBFBD>渡<EFBFBD>: 70-100%
|
||
```
|
||
|
||
#### 憭<><E686AD><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>
|
||
餈𥕦漲<EFBFBD>湔鰵: 瘥?<3F>⊥凒<E28AA5>唳㺭<E594B3>桀<EFBFBD>
|
||
<EFBFBD>滨垢頧株砭: 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>?潃?
|
||
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
|
||
- <20>?隞餃𦛚餈𥕦漲<F0A595A6>曄內嚗<E585A7>蔭霂g<E99C82>1蝘?甈∴<E79488>
|
||
- <20>?餈𥕦漲<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>
|
||
- <20>?蝏栞捏Tag嚗<67>熙<EFBFBD>?<3F>㘾膄/銝滨&摰𡄯<E691B0>
|
||
- <20>?<3F>脩<EFBFBD><E884A9><EFBFBD>讃擃䀝漁嚗<E6BC81>滯<EFBFBD>脰<EFBFBD><E884B0>荔<EFBFBD>
|
||
- <20>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285>霂<EFBFBD>旿嚗<E697BF><E59A97>璅∪<E79285>撖寞<E69296>嚗?- <20>?蝏煺<E89D8F>憭齿瓲Drawer嚗<72>椰靘扯祕<E689AF>?<3F>喃儒憭齿瓲嚗?- <20>?鈭箏極憭齿瓲<E9BDBF>𣂷漱
|
||
- <20>?蝑偦<E89D91>凤ab嚗<62><E59A97><EFBFBD>?<3F>脩<EFBFBD>/撌脩熙<E884A9>?撌脫<E6928C><E884AB>?撌脣<E6928C><E884A3>賂<EFBFBD>
|
||
- <20>?<3F><>△嚗<E296B3><E59A97>蝡臬<E89DA1>憿蛛<E686BF>20<32>?憿蛛<E686BF>
|
||
|
||
#### <20>喲睸隞<E79DB8><E99A9E>
|
||
```typescript
|
||
// <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> 潃?
|
||
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
|
||
- <20>?<3F>峕芋<E5B395>见僎銵𣬚<E98AB5><F0A3AC9A>㚁<EFBFBD>DeepSeek + Qwen嚗?- <20>?JSON蝏𤘪<E89D8F><F0A498AA>𤥁<EFBFBD><F0A4A581>綽<EFBFBD>撣吁chema撉諹<E69289>嚗?- <20>?<3F>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A>蝏栞捏銝滢<E98A9D><E6BBA2>湛<EFBFBD>
|
||
- <20>?銝脰<E98A9D>憭<EFBFBD><E686AD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD>PI<50>鞉<EFBFBD>嚗?- <20>?餈𥕦漲摰墧𧒄<E5A2A7>湔鰵嚗<E9B0B5><E59A97>1<EFBFBD>∴<EFBFBD>
|
||
- <20>?<3F>躰秤憭<E7A7A4><E686AD>銝𡡞<E98A9D>霂?- <20>?摮埈挾<E59F88>惩<EFBFBD>嚗㇊ICOS, 璅∪<E79285><E288AA>㵪<EFBFBD>
|
||
- <20>?<3F><>讃撉諹<E69289>嚗<EFBFBD><E59A97>憸?<3F>䁅<EFBFBD>敹<EFBFBD><E695B9>嚗?- <20>?霂衣<E99C82><E8A1A3>亙<EFBFBD>颲枏枂
|
||
|
||
#### <20>喲睸隞<E79DB8><E99A9E>
|
||
```typescript
|
||
// <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>滚𦛚撅?潃?
|
||
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
|
||
- <20>?蝏煺<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>
|
||
- <20>?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>嚗?
|
||
#### <20>喲睸隞<E79DB8><E99A9E>
|
||
```typescript
|
||
// <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>**
|
||
|
||
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
|
||
- <20>?蝏蠘恣璁<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>
|
||
- <20>?PRISMA<4D>㘾膄<E398BE>笔<EFBFBD>蝏蠘恣嚗<E681A3><E59A97><EFBFBD>嗅㦛撅閧內嚗?- <20>?蝏𤘪<E89D8F><F0A498AA>𡑒”Tab嚗<62><E59A97><EFBFBD>?撌脩熙<E884A9>?撌脫<E6928C><E884AB>?敺<><E695BA><EFBFBD>賂<EFBFBD>
|
||
- <20>?瘛瑕<E7989B><E79195>寞<EFBFBD>銵冽聢嚗㇁I<E38781>梯<EFBFBD> + 鈭箏極<E7AE8F><E6A5B5>蝏<EFBFBD><E89D8F>蝑吔<E89D91>
|
||
- <20>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285>霂衣<E99C82><E8A1A3>斗鱏嚗<E9B18F><E59A97>璅∪<E79285>霂<EFBFBD>旿撖寞<E69296>嚗?- <20>?<3F>寥<EFBFBD><E5AFA5>㗇𥋘銝𤾸紡<F0A4BEB8>綽<EFBFBD>3蝘滚紡<E6BB9A>箸䲮撘𧶏<E69298>
|
||
- <20>?Excel撖澆枂嚗<E69E82><E59A97>蝡舐<E89DA1><E88890>琜<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>
|
||
|
||
#### 瘛瑕<E7989B><E79195>寞<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>
|
||
- <20>𣳇<EFBFBD>餉<EFBFBD><E9A489>𤤿㦛
|
||
|
||
**銵冽聢<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>嗉絲 |
|
||
|
||
**<EFBFBD>餃捐摨?*嚗?70px嚗<78><E59A97><EFBFBD><EFBFBD>璅芸<E79285>皛𡁜𢆡嚗?
|
||
#### <20>喲睸隞<E79DB8><E99A9E>
|
||
```typescript
|
||
// <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>**
|
||
|
||
#### <20>蠘<EFBFBD>皜<EFBFBD><E79A9C>
|
||
- <20>?<3F>𡒊垢<F0A1928A>𡁜<EFBFBD>蝏蠘恣嚗㇊risma撟嗉<E6929F><E59789>亥砭嚗?- <20>?蝏蠘恣<E8A098>餅㺭<E9A485><E3BAAD>歇蝥喳<E89DA5><E596B3><EFBFBD>歇<EFBFBD>㘾膄<E398BE><E88684><EFBFBD>憭齿瓲<E9BDBF><E793B2><EFBFBD>蝒<EFBFBD><E89D92><EFBFBD>歇憭齿瓲
|
||
- <20>?<3F><><EFBFBD><EFBFBD>㘾膄<E398BE>笔<EFBFBD>嚗<EFBFBD><E59A97>AI<41>斗鱏銝剜<E98A9D><E5899C>吔<EFBFBD>
|
||
- <20>?霈∠<E99C88><E288A0><EFBFBD>掩<EFBFBD>曉<EFBFBD>瘥?- <20>?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗<EFBFBD><E59A97>撠𤑳<E692A0>蝏靝<E89D8F>颲?
|
||
#### <20>喲睸隞<E79DB8><E99A9E>
|
||
```typescript
|
||
// <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,
|
||
};
|
||
```
|
||
|
||
---
|
||
|
||
## <20>𩤃<EFBFBD> 撌脩䰻<E884A9>桅<EFBFBD>銝𡡞<E98A9D><F0A1A19E>?
|
||
### 1. <20>蠘<EFBFBD><E8A098>𣂼<EFBFBD>
|
||
- <20>𩤃<EFBFBD> 隞<><E99A9E><EFBFBD>唳<EFBFBD>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91><F0A8A588>冽<EFBFBD>憭滨<E686AD><E6BBA8>芸<EFBFBD><E88AB8>𡢅<EFBFBD>
|
||
- <20>𩤃<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>
|
||
- <20>𩤃<EFBFBD> <20>䭾鱏<E4ADBE>寧賒隡𩤃<E99AA1>銝剜鱏<E5899C>𡡞<EFBFBD><F0A1A19E>齿鰵撘<E9B0B5>憪页<E686AA>
|
||
- <20>𩤃<EFBFBD> <20><>&<EFBFBD>?0%嚗<><E59A97>閬<EFBFBD>rompt隡睃<E99AA1>嚗?
|
||
### 2. <20><><EFBFBD>臬<EFBFBD>箏𦛚
|
||
- <20>𩤃<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>
|
||
- <20>𩤃<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)
|
||
|
||
---
|
||
|
||
## <20><> 敹恍<E695B9>煺<EFBFBD><E785BA>𧢲<EFBFBD><F0A7A2B2>?
|
||
### <20>臬<EFBFBD>閬<EFBFBD><E996AC>
|
||
```
|
||
Node.js: v22.18.0+
|
||
PostgreSQL: 16+
|
||
npm: 10+
|
||
```
|
||
|
||
### 1. <20>嘥<EFBFBD><E598A5>𡝗㺭<F0A19D97>桀<EFBFBD>
|
||
|
||
```bash
|
||
cd backend
|
||
npm install
|
||
npx prisma generate
|
||
npx prisma migrate dev
|
||
```
|
||
|
||
### 2. <20>滨蔭<E6BBA8>臬<EFBFBD><E887AC>㗛<EFBFBD>
|
||
|
||
<EFBFBD>𥕦遣 `backend/.env`:
|
||
```bash
|
||
# <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>𡒊垢
|
||
|
||
```bash
|
||
cd backend
|
||
npm run dev
|
||
```
|
||
|
||
摨磰砲<EFBFBD>见<EFBFBD>嚗?```
|
||
<EFBFBD>?Fastify server listening on http://0.0.0.0:3001
|
||
<EFBFBD>?Database connected
|
||
<EFBFBD>?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
|
||
<EFBFBD>? 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
|
||
<20><>讃<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
|
||
<20>脩<EFBFBD>: <20>?```
|
||
|
||
---
|
||
|
||
## <20>妒 瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>
|
||
|
||
### 1. LLM韐券<E99F90>瘚贝<E7989A>
|
||
|
||
```bash
|
||
cd backend
|
||
|
||
# <20>孵<EFBFBD>1: 雿輻鍂瘚贝<E7989A><E8B49D>𡁏𧋦
|
||
npm run test:llm
|
||
|
||
# <20>孵<EFBFBD>2: <20>湔𦻖餈鞱<E9A488>
|
||
npx ts-node scripts/test-llm-screening.ts
|
||
```
|
||
|
||
**瘚贝<E7989A><E8B49D>唳旿**嚗?- 雿滨蔭嚗䫤backend/scripts/test-samples/asl-test-literatures.json`
|
||
- <20>圈<EFBFBD>嚗?0蝭<30><E89DAD>6蝭<36><E89DAD><EFBFBD>㘾膄嚗?蝭<><E89DAD>蝥喳<E89DA5>嚗?蝭<>器<EFBFBD>䕘<EFBFBD>
|
||
- PICOS嚗锭GLT2<54>穃<EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?
|
||
**憸<><E686B8>颲枏枂**嚗?```
|
||
<EFBFBD><EFBFBD>&<EFBFBD>? 60%
|
||
銝<EFBFBD><EFBFBD>渡<EFBFBD>: 70-100%
|
||
JSON撉諹<EFBFBD><EFBFBD>? 100%
|
||
撟喳<EFBFBD><EFBFBD>埈𧒄: 10-15蝘?蝭?```
|
||
|
||
### 2. API瘚贝<E7989A>
|
||
|
||
```bash
|
||
# <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<65><6C>辣銝𠹺<E98A9D>嚗<EFBFBD>迤撣賂<E692A3>
|
||
- [ ] Excel<65><6C>辣銝𠹺<E98A9D>嚗<EFBFBD><E59A97>霂舀聢撘𧶏<E69298>
|
||
- [ ] <20><>讃憸<E8AE83><E686B8><EFBFBD>曄內
|
||
- [ ] <20>駁<EFBFBD><E9A781>餉<EFBFBD>嚗<EFBFBD>㮾<EFBFBD>㷉OI嚗?- [ ] <20>臬𢆡AI<41>萘<EFBFBD>
|
||
- [ ] 餈𥕦漲<F0A595A6>⊥凒<E28AA5>?- [ ] <20>芸𢆡頝唾蓮
|
||
- [ ] 銵冽聢<E586BD>曄內
|
||
- [ ] <20>埈<EFBFBD>摨?- [ ] 蝑偦<E89D91>凤ab<61><62>揢
|
||
- [ ] 撅訫<E69285>銵?- [ ] 憭齿瓲Drawer
|
||
- [ ] <20>𣂷漱憭齿瓲
|
||
|
||
### 4. <20>唳旿摨㯄<E691A8>霂?
|
||
```sql
|
||
-- <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;
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> 撘<><E69298>𤏸<EFBFBD><F0A48FB8>?
|
||
### 1. 隞<><E99A9E>憌擧聢
|
||
|
||
#### TypeScript
|
||
```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
|
||
```typescript
|
||
// 雿輻鍂<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>辣<EFBFBD>? PascalCase
|
||
<20>?function DetailReviewDrawer()
|
||
|
||
<EFBFBD>㗛<EFBFBD>/<2F>賣㺭: camelCase
|
||
<20>?const screeningResult = ...
|
||
<20>?function processLiteratures()
|
||
|
||
撣賊<EFBFBD>: UPPER_SNAKE_CASE
|
||
<20>?const MODEL_NAME_MAP = ...
|
||
|
||
蝐餃<EFBFBD>/<2F>亙藁: PascalCase
|
||
<20>?interface ScreeningResult
|
||
```
|
||
|
||
### 3. 瘜券<E7989C>閫<EFBFBD><E996AB>
|
||
|
||
```typescript
|
||
/**
|
||
* 蝑偦<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>
|
||
|
||
```typescript
|
||
// <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(`<EFBFBD>滢<EFBFBD>憭梯揖: ${(error as Error).message}`);
|
||
}
|
||
```
|
||
|
||
### 5. Git<69>𣂷漱閫<E6BCB1><E996AB>
|
||
|
||
<EFBFBD>萄儐 [Git<69>𣂷漱閫<E6BCB1><E996AB>](../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?06-Git<69>𣂷漱閫<E6BCB1><E996AB>.md)嚗?
|
||
```bash
|
||
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>𧋦
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
|
||
|
||
### <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
|
||
1. **<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>
|
||
3. [API霈曇恣閫<E681A3><E996AB>](./02-<2D><><EFBFBD>航挽霈?02-API霈曇恣閫<E681A3><E996AB>.md)嚗𡁏𦻖<F0A1818F><F0A6BB96><EFBFBD>銋?4. [撘<><E69298>𤏸恣<F0A48FB8>哋(./04-撘<><E69298>𤏸恣<F0A48FB8>?03-隞餃𦛚<E9A483><F0A69B9A>圾.md)嚗𡁜<E59A97><F0A1819C>賣<EFBFBD><E8B3A3>蓥<EFBFBD>霈∪<E99C88>
|
||
|
||
### 撘<><E69298>𤏸扇敶?
|
||
**<2A>冽<EFBFBD>憭滨<E686AD>**:
|
||
- [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>?*
|
||
|
||
**<2A><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>**:
|
||
- [2025-11-21 <20>笔<EFBFBD>LLM<4C><4D><EFBFBD>](./05-撘<><E69298>𤏸扇敶?2025-11-21-<2D>笔<EFBFBD>LLM<4C><4D><EFBFBD>摰峕<E691B0><E5B395>亙<EFBFBD>.md)
|
||
- [2025-11-21 摮埈挾<E59F88>惩<EFBFBD>靽桀<E99DBD>](./05-撘<><E69298>𤏸扇敶?2025-11-21-摮埈挾<E59F88>惩<EFBFBD><E683A9>桅<EFBFBD>靽桀<E99DBD>.md)
|
||
- [2025-11-21 <20>冽<EFBFBD>雿㯄<E99BBF>隡睃<E99AA1>](./05-撘<><E69298>𤏸扇敶?2025-11-21-<2D>冽<EFBFBD>雿㯄<E99BBF>隡睃<E99AA1>.md)
|
||
- [2025-11-19 Week2-Day2摰峕<E691B0>](./05-撘<><E69298>𤏸扇敶?2025-11-19-Week2-Day2摰峕<E691B0><E5B395>亙<EFBFBD>.md)
|
||
- [2025-11-18 Prompt霈曇恣銝擧<E98A9D>霂騟(./05-撘<><E69298>𤏸扇敶?2025-11-18-Prompt霈曇恣銝擧<E98A9D>霂訫<E99C82><E8A8AB>鞉𥁒<E99E89>?md)
|
||
|
||
### 瘚贝<E7989A><E8B49D><EFBFBD>﹝
|
||
- [瘚贝<E7989A><E8B49D>唳旿](./05-瘚贝<E7989A><E8B49D><EFBFBD>﹝/03-瘚贝<E7989A><E8B49D>唳旿/)嚗䥪ICOS蝷箔<E89DB7><E7AE94><EFBFBD>xcel璅⊥踎
|
||
|
||
---
|
||
|
||
## <20>働 撘<><E69298>穃遣霈?
|
||
### 撖寞鰵撘<E9B0B5><E69298>睲犖<E79DB2>?
|
||
1. **<2A><><EFBFBD>閫<EFBFBD><E996AB><EFBFBD>?*嚗𡁻<E59A97>霂?[撘<><E69298>𤏸恣<F0A48FB8>哋(./04-撘<><E69298>𤏸恣<F0A48FB8>?02-<2D><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>撘<EFBFBD><E69298>𤏸恣<F0A48FB8>?md)
|
||
2. **<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>
|
||
5. **<2A><>粉Prompt**嚗𡁶<E59A97>閫ΙLM憒<4D><E68692>撌乩<E6928C>
|
||
|
||
### 撖農I<E8BEB2>拇<EFBFBD>
|
||
|
||
1. **隡睃<E99AA1><E79D83><EFBFBD>粉<EFBFBD>祆<EFBFBD>獢?*嚗帋<E59A97>閫<EFBFBD><E996AB>摰䂿𠶖<E482BF>?2. **<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸扇敶?*嚗帋<E59A97>閫<EFBFBD><E996AB><EFBFBD>脤䔮憸睃<E686B8>閫<EFBFBD><E996AB><EFBFBD>寞<EFBFBD>
|
||
3. **<2A>亦<EFBFBD>瘚贝<E7989A><E8B49D>唳旿**嚗帋<E59A97>閫<EFBFBD><E996AB><EFBFBD><EFBFBD>蝙<EFBFBD>典㦤<E585B8>?4. **璉<><E79289>亙<EFBFBD>畾菜<E795BE>撠?*嚗𡁏釣<F0A1818F>誩<EFBFBD><E8AAA9>𡒊垢<F0A1928A>澆<EFBFBD>撌桀<E6928C>
|
||
5. **<2A><>圾<EFBFBD>𣂼<EFBFBD>**嚗帋<E59A97>閬<EFBFBD>㗁霂箸𧊋摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD>?
|
||
### 撣貉<E692A3><E8B289>琿𩐠
|
||
|
||
1. <20>?**PICOS<4F>澆<EFBFBD>瘛瑟<E7989B>**嚗𡁜<E59A97>蝡舐鍂P/I/C/O/S嚗䔶<E59A97><E494B6>皰opulation/intervention
|
||
2. <20>?**璅∪<E79285><E288AA>滨妍<E6BBA8>躰秤**嚗𡁜<E59A97>蝡舐鍂DeepSeek-V3嚗淾PI<50>牡eepseek-chat
|
||
3. <20>?**蝏𤘪<E89D8F><F0A498AA>亥砭<E4BAA5>嗆㦤**嚗帋遙<E5B88B>⊥𧊋摰峕<E691B0><E5B395>嗆䰻霂Y<E99C82><EFBCB9>靝蛹蝛?4. <20>?**頧株砭<E6A0AA>湧<EFBFBD>餈<EFBFBD>鵭**嚗𡁶鍂<F0A181B6>瑚<EFBFBD>撉<EFBFBD>榆
|
||
5. <20>?**<2A><>讃蝻箏<E89DBB><E7AE8F>䁅<EFBFBD>**嚗匁LM靚<4D>鍂隡𡁜仃韐?
|
||
---
|
||
|
||
## <20><> <20>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>嚗<EFBFBD><E59A97>瘚页<E7989A>
|
||
|
||
### 憭<><E686AD><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嚗?```
|
||
<EFBFBD><EFBFBD>&<EFBFBD>? 60%
|
||
銝<EFBFBD><EFBFBD>渡<EFBFBD>: 70-100%
|
||
JSON撉諹<EFBFBD><EFBFBD>? 100%
|
||
<EFBFBD><EFBFBD>鈭箏極憭齿瓲<EFBFBD>? 20-30%嚗<><E59A97>蝒<EFBFBD><E89D92>
|
||
```
|
||
|
||
### <20>滨垢<E6BBA8>扯<EFBFBD>
|
||
```
|
||
頧株砭<EFBFBD>湧<EFBFBD>: 1蝘?<3F>唳旿<E594B3>湔鰵撱嗉<E692B1>: <1蝘?銵冽聢皜脫<E79A9C>: <100ms嚗?0<>∟扇敶𤏪<E695B6>
|
||
Drawer<EFBFBD>枏<EFBFBD>: <50ms
|
||
```
|
||
|
||
### <20>唳旿摨𤘪<E691A8>扯<EFBFBD>
|
||
```
|
||
憿寧𤌍<EFBFBD>𥕦遣: <50ms
|
||
<EFBFBD><EFBFBD>讃撖澆<EFBFBD>嚗?99蝭<39><E89DAD>: <500ms
|
||
蝑偦<EFBFBD>厩<EFBFBD><EFBFBD>𨀣䰻霂g<EFBFBD><EFBFBD><EFBFBD>△嚗? <100ms
|
||
餈𥕦漲<EFBFBD>湔鰵: <50ms
|
||
```
|
||
|
||
---
|
||
|
||
## <20>㴓 銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>?
|
||
### 敶枏<E695B6>Sprint嚗<74><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑㛈VP嚗?1. <20>银 **<2A>冽<EFBFBD>憭滨<E686AD> Day 4**嚗𡁏鸌憭<E9B88C><E686AD>隞餃𦛚<E9A483>滚𦛚嚗<F0A69B9A><E59A97>銵䔶葉嚗?2. <20>?**<2A>冽<EFBFBD>憭滨<E686AD> Day 5**嚗𡁜<E59A97>蝡狹I撘<49><E69298>𡢅<EFBFBD>敺<EFBFBD><E695BA>憪页<E686AA>
|
||
3. <20>?**<2A>冽<EFBFBD>憭滨<E686AD> Day 6**嚗鋫PI<50><49><EFBFBD>銝舘<E98A9D>靚<EFBFBD><E99D9A>敺<EFBFBD><E695BA>憪页<E686AA>
|
||
|
||
### <20>剜<EFBFBD>隡睃<E99AA1>嚗<EFBFBD><E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑𨥈<E89D91>
|
||
1. <20>?Prompt隡睃<E99AA1>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>蝖桃<E89D96><E6A183>?5%+嚗?2. <20>?瘛餃<E7989B>隞餃𦛚<E9A483><F0A69B9A><EFBFBD>/<2F>𡝗<EFBFBD><F0A19D97>蠘<EFBFBD>
|
||
3. <20>?摰䂿緵撟嗅<E6929F>憭<EFBFBD><E686AD>嚗?-5銝芸僎<E88AB8>𡢅<EFBFBD>
|
||
4. <20>?瘛餃<E7989B>隡啗恣<E59597>拐<EFBFBD><E68B90>園𡢿<E59C92>曄內
|
||
|
||
### 銝剜<E98A9D>嚗㇈onth 2嚗?1. <20>银 <20>冽<EFBFBD>憭滨<E686AD><E6BBA8>蠘<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>睲葉嚗?2. <20>?<3F>冽<EFBFBD><E586BD>唳旿<E594B3>𣂼<EFBFBD><F0A382BC>蠘<EFBFBD>
|
||
3. <20>?<3F>冽<EFBFBD><E586BD>芸<EFBFBD>銋㕑器<E39591>峕<EFBFBD><E5B395>?4. <20>?WebSocket摰墧𧒄<E5A2A7>券<EFBFBD>?
|
||
### <20>踵<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>?
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD>﹝蝏湔擪<EFBFBD>?*嚗鋫I<E98BAB>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
|
||
**<EFBFBD>湔鰵<EFBFBD>冽<EFBFBD>**嚗𡁏<E59A97>銝芷<E98A9D>閬<EFBFBD><E996AC><EFBFBD>賢<EFBFBD><E8B3A2>𣂼<EFBFBD><F0A382BC>湔鰵
|
||
**<EFBFBD>漤<EFBFBD><EFBFBD>孵<EFBFBD>**嚗𡁏<E59A97>鈭儿ssue<75>鞛ull Request
|
||
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-11-22嚗<32><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑?Day 2-3摰峕<E691B0>嚗?
|
||
**<EFBFBD><EFBFBD>﹝<EFBFBD>嗆<EFBFBD>?*嚗尠<E59A97> <20>齿<EFBFBD><E9BDBF>笔<EFBFBD><E7AC94>嗆<EFBFBD>?
|
||
**銝𧢲活<F0A7A2B2>湔鰵<E6B994>嗆㦤**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD>蝑㛈VP摰峕<E691B0> <20>?<3F><><EFBFBD><EFBFBD>䁅<EFBFBD>Prompt隡睃<E99AA1>摰峕<E691B0>
|
||
|
||
**<EFBFBD>祆活<EFBFBD>湔鰵<EFBFBD><EFBFBD>捆**嚗ǒ1.1嚗㚁<EFBFBD>
|
||
- <20>?<3F>湔鰵敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD>撘<EFBFBD><E69298>𤏸<EFBFBD>摨佗<E691A8>
|
||
- <20>?<3F>湔鰵<E6B994>喲睸<E596B2>𣬚<EFBFBD>蝣𡢅<E89DA3>Day 2-3摰峕<E691B0>嚗?- <20>?<3F>啣<EFBFBD><E595A3>𡒊垢隞<E59EA2><E99A9E>蝏𤘪<E89D8F>嚗Ếommon撅?+ fulltext-screening撅<67><E69285>
|
||
- <20>?<3F>啣<EFBFBD>撘<EFBFBD><E69298>𤏸扇敶閖曎<E99696>伐<EFBFBD>Day 2-3撌乩<E6928C><E4B9A9>餌<EFBFBD>嚗?- <20>?<3F>湔鰵銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>𡜐<EFBFBD>敶枏<E695B6>Sprint嚗?
|
||
|