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

37 KiB
Raw Blame History

AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃璅<EFBFBD> - 敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD><EFBFBD><E69298><EFBFBD><E78390>?

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗? v1.4
*<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗? 2025-11-21
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41><EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? <EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> 2025-12-13 <20><> *Postgres-Only <20><EFBFBD><E59786><EFBFBD><EFBFBD><E683A9>?
*<EFBFBD>滚之餈𥕦<EFBFBD>嚗? Platform-Only <20><EFBFBD><E59786><EFBFBD>?- <20><EFBFBD><E7AE84>峕芋撘誩<E69298><E8AAA9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E28AA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>寧賒隡? *<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <20>齿<EFBFBD><E79285><E288AA><EFBFBD><E7AC94><EFBFBD><E59786><EFBFBD>撣桀𨭌<E6A180><EFBFBD><E595A3>睲犖<E79DB2>睃翰<E79D83><EFBFBD><E785BA>?


<EFBFBD><EFBFBD> <20><>﹝霂湔<E99C82>

<EFBFBD><EFBFBD><EFBFBD>糓AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃嚗㇁SL嚗㗇芋<EFBFBD><EFBFBD>**<2A><EFBFBD><E7AC94><EFBFBD><E59786><EFBFBD>?*嚗諹扇敶訫<E695B6><E8A8AB><EFBFBD><EFBFBD><EFBFBD><E99A9E>蝏𤘪<E89D8F><F0A498AA><EFBFBD>歇摰䂿緵<E482BF><EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E88880><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><F0A48FB8><EFBFBD><EFBFBD>? 銝𤾸<EFBFBD>隞𡝗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>喟頂嚗?- **<2A><EFBFBD><EFBFBD><E78DA2>00-璅<E79285>敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD>**嚗阳hat is嚗<73><E59A97>摰䂿𠶖<E482BF><F0A0B696><EFBFBD>

  • **撘<><E69298>𤏸恣<F0A48FB8><EFBFBD>獢?*嚗阳hat to do嚗<6F><EFBFBD>𡜐<EFBFBD>
  • **撘<><E69298>𤏸扇敶閙<E695B6>獢?*嚗阳hat done嚗<65><E59A97><EFBFBD><EFBFBD>
  • **<2A><><EFBFBD>航挽霈⊥<E99C88>獢?*嚗䥅ow to do嚗<6F>挽霈∴<E99C88>

<EFBFBD>㴓 璅<E79285><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃璅<EFBFBD><EFBFBD><EFBFBD>銝芸抅鈭𤾸之霂剛<EFBFBD><EFBFBD>嚗𡿨LM嚗厩<EFBFBD><EFBFBD><EFBFBD>讃蝑偦<EFBFBD>厩頂蝏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撣桀𨭌<EFBFBD>𠉛弦鈭箏<EFBFBD><EFBFBD>寞旿PICOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>芸𢆡蝑偦<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?

敶枏<EFBFBD><EFBFBD><EFBFBD>?- **撘<><E69298>煾𧫴畾?*嚗𡄻<E59A97>?<3F><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD>MVP撌脣<E6928C><E884A3><EFBFBD><E7909C><EFBFBD>憭滨<E686AD><E6BBA8>𡒊垢撌脣<E6928C><E884A3><EFBFBD><EFBFBD><E695BA>蝡臬<E89DA1><E887AC>?- **撌脣<E6928C><E884A3>𣂼<EFBFBD><F0A382BC>?*嚗? - <20>?<3F><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD>嚗㇍itle & Abstract Screening嚗? 摰峕㟲瘚<E39FB2><E7989A>

  • <EFBFBD>?<3F><EFBFBD>憭滨<E686AD><E6BBA8>𡒊垢嚗㇄ay 2-5嚗? LLM<4C>滚𦛚 + API + Excel撖澆枂
  • **撘<><E69298>睲葉<E79DB2><EFBFBD>**嚗? - <20><20><EFBFBD>憭滨<E686AD><E6BBA8>滨垢UI嚗㇄ay 6-8嚗屸<E59A97>霈?.5憭抬<EFBFBD>
  • **璅<E79285><E288AA><EFBFBD>**嚗鋽eepSeek-V3 + Qwen-Max <20>峕芋<E5B395><EFBFBD><E8AEA0>?- **<2A>函蔡<E587BD><EFBFBD>?*嚗尠<E59A97> <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><E68693>銵峕迤撣?

<EFBFBD><EFBFBD> Postgres-Only <20><EFBFBD><E59786><EFBFBD>𩤃<EFBFBD>2025-12-13摰峕<E691B0>嚗?

<EFBFBD><EFBFBD>删𤌍<EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD><EFBFBD>2-24撠𤩺𧒄<F0A4A9BA><F0A79284><EFBFBD>園𡢿隞餃𦛚嚗?000蝭<30><E89DAD><EFBFBD><EFBFBD><E6A183><EFBFBD>
  • 摰硺<EFBFBD><EFBFBD>滚鍳<EFBFBD>𦒘遙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>寧賒隡𩤃<EFBFBD>
  • <EFBFBD><EFBFBD>憭𡝗<EFBFBD><EFBFBD>穿<EFBFBD>雿輻鍂 Postgres嚗䔶<E59A97><E494B6><EFBFBD>閬?Redis嚗? *<EFBFBD><EFBFBD>摰䂿緵嚗?
  1. *<EFBFBD><EFBFBD><EFBFBD>峕芋撘誩<EFBFBD><EFBFBD>? <20>

    • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>50蝭<EFBFBD><EFBFBD><EFBFBD>? - 撠譍遙<E8AD8D><EFBFBD><50蝭<30><E89DAD>嚗𡁶凒<F0A181B6><EFBFBD><E4BA99><EFBFBD><EFBFBD>敹恍<E695B9><EFBFBD>摨䈑<E691A8><1<><31><EFBFBD>嚗? - 憭找遙<E689BE><EFBFBD><E288B4>?0蝭<30><E89DAD>嚗𡁻<E59A97><F0A181BB><EFBFBD><E5A092><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E888AB><EFBFBD><EFBFBD>𣈲<EFBFBD><F0A388B2><EFBFBD>寧賒隡𩤃<E99AA1>
  2. 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>𣑐

    • 100蝭?<3F>?2銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
    • 1000蝭?<3F>?20銝芣鸌甈∴<E79488>瘥𤩺鸌50蝭<30><E89DAD>
    • <EFBFBD>芸𢆡<EFBFBD><EFBFBD><EFBFBD>寞活憭批<EFBFBD>
  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撅<EFBFBD><EFBFBD><EFBFBD>蝞∠<EFBFBD> <20><>儭? - 隞餃𦛚蝞∠<E89D9E>靽⊥<E99DBD>銝滚<E98A9D><E6BB9A>典銁 asl_schema.screening_tasks

    • 蝏煺<EFBFBD>摮睃<EFBFBD><EFBFBD>?platform_schema.job.data嚗㇇SONB嚗? - 雿輻鍂 CheckpointService <20><EFBFBD> job.data嚗<61><E59A97><EFBFBD>㗇芋<E39787><EFBFBD>𡁶鍂嚗? <EFBFBD><EFBFBD><EFBFBD>隞塚<EFBFBD>
  • 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>銝𡁜𦛚銵? *瘚贝<EFBFBD>撉諹<EFBFBD>嚗?
  • <EFBFBD>?撠譍遙<E8AD8D><EFBFBD>7蝭<37><E89DAD>- <20>湔𦻖璅<E79285>瘚贝<E7989A><E8B49D><EFBFBD>
  • <EFBFBD>?憭找遙<E689BE><EFBFBD>100蝭<30><E89DAD>- <20><EFBFBD><E79285>瘚贝<E7989A><E8B49D><EFBFBD>
  • <EFBFBD>?隞餃𦛚<E9A483><F0A69B9A><EFBFBD><EFBFBD><EFBFBD>撉諹<E69289><E8ABB9><EFBFBD>
  • <EFBFBD>?Platform-Only <20><EFBFBD>撉諹<E69289><E8ABB9><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>箏𦛚嚗?

  • <EFBFBD>𩤃<EFBFBD> Phase 8 <20>券𢒰瘚贝<E7989A><EFBFBD><EFBFBD>寧賒隡惩<E99AA1><E683A9>𥟇<EFBFBD>霂𨰻<E99C82>?000蝭<30><E89DAD><EFBFBD><EFBFBD><E6A180><EFBFBD>蝔页<E89D94>
  • <EFBFBD>𩤃<EFBFBD> Phase 9 SAE <20>函蔡撉諹<E69289>

<EFBFBD>喲睸<EFBFBD>𣬚<EFBFBD>蝣?

