Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/00-模块当前状态与开发指南.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

1053 lines
37 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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><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><EFBFBD>霈曄蔭<E69B84><E894AD><EFBFBD>摨艾<E691A8><E889BE>極雿𨅯蝱<F0A885AF><E89DB1><EFBFBD><EFBFBD><EFBFBD>
- PDF銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><E996AB><EFBFBD>? - <20>峕芋<E5B395>见ế<E8A781>剖笆瘥牐I
- 摰墧𧒄餈𥕦漲<F0A595A6>烐綉嚗<E7B689>蔭霂<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摰<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'
<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>唳旿嚗?蝝<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
<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
<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
<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
<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
<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>蔭霂<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>嗆䰻霂<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>𨀣䰻霂<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嚗?