Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-23_Day4_数据库设计与批处理服务开发.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

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