**<2A><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD><EFBFBD>歇摰峕<E691B0>嚗?*:

  • <EFBFBD>?2025-11-18嚗䥪rompt v1.0.0-MVP摰峕<E691B0><EFBFBD><E59A97>蝖桃<E89D96>60%
  • <EFBFBD>?2025-11-18嚗匁LM<4C><4D><EFBFBD>銝擧<E98A9D>霂閙<E99C82><E99699><EFBFBD><E59785>?- <20>?2025-11-19嚗𡁜<E59A97>蝡烘VP嚗<50>挽蝵桐<E89DB5><E6A190>臬𢆡<E887AC><F0A286A1><EFBFBD>詨極雿𨅯蝱嚗匧<E59A97><E58CA7>?- <20>?2025-11-21嚗𡁶<E59A97>摰掹LM<4C><4D><EFBFBD>摰峕<E691B0><EFBFBD>𤜯<EFBFBD>﹪ock<63>唳旿嚗?- <20>?2025-11-21嚗𡁶鍂<F0A181B6><EFBFBD>撉䔶<E69289><E494B6><EFBFBD>餈𥕦漲<F0A595A6>曄內<E69B84><E585A7><EFBFBD>銵冽<E98AB5>摨𧶏<E691A8>
  • <EFBFBD>?2025-11-21嚗?Week 4摰峕<E691B0><EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD>蝷箔<E89DB7>撖澆枂<E6BE86><EFBFBD>嚗?
    • 蝏蠘恣璁<EFBFBD><EFBFBD>銝窰RISMA<EFBFBD>㘾膄<EFBFBD><EFBFBD><EFBFBD>
    • <EFBFBD><EFBFBD>蝏𤘪<EFBFBD>憿菟𢒰嚗<EFBFBD><EFBFBD><EFBFBD>䲮獢<EFBFBD><EFBFBD>
    • Excel<EFBFBD><EFBFBD>撖澆枂嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <EFBFBD><EFBFBD>憭滨<EFBFBD><EFBFBD><EFBFBD>蝡臬歇摰峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD>𡢅<EFBFBD>:
  • <EFBFBD>?2025-11-22嚗?Day 2-3摰峕<E691B0>嚗𡿨LM<4C>滚𦛚銝𡡞<E98A9D><EFBFBD>頂蝏<E9A082><E89D8F>*
    • <EFBFBD>鞟內霂滚極蝔衤<EFBFBD>蝟鳴<EFBFBD>System/User Prompt + JSON Schema嚗? - PromptBuilder<65>滚𦛚嚗<F0A69B9A>𢆡<EFBFBD><F0A286A1>rompt蝏<74><E89D8F>嚗? - LLM12FieldsService嚗𠃊ougat隡睃<E99AA1> + <20>峕芋<E5B395>?+ 3撅<33>SON閫<4E><E996AB>嚗? - <20>餃郎<E9A483><EFBFBD>撉諹<E69289><E8ABB9><EFBFBD>5<EFBFBD><EFBFBD><E2889F><EFBFBD>
    • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>膥嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
    • <EFBFBD><EFBFBD><EFBFBD>瘚𧢲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>峕芋<EFBFBD>见笆瘥䈑<EFBFBD>
    • <EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD>銝𤾸捆<EFBFBD><EFBFBD><EFBFBD>?- <20>?2025-11-23嚗?Day 4銝𠰴<E98A9D>摰峕<E691B0><EFBFBD><EFBFBD><EFBFBD>霈曇恣銝舘<E98A9D>蝘鳴<E89D98>*
    • <EFBFBD>唳旿摨廍chema霈曇恣嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? - 靽格㺿 literatures 銵剁<E98AB5>+13銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>畾蛛<E795BE>
    • <EFBFBD>𥕦遣 fulltext_screening_tasks 銵? - <20>𥕦遣 fulltext_screening_results 銵? - <20>见𢆡SQL餈<4C><EFBFBD>𡁏𧋦嚗<F0A78BA6><E59A97><EFBFBD><EFBFBD>銵䕘<E98AB5>銝滚蔣<E6BB9A><EFBFBD>隞𡝗芋<F0A19D97><EFBFBD>
    • <EFBFBD>唳旿摨栞<EFBFBD>蝘餌𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂衣<EFBFBD>霈啣<EFBFBD>Schema<EFBFBD>𠉛氖<EFBFBD><EFBFBD><EFBFBD>嚗?- <20>?2025-11-23嚗?Day 4銝见<E98A9D>摰峕<E691B0><EFBFBD>鸌憭<E9B88C><E686AD><EFBFBD>滚𦛚嚗?
    • FulltextScreeningService嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?16銵䕘<E98AB5>
    • <EFBFBD>郊隞餃𦛚蝞∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LM靚<EFBFBD>鍂嚗? - 撟嗅<E6929F><E59785><EFBFBD>嚗ī-queue嚗? - 餈𥕦漲頝蠘葵<E8A098><EFBFBD>霂臬<E99C82><E887AC>?- <20>?2025-11-23嚗?Day 5摰峕<E691B0><EFBFBD><E59A97>蝡涉PI撘<49><E69298>𡢅<EFBFBD>*
    • FulltextScreeningController嚗?銝芣瓲敹<E793B2>PI嚗?52銵䕘<E98AB5>
    • ExcelExporter<EFBFBD>滚𦛚嚗?-Sheet<65><EFBFBD><E4BA99><EFBFBD><EFBFBD>嚗?52銵䕘<E98AB5>
    • Zod<EFBFBD><EFBFBD>㺭撉諹<EFBFBD>
    • 頝舐眏瘜典<EFBFBD>嚗?api/v1/asl/fulltext-screening嚗? - 31銝析EST Client瘚贝<E7989A><E8B49D><EFBFBD>
    • API<EFBFBD><EFBFBD><EFBFBD>湔鰵<EFBFBD>釘3.0
    • PDF<EFBFBD>𣂼<EFBFBD>fallback<EFBFBD><EFBFBD>
  • <EFBFBD>银 2025-11-24嚗?Day 6-8敺<38><E695BA><EFBFBD>𡢅<EFBFBD><F0A1A285>滨垢UI嚗?
    • 4銝芣瓲敹<EFBFBD><EFBFBD><EFBFBD>霈曄蔭<EFBFBD><EFBFBD><EFBFBD>摨艾<EFBFBD><EFBFBD>極雿𨅯蝱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
    • PDF銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? - <20>峕芋<E5B395>见ế<E8A781>剖笆瘥牐I
    • 摰墧𧒄餈𥕦漲<EFBFBD>烐綉嚗<EFBFBD>蔭霂<EFBFBD><EFBFBD>
    • 霂衣<EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>鍦歇<EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>儭?<3F><><EFBFBD>舀沲<E88880>?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>滨垢

<EFBFBD>沲: React 18 + TypeScript 5
頝舐眏: React Router DOM v6
<0A><EFBFBD><E59786><EFBFBD>? @tanstack/react-query (React Query v5)
UI蝏<49>辣: Ant Design v5
<0A><EFBFBD>: TailwindCSS v3
<0A><>遣撌亙<E6928C>: Vite v5

<EFBFBD>𡒊垢

