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%)
632 lines
17 KiB
Markdown
632 lines
17 KiB
Markdown
# 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妯″潡鏁版嵁瀹屽叏姝g‘锛氭墍鏈夎〃閮藉湪 `asl_schema`
|
||
- 鈿狅笍 Prisma Migrate浼氬皾璇曞垹闄?`public` 涓<>殑閲嶅<E996B2>琛?
|
||
|
||
#### 2.2 瑙e喅鏂规<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姝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鏈嶅姟銆侀獙璇佸櫒銆佸啿绐佹<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>璁℃枃妗c€佺姸鎬佹枃妗o級 | 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
|
||
|
||
**瑙e喅鏂规<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%姝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
|
||
|
||
|