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%)
17 KiB
Day 4寮€鍙戣<E98D99>褰曪細鏁版嵁搴撹<E690B4>璁′笌鎵瑰<E98EB5>鐞嗘湇鍔″紑鍙?
鏃ユ湡锛?025-11-23
**寮€鍙戣€?*锛欰SL寮€鍙戝洟闃? **闃舵<E99783>**锛氬叏鏂囧<E98F82>绛汳VP - Day 4
**鐘舵€?*锛氣渽 宸插畬鎴?
馃搵 寮€鍙戠洰鏍?
Day 4涓婂崍锛氬畬鎴愭暟鎹<EFBFBD>簱璁捐<EFBFBD>涓庤縼绉? Day 4涓嬪崍锛氬紑鍙戞壒澶勭悊鏈嶅姟锛團ulltextScreeningService锛?
鉁?Day 4涓婂崍锛氭暟鎹<E69A9F>簱璁捐<E79281>涓庤縼绉?
1. Schema璁捐<E79281>
1.1 淇<>敼 AslLiterature 琛?
鏂板<EFBFBD>13涓<EFBFBD>叏鏂囧<EFBFBD>绛涚浉鍏冲瓧娈碉細
鏂囩尞鐢熷懡鍛ㄦ湡锛?
stage- 闃舵<E99783>鏍囪<E98F8D>锛坕mported/title_screened/fulltext_pending/fulltext_screened锛?
PDF绠$悊锛?
has_pdf- 鏄<>惁鏈塒DFpdf_storage_type- 瀛樺偍绫诲瀷锛坥ss/dify/local锛?pdf_storage_ref- 瀛樺偍寮曠敤pdf_status- 鐘舵€侊紙pending/extracting/completed/failed锛?pdf_uploaded_at- 涓婁紶鏃堕棿
**鍏ㄦ枃绠$悊锛堜簯鍘熺敓锛?*锛?
full_text_storage_type- 瀛樺偍绫诲瀷锛坥ss/dify锛?full_text_storage_ref- 瀛樺偍寮曠敤full_text_url- 璁块棶URL
**鍏ㄦ枃鍏冩暟鎹?*锛?
full_text_format- 鏍煎紡锛坢arkdown/plaintext锛?full_text_source- 鎻愬彇鏂瑰紡锛坣ougat/pymupdf锛?full_text_token_count- Token鏁伴噺full_text_extracted_at- 鎻愬彇鏃堕棿
璁捐<EFBFBD>浜<EFBFBD>偣锛?
- 鉁?**浜戝師鐢熸灦鏋?*锛氬叏鏂囧瓨鍌ㄥ湪OSS/Dify锛屾暟鎹<E69A9F>簱鍙<E7B0B1>瓨寮曠敤
- 鉁?绗﹀悎瑙勮寖锛氶伒寰<EFBFBD>€婁簯鍘熺敓寮€鍙戣<EFBFBD>鑼冦€嬶紝涓嶅湪鏁版嵁搴撳瓨鍌ㄥぇ鏂囨湰
- 鉁?**鍙<>墿灞曟€?*锛氭敮鎸佸<E98EB8>绉嶅瓨鍌ㄦ柟寮忕殑閫傞厤鍣ㄦā寮?
1.2 鏂板缓 AslFulltextScreeningTask 琛?
浠诲姟绠$悊琛<EFBFBD>紝瀛楁<EFBFBD>鍖呮嫭锛?
- 鍩虹<EFBFBD>淇℃伅锛歚id
,project_id` - 妯″瀷閰嶇疆锛歚model_a
,model_b,prompt_version` - 杩涘害璺熻釜锛歚total_count
,processed_count,success_count,failed_count,degraded_count` - 鎴愭湰缁熻<EFBFBD>锛歚total_tokens
,total_cost` - 鐘舵€佺<EFBFBD>鐞嗭細
status,started_at,completed_at,estimated_end_at - 閿欒<EFBFBD>璁板綍锛歚error_message
,error_stack`
璁捐<EFBFBD>浜<EFBFBD>偣锛?
- 鉁?瀹炴椂杩涘害锛氭敮鎸佸墠绔<EFBFBD>疆璇<EFBFBD>换鍔¤繘搴?
- 鉁?鎴愭湰璺熻釜锛氱疮璁<EFBFBD>oken鍜岃垂鐢?
- 鉁?棰勪及鏃堕棿锛氬姩鎬佽<EFBFBD>绠楀墿浣欐椂闂?
1.3 鏂板缓 AslFulltextScreeningResult 琛?
缁撴灉瀛樺偍琛<EFBFBD>紙12瀛楁<EFBFBD>妯℃澘锛夛紝瀛楁<EFBFBD>鍖呮嫭锛?
- **鍙屾ā鍨嬬粨鏋?*锛歁odel A (DeepSeek-V3) 鍜?Model B (Qwen-Max) 鐨勫畬鏁磋緭鍑?
- 楠岃瘉缁撴灉锛氬尰瀛﹂€昏緫楠岃瘉銆佽瘉鎹<EFBFBD>摼楠岃瘉
- **鍐茬獊妫€娴?*锛氬瓧娈电骇鍐茬獊瀵规瘮銆佷紭鍏堢骇鎺掑簭
- 浜哄伐澶嶆牳锛氭渶缁堝喅绛栥€佹帓闄ゅ師鍥犮€佸<EFBFBD>鏍哥瑪璁?
- **鍙<>拷婧<E68BB7>€?*锛氬師濮嬭緭鍑恒€丳rompt鐗堟湰銆佸<E98A86>鐞嗘椂闂?
璁捐<EFBFBD>浜<EFBFBD>偣锛?
- 鉁?JSONB瀛樺偍锛?2瀛楁<E7809B>鐏垫椿瀛樺偍锛屾敮鎸侀珮鏁堟煡璇?
- 鉁?**鍙屾ā鍨嬪<E98DA8>姣?*锛氬畬鏁翠繚瀛樹袱涓<E8A2B1>ā鍨嬬殑杈撳嚭
- 鉁?**鍐茬獊浼樺厛绾?*锛氳嚜鍔ㄨ<E98D94>绠梤eview_priority锛?-100锛?
- 鉁?**鍙<><E98D99>璁?*锛氫繚鐣檙aw_output锛屽彲杩芥函LLM鍘熷<E98D98>鍝嶅簲
2. 杩佺Щ绛栫暐
2.1 闂<><E99782>璇嗗埆
鍦ㄨ縼绉昏繃绋嬩腑鍙戠幇锛?
- 鈿狅笍 鍘嗗彶閬楃暀闂<E69A80><E99782>锛氶儴鍒嗘ā鍧楃殑琛ㄥ垱寤哄湪
publicschema - 鉁?ASL妯″潡鏁版嵁瀹屽叏姝g‘锛氭墍鏈夎〃閮藉湪
asl_schema - 鈿狅笍 Prisma Migrate浼氬皾璇曞垹闄?
public涓<>殑閲嶅<E996B2>琛?
2.2 瑙e喅鏂规<E98F82>锛氭墜鍔⊿QL杩佺Щ
绛栫暐锛氫娇鐢ㄦ墜鍔⊿QL鑴氭湰锛屽彧鎿嶄綔 asl_schema锛屼笉褰卞搷鍏朵粬妯″潡
-- 鍙<>搷浣渁sl_schema锛屼笉褰卞搷鍏朵粬schema
ALTER TABLE asl_schema.literatures ADD COLUMN IF NOT EXISTS ...;
CREATE TABLE IF NOT EXISTS asl_schema.fulltext_screening_tasks (...);
CREATE TABLE IF NOT EXISTS asl_schema.fulltext_screening_results (...);
**鎵ц<E98EB5>**锛?
Get-Content manual_fulltext_screening.sql | docker exec -i ai-clinical-postgres psql ...
楠岃瘉锛?
\dt asl_schema.*
-- 缁撴灉锛?涓<>〃
-- 鉁?literatures (宸叉洿鏂?
-- 鉁?screening_projects
-- 鉁?screening_tasks
-- 鉁?screening_results
-- 鉁?fulltext_screening_tasks (鏂板缓)
-- 鉁?fulltext_screening_results (鏂板缓)
2.3 Schema闅旂<E99785>楠岃瘉
**妫€鏌ョ粨鏋?*锛?
- 鉁?ASL妯″潡鎵€鏈?涓<>〃閮藉湪
asl_schema - 鉁?鏃犳暟鎹<E69A9F>硠婕忓埌
publicschema - 鉁?澶栭敭绾︽潫鍏ㄩ儴鎸囧悜
asl_schema鍐呴儴 - 鉁?Prisma Model姝g‘鏄犲皠锛坄@@schema("asl_schema")`锛?
**鐩稿叧鏂囨。**锛?
- [鏁版嵁搴撹縼绉荤姸鎬佽<E98EAC>鏄嶿(./2025-11-23_鏁版嵁搴撹縼绉荤姸鎬佽<E98EAC>鏄?md)
- [鏁版嵁搴撹<E690B4>璁℃枃妗<E69E83>(../02-鎶€鏈<E282AC><E98F88>璁?01-鏁版嵁搴撹<E690B4>璁?md)
3. 浜у嚭
- 鉁?Prisma Schema鏇存柊锛?涓<>ā鍨嬶級
- 鉁?鎵嬪姩SQL杩佺Щ鑴氭湰锛?41琛岋級
- 鉁?鏁版嵁搴撹縼绉荤姸鎬佽<E98EAC>鏄庢枃妗o紙435琛岋級
- 鉁?鏁版嵁搴撹<E690B4>璁℃枃妗f洿鏂帮紙v3.0锛?
- 鉁?妯″潡鐘舵€佹枃妗f洿鏂帮紙v1.2锛?
鉁?Day 4涓嬪崍锛氭壒澶勭悊鏈嶅姟寮€鍙?
1. 鏍稿績鏈嶅姟锛欶ulltextScreeningService
1.1 鏈嶅姟鑱岃矗
| 鑱岃矗 | 璇存槑 |
|---|---|
| 浠诲姟璋冨害 | 鎵归噺澶勭悊鏂囩尞锛屽苟鍙戞帶鍒? |
| 鏈嶅姟闆嗘垚 | 璋冪敤LLM鏈嶅姟銆侀獙璇佸櫒銆佸啿绐佹<EFBFBD>娴? |
| 杩涘害璺熻釜 | 瀹炴椂鏇存柊浠诲姟杩涘害锛岃<EFBFBD>绠楅<EFBFBD>浼版椂闂? |
| 瀹归敊澶勭悊 | 閲嶈瘯鏈哄埗銆侀檷绾фā寮忋€侀敊璇<EFBFBD><EFBFBD>褰? |
| *鏁版嵁鎸佷箙鍖? | 淇濆瓨澶勭悊缁撴灉鍒版暟鎹<EFBFBD>簱 |
1.2 鏍稿績鏂规硶
1. createAndProcessTask() - 浠诲姟鍒涘缓鍏ュ彛
async createAndProcessTask(
projectId: string,
literatureIds: string[],
config: FulltextScreeningConfig
): Promise<string>
鍔熻兘锛?
- 楠岃瘉椤圭洰鍜屾枃鐚<EFBFBD>暟鎹?
- 鍒涘缓浠诲姟璁板綍
- 鍚<EFBFBD>姩鍚庡彴澶勭悊锛堜笉绛夊緟瀹屾垚锛?
- 杩斿洖浠诲姟ID
2. processTaskInBackground() - 鍚庡彴鎵瑰<E98EB5>鐞嗛€昏緫
private async processTaskInBackground(
taskId: string,
literatures: any[],
project: any,
config: FulltextScreeningConfig
): Promise<void>
鍔熻兘锛?
- 鏇存柊浠诲姟鐘舵€佷负"杩愯<E69DA9>涓?
- 鏋勫缓PICOS涓婁笅鏂?
- 浣跨敤
p-queue瀹炵幇骞跺彂鎺у埗锛堥粯璁ゅ苟鍙?锛? - 璋冪敤
screenLiteratureWithRetry()澶勭悊姣忕瘒鏂囩尞 - 绱<EFBFBD><EFBFBD>缁熻<EFBFBD>锛坰uccess/failed/degraded/tokens/cost锛?
- 鏍囪<EFBFBD>浠诲姟瀹屾垚
*3. screenLiteratureWithRetry() - 鍗曠瘒澶勭悊锛堝甫閲嶈瘯锛?
private async screenLiteratureWithRetry(
taskId: string,
projectId: string,
literature: any,
picosContext: any,
config: FulltextScreeningConfig
): Promise<SingleLiteratureResult>
鍔熻兘锛?
- 鏈€澶氶噸璇?娆★紙鍙<E7B499>厤缃<E58EA4>級
- 鎸囨暟閫€閬跨瓥鐣ワ紙1s, 2s锛?
- 鎹曡幏骞惰<EFBFBD>褰曢敊璇?
4. screenLiterature() - 鍗曠瘒澶勭悊鏍稿績閫昏緫
private async screenLiterature(
taskId: string,
projectId: string,
literature: any,
picosContext: any,
config: FulltextScreeningConfig
): Promise<SingleLiteratureResult>
鍔熻兘锛?
- 鑾峰彇鍏ㄦ枃鍐呭<EFBFBD>锛堟敮鎸佹祴璇曟ā寮忥細璺宠繃PDF鎻愬彇锛?
- 璋冪敤
LLM12FieldsService.processDualModels()锛堝弻妯″瀷骞惰<EFBFBD>锛? - 鍖诲<EFBFBD>閫昏緫楠岃瘉锛坄MedicalLogicValidator`锛?
- 璇佹嵁閾鹃獙璇侊紙
EvidenceChainValidator锛? - 鍐茬獊妫€娴嬶紙
ConflictDetectionService锛? - 淇濆瓨缁撴灉鍒版暟鎹<EFBFBD>簱锛坄fulltext_screening_results`琛<>級
- 杩斿洖澶勭悊缁撴灉锛坱okens銆乧ost銆乮sDegraded锛?
5. updateTaskProgress() - 杩涘害鏇存柊
private async updateTaskProgress(
taskId: string,
progress: { ... }
): Promise<void>
鍔熻兘锛?
- 璁$畻骞冲潎澶勭悊鏃堕棿
- 棰勪及鍓╀綑鏃堕棿锛坋stimatedEndAt锛?
- 鏇存柊鏁版嵁搴擄紙processed/success/failed/degraded/tokens/cost锛?
6. completeTask() - 浠诲姟瀹屾垚
private async completeTask(
taskId: string,
summary: { ... }
): Promise<void>
鍔熻兘锛?
- 鏍囪<EFBFBD>浠诲姟鐘舵€侊紙completed/failed锛?
- 鏇存柊鏈€缁堢粺璁?
- 璁板綍瀹屾垚鏃堕棿
1.3 鏌ヨ<E98F8C>鎺ュ彛
getTaskProgress() - 鏌ヨ<E98F8C>浠诲姟杩涘害
async getTaskProgress(taskId: string): Promise<ScreeningProgress | null>
杩斿洖锛?
- 浠诲姟鐘舵€侊紙pending/running/completed/failed锛?
- 杩涘害缁熻<EFBFBD>锛坧rocessed/success/failed/degraded锛?
- 鎴愭湰缁熻<EFBFBD>锛坱otalTokens/totalCost锛?
- 鏃堕棿淇℃伅锛坰tarted/completed/estimatedEnd锛?
getTaskResults() - 鏌ヨ<E98F8C>浠诲姟缁撴灉
async getTaskResults(
taskId: string,
filter?: { conflictOnly, page, pageSize }
): Promise<{ results, total }>
鍔熻兘锛?
- 鏀<EFBFBD>寔杩囨护锛堜粎鍐茬獊椤癸級
- 鍒嗛〉鏌ヨ<EFBFBD>
- 鎸変紭鍏堢骇鎺掑簭锛堝啿绐佷紭鍏堛€乺eview_priority闄嶅簭锛?
updateReviewDecision() - 鏇存柊浜哄伐澶嶆牳鍐崇瓥
async updateReviewDecision(
resultId: string,
decision: { finalDecision, finalDecisionBy, ... }
): Promise<void>
鍔熻兘锛?
- 鏇存柊鏈€缁堝喅绛栵紙include/exclude锛?
- 璁板綍澶嶆牳浜哄拰鏃堕棿
- 璁板綍鎺掗櫎鍘熷洜鍜岀瑪璁?
2. 鎶€鏈<E282AC>寒鐐?
2.1 骞跺彂鎺у埗
浣跨敤 p-queue 瀹炵幇浼橀泤鐨勫苟鍙戞帶鍒讹細
const queue = new PQueue({ concurrency: 3 });
const tasks = literatures.map((literature, index) =>
queue.add(async () => {
// 澶勭悊鍗曠瘒鏂囩尞
})
);
await Promise.all(tasks);
浼樺娍锛?
- 鉁?鑷<>姩鎺掗槦锛岄伩鍏嶅悓鏃跺彂璧疯繃澶歀LM璇锋眰
- 鉁?鎺у埗API璋冪敤棰戠巼锛岄槻姝㈣Е鍙戦檺娴?
- 鉁?鍏呭垎鍒╃敤骞跺彂锛屾彁閫?鍊嶏紙涓茶<E6B693>鈫?骞跺彂锛?
2.2 瀹归敊鏈哄埗
**3灞傚<E7819E>閿?*锛?
- **Retry灞?*锛氬崟绡囨枃鐚<E69E83>け璐ヨ嚜鍔ㄩ噸璇曪紙鏈€澶?娆★級
- **Degraded灞?*锛歀LM12FieldsService鏀<65>寔闄嶇骇妯″紡锛堝崟妯″瀷鎴愬姛鍗冲彲锛?
- **Continue灞?*锛氬崟绡囧け璐ヤ笉褰卞搷鏁翠綋锛岀户缁<E688B7><E7BC81>鐞嗗叾浠栨枃鐚?
鏁堟灉锛?
- 鉁?闄嶄綆澶辫触鐜?
- 鉁?鎻愰珮浠诲姟瀹屾垚鐜?
- 鉁?瀹屾暣璁板綍澶辫触鍘熷洜
2.3 娴嬭瘯妯″紡
鏀<EFBFBD>寔 skipExtraction: true 娴嬭瘯妯″紡锛?
if (config.skipExtraction) {
// 浣跨敤鏍囬<E98F8D>+鎽樿<E98EBD>浣滀负鍏ㄦ枃
fullText = `# ${literature.title}\n\n## Abstract\n${literature.abstract}`;
fullTextFormat = 'markdown';
fullTextSource = 'test';
}
浼樺娍锛?
- 鉁?蹇<>€熼獙璇佹湇鍔¢€昏緫
- 鉁?鏃犻渶鐪熷疄PDF鏂囦欢
- 鉁?鑺傜渷娴嬭瘯鎴愭湰
2.4 瀹炴椂杩涘害璺熻釜
鍔ㄦ€佽<EFBFBD>绠楅<EFBFBD>浼板墿浣欐椂闂达細
const avgTimePerItem = elapsed / processedCount;
const remainingItems = totalCount - processedCount;
const estimatedRemainingTime = avgTimePerItem * remainingItems;
鐢ㄦ埛浣撻獙锛?
- 鉁?鍓嶇<E98D93>鍙<EFBFBD>疆璇㈡樉绀鸿繘搴?
- 鉁?鏄剧ず棰勪及瀹屾垚鏃堕棿
- 鉁?瀹炴椂鏄剧ず鎴愭湰缁熻<E7BC81>
3. 闆嗘垚娴嬭瘯
鍒涘缓浜嗗畬鏁寸殑闆嗘垚娴嬭瘯鑴氭湰锛?
娴嬭瘯鍦烘櫙锛?
- 鉁?鍑嗗<E98D91>娴嬭瘯鏁版嵁锛堟煡鎵鹃」鐩<E3808D>拰鏂囩尞锛?
- 鉁?鍒涘缓骞跺<E9AA9E>鐞嗕换鍔★紙娴嬭瘯妯″紡锛?绡囨枃鐚<E69E83>紝2骞跺彂锛?
- 鉁?杞<><E69D9E>浠诲姟杩涘害锛堟瘡5绉掞級
- 鉁?鏌ヨ<E98F8C>浠诲姟缁撴灉锛堝垎椤碉紝鎺掑簭锛?
- 鉁?鏇存柊浜哄伐澶嶆牳鍐崇瓥
娴嬭瘯鏂囦欢锛?
service-integration-test.ts(绾?00琛?
杩愯<EFBFBD>鏂瑰紡锛?
cd backend
npx ts-node src/modules/asl/fulltext-screening/services/__tests__/service-integration-test.ts
4. 浜у嚭
浠g爜锛?
- 鉁?
FulltextScreeningService.ts(绾?00琛? - 鉁?闆嗘垚娴嬭瘯鑴氭湰 (绾?00琛?
- 鉁?TypeScript绫诲瀷瀹氫箟瀹屾暣
- 鉁?浠g爜娉ㄩ噴璇︾粏
渚濊禆锛?
- 鉁?瀹夎<E780B9>
p-queue搴?
璐ㄩ噺锛?
- 鉁?鏃燣inter閿欒<E996BF>
- 鉁?瀹屾暣鐨勯敊璇<E6958A><E79287>鐞?
- 鉁?璇︾粏鐨勬棩蹇楄<E8B987>褰?
馃搳 Day 4 鎬讳綋缁熻<E7BC81>
鏃堕棿鍒嗛厤
| 闃舵<EFBFBD> | 浠诲姟 | 鑰楁椂 | 鐘舵€? |
|---|---|---|---|
| 涓婂崍 | 鏁版嵁搴撹<EFBFBD>璁? | 1h | 鉁? |
| Schema璁捐<EFBFBD>锛?涓<>ā鍨嬶級 | 30min | 鉁? | |
| 鎵嬪姩SQL杩佺Щ | 20min | 鉁? | |
| Schema闅旂<EFBFBD>楠岃瘉 | 10min | 鉁? | |
| 鏂囨。缂栧啓锛堣縼绉荤姸鎬佽<EFBFBD>鏄庯級 | 30min | 鉁? | |
| 鏂囨。鏇存柊锛堣<EFBFBD>璁℃枃妗c€佺姸鎬佹枃妗o級 | 20min | 鉁? | |
| 涓嬪崍 | 鎵瑰<EFBFBD>鐞嗘湇鍔″紑鍙? | 2h | 鉁? |
| 鏈嶅姟鏍稿績閫昏緫 | 1h | 鉁? | |
| 闆嗘垚娴嬭瘯鑴氭湰 | 30min | 鉁? | |
| 浠g爜瀹℃煡涓庝紭鍖? | 30min | 鉁? | |
| 鍚堣<EFBFBD> | 3h | 鉁? |
浠g爜浜у嚭
| 绫诲埆 | 鏂囦欢 | 琛屾暟 | 璇存槑 |
|---|---|---|---|
| 鏍稿績鏈嶅姟 | FulltextScreeningService.ts | ~700 | 鎵瑰<EFBFBD>鐞嗘湇鍔? |
| 娴嬭瘯 | service-integration-test.ts | ~200 | 闆嗘垚娴嬭瘯 |
| *鏁版嵁搴? | manual_fulltext_screening.sql | 141 | 杩佺Щ鑴氭湰 |
| 鏂囨。 | 鏁版嵁搴撹縼绉荤姸鎬佽<EFBFBD>鏄? | 435 | 璇︾粏璁板綍 |
| 鏂囨。 | Day 4寮€鍙戣<E98D99>褰? | ~800 | 鏈<EFBFBD>枃妗? |
| 鍚堣<EFBFBD> | ~2,276 |
鍔熻兘瀹屾垚搴?
| 鍔熻兘妯″潡 | 瀹屾垚搴? | 璇存槑 |
|---|---|---|
| 鏁版嵁搴撹<EFBFBD>璁? | 100% 鉁? | 3涓<EFBFBD>〃锛?3涓<33>柊瀛楁<E7809B> |
| 鏁版嵁搴撹縼绉? | 100% 鉁? | 鎵嬪姩SQL锛屽畨鍏ㄦ墽琛? |
| 浠诲姟鍒涘缓涓庤皟搴? | 100% 鉁? | 鏀<EFBFBD>寔骞跺彂鎺у埗 |
| 鍗曠瘒鏂囩尞澶勭悊 | 100% 鉁? | 闆嗘垚鎵€鏈夐獙璇佸櫒 |
| 杩涘害璺熻釜 | 100% 鉁? | 瀹炴椂鏇存柊锛岄<EFBFBD>浼版椂闂? |
| 瀹归敊澶勭悊 | 100% 鉁? | 閲嶈瘯銆侀檷绾с€佺户缁? |
| 鏌ヨ<EFBFBD>鎺ュ彛 | 100% 鉁? | 杩涘害銆佺粨鏋溿€佸喅绛? |
| 闆嗘垚娴嬭瘯 | 100% 鉁? | 绔<EFBFBD>埌绔<EFBFBD>祴璇曡剼鏈? |
馃幆 鍏抽敭鍐崇瓥
1. 浜戝師鐢熷瓨鍌ㄦ柟妗?鉁?
鍐崇瓥锛氬叏鏂囧唴瀹瑰瓨鍌ㄥ湪OSS/Dify锛屾暟鎹<E69A9F>簱鍙<E7B0B1>瓨寮曠敤
鐞嗙敱锛?
- 绗﹀悎銆婁簯鍘熺敓寮€鍙戣<EFBFBD>鑼冦€?
- 閬垮厤鏁版嵁搴撹啫鑳€
- 鏀<EFBFBD>寔澶ц<EFBFBD>妯℃墿灞?
瀹炵幇锛?
full_text_storage_type- 瀛樺偍绫诲瀷锛坥ss/dify锛?full_text_storage_ref- 瀛樺偍寮曠敤锛坘ey鎴朓D锛?full_text_url- 璁块棶URL
2. 鎵嬪姩SQL杩佺Щ绛栫暐 鉁?
鍐崇瓥锛氫笉浣跨敤 prisma migrate锛岃€屾槸鎵嬪姩缂栧啓SQL鑴氭湰
鐞嗙敱锛?
- Prisma Migrate浼氬皾璇曞垹闄?
publicschema涓<61>殑閲嶅<E996B2>琛? - 鍙<EFBFBD>兘褰卞搷鍏朵粬妯″潡锛圓IA銆丳KB銆丳latform锛?
- 鎵嬪姩SQL鏇村畨鍏ㄣ€佸彲鎺с€佸彲瀹¤<EFBFBD>
鍘熷垯锛?
- "绠″ソ鑷<E382BD>繁"锛氬彧鎿嶄綔
asl_schema - 涓嶅姩
publicschema锛屼笉褰卞搷鍏朵粬妯″潡
3. 娴嬭瘯妯″紡璁捐<E79281> 鉁?
鍐崇瓥锛氭敮鎸?skipExtraction: true 娴嬭瘯妯″紡
鐞嗙敱锛?
- 蹇<EFBFBD>€熼獙璇佹湇鍔¢€昏緫
- 鏃犻渶鍑嗗<EFBFBD>鐪熷疄PDF鏂囦欢
- 鑺傜渷娴嬭瘯鎴愭湰鍜屾椂闂?
瀹炵幇锛?
if (config.skipExtraction) {
fullText = `# ${title}\n\n## Abstract\n${abstract}`;
}
4. 骞跺彂鎺у埗绛栫暐 鉁?
鍐崇瓥锛氫娇鐢?p-queue锛岄粯璁ゅ苟鍙?
鐞嗙敱锛?
- 鎻愰€?鍊嶏紙鐩告瘮涓茶<E6B693>澶勭悊锛?
- 閬垮厤瑙﹀彂API闄愭祦
- 鑷<EFBFBD>姩鎺掗槦锛屼紭闆呮帶鍒?
閰嶇疆锛?
const queue = new PQueue({ concurrency: 3 });
馃悰 閬囧埌鐨勯棶棰樹笌瑙e喅
闂<EFBFBD><EFBFBD>1锛氭暟鎹<EFBFBD>簱杩佺Щ鍐茬獊
**闂<><E99782>**锛歚prisma db push 妫€娴嬪埌浼氬垹闄?public` schema涓<61>殑琛?
鐜拌薄锛?
鈿狅笍 There might be data loss when applying the changes:
鈥?You are about to drop the `users` table, which is not empty (2 rows).
鈥?You are about to drop the `projects` table, which is not empty (2 rows).
鏍瑰洜锛?
- 鍘嗗彶閬楃暀闂<EFBFBD><EFBFBD>锛氶儴鍒嗘ā鍧楃殑琛ㄥ垱寤哄湪
publicschema - Prisma Migrate浼氬皾璇曞悓姝ユ墍鏈塻chema
**瑙e喅鏂规<E98F82>**锛?
- 涓嶄娇鐢?
prisma migrate鎴?prisma db push - 缂栧啓鎵嬪姩SQL鑴氭湰锛屽彧鎿嶄綔
asl_schema - 鎵ц<EFBFBD>锛歚Get-Content xxx.sql | docker exec -i postgres psql ...`
- 楠岃瘉锛歚\dt asl_schema.*`
棰勯槻鎺<EFBFBD>柦锛?
- 鏈<EFBFBD>潵缁х画浣跨敤鎵嬪姩SQL杩佺Щ
- 鏄庣‘璁板綍鍦ㄦ枃妗d腑
- 鎻愰啋鍏朵粬妯″潡寮€鍙戣€?
闂<EFBFBD><EFBFBD>2锛歅risma Client绫诲瀷鐢熸垚
**闂<><E99782>**锛氫慨鏀筍chema鍚庯紝Prisma Client绫诲瀷鏈<E780B7>洿鏂?
瑙e喅锛?
npx prisma generate
棰勯槻鎺<EFBFBD>柦锛?
- 姣忔<EFBFBD>淇<EFBFBD>敼Schema鍚庣珛鍗虫墽琛?
- 鍔犲叆杩佺Щ娴佺▼鏂囨。
馃摎 鐩稿叧鏂囨。
**鏈<><E98F88>鏇存柊鐨勬枃妗?*锛?
- [鏁版嵁搴撹縼绉荤姸鎬佽<E98EAC>鏄嶿(./2025-11-23_鏁版嵁搴撹縼绉荤姸鎬佽<E98EAC>鏄?md) 鈫?鏂板缓
- [鏁版嵁搴撹<E690B4>璁℃枃妗<E69E83>(../02-鎶€鏈<E282AC><E98F88>璁?01-鏁版嵁搴撹<E690B4>璁?md) 鈫?鏇存柊v3.0
- [妯″潡褰撳墠鐘舵€佷笌寮€鍙戞寚鍗梋(../00-妯″潡褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md) 鈫?鏇存柊v1.2
- 鎶€鏈<EFBFBD>€哄姟娓呭崟 鈫?鏇存柊鍊哄姟7鐘舵€?
- [鍏ㄦ枃澶嶇瓫寮€鍙戣<E98D99>鍒抅(../04-寮€鍙戣<E98D99>鍒?04-鍏ㄦ枃澶嶇瓫寮€鍙戣<E98D99>鍒?md) 鈫?鏇存柊Day 4杩涘害
**鍙傝€冪殑瑙勮寖鏂囨。**锛?
- [浜戝師鐢熷紑鍙戣<E98D99>鑼僝(../../../../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
- [鏁版嵁搴撴灦鏋勮<E98F8B>鏄嶿(../../../../00-绯荤粺鎬讳綋璁捐<E79281>/03-鏁版嵁搴撴灦鏋勮<E98F8B>鏄?md)
- [绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗梋(../../../../00-绯荤粺鎬讳綋璁捐<E79281>/00-绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md)
馃殌 涓嬩竴姝ヨ<E5A79D>鍒?
Day 5锛氬悗绔疉PI寮€鍙戯紙棰勮<E6A3B0>1澶╋級
浠诲姟娓呭崟锛?
- 鍒涘缓
FulltextScreeningController.tscreateTask()- 鍒涘缓浠诲姟getTaskProgress()- 鑾峰彇杩涘害getTaskResults()- 鑾峰彇缁撴灉鍒楄〃getResultDetail()- 鑾峰彇缁撴灉璇︽儏updateDecision()- 浜哄伐瀹℃牳鍐崇瓥
- 鍒涘缓
fulltext-screening.ts璺<>敱 - 闆嗘垚鍒癋astify搴旂敤
- API娴嬭瘯锛圥ostman鎴栭泦鎴愭祴璇曪級
- 閿欒<EFBFBD>澶勭悊瀹屽杽
棰勮<EFBFBD>浜у嚭锛?
- 5涓狝PI鎺ュ彛
- API鏂囨。
- 鍚庣<EFBFBD>瀹屾垚鉁?
馃帀 鎬荤粨
Day 4鏍稿績鎴愭灉锛?
- 鉁?瀹屾垚鏁版嵁搴撹<E690B4>璁★紙浜戝師鐢熸灦鏋勶級
- 鉁?瀹屾垚鏁版嵁搴撹縼绉伙紙瀹夊叏鎵ц<E98EB5>锛屾棤褰卞搷鍏朵粬妯″潡锛?
- 鉁?瀹屾垚鎵瑰<E98EB5>鐞嗘湇鍔″紑鍙戯紙700琛屾牳蹇冧唬鐮侊級
- 鉁?瀹屾垚闆嗘垚娴嬭瘯锛堢<E9949B>鍒扮<E98D92>楠岃瘉锛?
- 鉁?瀹屾垚璇︾粏鏂囨。锛?绡囨枃妗f洿鏂帮級
**鎶€鏈<E282AC>寒鐐?*锛?
- 鉁?浜戝師鐢熷瓨鍌ㄦ柟妗堬紙鍏ㄦ枃瀛極SS/Dify锛?
- 鉁?鎵嬪姩SQL杩佺Щ绛栫暐锛堝畨鍏ㄥ彲鎺э級
- 鉁?骞跺彂鎺у埗锛坧-queue锛屾彁閫?鍊嶏級
- 鉁?瀹归敊鏈哄埗锛堥噸璇曘€侀檷绾с€佺户缁<E688B7>級
- 鉁?娴嬭瘯妯″紡锛堝揩閫熼獙璇侊級
璐ㄩ噺淇濋殰锛?
- 鉁?Schema闅旂<E99785>100%姝g‘锛堟墍鏈夎〃鍦╝sl_schema锛?
- 鉁?浠g爜鏃燣inter閿欒<E996BF>
- 鉁?瀹屾暣鐨勯敊璇<E6958A><E79287>鐞嗗拰鏃ュ織
- 鉁?璇︾粏鐨勬枃妗h<E5A697>褰?
**寮€鍙戞晥鐜?*锛?
- 鈴憋笍 涓婂崍1h瀹屾垚鏁版嵁搴撹<E690B4>璁′笌杩佺Щ
- 鈴憋笍 涓嬪崍2h瀹屾垚鎵瑰<E98EB5>鐞嗘湇鍔″紑鍙?
- 鈴憋笍 鍚堣<E98D9A>3h瀹屾垚Day 4鍏ㄩ儴浠诲姟
MVP杩涘害锛?
- Week 1锛?0% 鈫?75% 鉁?
- Day 1-3锛氶€氱敤鑳藉姏灞傚畬鎴?鉁?
- Day 4锛氭壒澶勭悊鏈嶅姟瀹屾垚 鉁?
- Day 5锛欰PI寮€鍙戯紙涓嬩竴姝ワ級
**寮€鍙戜汉鍛?*锛欰SL寮€鍙戝洟闃?
鏂囨。缂栧啓鏃堕棿锛?025-11-23
鏂囨。鐗堟湰锛歷1.0