<EFBFBD>沲: Fastify v4 (Node.js 22)
<0A>唳旿摨? PostgreSQL 16 + Prisma 5
LLM SDK: <20><EFBFBD> LLMFactory (蝏煺<E89D8F><E785BA><EFBFBD><EFBFBD>撅?
璅<E79285>: DeepSeek-V3, Qwen-Max, GPT-4o, Claude-4.5
<0A><EFBFBD>: Winston

<EFBFBD><EFBFBD>霈暹鴌

<EFBFBD>唳旿摨? PostgreSQL 16 with Schema isolation
Schema: asl_schema (<28><EFBFBD><E7A589>𠉛氖)
<0A><EFBFBD>銵? platform_schema.users (<28>曹澈)

<EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E99A9E>蝏𤘪<E89D8F>

<EFBFBD>滨垢隞<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>

frontend-v2/src/modules/asl/
<0A><EFBFBD><E98EBF><EFBFBD> api/
<0A>?  <20><EFBFBD><E5A999><EFBFBD> index.ts                    # API摰<E691B0>蝡荔<E89DA1><E88D94><EFBFBD><EFBFBD><EFBFBD>蝡航<E89DA1><E888AA><EFBFBD>
<0A><EFBFBD><E98EBF><EFBFBD> components/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> ASLLayout.tsx               # 撌虫儒撖潸⏛撣<E28F9B><E692A3>
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> JudgmentBadge.tsx           # PICOS<4F>斗鱏Badge
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> ConclusionTag.tsx           # 蝏栞捏Tag嚗<67><EFBFBD>?<3F>㘾膄嚗?<3F>?  <20><EFBFBD><E5A999><EFBFBD> DetailReviewDrawer.tsx      # 霂行<E99C82>+憭齿瓲蝏煺<E89D8F>Drawer
<0A><EFBFBD><E98EBF><EFBFBD> hooks/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> useScreeningTask.ts         # 隞餃𦛚餈𥕦漲頧株砭Hook
<0A>?  <20><EFBFBD><E5A999><EFBFBD> useScreeningResults.ts      # 蝑偦<E89D91><EFBFBD><E58EA9>𨀣䰻霂ook
<0A><EFBFBD><E98EBF><EFBFBD> pages/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> TitleScreeningSettings.tsx  # 霈曄蔭銝𤾸鍳<F0A4BEB8>券△<E588B8>?<3F>?  <20><EFBFBD><E98EBF><EFBFBD> ScreeningWorkbench.tsx      # 摰⊥瓲撌乩<E6928C><E4B9A9>圈△<E59C88>?<3F>?  <20><EFBFBD><E5A999><EFBFBD> ScreeningResults.tsx        # <20><EFBFBD>蝏𤘪<E89D8F>憿菟𢒰嚗<F0A292B0><E59A97>雿㵪<E99BBF>
<0A><EFBFBD><E98EBF><EFBFBD> types/
<0A>?  <20><EFBFBD><E5A999><EFBFBD> index.ts                    # TypeScript蝐餃<E89D90>摰帋<E691B0>
<0A><EFBFBD><E98EBF><EFBFBD> utils/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> excelUtils.ts               # Excel撖澆<E69296>/撖澆枂撌亙<E6928C>
<0A>?  <20><EFBFBD><E5A999><EFBFBD> tableTransform.ts           # 銵冽聢<E586BD>唳旿頧祆揢嚗<E68FA2><E59A97>銵䕘<E98AB5>
<0A><EFBFBD><E5A999><EFBFBD> index.tsx                       # 璅<E79285><E288AA>亙藁嚗<E89781><EFBFBD><EFBFBD>蝵殷<E89DB5>

<EFBFBD>𡒊垢隞<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>

backend/src/modules/asl/
<0A><EFBFBD><E98EBF><EFBFBD> controllers/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> projectController.ts        # 憿寧𤌍蝞∠<E89D9E>API
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> literatureController.ts     # <20><>讃蝞∠<E89D9E>API
<0A>?  <20><EFBFBD><E5A999><EFBFBD> screeningController.ts      # 蝑偦<E89D91>厩㮾<E58EA9>莧PI嚗<49><E59A97>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91>
<0A><EFBFBD><E98EBF><EFBFBD> services/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> screeningService.ts         # 蝑偦<E89D91>劐遙<E58A90><EFBFBD><E28AA5><EFBFBD><E288B4><EFBFBD>嚗?<3F>?  <20><EFBFBD><E5A999><EFBFBD> llmScreeningService.ts      # LLM靚<4D><EFBFBD>滚𦛚嚗<F0A69B9A><E59A97>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91>
<0A><EFBFBD><E98EBF><EFBFBD> schemas/
<0A>?  <20><EFBFBD><E5A999><EFBFBD> screening.schema.ts         # Prompt<70><74><EFBFBD>銝𥣡SON Schema嚗<61><E59A97>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91>
<0A><EFBFBD><E98EBF><EFBFBD> types/
<0A>?  <20><EFBFBD><E5A999><EFBFBD> index.ts                    # TypeScript蝐餃<E89D90>摰帋<E691B0>
<0A><EFBFBD><E98EBF><EFBFBD> routes/
<0A>?  <20><EFBFBD><E5A999><EFBFBD> index.ts                    # 頝舐眏瘜典<E7989C>
<0A>?<3F><EFBFBD><E98EBF><EFBFBD> common/                          # <20>?<3F><EFBFBD>憭滨<E686AD><E6BBA8>𡁶鍂<F0A181B6><EFBFBD><EFBFBD><E69285>NEW嚗?<3F>?  <20><EFBFBD><E98EBF><EFBFBD> pdf/                         # PDF摮睃<E691AE>銝擧<E98A9D><E693A7>?<3F>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> types.ts
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> PDFStorageService.ts
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> PDFStorageFactory.ts
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> adapters/
<0A>?  <20>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> DifyPDFStorageAdapter.ts
<0A>?  <20>?  <20>?  <20><EFBFBD><E5A999><EFBFBD> OSSPDFStorageAdapter.ts
<0A>?  <20>?  <20><EFBFBD><E5A999><EFBFBD> __tests__/
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> llm/                         # LLM 12摮埈挾<E59F88>滚𦛚嚗<F0A69B9A>瓲敹<E793B2><E695B9>
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> types.ts
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> PromptBuilder.ts         # <20><EFBFBD><E586BD>rompt蝏<74><E89D8F>
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> LLM12FieldsService.ts    # Nougat+<2B>峕芋<E5B395>?3撅<33>SON閫<4E><E996AB>
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> index.ts
<0A>?  <20>?  <20><EFBFBD><E5A999><EFBFBD> __tests__/
<0A>?  <20>?      <20><EFBFBD><E98EBF><EFBFBD> integration-test.ts  # 摰峕㟲<E5B395><E39FB2><EFBFBD>瘚贝<E7989A>
<0A>?  <20>?      <20><EFBFBD><E98EBF><EFBFBD> quick-test.ts        # 敹恍<E695B9><E6818D><EFBFBD>霂𤏪<E99C82>1蝭𤊿DF嚗?<3F>?  <20>?      <20><EFBFBD><E5A999><EFBFBD> cached-result-test.ts # 摰寥<E691B0>撉諹<E69289>瘚贝<E7989A>
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> validation/                  # 撉諹<E69289><E8ABB9>滚𦛚
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> MedicalLogicValidator.ts # <20>餃郎<E9A483><EFBFBD>撉諹<E69289>嚗?<3F><EFBFBD><E2889F><EFBFBD>
<0A>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> EvidenceChainValidator.ts # 霂<><EFBFBD><EFBFBD>霂?<3F>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> ConflictDetectionService.ts # <20><EFBFBD><EFBFBD>瘚?<3F>?  <20>?  <20><EFBFBD><E98EBF><EFBFBD> index.ts
<0A>?  <20>?  <20><EFBFBD><E5A999><EFBFBD> __tests__/
<0A>?  <20>?      <20><EFBFBD><E5A999><EFBFBD> validation-test.ts
<0A>?  <20><EFBFBD><E98EBF><EFBFBD> utils/
<0A>?  <20>?  <20><EFBFBD><E5A999><EFBFBD> tokenCalculator.ts      # Token霈∠<E99C88>銝擧<E98A9D><E693A7>砌摯蝞?<3F>?  <20><EFBFBD><E5A999><EFBFBD> index.ts
<0A>?<3F><EFBFBD><E5A999><EFBFBD> fulltext-screening/              # <20>?<3F><EFBFBD>憭滨<E686AD><E79285>嚗𠃊EW嚗?    <20><EFBFBD><E98EBF><EFBFBD> controllers/
    <20>?  <20><EFBFBD><E5A999><EFBFBD> FulltextScreeningController.ts  # 5銝芣瓲敹<E793B2>PI嚗?52銵䕘<E98AB5>
    <20><EFBFBD><E98EBF><EFBFBD> services/
    <20>?  <20><EFBFBD><E98EBF><EFBFBD> FulltextScreeningService.ts     # <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>716銵䕘<E98AB5>
    <20>?  <20><EFBFBD><E5A999><EFBFBD> ExcelExporter.ts                # Excel撖澆枂<E6BE86>滚𦛚嚗?52銵䕘<E98AB5>
    <20><EFBFBD><E98EBF><EFBFBD> routes/
    <20>?  <20><EFBFBD><E5A999><EFBFBD> fulltext-screening.ts           # 頝舐眏瘜典<E7989C>嚗?3銵䕘<E98AB5>
    <20><EFBFBD><E98EBF><EFBFBD> prompts/                     # <20>鞟內霂滢<E99C82>蝟?    <20>?  <20><EFBFBD><E98EBF><EFBFBD> system_prompt.md         # System Prompt嚗?601摮㛖泵嚗?    <20>?  <20><EFBFBD><E98EBF><EFBFBD> user_prompt_template.md  # User Prompt璅⊥踎嚗?99銵䕘<E98AB5>
    <20>?  <20><EFBFBD><E98EBF><EFBFBD> json_schema.json         # JSON Schema嚗?2摮埈挾蝥行<E89DA5>嚗?    <20>?  <20><EFBFBD><E5A999><EFBFBD> cochrane_standards/      # Cochrane<6E><65><EFBFBD>嚗㇈VP<56><50><EFBFBD><EFBFBD>㰘蝸嚗?    <20>?      <20><EFBFBD><E98EBF><EFBFBD> <20>𤩺㦤<F0A4A9BA>𡝗䲮瘜?md
    <20>?      <20><EFBFBD><E98EBF><EFBFBD> <20><EFBFBD>.md
    <20>?      <20><EFBFBD><E5A999><EFBFBD> 蝏𤘪<E89D8F>摰峕㟲<E5B395>?md
    <20><EFBFBD><E5A999><EFBFBD> __tests__/                   # 瘚贝<E7989A><E8B49D><EFBFBD><20><EFBFBD><E98EBF><EFBFBD> fulltext-screening-api.http     # REST Client瘚贝<E7989A>嚗?1銝芰鍂靘页<E99D98>
        <20><EFBFBD><E98EBF><EFBFBD> api-integration-test.ts         # <20>芸𢆡<E88AB8><EFBFBD><E39A9A><EFBFBD>霂?        <20><EFBFBD><E98EBF><EFBFBD> e2e-real-test.ts                # 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82><F0A48FAA><EFBFBD>PDF嚗?        <20><EFBFBD><E5A999><EFBFBD> e2e-real-test-v2.ts             # 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82><EFBFBD><E89D9E>𣇉<EFBFBD>嚗?
backend/prisma/
<0A><EFBFBD><E5A999><EFBFBD> schema.prisma                    # <20>唳旿摨廍chema摰帋<E691B0>

backend/prompts/asl/screening/
<0A><EFBFBD><E98EBF><EFBFBD> v1.0.0-mvp.txt                   # <20><><EFBFBD>Prompt嚗<74><E59A97>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91>
<0A><EFBFBD><E98EBF><EFBFBD> v1.1.0-lenient.txt               # 摰賣𠹭璅<E79285>
<0A><EFBFBD><E5A999><EFBFBD> v1.1.0-strict.txt                # 銝交聢璅<E79285>

backend/scripts/
<0A><EFBFBD><E5A999><EFBFBD> test-llm-screening.ts            # LLM瘚贝<E7989A><E8B49D>𡁏𧋦嚗<F0A78BA6><E59A97>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91>

<EFBFBD><EFBFBD> API蝡舐<E89DA1><EFBFBD><E59A97>摰痹<E691B0>

<EFBFBD><EFBFBD>URL

<EFBFBD><EFBFBD>𤑳㴓憓? http://localhost:3001/api/v1/asl

憿寧𤌍蝞∠<EFBFBD>

POST   /projects                     # <20>𥕦遣憿寧𤌍
GET    /projects                     # <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”
GET    /projects/:projectId          # <20><EFBFBD>憿寧𤌍霂行<E99C82>

<EFBFBD><EFBFBD>讃蝞∠<EFBFBD>

POST   /literatures/import           # 撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F><EFBFBD>嚗?POST   /literatures/import/excel     # 撖澆<E69296>Excel<65><6C>GET    /projects/:projectId/literatures  # <20><EFBFBD><E79195><EFBFBD><EFBFBD>𡑒”
DELETE /literatures/:literatureId    # <20>𣳇膄<F0A3B387><E88684>

蝑偦<EFBFBD>厩㮾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?```http

GET /projects/:projectId/screening-task # <20><EFBFBD>隞餃𦛚餈𥕦漲 GET /projects/:projectId/screening-results # <20><EFBFBD>蝑偦<E89D91><EFBFBD><E58EA9>?GET /screening-results/:resultId # <20><EFBFBD>蝏𤘪<E89D8F>霂行<E99C82> POST /screening-results/:resultId/review # <20>𣂷漱鈭箏極憭齿瓲


### <20><EFBFBD>憭滨<E686AD>嚗𠃊EW - Day 5嚗?```http
POST   /fulltext-screening/tasks                         # <20>𥕦遣<F0A595A6><EFBFBD>憭滨<E686AD>隞餃𦛚
GET    /fulltext-screening/tasks/:taskId/progress        # <20><EFBFBD>隞餃𦛚餈𥕦漲
GET    /fulltext-screening/tasks/:taskId/results         # <20><EFBFBD>隞餃𦛚蝏𤘪<E89D8F>
PUT    /fulltext-screening/results/:resultId/decision    # <20>湔鰵鈭箏極<E7AE8F><EFBFBD>
GET    /fulltext-screening/tasks/:taskId/export          # 撖澆枂Excel<65><EFBFBD>

<EFBFBD>喲睸<EFBFBD><EFBFBD>㺭霂湔<EFBFBD>

<EFBFBD>𥕦遣憿寧𤌍

{
  projectName: string;
  picoCriteria: {
    P: string;  // 鈭箇黎
    I: string;  // 撟脤<E6929F>
    C: string;  // 撖寧<E69296>
    O: string;  // 蝏枏<E89D8F>
    S: string;  // <20>𠉛弦霈曇恣
  };
  inclusionCriteria: string;
  exclusionCriteria: string;
  screeningConfig?: {
    models: ['DeepSeek-V3', 'Qwen-Max'];
    style: 'standard' | 'lenient' | 'strict';
  };
}

<EFBFBD><EFBFBD>蝑偦<EFBFBD><EFBFBD><EFBFBD>?```

Query<EFBFBD><EFBFBD>㺭:

  • page: 憿萇<E686BF><EFBFBD><E59A97>霈?嚗?- pageSize: 瘥誯△<E8AAAF><EFBFBD><EFBFBD><E59A97>霈?0嚗?- filter: all | conflict | included | excluded | reviewed

---

## <20><>儭?<3F>唳旿摨梶<E691A8><E6A2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
### Schema: asl_schema

#### 1. screening_projects嚗<73><E59A97><EFBFBD>厰★<E58EB0><EFBFBD>
```sql
銝駁睸: id (UUID)
憭㚚睸: user_id <20>?platform_schema.users(id)
<0A>喲睸摮埈挾:
  - project_name: 憿寧𤌍<E5AFA7>滨妍
  - pico_criteria: JSONB嚗<42>聢撘𧶏<E69298>{P, I, C, O, S}嚗?  - inclusion_criteria: TEXT
  - exclusion_criteria: TEXT
  - screening_config: JSONB嚗<42>聢撘𧶏<E69298>{models, style}嚗?  - status: 'draft' | 'screening' | 'completed'
蝝<E89D9D>: user_id, status

2. literatures嚗<73><E59A97><EFBFBD><EFBFBD><E6AEB7>?撌脫<E6928C>撅?```sql

銝駁睸: id (UUID) 憭㚚睸: project_id <20>?screening_projects(id) CASCADE <0A><><EFBFBD><EFBFBD><EFBFBD>摮埈挾:

  • title: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - abstract: TEXT嚗<54><E59A97><EFBFBD><EFBFBD>嚗? - authors, journal, publication_year, pmid, doi <0A><EFBFBD>憭滨<E686AD>摮埈挾嚗?025-11-23<32><EFBFBD>嚗?
  • stage: TEXT嚗<54><E59A97><EFBFBD>賢𪂹<E8B3A2><F0AA82B9><EFBFBD>imported/title_screened/fulltext_pending/fulltext_screened嚗? - has_pdf: BOOLEAN嚗<4E><EFBFBD><EFBFBD>PDF嚗? - pdf_storage_type, pdf_storage_ref, pdf_status, pdf_uploaded_at嚗㇊DF蝞∠<E89D9E>嚗? - full_text_storage_type, full_text_storage_ref, full_text_url嚗<6C><E59A97><EFBFBD><EFBFBD>摮睃<E691AE>嚗? - full_text_format, full_text_source, full_text_token_count嚗<74><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿嚗?蝝<E89D9D>: project_id, pmid, doi, stage, has_pdf, pdf_status <0A><EFBFBD>蝥行<E89DA5>: (project_id, pmid), (project_id, doi)

#### 3. screening_tasks嚗<73><E59A97>憸䀹<E686B8><EFBFBD><E996AC><EFBFBD>劐遙<E58A90><EFBFBD>
```sql
銝駁睸: id (UUID)
憭㚚睸: project_id <20>?screening_projects(id) CASCADE
<0A>喲睸摮埈挾:
  - status: 'pending' | 'running' | 'completed' | 'failed'
  - total_items, processed_items, success_items, conflict_items
  - started_at, completed_at
蝝<E89D9D>: project_id, status

4. screening_results嚗<73><E59A97>憸䀹<E686B8><EFBFBD><E996AC><EFBFBD><EFBFBD><E58EA9><EFBFBD>

銝駁睸: id (UUID)
憭㚚睸: 
  - project_id <EFBFBD>?screening_projects(id) CASCADE
  - literature_id <EFBFBD>?literatures(id) CASCADE
<EFBFBD>喲睸摮埈挾:
  DeepSeek蝏𤘪<EFBFBD>:
    - ds_*_judgment: 'match' | 'partial' | 'mismatch'
    - ds_*_evidence: TEXT嚗/I/C/S<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
    - ds_conclusion: 'include' | 'exclude' | 'uncertain'
    - ds_confidence: FLOAT(0-1)
    - ds_reason: TEXT
  Qwen蝏𤘪<EFBFBD>: <EFBFBD><EFBFBD>嚗íwen_*?  <EFBFBD><EFBFBD><EFBFBD>?
    - conflict_status: 'none' | 'conflict' | 'resolved'
    - conflict_fields: JSONB
  鈭箏極憭齿瓲:
    - final_decision: 'include' | 'exclude' | NULL
    - final_decision_by: <EFBFBD><EFBFBD>ID
    - final_decision_at: TIMESTAMP
    - exclusion_reason: TEXT
<EFBFBD>: project_id, literature_id, conflict_status, final_decision
<EFBFBD><EFBFBD>蝥行<EFBFBD>: (project_id, literature_id)

5. fulltext_screening_tasks嚗<73><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑𥕢遙<F0A595A2><EFBFBD><E288B4>?<3F>啣遣

銝駁睸: id (UUID)
憭㚚睸: project_id <EFBFBD>?screening_projects(id) CASCADE
<EFBFBD>喲睸摮埈挾:
  - model_a, model_b: TEXT嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨妍嚗?  - prompt_version: TEXT嚗rompt<EFBFBD><EFBFBD>𧋦嚗?  - status: 'pending' | 'running' | 'completed' | 'failed'
  - total_count, processed_count, success_count, failed_count, degraded_count
  - total_tokens, total_cost: <EFBFBD>鞉𧋦蝏蠘恣
  - started_at, completed_at, estimated_end_at
  - error_message, error_stack
<EFBFBD>: project_id, status, created_at

6. fulltext_screening_results嚗<73><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑𤤿<E89D91><F0A4A4BF><EFBFBD><E9A0A3>?<3F>啣遣

銝駁睸: id (UUID)
憭㚚睸: 
  - task_id <EFBFBD>?fulltext_screening_tasks(id) CASCADE
  - project_id <EFBFBD>?screening_projects(id) CASCADE
  - literature_id <EFBFBD>?literatures(id) CASCADE
<EFBFBD>喲睸摮埈挾:
  Model A (DeepSeek-V3) 蝏𤘪<EFBFBD>:
    - model_a_name, model_a_status, model_a_fields (JSONB)
    - model_a_overall, model_a_processing_log, model_a_verification (JSONB)
    - model_a_tokens, model_a_cost, model_a_error
  Model B (Qwen-Max) 蝏𤘪<EFBFBD>: <EFBFBD><EFBFBD>嚗éodel_b_*?  撉諹<EFBFBD>蝏𤘪<EFBFBD>:
    - medical_logic_issues (JSONB): <EFBFBD>餃郎<EFBFBD><EFBFBD>撉諹<EFBFBD>
    - evidence_chain_issues (JSONB): <EFBFBD><EFBFBD><EFBFBD>?  <EFBFBD><EFBFBD><EFBFBD>?
    - is_conflict, conflict_severity, conflict_fields, conflict_details (JSONB)
    - review_priority (0-100), review_deadline
  鈭箏極憭齿瓲:
    - final_decision: 'include' | 'exclude' | NULL
    - final_decision_by, final_decision_at
    - exclusion_reason, review_notes
  <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
    - processing_status, is_degraded, degraded_model
  <EFBFBD>航蕭皞舀<EFBFBD>?
    - raw_output_a (JSONB), raw_output_b (JSONB), prompt_version
<EFBFBD>: task_id, project_id, literature_id, is_conflict, final_decision, review_priority
<EFBFBD><EFBFBD>蝥行<EFBFBD>: (project_id, literature_id)

<EFBFBD>唳旿摨廍chema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>?

**<2A>?摰<><E691B0><EFBFBD>**嚗?- <20><><EFBFBD>𡅅SL銵券<E98AB5><E588B8>?asl_schema 銝?- <20>䭾㺭<E4ADBE><EFBFBD>瞍誩<E79E8D> public schema

  • Schema<EFBFBD>𠉛氖蝑𣇉裦<EFBFBD><EFBFBD>銝交聢
  • 霂西<EFBFBD>嚗靀<EFBFBD>唳旿摨栞<EFBFBD>蝘餌𠶖<EFBFBD><EFBFBD><EFBFBD>筕(./05-撘<><E69298>𤏸扇敶?2025-11-23_<33>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696><EFBFBD>?md)

<EFBFBD><EFBFBD> <20>唳旿瘚<E697BF><E7989A><EFBFBD><E59A97>摰痹<E691B0>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>銝𠹺<EFBFBD>Excel
  <20>?閫<><E996AB>撟嗅紡<E59785><EFBFBD> literatures 銵?  <20>?<3F>𥕦遣 screening_task
  <20>?<3F>𤾸蝱撘<E89DB1>郊憭<E9838A><E686AD>:
  - <20>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9><EFBFBD>DeepSeek + Qwen嚗?  - 靽嘥<E99DBD><E598A5>?screening_results
  - <20><EFBFBD><EFBFBD>瘚?  - <20>湔鰵隞餃𦛚餈𥕦漲
  <20>?<3F>滨垢頧株砭隞餃𦛚<E9A483><EFBFBD>?  <20>?<3F><EFBFBD>摰⊿<E691B0>蝏𤘪<E89D8F>嚗峕<E59A97>鈭支犖撌亙<E6928C><E4BA99>?  <20>?撖澆枂Excel嚗<6C><E59A97>蝡舐<E89DA1><E88890><EFBFBD><E99E89>𡒊垢OSS嚗?```

### <20><EFBFBD>憭滨<E686AD><EFBFBD><E7989A><EFBFBD>挽霈∩葉嚗?

<EFBFBD><EFBFBD>銝𠹺<EFBFBD>PDF嚗<EFBFBD><EFBFBD>𧶏<EFBFBD> <0A>?PDF<44>𣂼<EFBFBD><F0A382BC>滚𦛚嚗𠃊ougat隡睃<E99AA1>嚗釶yMuPDF<44>滨漣嚗? <20>?<3F>湔鰵 literatures 銵剁<E98AB5><E58981><EFBFBD>撘閧鍂摮埈挾嚗? <20>?<3F>𥕦遣 fulltext_screening_task <0A>?<3F>𤾸蝱撘<E89DB1><EFBFBD><EFBFBD><E5ADB5>?

  • <EFBFBD>峕芋<EFBFBD>见僎銵諹<EFBFBD><EFBFBD><EFBFBD>DeepSeek + Qwen嚗? - 12摮埈挾蝏𤘪<E89D8F><F0A498AA>𡝗<EFBFBD><F0A19D97>? - <20>餃郎<E9A483><EFBFBD>撉諹<E69289> + 霂<><EFBFBD><EFBFBD>霂? - <20><EFBFBD><EFBFBD>瘚页<E7989A>摮埈挾蝥批笆瘥䈑<E798A5>
  • 靽嘥<EFBFBD><EFBFBD>?fulltext_screening_results
  • <EFBFBD>湔鰵隞餃𦛚餈𥕦漲 <0A>?<3F>滨垢撅閧內蝏𤘪<E89D8F><EFBFBD><E59A97><EFBFBD>㦛摰⊿<E691B0>嚗? <20>?<3F><EFBFBD>憭齿瓲<E9BDBF><EFBFBD>憿對<E686BF><E5B08D>𣂷漱<F0A382B7><E6BCB1><EFBFBD><E89D8F>蝑? <20>?撖澆枂Excel嚗?2摮埈挾霂衣<E99C82><E8A1A3><EFBFBD>嚗? - total_items: INT
  • processed_items: INT
  • success_items: INT
  • conflict_items: INT
  • failed_items: INT
  • started_at, completed_at: TIMESTAMP 蝝<E89D9D>: project_id, status

---

## <20><> LLM<4C><4D><EFBFBD><EFBFBD><E59A97>摰𧼮<E691B0><F0A7BCAE><EFBFBD>

### LLM靚<4D>鍂瘚<E98D82><E7989A>

<EFBFBD>滨垢: <20>孵稬"撘<>憪𧘹I<F0A798B9><EFBFBD>" <0A>?<3F>𡒊垢: literatureController.importLiteratures() <0A>?<3F>𡒊垢: screeningService.startScreeningTask() <0A>?<3F>𡒊垢: screeningService.processLiteraturesInBackground() <0A>?(for each literature) <0A>𡒊垢: llmScreeningService.dualModelScreening() <0A>?<3F>𡒊垢: LLMFactory.getAdapter(model).chat() <0A>?<3F><EFBFBD>API: DeepSeek API / Qwen API <0A>?<3F>𡒊垢: JSON閫<4E><E996AB> + Schema撉諹<E69289> <0A>?<3F>𡒊垢: 靽嘥<E99DBD><E598A5>?screening_results 銵? <20>?<3F>𡒊垢: <20>湔鰵 screening_tasks 餈𥕦漲 <0A>?<3F>滨垢: useScreeningTask 頧株砭嚗?蝘?甈∴<E79488> <0A>?<3F>滨垢: <20>曄內餈𥕦漲<F0A595A6><EFBFBD>蝏𤘪<E89D8F>


### 摮埈挾<E59F88><EFBFBD><E683A9>喟頂

#### PICOS摮埈挾
```typescript
// <20>滨垢/<2F>唳旿摨𤘪聢撘?picoCriteria: { P, I, C, O, S }

// LLM<4C>滚𦛚<E6BB9A>澆捆<E6BE86><EFBFBD>
picoCriteria: { 
  P || population, 
  I || intervention, 
  C || comparison, 
  O || outcome, 
  S || studyDesign 
}

// <20><EFBFBD>雿滨蔭: screeningService.ts (Line 82-92)

<EFBFBD><EFBFBD>滨妍

// <20>滨垢撅閧內<E996A7>?<3F>?API<50>滨妍
const MODEL_NAME_MAP = {
  'DeepSeek-V3': 'deepseek-chat',
  'Qwen-Max': 'qwen-max',
  'GPT-4o': 'gpt-4o',
  'Claude-4.5': 'claude-sonnet-4.5',
};

// <20><EFBFBD>雿滨蔭: screeningService.ts (Line 97-110)

LLM<EFBFBD>滨蔭

<EFBFBD><EFBFBD><EFBFBD>

{
  temperature: 0,      // <20><EFBFBD>嚗𣬚靽萘<E99DBD><E89098><EFBFBD><E99D9D><EFBFBD>?  top_p: 1.0,
  max_tokens: 2048,
}

Prompt<EFBFBD><EFBFBD>𧋦

敶枏<EFBFBD>雿輻鍂: v1.0.0-mvp.txt
雿滨蔭: backend/prompts/asl/screening/v1.0.0-mvp.txt
<0A><><EFBFBD>? 60%嚗<><E59A97>甈⊥<E79488>霂𤏪<E99C82><><E98A9D><EFBFBD>: 70-100%

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>埈𧒄: 10-20蝘𡜐<E89D98>DeepSeek + Qwen撟嗉<E6929F>嚗?5蝭<35><E89DAD><EFBFBD>? 蝥?0-100蝘?199蝭<39><E89DAD><EFBFBD>? 蝥?3-66<36><36><EFBFBD><EFBFBD>葡銵<E891A1><E98AB5><EFBFBD><EFBFBD><EFBFBD>
餈𥕦漲<F0A595A6>湔鰵: 瘥?<3F>⊥凒<E28AA5>唳㺭<E594B3><EFBFBD>
<0A>滨垢頧株砭: 1蝘?甈?```

---

## <20>?撌脣<E6928C><E884A3>𣂼<EFBFBD><F0A382BC>?
### 1. <20><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD> - 霈曄蔭銝𤾸鍳<F0A4BEB8>?潃?
#### <20><EFBFBD><EFBFBD><E79A9C>
- <20>?PICOS<4F><53><EFBFBD>敶訫<E695B6>嚗㇊/I/C/O/S銝斗<E98A9D><EFBFBD><E692A3>嚗?- <20>?蝥喳<E89DA5>/<2F>㘾膄<E398BE><E88684><EFBFBD>敶訫<E695B6><EFBFBD>儒颲孵笆蝘啣<E89D98><EFBFBD>嚗?- <20>?Excel璅⊥踎銝贝蝸嚗<E89DB8><E59A97><EFBFBD><EFBFBD>畾菔秩<E88F94>𠬍<EFBFBD>
- <20>?Excel<65><6C>辣銝𠹺<E98A9D>
- <20>?Excel閫<6C><E996AB><EFBFBD><E59A97>摮䀝葉嚗峕𣈲<E5B395><F0A388B2><EFBFBD><EFBFBD>銵典仍嚗?- <20>?<3F><><EFBFBD><EFBFBD>嚗㇄OI隡睃<E99AA1>嚗峕<E59A97>憸䁅<E686B8><E48185><EFBFBD>
- <20>?<3F><>讃憸<E8AE83><E686B8>銵冽聢嚗<E881A2>𤐄摰𡁜<E691B0>摰踝<E691B0>Tooltip<69>曄內<E69B84><EFBFBD>嚗?- <20>?<3F>臬𢆡AI<41><EFBFBD><E89098>厰僼
- <20>?<3F>芸𢆡頝唾蓮<E594BE>啣恣<E595A3>詨極雿𨅯蝱

#### <20>喲睸隞<E79DB8><E99A9E>
```typescript
// <20><>辣: frontend-v2/src/modules/asl/pages/TitleScreeningSettings.tsx
// <20><EFBFBD><E8A9A8><EFBFBD>: PICOS銵典<E98AB5> + Excel銝𠹺<E98A9D> + <20><>讃憸<E8AE83><E686B8> + <20>𣂷漱

// Excel憭<6C><E686AD>
import { downloadExcelTemplate, processExcelFile } from '../utils/excelUtils';

// API靚<49>鍂
const projectResponse = await aslApi.createProject({ ... });
const importResponse = await aslApi.importLiteratures({ ... });
navigate('/literature/screening/title/workbench', { state: { projectId } });

2. <20><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD> - 摰⊥瓲撌乩<E6928C><E4B9A9>?潃?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD>?隞餃𦛚餈𥕦漲<F0A595A6>曄內嚗<E585A7>蔭霂<E99C82>1蝘?甈∴<E79488>
  • <EFBFBD>?餈𥕦漲<F0A595A6><EFBFBD><E288AA>嗆凒<E59786><EFBFBD>撟單<E6929F>憓鮋鵭嚗?- <20>?璅<E79285><EFBFBD><E686AD><EFBFBD><EFBFBD><E59C88>曄內嚗㇄eepSeek + Qwen嚗?- <20>?<3F><EFBFBD>銵冽聢嚗㇄eepSeek銝𡃏<E98A9D>嚗熑wen銝贝<E98A9D>嚗?- <20>?PICOS<4F>斗鱏Badge嚗<65><EFBFBD>?<3F><EFBFBD>/銝滚龪<E6BB9A><EFBFBD>
  • <EFBFBD>?蝏栞捏Tag嚗<67><EFBFBD>?<3F>㘾膄/銝滨摰𡄯<E691B0>
  • <EFBFBD>?<3F><EFBFBD><E884A9><EFBFBD>讃擃䀝漁嚗<E6BC81><EFBFBD><EFBFBD><E884B0><EFBFBD>
  • <EFBFBD>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285><EFBFBD>旿嚗<E697BF><E59A97><E79285>撖寞<E69296>嚗?- <20>?蝏煺<E89D8F>憭齿瓲Drawer嚗<72>椰靘扯祕<E689AF>?<3F>喃儒憭齿瓲嚗?- <20>?鈭箏極憭齿瓲<E9BDBF>𣂷漱
  • <EFBFBD>?蝑偦<E89D91>凤ab嚗<62><E59A97><EFBFBD>?<3F><EFBFBD>/撌脩熙<E884A9>?撌脫<E6928C><E884AB>?撌脣<E6928C><E884A3><EFBFBD>
  • <EFBFBD>?<3F><>△嚗<E296B3><E59A97>蝡臬<E89DA1>憿蛛<E686BF>20<32>?憿蛛<E686BF>

<EFBFBD>喲睸隞<EFBFBD><EFBFBD>

// <20><>辣: frontend-v2/src/modules/asl/pages/ScreeningWorkbench.tsx
// <20><EFBFBD><E8A9A8><EFBFBD>: <20><EFBFBD>銵冽聢 + 餈𥕦漲頧株砭 + 撅訫<E69285>銵?+ 憭齿瓲Drawer

// 頧株砭餈𥕦漲
const { task, progress, isRunning } = useScreeningTask({ projectId, pollingInterval: 1000 });

// <20>亥砭蝏𤘪<E89D8F>
const { results } = useScreeningResults({ projectId, page, pageSize, filter });

// <20><EFBFBD>頧祆揢
const tableData = transformToDoubleRows(results);

// 撅訫<E69285>銵?expandable={{
  expandedRowRender: (record) => { /* <20>峕芋<E5B395><EFBFBD><E8B49D>桀笆瘥?*/ },
  expandedRowKeys,
  onExpandedRowsChange: (keys) => setExpandedRowKeys([...keys]),
}}

3. <20>𡒊垢LLM<4C><4D><EFBFBD> 潃?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD>?<3F>峕芋<E5B395>见僎銵𣬚<E98AB5><F0A3AC9A><EFBFBD>DeepSeek + Qwen嚗?- <20>?JSON蝏𤘪<E89D8F><F0A498AA>𤥁<EFBFBD><F0A4A581><EFBFBD>撣吁chema撉諹<E69289>嚗?- <20>?<3F><EFBFBD><EFBFBD>瘚页<E7989A>蝏栞捏銝滢<E98A9D><E6BBA2><EFBFBD>
  • <EFBFBD>?銝脰<E98A9D><EFBFBD><E686AD><EFBFBD><E59A97><EFBFBD><EFBFBD>PI<50><EFBFBD>嚗?- <20>?餈𥕦漲摰墧𧒄<E5A2A7>湔鰵嚗<E9B0B5><E59A97>1<EFBFBD><EFBFBD>
  • <EFBFBD>?<3F>躰秤憭<E7A7A4><E686AD>銝𡡞<E98A9D>霂?- <20>?摮埈挾<E59F88><EFBFBD>嚗㇊ICOS, 璅<E79285><E288AA><EFBFBD>
  • <EFBFBD>?<3F><>讃撉諹<E69289><EFBFBD><E59A97>憸?<3F><EFBFBD><EFBFBD><E695B9>嚗?- <20>?霂衣<E99C82><E8A1A3><EFBFBD>颲枏枂

<EFBFBD>喲睸隞<EFBFBD><EFBFBD>

// <20><>辣: backend/src/modules/asl/services/screeningService.ts
// <20><EFBFBD><E8A9A8><EFBFBD>: 隞餃𦛚蝞∠<E89D9E> + 摮埈挾<E59F88><EFBFBD> + LLM靚<4D>
// 摮埈挾<E59F88><EFBFBD>
const picoCriteria = {
  P: rawPicoCriteria?.P || rawPicoCriteria?.population || '',
  I: rawPicoCriteria?.I || rawPicoCriteria?.intervention || '',
  // ... C, O, S
};

const MODEL_NAME_MAP = {
  'DeepSeek-V3': 'deepseek-chat',
  'Qwen-Max': 'qwen-max',
  // ...
};

// LLM靚<4D>const screeningResult = await llmScreeningService.dualModelScreening(
  literature.id,
  literature.title,
  literature.abstract,
  picoCriteria,
  inclusionCriteria,
  exclusionCriteria,
  [models[0], models[1]],
  screeningConfig?.style || 'standard'
);

4. LLM<4C>滚𦛚撅?潃?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD>?蝏煺<E89D8F>LLM<4C><4D><EFBFBD><EFBFBD><EFBFBD>LLMFactory嚗?- <20>?<3F><EFBFBD>4銝芣芋<E88AA3><EFBFBD>DeepSeek, Qwen, GPT, Claude嚗?- <20>?Prompt<70><74><EFBFBD><EFBFBD>抅鈭擧芋<E693A7><EFBFBD>
  • <EFBFBD>?JSON閫<4E><E996AB><EFBFBD><EFBFBD><EFBFBD><E8BEB7><EFBFBD>銝剜<E98A9D>撘訫噡嚗?- <20>?Schema撉諹<E69289>嚗㇁JV嚗?- <20>?<3F>峕芋<E5B395>见僎銵諹<E98AB5><E8ABB9>?- <20>?<3F><EFBFBD>蝑偦<E89D91><EFBFBD>撟嗅<E6929F><E59785><EFBFBD>嚗?

<EFBFBD>喲睸隞<EFBFBD><EFBFBD>

// <20><>辣: backend/src/modules/asl/services/llmScreeningService.ts
// <20><EFBFBD><E8A9A8><EFBFBD>: LLM靚<4D>鍂 + JSON閫<4E><E996AB> + Schema撉諹<E69289>

async dualModelScreening(...) {
  const [result1, result2] = await Promise.all([
    this.screenWithModel(model1, ...),
    this.screenWithModel(model2, ...),
  ]);
  
  // <20><EFBFBD><EFBFBD>瘚页<E7989A><E9A1B5><EFBFBD>瘚醶onclusion嚗?  const hasConflict = result1.conclusion !== result2.conclusion;
  
  // <20><><EFBFBD><E89D8F>蝑?  let finalDecision = hasConflict ? 'pending' : result1.conclusion;
  
  return { deepseek: result1, qwen: result2, hasConflict, finalDecision };
}

5. <20><><EFBFBD><EFBFBD><EFBFBD><E48185><EFBFBD> - <20><EFBFBD>蝏𤘪<E89D8F> 潃?Week 4 <20><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD>?蝏蠘恣璁<E681A3><E79281><EFBFBD><EFBFBD><EFBFBD><E59A97>餅㺭<E9A485><E3BAAD>歇蝥喳<E89DA5><E596B3><EFBFBD><EFBFBD>㘾膄<E398BE><E88684><EFBFBD>憭齿瓲嚗?- <20>?敺<><E695BA><EFBFBD><EFBFBD>蝷綽<E89DB7>敶𤘪<E695B6><F0A498AA><EFBFBD><E884A9>嗆遬蝷綽<E89DB7>
  • <EFBFBD>?PRISMA<4D>㘾膄<E398BE><EFBFBD>蝏蠘恣嚗<E681A3><E59A97><EFBFBD>嗅㦛撅閧內嚗?- <20>?蝏𤘪<E89D8F><F0A498AA>𡑒”Tab嚗<62><E59A97><EFBFBD>?撌脩熙<E884A9>?撌脫<E6928C><E884AB>?敺<><E695BA><EFBFBD><EFBFBD>
  • <EFBFBD>?瘛瑕<E7989B><E79195><EFBFBD>銵冽聢嚗㇁I<E38781><EFBFBD> + 鈭箏極<E7AE8F><E6A5B5><EFBFBD><E89D8F>蝑吔<E89D91>
  • <EFBFBD>?<3F>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285>霂衣<E99C82><E8A1A3>斗鱏嚗<E9B18F><E59A97><E79285><EFBFBD>旿撖寞<E69296>嚗?- <20>?<3F><EFBFBD><E5AFA5>㗇𥋘銝𤾸紡<F0A4BEB8><EFBFBD>3蝘滚紡<E6BB9A>箸䲮撘𧶏<E69298>
  • <EFBFBD>?Excel撖澆枂嚗<E69E82><E59A97>蝡舐<E89DA1><E88890><EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>

瘛瑕<EFBFBD><EFBFBD><EFBFBD>霈曇恣

**<2A><EFBFBD><E8A9A8><EFBFBD>**嚗?- <20>𡒊<F0A1928A><EFBFBD>AI<41><EFBFBD><E5969F>䔶犖撌亙<E6928C>蝑?- <20>㘾膄<E398BE><EFBFBD><E7AC94><EFBFBD><EFBFBD>苊嚗<E88B8A><EFBFBD><EFBFBD><E4B9A9>曄內<E69B84><EFBFBD>嚗?- <20><EFBFBD><E59786><EFBFBD>蝑曉<E89D91>蝖殷<E89D96>4蝘滨𠶖<E6BBA8><F0A0B696><EFBFBD>

  • <EFBFBD>𣳇<EFBFBD><EFBFBD><EFBFBD>𤤿㦛

**銵冽聢<E586BD>𡑒挽霈?*嚗?| <20><EFBFBD> | 摰賢漲 | 霂湔<E99C82> | |------|------|------| | # | 50px | 摨誩噡 | | <20><><EFBFBD><E8AE83><EFBFBD> | 300px | <20><EFBFBD><E88890><EFBFBD><EFBFBD> | | AI<41><EFBFBD> | 100px | DS+QW<51>臬炏銝<E7828F><E98A9D>?| | <20>㘾膄<E398BE><EFBFBD> | 140px | <20><EFBFBD><E7AE84>曄內 | | 鈭箏極<E7AE8F><E6A5B5><EFBFBD><E89D8F>蝑?| 120px | <20><><EFBFBD>函蕃AI/銝垾I銝<49><E98A9D>?| | <20><EFBFBD>?| 90px | 4蝘滨𠶖<E6BBA8>?| | <20><EFBFBD> | 70px | 撅訫<E69285>/<2F>嗉絲 |

**<2A>餃捐摨?*嚗?70px嚗<78><E59A97><EFBFBD><EFBFBD>璅芸<E79285>皛𡁜𢆡嚗?

<EFBFBD>喲睸隞<EFBFBD><EFBFBD>

// <20><>辣: frontend-v2/src/modules/asl/pages/ScreeningResults.tsx
// <20><EFBFBD><E8A9A8><EFBFBD>: 蝏蠘恣撅閧內 + 瘛瑕<E7989B><E79195><EFBFBD>銵冽聢 + Excel撖澆枂

// 蝏蠘恣<E8A098>唳旿<E594B3><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA><EFBFBD><EFBFBD>
const { data: statsData } = useQuery({
  queryKey: ['projectStatistics', projectId],
  queryFn: () => aslApi.getProjectStatistics(projectId),
});

// Excel撖澆枂嚗<E69E82><E59A97><EFBFBD><EFBFBD>嚗𡁜<E59A97>蝡舐<E89DA1><E88890><EFBFBD><E7909C><EFBFBD>隞嗉氜<E59789><EFBFBD>
exportScreeningResults(data.items, {
  filter,
  projectName: `憿寧𤌍${projectId.slice(0, 8)}`,
});

6. 蝏蠘恣API 潃?Week 4 <20><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD>?<3F>𡒊垢<F0A1928A>𡁜<EFBFBD>蝏蠘恣嚗㇊risma撟嗉<E6929F><E59789>亥砭嚗?- <20>?蝏蠘恣<E8A098>餅㺭<E9A485><E3BAAD>歇蝥喳<E89DA5><E596B3><EFBFBD><EFBFBD>㘾膄<E398BE><E88684><EFBFBD>憭齿瓲<E9BDBF><E793B2><EFBFBD><EFBFBD><E89D92><EFBFBD>歇憭齿瓲
  • <EFBFBD>?<3F><><EFBFBD><EFBFBD>㘾膄<E398BE><EFBFBD><EFBFBD><E59A97>AI<41>斗鱏銝剜<E98A9D><E5899C><EFBFBD>
  • <EFBFBD>?霈∠<E99C88><E288A0><EFBFBD><EFBFBD><EFBFBD>瘥?- <20>?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢<F0A1928A>𡁜<EFBFBD><EFBFBD><E59A97>撠𤑳<E692A0>蝏靝<E89D8F>颲?

<EFBFBD>喲睸隞<EFBFBD><EFBFBD>

// <20><>辣: backend/src/modules/asl/controllers/screeningController.ts
// <20><EFBFBD><E8A9A8><EFBFBD>: 蝏蠘恣<E8A098>𡁜<EFBFBD> + <20>㘾膄<E398BE><EFBFBD><E7AC94><EFBFBD><EFBFBD>

// 潃?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>雿輻鍂Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗<E7A0AD>僎銵峕<E98AB5>銵䕘<E98AB5>
const [total, included, excluded, pending, conflict, reviewed] = 
  await Promise.all([
    prisma.aslScreeningResult.count({ where: { projectId } }),
    prisma.aslScreeningResult.count({ where: { projectId, finalDecision: 'include' } }),
    // ... <20><EFBFBD>撟嗉<E6929F><E59789>亥砭
  ]);

// 餈𥪜<E9A488>蝏蠘恣<E8A098>唳旿嚗<E697BF><E59A97>MB蝥折<E89DA5><E68A98>袁B蝥改<E89DA5>
return {
  total, included, excluded, pending, conflict, reviewed,
  exclusionReasons,
  includedRate, excludedRate, pendingRate,
};

<EFBFBD>𩤃<EFBFBD> 撌脩䰻<E884A9><EFBFBD>銝𡡞<E98A9D><F0A1A19E>?

1. <20><EFBFBD><E8A098>𣂼<EFBFBD>

  • <EFBFBD>𩤃<EFBFBD><><E99A9E><EFBFBD><EFBFBD>憸䀹<E686B8><EFBFBD><E996AC>蝑𨥈<E89D91><F0A8A588><EFBFBD>憭滨<E686AD><E6BBA8><EFBFBD><E88AB8>𡢅<EFBFBD>
  • <EFBFBD>𩤃<EFBFBD> 銝脰<E98A9D><EFBFBD><E686AD><EFBFBD><E59A97><EFBFBD><EFBFBD>𧒄<EFBFBD><EFBFBD><E6B8B2><EFBFBD>199蝭<39>漲30-60<36><30><EFBFBD>嚗?- <20>𩤃<EFBFBD> <20>牐遙<E78990><EFBFBD><E28AA5>?<3F>𡝗<EFBFBD><F0A19D97><EFBFBD>
  • <EFBFBD>𩤃<EFBFBD> <20>䭾鱏<E4ADBE>寧賒隡𩤃<E99AA1>銝剜鱏<E5899C>𡡞<EFBFBD><F0A1A19E>齿鰵撘<E9B0B5>憪页<E686AA>
  • <EFBFBD>𩤃<EFBFBD> <20><><EFBFBD>?0%嚗<><E59A97><EFBFBD>rompt隡睃<E99AA1>嚗?

2. <20><><EFBFBD><EFBFBD>箏𦛚

  • <EFBFBD>𩤃<EFBFBD> 瘚讛<E7989A><E8AE9B>刻郎<E588BB>𠺪<EFBFBD>setTimeout handler took >50ms<EFBFBD><EFBFBD><EFBFBD>隡睃<EFBFBD>嚗?- <20>𩤃<EFBFBD> <20>滨垢頧株砭嚗<E7A0AD>遣霈格㺿銝斡ebSocket嚗?- <20>𩤃<EFBFBD> 蝻箏<E89DBB><E7AE8F><EFBFBD>瘚贝<E7989A>嚗𠄌2E瘚贝<E7989A>嚗?- <20>𩤃<EFBFBD> Excel<65>𡒊垢撖澆枂隡睃<E99AA1><EFBFBD><E59A97><EFBFBD>唳旿<E594B3>?5000<30>⊥𧒄嚗?

3. <20><EFBFBD>雿㯄<E99BBF>

  • <EFBFBD>𩤃<EFBFBD> <20>牐摯霈<E99C88>雿蹱𧒄<E8B9B1>?- <20>𩤃<EFBFBD> <20><EFBFBD><E683A9><EFBFBD><E6BB9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憸䀹遬蝷?- <20>𩤃<EFBFBD> <20><EFBFBD>靽格㺿<E6A0BC><EFBFBD><E5969F><EFBFBD><E8A098><EFBFBD><E88AB8>?

4. <20>煺漣<E785BA><EFBFBD><E887AC>芸停蝏?- <20>𩤃<EFBFBD> 雿輻鍂暺䁅恕瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>霈方<E99C88>嚗?- <20>𩤃<EFBFBD> <20><EFBFBD><E4ADBE><EFBFBD><E888AB><EFBFBD><EFBFBD>郊隞餃𦛚嚗?- <20>𩤃<EFBFBD> <20>𣳇<EFBFBD>霂舫<E99C82>霂閙㦤<E99699>?- <20>𩤃<EFBFBD> <20><EFBFBD><E4ADBE>祆綉<E7A586><EFBFBD>API靚<49>鍂嚗?- <20>𩤃<EFBFBD> <20><EFBFBD><E588A0><EFBFBD><E689B9>𡃏郎

**霂衣<E99C82><E8A1A3><EFBFBD><EFBFBD><EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>**嚗靀<E59A97><E99D80><EFBFBD><EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>](./06-<2D><><EFBFBD><EFBFBD>箏𦛚/<2F><><EFBFBD><EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md)


<EFBFBD><EFBFBD> 敹恍<E695B9><EFBFBD><E785BA>𧢲<EFBFBD><F0A7A2B2>?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

Node.js: v22.18.0+
PostgreSQL: 16+
npm: 10+

1. <20><EFBFBD><E598A5>𡝗㺭<F0A19D97><EFBFBD>

cd backend
npm install
npx prisma generate
npx prisma migrate dev

2. <20>滨蔭<E6BBA8><EFBFBD><E887AC><EFBFBD>

<EFBFBD>𥕦遣 backend/.env:

# <20>唳旿摨?DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=asl_schema"

# LLM API撖<49>𤨎
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxx
QWEN_API_KEY=sk-xxxxxxxxxxxxxx

# <20><EFBFBD>?GPT_API_KEY=sk-xxxxxxxxxxxxxx
CLAUDE_API_KEY=sk-xxxxxxxxxxxxxx

3. <20>臬𢆡<E887AC>𡒊垢

cd backend
npm run dev

摨磰砲<EFBFBD><EFBFBD>嚗?``` <0A>?Fastify server listening on http://0.0.0.0:3001 <0A>?Database connected <0A>?ASL module routes registered at /api/v1/asl


### 4. <20>臬𢆡<E887AC>滨垢

```bash
cd frontend-v2
npm install
npm run dev

摨磰砲<EFBFBD><EFBFBD>嚗?``` VITE v5.x.x ready in xxx ms <0A>? Local: http://localhost:3000


### 5. 瘚贝<E7989A><EFBFBD><E7989A>

1. 霈輸䔮 `http://localhost:3001`
2. <20>孵稬憿園<E686BF> **"AI<41><EFBFBD><E7AE84><EFBFBD>讃"**
3. <20>芸𢆡頝唾蓮<E594BE>?**"霈曄蔭銝𤾸鍳<F0A4BEB8>?**
4. 憛怠<E6869B>PICOS<4F><53><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>霂閙㺭<E99699><EFBFBD>
5. 銝贝蝸Excel璅⊥踎嚗<E8B88E><E59A97>雿輻鍂<E8BCBB><EFBFBD>嚗?6. 銝𠹺<E98A9D>Excel嚗<6C>遣霈桀<E99C88>瘚贝<E7989A>5蝭<35><E89DAD>
7. <20>孵稬 **"撘<>憪𧘹I<F0A798B9><EFBFBD>"**
8. 蝑匧<E89D91>10-100蝘𡜐<E89D98><F0A19C90><EFBFBD>鈭擧<E988AD><E693A7>格㺭嚗?9. <20><EFBFBD> **"摰⊥瓲撌乩<E6928C><E4B9A9>?**
10. <20>孵稬<E5ADB5><E7A8AC><EFBFBD>撅訫<E69285><E8A8AB><EFBFBD><EFBFBD>旿
11. <20>孵稬"憭齿瓲"<22>𣂷漱鈭箏極<E7AE8F><EFBFBD>

### 6. <20><EFBFBD><E4BAA6>𡒊垢<F0A1928A><EFBFBD>

<EFBFBD><EFBFBD><>憪讠<E686AA>摰掹LM蝑偦<E89D91>? 隞餃𦛚ID: xxx <0A><><EFBFBD>? 5 璅<E79285><EFBFBD><E59A97><EFBFBD><E692A0>嚗? [ 'deepseek-chat', 'qwen-max' ] PICOS-P: 2<><EFBFBD>撠輻<E692A0><E8BCBB><EFBFBD><EFBFBD>?..

<EFBFBD>?<3F><>讃 1/5 憭<><E686AD><EFBFBD>𣂼<EFBFBD> DS: include / Qwen: exclude <0A><EFBFBD>: <20>?```


<EFBFBD>妒 瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>

1. LLM韐券<E99F90>瘚贝<E7989A>

cd backend

# <20><EFBFBD>1: 雿輻鍂瘚贝<E7989A><E8B49D>𡁏𧋦
npm run test:llm

# <20><EFBFBD>2: <20>湔𦻖餈鞱<E9A488>
npx ts-node scripts/test-llm-screening.ts

瘚贝<EFBFBD><EFBFBD>唳旿嚗?- 雿滨蔭嚗䫤backend/scripts/test-samples/asl-test-literatures.json`

  • <EFBFBD><EFBFBD>嚗?0蝭<30><E89DAD>6蝭<36><E89DAD><EFBFBD>㘾膄嚗?蝭<><E89DAD>蝥喳<E89DA5>嚗?蝭<><EFBFBD><EFBFBD>
  • PICOS嚗锭GLT2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頂蝏毺遞餈? <EFBFBD><EFBFBD>颲枏枂嚗? <20><><EFBFBD>? 60% 銝<><E98A9D><EFBFBD>: 70-100% JSON撉諹<E69289><E8ABB9>? 100% 撟喳<E6929F><E596B3>埈𧒄: 10-15蝘?蝭?

2. API瘚贝<E7989A>

# <20>𥕦遣憿寧𤌍
curl -X POST http://localhost:3001/api/v1/asl/projects \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "瘚贝<E7989A>憿寧𤌍",
    "picoCriteria": {"P":"<22>𣂷犖","I":"<22><EFBFBD>A","C":"摰㗇<E691B0><E39787>?,"O":"蝏枏<E89D8F>","S":"RCT"},
    "inclusionCriteria": "<22><EFBFBD>",
    "exclusionCriteria": "蝏潸膩"
  }'

# <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”
curl http://localhost:3001/api/v1/asl/projects

3. <20>滨垢E2E瘚贝<E7989A>

**<2A>见𢆡瘚贝<E7989A><EFBFBD><E79A9C>**嚗?- [ ] PICOS銵典<E98AB5><E585B8>𣂷漱

  • Excel璅⊥踎銝贝蝸
  • Excel<EFBFBD><EFBFBD>辣銝𠹺<EFBFBD><EFBFBD>迤撣賂<EFBFBD>
  • Excel<EFBFBD><EFBFBD>辣銝𠹺<EFBFBD><EFBFBD><EFBFBD>霂舀聢撘𧶏<EFBFBD>
  • <EFBFBD><EFBFBD>讃憸<EFBFBD><EFBFBD><EFBFBD>曄內
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷉OI嚗?- [ ] <20>臬𢆡AI<41><EFBFBD>
  • 餈𥕦漲<EFBFBD>⊥凒<EFBFBD>?- [ ] <20>芸𢆡頝唾蓮
  • 銵冽聢<EFBFBD>曄內
  • <EFBFBD><EFBFBD>摨?- [ ] 蝑偦<E89D91>凤ab<61><62>
  • 撅訫<EFBFBD>銵?- [ ] 憭齿瓲Drawer
  • <EFBFBD>𣂷漱憭齿瓲

4. <20>唳旿摨㯄<E691A8>霂?

-- <20><EFBFBD><E4BAA6><EFBFBD><EFBFBD>圈★<E59C88>?SELECT * FROM asl_schema.screening_projects 
ORDER BY created_at DESC LIMIT 1;

-- <20><EFBFBD>蝑偦<E89D91>劐遙<E58A90>?SELECT * FROM asl_schema.screening_tasks 
WHERE project_id = 'xxx';

-- <20><EFBFBD>蝑偦<E89D91><EFBFBD><E58EA9>?SELECT 
  id, 
  ds_conclusion, 
  qwen_conclusion, 
  conflict_status,
  SUBSTRING(ds_p_evidence, 1, 50) as ds_evidence
FROM asl_schema.screening_results 
WHERE project_id = 'xxx'
LIMIT 5;

<EFBFBD><EFBFBD><><E69298>𤏸<EFBFBD><F0A48FB8>?

1. 隞<><E99A9E>憌擧聢

TypeScript

// 雿輻鍂<E8BCBB>亙藁<E4BA99><EFBFBD>蝐餃<E89D90><E9A483><EFBFBD><EFBFBD>笆憭䨝PI嚗?export interface ScreeningResult { ... }

// 銝交聢蝐餃<E89D90><EFBFBD><E79289>?const picoCriteria: PicoCriteria = { ... };

// 雿輻鍂<E8BCBB><EFBFBD>厰曎<E58EB0>𣬚征<F0A3AC9A><EFBFBD>撟?const models = config?.models ?? ['deepseek-chat', 'qwen-max'];

React

// 雿輻鍂<E8BCBB>賣㺭蝏<E3BAAD>export function ScreeningWorkbench() { ... }

// <20><EFBFBD>銋鵎ook<6F><EFBFBD>隞只se撘<65>憭?export function useScreeningTask() { ... }

// Props<70>亙藁<E4BA99><EFBFBD>隞仙rops蝏枏偏
interface ScreeningWorkbenchProps { ... }

2. <20><EFBFBD>蝥血<E89DA5>

<EFBFBD><EFBFBD><EFBFBD>? PascalCase (蝏<>辣) <20>?camelCase (撌亙<E6928C>)
  <20>?ScreeningWorkbench.tsx
  <20>?excelUtils.ts

蝏<><EFBFBD>? PascalCase
  <20>?function DetailReviewDrawer()

<0A><EFBFBD>/<2F>賣㺭: camelCase
  <20>?const screeningResult = ...
  <20>?function processLiteratures()

撣賊<E692A3>: UPPER_SNAKE_CASE
  <20>?const MODEL_NAME_MAP = ...

蝐餃<E89D90>/<2F>亙藁: PascalCase
  <20>?interface ScreeningResult

3. 瘜券<E7989C><EFBFBD><E996AB>

/**
 * 蝑偦<E89D91>劐遙<E58A90>∟蔭霂ook
 * 
 * @param projectId - 憿寧𤌍ID
 * @param pollingInterval - 頧株砭<E6A0AA><EFBFBD><EFBFBD>神蝘𡜐<E89D98>嚗屸<E59A97>霈?000
 * @returns 隞餃𦛚<E9A483><EFBFBD><E59786><EFBFBD>餈𥕦漲靽⊥<E99DBD>
 */
export function useScreeningTask() { ... }

// <20>圲 靽桀<E99DBD>嚗𡁜<E59A97>畾萄<E795BE><E89084><EFBFBD><EFBFBD><E59A97>蝡舀聢撘?<3F>?LLM<4C><EFBFBD>嚗?const picoCriteria = { ... };

// <20>𩤃<EFBFBD> 瘜冽<E7989C>嚗𡁜<E59A97><E79285><E288AA>臬僎銵<E5838E><E98AB5><EFBFBD>?await Promise.all([...]);

4. <20>躰秤憭<E7A7A4><E686AD>

// <20>𡒊垢
try {
  const result = await llmScreeningService.dualModelScreening(...);
} catch (error) {
  logger.error('Failed to process literature', {
    literatureId: literature.id,
    error: error instanceof Error ? error.message : 'Unknown error',
    stack: error instanceof Error ? error.stack : undefined,
  });
  // 颲枏枂<E69E8F>唳綉<E594B3>嗅蝱
  console.error('\n<>?<3F><>讃憭<E8AE83><E686AD>憭梯揖:', error);
}

// <20>滨垢
try {
  await aslApi.createProject(...);
} catch (error) {
  message.error(`<60><EFBFBD>憭梯揖: ${(error as Error).message}`);
}

5. Git<69>𣂷漱閫<E6BCB1><E996AB>

<EFBFBD>萄儐 Git<EFBFBD>𣂷漱閫<EFBFBD><EFBFBD>嚗?

feat: 瘛餃<E7989B>摰⊥瓲撌乩<E6928C><E4B9A9><EFBFBD>摨行遬蝷箔<E89DB7><E7AE94>?fix: 靽桀<E99DBD><E6A180>𡑒”<F0A19192>曄內憿箏<E686BF><E7AE8F><EFBFBD><E6BB9A><EFBFBD>
refactor: <20>齿<EFBFBD>摮埈挾<E59F88><EFBFBD><E683A9><EFBFBD>
docs: <20>湔鰵璅<E79285><E288AA><EFBFBD><E59786><EFBFBD>獢?test: 瘛餃<E7989B>LLM蝑偦<E89D91>㕑捶<E39591>𤩺<EFBFBD>霂?chore: <20>湔鰵靘肽<E99D98><E882BD><EFBFBD>𧋦

<EFBFBD><EFBFBD> <20><EFBFBD><E8A9A8><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  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>
  2. API霈曇恣閫<EFBFBD><EFBFBD>嚗𡁏𦻖<EFBFBD><EFBFBD><EFBFBD>銋?4. [撘<><E69298>𤏸恣<F0A48FB8>哋(./04-撘<><E69298>𤏸恣<F0A48FB8>?03-隞餃𦛚<E9A483><F0A69B9A>圾.md)嚗𡁜<E59A97><F0A1819C><EFBFBD><E8B3A3><EFBFBD><E99C88>

<EFBFBD><EFBFBD>𤏸扇敶?

<EFBFBD><EFBFBD>憭滨<EFBFBD>:

  • [2025-11-22 Day2-Day3 LLM<4C>滚𦛚銝𡡞<E98A9D><EFBFBD>頂蝏笔<E89D8F><E7AC94>𩬅(./05-撘<><E69298>𤏸扇敶?2025-11-22_Day2-Day3_LLM<4C>滚𦛚銝𡡞<E98A9D><EFBFBD>頂蝏笔<E89D8F><E7AC94>?md) 潃?**<2A><><EFBFBD>?*

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

瘚贝<EFBFBD><EFBFBD><EFBFBD>


<EFBFBD>働 撘<><E69298>穃遣霈?

撖寞鰵撘<EFBFBD><EFBFBD>睲犖<EFBFBD>?

  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>
  3. <EFBFBD><EFBFBD>粉Prompt嚗𡁶<EFBFBD>ΙLM憒<EFBFBD><EFBFBD>撌乩<EFBFBD>

撖農I<EFBFBD><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>
  2. <EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD>唳旿嚗帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>典㦤<EFBFBD>?4. **璉<><E79289><EFBFBD>畾菜<E795BE>撠?*嚗𡁏釣<F0A1818F><EFBFBD><E8AAA9>𡒊垢<F0A1928A><EFBFBD>撌桀<E6928C>
  3. **<2A><><EFBFBD>𣂼<EFBFBD>**嚗帋<E59A97><EFBFBD>㗁霂箸𧊋摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD>?

撣貉<EFBFBD><EFBFBD>琿𩐠

  1. <EFBFBD>?**PICOS<4F><EFBFBD>瘛瑟<E7989B>**嚗𡁜<E59A97>蝡舐鍂P/I/C/O/S嚗䔶<E59A97><E494B6>皰opulation/intervention
  2. <EFBFBD>?<EFBFBD><EFBFBD>滨妍<EFBFBD>躰秤嚗𡁜<EFBFBD>蝡舐鍂DeepSeek-V3嚗淾PI<50>牡eepseek-chat
  3. <EFBFBD>?蝏𤘪<EFBFBD><EFBFBD>亥砭<EFBFBD>嗆㦤嚗帋遙<EFBFBD>⊥𧊋摰峕<EFBFBD><EFBFBD>嗆䰻霂<EFBFBD><EFBFBD>靝蛹蝛?4. <20>?頧株砭<EFBFBD><EFBFBD><EFBFBD>嚗𡁶鍂<EFBFBD><EFBFBD><EFBFBD>
  4. <EFBFBD>?**<2A><>讃蝻箏<E89DBB><E7AE8F><EFBFBD>**嚗匁LM靚<4D>鍂隡𡁜仃韐?

<EFBFBD><EFBFBD> <20><EFBFBD><E689AF><EFBFBD><EFBFBD><EFBFBD><E59A97>瘚页<E7989A>

<EFBFBD><EFBFBD><EFBFBD>笔漲

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃: 10-20蝘𡜐<E89D98>DeepSeek + Qwen撟嗉<E6929F>嚗?5蝭<35><E89DAD><EFBFBD>? 50-100蝘?20蝭<30><E89DAD><EFBFBD>? 200-400蝘𡜐<E89D98>3-7<><37><EFBFBD>嚗?199蝭<39><E89DAD><EFBFBD>? 2000-4000蝘𡜐<E89D98>33-66<36><36><EFBFBD>嚗?```

### <20><><EFBFBD><EFBC86><EFBFBD>v1.0.0-MVP嚗?```
<0A><><EFBFBD>? 60%
銝<><E98A9D><EFBFBD>: 70-100%
JSON撉諹<E69289><E8ABB9>? 100%
<0A><>鈭箏極憭齿瓲<E9BDBF>? 20-30%嚗<><E59A97><EFBFBD><E89D92>

<EFBFBD>滨垢<EFBFBD><EFBFBD>

頧株砭<EFBFBD><EFBFBD>: 1蝘?<3F>唳旿<E594B3>湔鰵撱嗉<E692B1>: <1蝘?銵冽聢皜脫<E79A9C>: <100ms嚗?0<>∟扇敶𤏪<E695B6>
Drawer<65><EFBFBD>: <50ms

<EFBFBD>唳旿摨𤘪<EFBFBD><EFBFBD>

憿寧𤌍<EFBFBD>𥕦遣: <50ms
<0A><>讃撖澆<E69296>嚗?99蝭<39><E89DAD>: <500ms
蝑偦<E89D91><EFBFBD><E58EA9>𨀣䰻霂<E99C82><EFBD87><EFBFBD>△嚗? <100ms
餈𥕦漲<F0A595A6>湔鰵: <50ms

<EFBFBD>㴓 銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>?

敶枏<EFBFBD>Sprint嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑㛈VP嚗?1. <20><EFBFBD><EFBFBD>憭滨<EFBFBD> Day 4嚗𡁏鸌憭<EFBFBD><EFBFBD>隞餃𦛚<EFBFBD>滚𦛚嚗<EFBFBD><EFBFBD>銵䔶葉嚗?2. <20>?<EFBFBD><EFBFBD>憭滨<EFBFBD> Day 5嚗𡁜<EFBFBD>蝡狹I撘<EFBFBD><EFBFBD>𡢅<EFBFBD><EFBFBD><EFBFBD>憪页<EFBFBD>

  1. <EFBFBD>?<EFBFBD><EFBFBD>憭滨<EFBFBD> Day 6嚗鋫PI<EFBFBD><EFBFBD><EFBFBD>銝舘<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憪页<EFBFBD>

<EFBFBD><EFBFBD>隡睃<EFBFBD><EFBFBD><EFBFBD>憸䀹<EFBFBD><EFBFBD><EFBFBD>蝑𨥈<EFBFBD>

  1. <EFBFBD>?Prompt隡睃<E99AA1><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>蝖桃<E89D96><E6A183>?5%+嚗?2. <20>?瘛餃<E7989B>隞餃𦛚<E9A483><F0A69B9A><EFBFBD>/<2F>𡝗<EFBFBD><F0A19D97><EFBFBD>
  2. <EFBFBD>?摰䂿緵撟嗅<E6929F><EFBFBD><E686AD>嚗?-5銝芸僎<E88AB8>𡢅<EFBFBD>
  3. <EFBFBD>?瘛餃<E7989B>隡啗恣<E59597><EFBFBD><E68B90>園𡢿<E59C92>曄內

銝剜<EFBFBD>嚗㇈onth 2嚗?1. <20><20><EFBFBD>憭滨<E686AD><E6BBA8><EFBFBD><EFBFBD><E59A97><EFBFBD>睲葉嚗?2. <20>?<3F><EFBFBD><E586BD>唳旿<E594B3>𣂼<EFBFBD><F0A382BC><EFBFBD>

  1. <EFBFBD>?<3F><EFBFBD><E586BD><EFBFBD>銋㕑器<E39591><EFBFBD><E5B395>?4. <20>?WebSocket摰墧𧒄<E5A2A7><EFBFBD>?

<EFBFBD><EFBFBD>嚗㇈onth 3+嚗?1. <20>?憭𡁶鍂<F0A181B6>瑟𣈲<E7919F><F0A388B2><EFBFBD><EFBFBD><EFBFBD>霈方<E99C88>嚗?2. <20>?瘨<><E798A8><EFBFBD><EFBFBD>嚗㇂ull/RabbitMQ嚗?3. <20>?<3F><><EFBFBD>撘誩<E69298><E8AAA9>?4. <20>?<3F>鞉𧋦<E99E89><EFBFBD><E689B9>𣬚<EFBFBD><F0A3AC9A>?


**<2A><>﹝蝏湔擪<E6B994>?*嚗鋫I<E98BAB><EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? **<2A>湔鰵<E6B994><EFBFBD>**嚗𡁏<E59A97>銝芷<E98A9D><EFBFBD><E996AC><EFBFBD><EFBFBD><E8B3A2>𣂼<EFBFBD><F0A382BC>湔鰵
**<2A><EFBFBD><E6BCA4><EFBFBD>**嚗𡁏<E59A97>鈭儿ssue<75>鞛ull Request


**<2A><><EFBFBD>擧凒<E693A7>?*嚗?025-11-22嚗<32><E59A97><EFBFBD><EFBFBD><EFBFBD>蝑?Day 2-3摰峕<E691B0>嚗? **<2A><><EFBFBD><EFBFBD>?*嚗尠<E59A97> <20>齿<EFBFBD><E9BDBF><EFBFBD><E7AC94><EFBFBD>? 銝𧢲活<EFBFBD>湔鰵<EFBFBD>嗆㦤嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑㛈VP摰峕<EFBFBD> <20>?<3F><><EFBFBD><EFBFBD><EFBFBD>Prompt隡睃<E99AA1>摰峕<E691B0>

<EFBFBD>祆活<EFBFBD>湔鰵<EFBFBD><EFBFBD>嚗ǒ1.1嚗㚁<EFBFBD>

  • <EFBFBD>?<3F>湔鰵敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD><EFBFBD><EFBFBD><E595A3><EFBFBD>憭滨<E686AD><EFBFBD><E69298>𤏸<EFBFBD>摨佗<E691A8>
  • <EFBFBD>?<3F>湔鰵<E6B994>喲睸<E596B2>𣬚<EFBFBD>蝣𡢅<E89DA3>Day 2-3摰峕<E691B0>嚗?- <20>?<3F><EFBFBD><E595A3>𡒊垢隞<E59EA2><E99A9E>蝏𤘪<E89D8F>嚗Ếommon撅?+ fulltext-screening撅<67><E69285>
  • <EFBFBD>?<3F><EFBFBD><EFBFBD><E69298>𤏸扇敶閖曎<E99696><EFBFBD>Day 2-3撌乩<E6928C><E4B9A9><EFBFBD>嚗?- <20>?<3F>湔鰵銝衤<E98A9D>甇亙<E79487><E4BA99>𤏸恣<F0A48FB8>𡜐<EFBFBD>敶枏<E695B6>Sprint嚗?