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%)
945 lines
29 KiB
Markdown
945 lines
29 KiB
Markdown
# PKB锛堜釜浜虹煡璇嗗簱锛夊拰 RVW锛堝<E9949B>绋垮姛鑳斤級杩佺Щ璁″垝
|
||
|
||
> **鍒涘缓鏃ユ湡锛?* 2025-12-28
|
||
> **缁存姢鑰咃細** 鎶€鏈<E282AC>洟闃?
|
||
> **鐩<>爣锛?* 灏嗗凡寮€鍙戠殑PKB鍜孯VW鍔熻兘杩佺Щ鍒版渶鏂扮殑妯″潡鍖栨灦鏋勪笂
|
||
|
||
---
|
||
|
||
## 馃搵 鎵ц<E98EB5>鎽樿<E98EBD>
|
||
|
||
### 杩佺Щ鐩<D0A9>爣
|
||
灏嗘棫鐗堟湰锛坄frontend` + `backend/src/legacy`锛変腑鐨?*涓<>汉鐭ヨ瘑搴擄紙PKB锛?*鍜?*瀹$ǹ鍔熻兘锛圧VW锛?*杩佺Щ鍒版柊鏋舵瀯锛坄frontend-v2` + `backend/src/modules`锛夛紝浣垮叾绗﹀悎鏈€鏂扮殑妯″潡鍖栥€佷簯鍘熺敓璁捐<EFBFBD>瑙勮寖銆?
|
||
|
||
### 褰撳墠鐘舵€?
|
||
|
||
| 鍔熻兘 | 鏃ф灦鏋勪綅缃?| 瀹屾垚搴?| 鏁版嵁搴揝chema | 鍓嶇<E98D93>UI |
|
||
|------|-----------|--------|-------------|--------|
|
||
| **PKB 涓<>汉鐭ヨ瘑搴?* | `backend/src/legacy` + `frontend/src` | 鉁?100% | `pkb_schema` | 鉁?瀹屾暣UI |
|
||
| **RVW 瀹$ǹ鍔熻兘** | `backend/src/legacy` + `frontend/src` | 鉁?100% | `public.ReviewTask` | 鉁?瀹屾暣UI |
|
||
|
||
### 杩佺Щ浼樺厛绾?
|
||
1. **P0锛堟渶楂樹紭鍏堢骇锛?*: PKB涓<42>汉鐭ヨ瘑搴?- 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
|
||
2. **P1锛堥珮浼樺厛绾э級**: RVW瀹$ǹ鍔熻兘 - 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
|
||
|
||
---
|
||
|
||
## 馃攳 宸叉湁鍔熻兘娣卞害鍒嗘瀽
|
||
|
||
### 涓€銆丳KB锛堜釜浜虹煡璇嗗簱锛夊姛鑳借<E991B3>鎯?
|
||
|
||
#### 1.1 鍔熻兘鐗规€?
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?**鐭ヨ瘑搴揅RUD**锛氬垱寤恒€佹煡鐪嬨€佺紪杈戙€佸垹闄ょ煡璇嗗簱
|
||
- 鉁?**閰嶉<E996B0>绠$悊**锛氭瘡鐢ㄦ埛3涓<33>煡璇嗗簱锛屾瘡搴?0涓<30>枃妗?
|
||
- 鉁?**鏂囨。涓婁紶**锛氭敮鎸丳DF銆乄ord銆乀XT銆丮arkdown
|
||
- 鉁?**鏂囨。鐘舵€佽拷韪?*锛歶ploading 鈫?parsing 鈫?indexing 鈫?completed/error
|
||
- 鉁?**Dify RAG闆嗘垚**锛氬熀浜嶥ify骞冲彴鐨勫悜閲忔<E996B2>绱?
|
||
- 鉁?**璇<>箟妫€绱?*锛氭敮鎸佸<E98EB8>鐭ヨ瘑搴撹仈鍚堟<E98D9A>绱<EFBFBD>紝top_k=15
|
||
- 鉁?**缁熻<E7BC81>淇℃伅**锛氭枃妗f暟銆乀oken鏁般€佹<E282AC>钀芥暟缁熻<E7BC81>
|
||
- 鉁?**鍏ㄦ枃闃呰<E99783>妯″紡**锛圥hase2锛夛細Token闄愬埗銆佹櫤鑳芥枃妗i€夋嫨
|
||
|
||
**鎶€鏈<E282AC>寒鐐癸細**
|
||
- 馃弳 **Python寰<6E>湇鍔¢泦鎴?*锛氳皟鐢╜extraction_service`鎻愬彇鏂囨。鏂囨湰
|
||
- 馃弳 **Dify Dataset绠$悊**锛氭瘡涓<E798A1>煡璇嗗簱瀵瑰簲涓€涓狣ify Dataset
|
||
- 馃弳 **Token绮剧‘璁$畻**锛氫娇鐢╰iktoken璁$畻Token鏁帮紝鍙岄噸闄愬埗锛?0鏂囦欢 + 980K tokens锛?
|
||
- 馃弳 **鏅鸿兘鏂囨。閫夋嫨**锛氬熀浜嶵oken瀹归噺鐨勬櫤鑳芥帹鑽愮畻娉?
|
||
|
||
#### 1.2 鏁版嵁搴撶粨鏋?
|
||
|
||
**PKB Schema锛坄pkb_schema`锛夛細**
|
||
```prisma
|
||
model KnowledgeBase {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
description String?
|
||
difyDatasetId String // 鏄犲皠鍒癉ify
|
||
fileCount Int @default(0)
|
||
totalSizeBytes BigInt @default(0)
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
documents Document[]
|
||
batchTasks BatchTask[]
|
||
}
|
||
|
||
model Document {
|
||
id String @id @default(uuid())
|
||
kbId String
|
||
userId String
|
||
filename String
|
||
fileType String
|
||
fileSizeBytes BigInt
|
||
fileUrl String
|
||
difyDocumentId String
|
||
status String // uploading/parsing/indexing/completed/error
|
||
progress Int @default(0)
|
||
errorMessage String?
|
||
segmentsCount Int?
|
||
tokensCount Int?
|
||
extractionMethod String? // nougat/pymupdf/mammoth
|
||
extractionQuality Float?
|
||
charCount Int?
|
||
language String? // chinese/english
|
||
extractedText String? // Phase2锛氬叏鏂囧瓨鍌?
|
||
uploadedAt DateTime @default(now())
|
||
processedAt DateTime?
|
||
}
|
||
|
||
model BatchTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
kbId String
|
||
name String
|
||
templateType String
|
||
templateId String?
|
||
prompt String
|
||
status String
|
||
totalDocuments Int
|
||
completedCount Int @default(0)
|
||
failedCount Int @default(0)
|
||
modelType String
|
||
concurrency Int @default(3)
|
||
startedAt DateTime?
|
||
completedAt DateTime?
|
||
durationSeconds Int?
|
||
|
||
results BatchResult[]
|
||
}
|
||
```
|
||
|
||
#### 1.3 鍚庣<E98D9A>浠g爜缁撴瀯
|
||
|
||
**鏈嶅姟灞傦紙`backend/src/legacy/services/`锛夛細**
|
||
```typescript
|
||
knowledgeBaseService.ts (365琛?
|
||
鈹溾攢鈹€ createKnowledgeBase() // 鍒涘缓鐭ヨ瘑搴擄紙Dify Dataset锛?
|
||
鈹溾攢鈹€ getKnowledgeBases() // 鑾峰彇鍒楄〃
|
||
鈹溾攢鈹€ getKnowledgeBaseById() // 鑾峰彇璇︽儏
|
||
鈹溾攢鈹€ updateKnowledgeBase() // 鏇存柊
|
||
鈹溾攢鈹€ deleteKnowledgeBase() // 鍒犻櫎锛堢骇鑱斿垹闄<E59EB9>ify Dataset锛?
|
||
鈹溾攢鈹€ searchKnowledgeBase() // 璇<>箟妫€绱<E282AC>紙璋冪敤Dify API锛?
|
||
鈹溾攢鈹€ getKnowledgeBaseStats() // 缁熻<E7BC81>淇℃伅
|
||
鈹斺攢鈹€ getDocumentSelection() // 鏅鸿兘鏂囨。閫夋嫨锛圥hase2锛?
|
||
|
||
documentService.ts
|
||
鈹溾攢鈹€ uploadDocument() // 涓婁紶鏂囨。
|
||
鈹溾攢鈹€ getDocuments() // 鑾峰彇鏂囨。鍒楄〃
|
||
鈹溾攢鈹€ deleteDocument() // 鍒犻櫎鏂囨。
|
||
鈹溾攢鈹€ reprocessDocument() // 閲嶆柊澶勭悊
|
||
鈹斺攢鈹€ pollDocumentStatus() // 杞<><E69D9E>鐘舵€?
|
||
|
||
tokenService.ts (243琛?
|
||
鈹溾攢鈹€ calculateDocumentTokens() // 璁$畻Token
|
||
鈹溾攢鈹€ selectDocumentsForFullText() // 鏅鸿兘閫夋嫨
|
||
鈹斺攢鈹€ TOKEN_LIMITS 甯搁噺
|
||
```
|
||
|
||
**鎺у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/`锛夛細**
|
||
```typescript
|
||
knowledgeBaseController.ts (341琛?
|
||
鈹溾攢鈹€ POST /knowledge-bases
|
||
鈹溾攢鈹€ GET /knowledge-bases
|
||
鈹溾攢鈹€ GET /knowledge-bases/:id
|
||
鈹溾攢鈹€ PUT /knowledge-bases/:id
|
||
鈹溾攢鈹€ DELETE /knowledge-bases/:id
|
||
鈹溾攢鈹€ GET /knowledge-bases/:id/search
|
||
鈹溾攢鈹€ GET /knowledge-bases/:id/stats
|
||
鈹斺攢鈹€ GET /knowledge-bases/:id/document-selection
|
||
|
||
documentController.ts
|
||
鈹溾攢鈹€ POST /knowledge-bases/:kbId/documents
|
||
鈹溾攢鈹€ GET /knowledge-bases/:kbId/documents
|
||
鈹溾攢鈹€ GET /documents/:id
|
||
鈹溾攢鈹€ GET /documents/:id/full-text
|
||
鈹溾攢鈹€ DELETE /documents/:id
|
||
鈹斺攢鈹€ POST /documents/:id/reprocess
|
||
```
|
||
|
||
#### 1.4 鍓嶇<E98D93>浠g爜缁撴瀯
|
||
|
||
**涓婚〉闈<E38089>紙`frontend/src/pages/KnowledgePage.tsx`锛夛細** 281琛?
|
||
- 鐭ヨ瘑搴撳垪琛ㄨ<E7909B>鍥?
|
||
- 鐭ヨ瘑搴撹<E690B4>鎯呰<E98EAF>鍥撅紙Tabs锛氭枃妗g<E5A697>鐞?+ 缁熻<E7BC81>淇℃伅锛?
|
||
- 鍙岃繘搴︽潯瀹归噺鏄剧ず锛堟枃浠舵暟 + Token鏁帮級
|
||
|
||
**缁勪欢锛坄frontend/src/components/knowledge/`锛夛細**
|
||
```
|
||
KnowledgeBaseList.tsx // 鐭ヨ瘑搴撳崱鐗囧垪琛?
|
||
CreateKBDialog.tsx // 鍒涘缓瀵硅瘽妗?
|
||
EditKBDialog.tsx // 缂栬緫瀵硅瘽妗?
|
||
DocumentList.tsx // 鏂囨。鍒楄〃锛堝惈鐘舵€佸窘绔狅級
|
||
DocumentUpload.tsx // 鏂囦欢涓婁紶锛堟嫋鎷芥敮鎸侊級
|
||
```
|
||
|
||
**鐘舵€佺<E282AC>鐞嗭紙`frontend/src/stores/useKnowledgeBaseStore.ts`锛夛細**
|
||
- Zustand鐘舵€佺<E282AC>鐞?
|
||
- API璋冪敤灏佽<E7818F>
|
||
- 瀹炴椂鐘舵€佽疆璇<E79686>紙5绉掗棿闅旓級
|
||
|
||
---
|
||
|
||
### 浜屻€丷VW锛堝<E9949B>绋垮姛鑳斤級鍔熻兘璇︽儏
|
||
|
||
#### 2.1 鍔熻兘鐗规€?
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?**绋夸欢涓婁紶**锛氭敮鎸乄ord鏂囨。锛?doc/.docx锛夛紝鏈€澶?MB
|
||
- 鉁?**鍙岀淮搴﹁瘎浼?*锛?
|
||
- 绋跨害瑙勮寖鎬ц瘎浼帮紙11椤规爣鍑嗭級
|
||
- 鏂规硶瀛﹁瘎浼帮紙3澶ч儴鍒嗭級
|
||
- 鉁?**鍩轰簬鐪熷疄鏈熷垔鏍囧噯**锛氥€婁腑鍗庡尰瀛﹁秴澹版潅蹇椼€嬬ǹ绾?
|
||
- 鉁?**鏅鸿兘鍒嗘瀽**锛氫娇鐢↙LM杩涜<E69DA9>缁撴瀯鍖栬瘎浼?
|
||
- 鉁?**瀹屾暣鎶ュ憡**锛欽SON鏍煎紡缁撴灉锛屾敮鎸佸<E98EB8>鍑篜DF/澶嶅埗鏂囨湰
|
||
- 鉁?**妯″瀷閫夋嫨**锛欴eepSeek-V3 / Qwen3-72B / Qwen-Long
|
||
- 鉁?**浠诲姟绠$悊**锛氫换鍔″垪琛ㄣ€佺姸鎬佽拷韪<E68BB7>€佽繘搴︽樉绀?
|
||
|
||
**璇勪及鏍囧噯锛?*
|
||
|
||
**绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級锛?*
|
||
1. 鏂囬<E98F82>锛圱itle锛?
|
||
2. 浣滆€咃紙Authors锛?
|
||
3. 涓<>枃鎽樿<E98EBD>锛圕hinese Abstract锛?
|
||
4. 鑻辨枃鎽樿<E98EBD>锛圗nglish Abstract锛?
|
||
5. 涓<>枃鍏抽敭璇嶏紙Chinese Keywords锛?
|
||
6. 鑻辨枃鍏抽敭璇嶏紙English Keywords锛?
|
||
7. 姝f枃锛圡ain Text锛?
|
||
8. 鍙傝€冩枃鐚<E69E83>紙References锛?
|
||
9. 鍥捐〃锛團igures and Tables锛?
|
||
10. 鍒╃泭鍐茬獊锛圕onflict of Interest锛?
|
||
11. 浼︾悊瀹℃煡锛圗thics Approval锛?
|
||
|
||
**鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛夛細**
|
||
1. 绉戠爺璁捐<E79281>锛圧esearch Design锛?
|
||
2. 缁熻<E7BC81>鏂规硶锛圫tatistical Methods锛?
|
||
3. 缁熻<E7BC81>鍒嗘瀽锛圫tatistical Analysis锛?
|
||
|
||
#### 2.2 鏁版嵁搴撶粨鏋?
|
||
|
||
**ReviewTask琛<6B>紙褰撳墠鍦╜public` schema锛岄渶杩佺Щ鍒癭rvw_schema`锛夛細**
|
||
```prisma
|
||
model ReviewTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
fileName String
|
||
fileSize BigInt
|
||
extractedText String?
|
||
wordCount Int?
|
||
status String // pending/extracting/reviewing_editorial/reviewing_methodology/completed/failed
|
||
modelUsed String
|
||
overallScore Float?
|
||
editorialReview Json? // 绋跨害瑙勮寖鎬ц瘎浼扮粨鏋?
|
||
methodologyReview Json? // 鏂规硶瀛﹁瘎浼扮粨鏋?
|
||
errorMessage String?
|
||
startedAt DateTime?
|
||
completedAt DateTime?
|
||
durationSeconds Int?
|
||
createdAt DateTime @default(now())
|
||
}
|
||
```
|
||
|
||
#### 2.3 鍚庣<E98D9A>浠g爜缁撴瀯
|
||
|
||
**鏈嶅姟灞傦紙`backend/src/legacy/services/reviewService.ts`锛夛細** 453琛?
|
||
```typescript
|
||
reviewManuscript() // 涓诲叆鍙o紙寮傛<E5AFAE>鎵ц<E98EB5>锛?
|
||
processReviewTask() // 鍚庡彴澶勭悊浠诲姟
|
||
reviewEditorialStandards() // 绋跨害瑙勮寖鎬ц瘎浼?
|
||
reviewMethodology() // 鏂规硶瀛﹁瘎浼?
|
||
parseJSONFromLLMResponse() // 瀹归敊JSON瑙f瀽
|
||
getReviewTask() // 鑾峰彇浠诲姟鐘舵€?
|
||
getReviewTasks() // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
|
||
deleteReviewTask() // 鍒犻櫎浠诲姟
|
||
getReviewReport() // 鑾峰彇瀹屾暣鎶ュ憡
|
||
```
|
||
|
||
**Prompt璁捐<E79281>锛坄backend/prompts/`锛夛細**
|
||
```
|
||
review_editorial_system.txt (210琛?
|
||
鈹斺攢鈹€ 11涓<31>瘎浼扮淮搴︾殑璇︾粏鏍囧噯
|
||
|
||
review_methodology_system.txt (231琛?
|
||
鈹斺攢鈹€ 3涓<33>儴鍒嗙殑璇勪及鏍囧噯
|
||
```
|
||
|
||
**鎺у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/reviewController.ts`锛夛細** 265琛?
|
||
```typescript
|
||
POST /review/upload // 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌?
|
||
GET /review/tasks/:taskId // 鑾峰彇浠诲姟鐘舵€?
|
||
GET /review/tasks/:taskId/report // 鑾峰彇瀹℃煡鎶ュ憡
|
||
GET /review/tasks // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
|
||
DELETE /review/tasks/:taskId // 鍒犻櫎浠诲姟
|
||
```
|
||
|
||
#### 2.4 鍓嶇<E98D93>浠g爜缁撴瀯
|
||
|
||
**涓婚〉闈<E38089>紙`frontend/src/pages/ReviewPage.tsx`锛夛細** 625琛?
|
||
- 娓愬彉鑹叉爣棰樺崱鐗?
|
||
- 3姝ユ祦绋嬶細涓婁紶绋夸欢 鈫?閫夋嫨妯″瀷 鈫?寮€濮嬪<E6BFAE>鏌?
|
||
- 5姝ヨ繘搴﹀睍绀猴細涓婁紶 鈫?鎻愬彇鏂囨湰 鈫?绋跨害璇勪及 鈫?鏂规硶瀛﹁瘎浼?鈫?鐢熸垚鎶ュ憡
|
||
- 鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
|
||
- 瀵煎嚭鍔熻兘锛圥DF鐢熸垚 + 鏂囨湰澶嶅埗锛?
|
||
|
||
**缁勪欢锛坄frontend/src/components/review/`锛夛細**
|
||
```
|
||
ScoreCard.tsx // 鍒嗘暟鍗$墖锛堥<E9949B>鑹茬紪鐮侊級
|
||
EditorialReview.tsx // 绋跨害瑙勮寖鎬ц瘎浼拌<E6B5BC>鎯?
|
||
MethodologyReview.tsx // 鏂规硶瀛﹁瘎浼拌<E6B5BC>鎯?
|
||
```
|
||
|
||
**瑙嗚<E79199>璁捐<E79281>锛?*
|
||
- 娓愬彉鑹蹭富棰橈細`linear-gradient(135deg, #667eea 0%, #764ba2 100%)`
|
||
- 鍒嗘暟棰滆壊缂栫爜锛氣墺90浼樼<E6B5BC>锛堢豢锛夈€佲墺80鑹<30>ソ锛堣摑锛夈€佲墺70涓<30>瓑锛堥粍锛夈€?70闇€鏀硅繘锛堢孩锛?
|
||
- 鎷栨嫿涓婁紶鏀<E7B4B6>寔
|
||
- 鍝嶅簲寮忓竷灞€
|
||
|
||
---
|
||
|
||
## 馃幆 杩佺Щ绛栫暐
|
||
|
||
### 杩佺Щ鍘熷垯
|
||
1. **淇濇寔鍔熻兘瀹屾暣鎬?*锛?00%淇濈暀鐜版湁鍔熻兘锛屼笉鍋氬垹鍑?
|
||
2. **閬靛惊鏂版灦鏋勮<E98F8B>鑼?*锛氱<E9949B>鍚堟ā鍧楀寲銆丼chema闅旂<E99785>銆佷簯鍘熺敓璁捐<E79281>
|
||
3. **澶嶇敤骞冲彴鑳藉姏**锛氫娇鐢╜common`灞傜殑瀛樺偍銆佹棩蹇椼€丩LM銆佹枃妗e<E5A697>鐞嗘湇鍔?
|
||
4. **娓愯繘寮忚縼绉?*锛氬厛鍚庣<E98D9A>鍐嶅墠绔<E5A2A0>紝纭<E7B49D>繚姣忔<E5A7A3>鍙<EFBFBD>祴璇?
|
||
5. **淇濇寔鏁版嵁鍏煎<E98D8F>**锛氭暟鎹<E69A9F>簱琛ㄧ粨鏋勫钩婊戣縼绉伙紝涓嶄涪澶辨暟鎹?
|
||
|
||
---
|
||
|
||
## 馃搵 杩佺Щ浠诲姟娓呭崟
|
||
|
||
### Phase 1: PKB涓<42>汉鐭ヨ瘑搴撹縼绉伙紙浼樺厛锛?
|
||
|
||
#### Task 1.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
|
||
|
||
**鐩<>爣鐩<E788A3>綍锛?* `backend/src/modules/pkb/`
|
||
|
||
**杩佺Щ姝ラ<E5A79D>锛?*
|
||
|
||
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
|
||
```bash
|
||
backend/src/modules/pkb/
|
||
鈹溾攢鈹€ README.md # 妯″潡璇存槑
|
||
鈹溾攢鈹€ controllers/
|
||
鈹? 鈹溾攢鈹€ knowledgeBaseController.ts # 浠巐egacy杩佺Щ
|
||
鈹? 鈹斺攢鈹€ documentController.ts # 浠巐egacy杩佺Щ
|
||
鈹溾攢鈹€ services/
|
||
鈹? 鈹溾攢鈹€ knowledgeBaseService.ts # 浠巐egacy杩佺Щ
|
||
鈹? 鈹溾攢鈹€ documentService.ts # 浠巐egacy杩佺Щ
|
||
鈹? 鈹斺攢鈹€ tokenService.ts # 浠巐egacy杩佺Щ
|
||
鈹溾攢鈹€ routes/
|
||
鈹? 鈹斺攢鈹€ index.ts # 璺<>敱娉ㄥ唽
|
||
鈹斺攢鈹€ types/
|
||
鈹斺攢鈹€ index.ts # 绫诲瀷瀹氫箟
|
||
```
|
||
|
||
2. **澶嶅埗骞舵洿鏂版湇鍔″眰** (60鍒嗛挓)
|
||
- 浠巂backend/src/legacy/services/`澶嶅埗鏂囦欢
|
||
- 鏇存柊瀵煎叆璺<E58F86>緞锛?
|
||
```typescript
|
||
// 鉂?鏃т唬鐮?
|
||
import { prisma } from '../../config/database.js';
|
||
import { difyClient } from '../../common/rag/DifyClient.js';
|
||
|
||
// 鉁?鏂颁唬鐮?
|
||
import { prisma } from '@/config/database';
|
||
import { difyClient } from '@/common/rag/DifyClient';
|
||
```
|
||
- 浣跨敤骞冲彴鑳藉姏锛?
|
||
```typescript
|
||
// 鉁?浣跨敤storage鎶借薄灞傦紙濡傛灉闇€瑕佹枃浠跺瓨鍌<E793A8>級
|
||
import { storage } from '@/common/storage';
|
||
|
||
// 鉁?浣跨敤logger锛堟浛鎹<E6B59B>onsole.log锛?
|
||
import { logger } from '@/common/logging';
|
||
|
||
// 鉁?浣跨敤extractionClient锛堝凡鏈夛級
|
||
import { extractionClient } from '@/common/document/ExtractionClient';
|
||
```
|
||
|
||
3. **澶嶅埗骞舵洿鏂版帶鍒跺櫒灞?* (30鍒嗛挓)
|
||
- 浠巂backend/src/legacy/controllers/`澶嶅埗鏂囦欢
|
||
- 鏇存柊瀵煎叆璺<E58F86>緞
|
||
- 绉婚櫎`MOCK_USER_ID`锛屼粠`request.user`鑾峰彇锛堝緟瀹炵幇璁よ瘉涓<EFBFBD>棿浠讹級
|
||
|
||
4. **鍒涘缓璺<E7BC93>敱鏂囦欢** (30鍒嗛挓)
|
||
```typescript
|
||
// backend/src/modules/pkb/routes/index.ts
|
||
import type { FastifyInstance } from 'fastify';
|
||
import * as knowledgeBaseController from '../controllers/knowledgeBaseController';
|
||
import * as documentController from '../controllers/documentController';
|
||
|
||
export default async function pkbRoutes(fastify: FastifyInstance) {
|
||
// 鐭ヨ瘑搴撶<E690B4>鐞?
|
||
fastify.post('/api/v1/pkb/knowledge-bases', knowledgeBaseController.createKnowledgeBase);
|
||
fastify.get('/api/v1/pkb/knowledge-bases', knowledgeBaseController.getKnowledgeBases);
|
||
fastify.get('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.getKnowledgeBaseById);
|
||
fastify.put('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.updateKnowledgeBase);
|
||
fastify.delete('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.deleteKnowledgeBase);
|
||
fastify.get('/api/v1/pkb/knowledge-bases/:id/search', knowledgeBaseController.searchKnowledgeBase);
|
||
fastify.get('/api/v1/pkb/knowledge-bases/:id/stats', knowledgeBaseController.getKnowledgeBaseStats);
|
||
fastify.get('/api/v1/pkb/knowledge-bases/:id/document-selection', knowledgeBaseController.getDocumentSelection);
|
||
|
||
// 鏂囨。绠$悊
|
||
fastify.post('/api/v1/pkb/knowledge-bases/:kbId/documents', documentController.uploadDocument);
|
||
fastify.get('/api/v1/pkb/knowledge-bases/:kbId/documents', documentController.getDocuments);
|
||
fastify.get('/api/v1/pkb/documents/:id', documentController.getDocumentById);
|
||
fastify.get('/api/v1/pkb/documents/:id/full-text', documentController.getDocumentFullText);
|
||
fastify.delete('/api/v1/pkb/documents/:id', documentController.deleteDocument);
|
||
fastify.post('/api/v1/pkb/documents/:id/reprocess', documentController.reprocessDocument);
|
||
}
|
||
```
|
||
|
||
5. **鍦ㄤ富鍏ュ彛娉ㄥ唽璺<E594BD>敱** (10鍒嗛挓)
|
||
```typescript
|
||
// backend/src/index.ts
|
||
import pkbRoutes from './modules/pkb/routes';
|
||
|
||
// 娉ㄥ唽PKB璺<42>敱
|
||
await fastify.register(pkbRoutes);
|
||
```
|
||
|
||
6. **鍒涘缓妯″潡README** (20鍒嗛挓)
|
||
```markdown
|
||
# PKB 涓<>汉鐭ヨ瘑搴撴ā鍧?
|
||
|
||
## 鍔熻兘姒傝堪
|
||
- 鐭ヨ瘑搴揅RUD
|
||
- 鏂囨。涓婁紶涓庣<E6B693>鐞?
|
||
- Dify RAG妫€绱?
|
||
- 鎵瑰<E98EB5>鐞嗕换鍔?
|
||
|
||
## API绔<49>偣
|
||
...
|
||
|
||
## 鏁版嵁搴揝chema
|
||
- pkb_schema.knowledge_bases
|
||
- pkb_schema.documents
|
||
- pkb_schema.batch_tasks
|
||
- pkb_schema.batch_results
|
||
```
|
||
|
||
#### Task 1.2锛氬墠绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
|
||
|
||
**鐩<>爣鐩<E788A3>綍锛?* `frontend-v2/src/modules/pkb/`
|
||
|
||
**杩佺Щ姝ラ<E5A79D>锛?*
|
||
|
||
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
|
||
```bash
|
||
frontend-v2/src/modules/pkb/
|
||
鈹溾攢鈹€ index.tsx # 妯″潡鍏ュ彛锛堣矾鐢遍厤缃<E58EA4>級
|
||
鈹溾攢鈹€ api/
|
||
鈹? 鈹斺攢鈹€ index.ts # API灏佽<E7818F>
|
||
鈹溾攢鈹€ pages/
|
||
鈹? 鈹溾攢鈹€ KnowledgeBasePage.tsx # 鐭ヨ瘑搴撳垪琛ㄩ〉
|
||
鈹? 鈹斺攢鈹€ KnowledgeBaseDetail.tsx # 鐭ヨ瘑搴撹<E690B4>鎯呴〉
|
||
鈹溾攢鈹€ components/
|
||
鈹? 鈹溾攢鈹€ KnowledgeBaseList.tsx
|
||
鈹? 鈹溾攢鈹€ CreateKBDialog.tsx
|
||
鈹? 鈹溾攢鈹€ EditKBDialog.tsx
|
||
鈹? 鈹溾攢鈹€ DocumentList.tsx
|
||
鈹? 鈹斺攢鈹€ DocumentUpload.tsx
|
||
鈹溾攢鈹€ hooks/
|
||
鈹? 鈹斺攢鈹€ useKnowledgeBase.ts # 鐘舵€佺<E282AC>鐞?
|
||
鈹斺攢鈹€ types/
|
||
鈹斺攢鈹€ index.ts # 绫诲瀷瀹氫箟
|
||
```
|
||
|
||
2. **澶嶅埗骞舵洿鏂癆PI灞?* (30鍒嗛挓)
|
||
- 浠巂frontend/src/api/knowledgeBaseApi.ts`澶嶅埗
|
||
- 鏇存柊API璺<49>緞锛歚/api/knowledge-bases` 鈫?`/api/v1/pkb/knowledge-bases`
|
||
|
||
3. **澶嶅埗骞舵洿鏂扮粍浠?* (90鍒嗛挓)
|
||
- 浠巂frontend/src/components/knowledge/`澶嶅埗鎵€鏈夌粍浠?
|
||
- 鏇存柊瀵煎叆璺<E58F86>緞
|
||
- 浣跨敤鏂扮殑`request`瀹炰緥锛堝<EFBFBD>鏋滄湁锛?
|
||
- 淇濇寔Ant Design 6.0缁勪欢鍏煎<EFBFBD>鎬?
|
||
|
||
4. **澶嶅埗骞舵洿鏂颁富椤甸潰** (60鍒嗛挓)
|
||
- 浠巂frontend/src/pages/KnowledgePage.tsx`澶嶅埗
|
||
- 鎷嗗垎涓轰袱涓<E8A2B1>〉闈<E38089>細鍒楄〃椤?+ 璇︽儏椤碉紙鍙<E7B499>€夛級
|
||
- 鏇存柊鐘舵€佺<E282AC>鐞嗭細Zustand 鈫?React Query鎴栦繚鎸乑ustand
|
||
|
||
5. **鍒涘缓妯″潡鍏ュ彛** (30鍒嗛挓)
|
||
```typescript
|
||
// frontend-v2/src/modules/pkb/index.tsx
|
||
import { lazy } from 'react';
|
||
import { ModuleConfig } from '@/framework/modules/types';
|
||
|
||
const KnowledgeBasePage = lazy(() => import('./pages/KnowledgeBasePage'));
|
||
|
||
const pkbModule: ModuleConfig = {
|
||
id: 'pkb',
|
||
name: '涓<>汉鐭ヨ瘑搴?,
|
||
icon: 'FileTextOutlined',
|
||
routes: [
|
||
{
|
||
path: '/pkb',
|
||
element: <KnowledgeBasePage />,
|
||
permission: 'pkb:view',
|
||
},
|
||
],
|
||
};
|
||
|
||
export default pkbModule;
|
||
```
|
||
|
||
6. **鍦ㄦ<E98DA6>鏋朵腑娉ㄥ唽妯″潡** (10鍒嗛挓)
|
||
```typescript
|
||
// frontend-v2/src/framework/modules/moduleRegistry.ts
|
||
import pkbModule from '@/modules/pkb';
|
||
|
||
registerModule(pkbModule);
|
||
```
|
||
|
||
#### Task 1.3锛氭暟鎹<EFBFBD>簱Schema楠岃瘉 鈴憋笍 棰勮<E6A3B0>30鍒嗛挓
|
||
|
||
**妫€鏌ヤ簨椤癸細**
|
||
- 鉁?`pkb_schema.knowledge_bases` 琛ㄧ粨鏋勫畬鏁?
|
||
- 鉁?`pkb_schema.documents` 琛ㄧ粨鏋勫畬鏁?
|
||
- 鉁?`pkb_schema.batch_tasks` 琛ㄧ粨鏋勫畬鏁?
|
||
- 鉁?`pkb_schema.batch_results` 琛ㄧ粨鏋勫畬鏁?
|
||
- 鉁?澶栭敭鍏崇郴姝g‘
|
||
- 鉁?绱㈠紩榻愬叏
|
||
|
||
**Prisma Schema宸插瓨鍦<E793A8>紝鏃犻渶淇<E6B8B6>敼銆?*
|
||
|
||
#### Task 1.4锛氶泦鎴愭祴璇?鈴憋笍 棰勮<E6A3B0>1灏忔椂
|
||
|
||
**娴嬭瘯娓呭崟锛?*
|
||
1. 鉁?鍒涘缓鐭ヨ瘑搴?
|
||
2. 鉁?涓婁紶鏂囨。锛圥DF/Word锛?
|
||
3. 鉁?鏂囨。鐘舵€佽疆璇?
|
||
4. 鉁?璇<>箟妫€绱?
|
||
5. 鉁?鍒犻櫎鏂囨。
|
||
6. 鉁?鍒犻櫎鐭ヨ瘑搴?
|
||
7. 鉁?Token璁$畻鍜屾櫤鑳介€夋嫨
|
||
8. 鉁?鎵瑰<E98EB5>鐞嗕换鍔″垱寤哄拰鎵ц<E98EB5>
|
||
|
||
---
|
||
|
||
### Phase 2: RVW瀹$ǹ鍔熻兘杩佺Щ
|
||
|
||
#### Task 2.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
|
||
|
||
**鐩<>爣鐩<E788A3>綍锛?* `backend/src/modules/rvw/`
|
||
|
||
**杩佺Щ姝ラ<E5A79D>锛?*
|
||
|
||
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
|
||
```bash
|
||
backend/src/modules/rvw/
|
||
鈹溾攢鈹€ README.md
|
||
鈹溾攢鈹€ controllers/
|
||
鈹? 鈹斺攢鈹€ reviewController.ts
|
||
鈹溾攢鈹€ services/
|
||
鈹? 鈹斺攢鈹€ reviewService.ts
|
||
鈹溾攢鈹€ routes/
|
||
鈹? 鈹斺攢鈹€ index.ts
|
||
鈹溾攢鈹€ prompts/
|
||
鈹? 鈹溾攢鈹€ editorial_system.txt # 浠巄ackend/prompts/澶嶅埗
|
||
鈹? 鈹斺攢鈹€ methodology_system.txt # 浠巄ackend/prompts/澶嶅埗
|
||
鈹斺攢鈹€ types/
|
||
鈹斺攢鈹€ index.ts
|
||
```
|
||
|
||
2. **澶嶅埗骞舵洿鏂版湇鍔″眰** (60鍒嗛挓)
|
||
- 浠巂backend/src/legacy/services/reviewService.ts`澶嶅埗
|
||
- 鏇存柊瀵煎叆璺<E58F86>緞
|
||
- 浣跨敤骞冲彴鑳藉姏锛?
|
||
```typescript
|
||
import { logger } from '@/common/logging';
|
||
import { extractionClient } from '@/common/document/ExtractionClient';
|
||
import { LLMFactory } from '@/common/llm/adapters/LLMFactory';
|
||
```
|
||
- 绉诲姩Prompt鏂囦欢鍒版ā鍧楀唴閮?
|
||
|
||
3. **澶嶅埗骞舵洿鏂版帶鍒跺櫒灞?* (30鍒嗛挓)
|
||
- 浠巂backend/src/legacy/controllers/reviewController.ts`澶嶅埗
|
||
- 鏇存柊瀵煎叆璺<E58F86>緞
|
||
|
||
4. **鍒涘缓璺<E7BC93>敱鏂囦欢** (30鍒嗛挓)
|
||
```typescript
|
||
// backend/src/modules/rvw/routes/index.ts
|
||
import type { FastifyInstance } from 'fastify';
|
||
import * as reviewController from '../controllers/reviewController';
|
||
|
||
export default async function rvwRoutes(fastify: FastifyInstance) {
|
||
fastify.post('/api/v1/rvw/upload', reviewController.uploadManuscript);
|
||
fastify.get('/api/v1/rvw/tasks/:taskId', reviewController.getTaskStatus);
|
||
fastify.get('/api/v1/rvw/tasks/:taskId/report', reviewController.getTaskReport);
|
||
fastify.get('/api/v1/rvw/tasks', reviewController.getTaskList);
|
||
fastify.delete('/api/v1/rvw/tasks/:taskId', reviewController.deleteTask);
|
||
}
|
||
```
|
||
|
||
5. **鍦ㄤ富鍏ュ彛娉ㄥ唽璺<E594BD>敱** (10鍒嗛挓)
|
||
```typescript
|
||
// backend/src/index.ts
|
||
import rvwRoutes from './modules/rvw/routes';
|
||
|
||
await fastify.register(rvwRoutes);
|
||
```
|
||
|
||
#### Task 2.2锛氭暟鎹<EFBFBD>簱Schema杩佺Щ 鈴憋笍 棰勮<E6A3B0>1灏忔椂
|
||
|
||
**褰撳墠闂<E5A2A0><E99782>锛?* `ReviewTask`琛ㄥ湪`public` schema锛岄渶杩佺Щ鍒癭rvw_schema`
|
||
|
||
**杩佺Щ姝ラ<E5A79D>锛?*
|
||
|
||
1. **鏇存柊Prisma Schema** (20鍒嗛挓)
|
||
```prisma
|
||
// backend/prisma/schema.prisma
|
||
model ReviewTask {
|
||
id String @id @default(uuid())
|
||
userId String @map("user_id")
|
||
fileName String @map("file_name")
|
||
fileSize BigInt @map("file_size")
|
||
extractedText String? @map("extracted_text")
|
||
wordCount Int? @map("word_count")
|
||
status String @default("pending")
|
||
modelUsed String @map("model_used")
|
||
overallScore Float? @map("overall_score")
|
||
editorialReview Json? @map("editorial_review")
|
||
methodologyReview Json? @map("methodology_review")
|
||
errorMessage String? @map("error_message")
|
||
startedAt DateTime? @map("started_at")
|
||
completedAt DateTime? @map("completed_at")
|
||
durationSeconds Int? @map("duration_seconds")
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
@@index([userId], map: "idx_rvw_tasks_user_id")
|
||
@@index([status], map: "idx_rvw_tasks_status")
|
||
@@index([createdAt], map: "idx_rvw_tasks_created_at")
|
||
@@map("review_tasks")
|
||
@@schema("rvw_schema") // 猸?杩佺Щ鍒皉vw_schema
|
||
}
|
||
```
|
||
|
||
2. **鍒涘缓杩佺Щ鑴氭湰** (20鍒嗛挓)
|
||
```sql
|
||
-- backend/prisma/migrations/migrate_review_to_rvw_schema.sql
|
||
|
||
-- 1. 鍒涘缓rvw_schema锛堝<E9949B>鏋滀笉瀛樺湪锛?
|
||
CREATE SCHEMA IF NOT EXISTS rvw_schema;
|
||
|
||
-- 2. 鍦╮vw_schema涓<61>垱寤烘柊琛?
|
||
CREATE TABLE rvw_schema.review_tasks (
|
||
-- 澶嶅埗public.ReviewTask琛ㄧ粨鏋?
|
||
-- 娣诲姞铔囧舰鍛藉悕锛坲ser_id, file_name绛夛級
|
||
);
|
||
|
||
-- 3. 杩佺Щ鏁版嵁
|
||
INSERT INTO rvw_schema.review_tasks
|
||
SELECT * FROM public."ReviewTask";
|
||
|
||
-- 4. 鍒涘缓绱㈠紩
|
||
CREATE INDEX idx_rvw_tasks_user_id ON rvw_schema.review_tasks(user_id);
|
||
CREATE INDEX idx_rvw_tasks_status ON rvw_schema.review_tasks(status);
|
||
CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);
|
||
|
||
-- 5. 楠岃瘉鏁版嵁
|
||
SELECT COUNT(*) FROM rvw_schema.review_tasks;
|
||
|
||
-- 6. 澶囦唤鍚庡垹闄ゆ棫琛<E6A3AB>紙鍙<E7B499>€夛級
|
||
-- DROP TABLE public."ReviewTask";
|
||
```
|
||
|
||
3. **杩愯<E69DA9>杩佺Щ** (20鍒嗛挓)
|
||
```bash
|
||
# 鐢熸垚Prisma Client
|
||
cd backend
|
||
npx prisma generate
|
||
|
||
# 杩愯<E69DA9>鎵嬪姩杩佺Щ鑴氭湰
|
||
psql $DATABASE_URL < prisma/migrations/migrate_review_to_rvw_schema.sql
|
||
|
||
# 楠岃瘉
|
||
npm run test:db
|
||
```
|
||
|
||
#### Task 2.3锛氬墠绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
|
||
|
||
**鐩<>爣鐩<E788A3>綍锛?* `frontend-v2/src/modules/rvw/`
|
||
|
||
**杩佺Щ姝ラ<E5A79D>锛?*
|
||
|
||
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
|
||
```bash
|
||
frontend-v2/src/modules/rvw/
|
||
鈹溾攢鈹€ index.tsx
|
||
鈹溾攢鈹€ api/
|
||
鈹? 鈹斺攢鈹€ index.ts
|
||
鈹溾攢鈹€ pages/
|
||
鈹? 鈹溾攢鈹€ ReviewPage.tsx
|
||
鈹? 鈹斺攢鈹€ ReviewList.tsx (鍙<>€?
|
||
鈹溾攢鈹€ components/
|
||
鈹? 鈹溾攢鈹€ ScoreCard.tsx
|
||
鈹? 鈹溾攢鈹€ EditorialReview.tsx
|
||
鈹? 鈹斺攢鈹€ MethodologyReview.tsx
|
||
鈹溾攢鈹€ hooks/
|
||
鈹? 鈹斺攢鈹€ useReviewTask.ts
|
||
鈹斺攢鈹€ types/
|
||
鈹斺攢鈹€ index.ts
|
||
```
|
||
|
||
2. **澶嶅埗骞舵洿鏂癆PI灞?* (30鍒嗛挓)
|
||
- 浠巂frontend/src/api/reviewApi.ts`澶嶅埗
|
||
- 鏇存柊API璺<49>緞锛歚/api/review` 鈫?`/api/v1/rvw`
|
||
|
||
3. **澶嶅埗骞舵洿鏂扮粍浠?* (60鍒嗛挓)
|
||
- 浠巂frontend/src/components/review/`澶嶅埗鎵€鏈夌粍浠?
|
||
- 淇濇寔瑙嗚<E79199>璁捐<E79281>锛堟笎鍙樿壊銆侀<E98A86>鑹茬紪鐮侊級
|
||
|
||
4. **澶嶅埗骞舵洿鏂颁富椤甸潰** (90鍒嗛挓)
|
||
- 浠巂frontend/src/pages/ReviewPage.tsx`澶嶅埗
|
||
- 淇濇寔瀹屾暣UI娴佺▼
|
||
- 鏇存柊CSS瀵煎叆锛堝<E9949B>鏋滈渶瑕侊級
|
||
|
||
5. **鍒涘缓妯″潡鍏ュ彛** (30鍒嗛挓)
|
||
```typescript
|
||
// frontend-v2/src/modules/rvw/index.tsx
|
||
import { lazy } from 'react';
|
||
import { ModuleConfig } from '@/framework/modules/types';
|
||
|
||
const ReviewPage = lazy(() => import('./pages/ReviewPage'));
|
||
|
||
const rvwModule: ModuleConfig = {
|
||
id: 'rvw',
|
||
name: '绋夸欢瀹℃煡',
|
||
icon: 'FileTextOutlined',
|
||
routes: [
|
||
{
|
||
path: '/rvw',
|
||
element: <ReviewPage />,
|
||
permission: 'rvw:view',
|
||
},
|
||
],
|
||
};
|
||
|
||
export default rvwModule;
|
||
```
|
||
|
||
6. **鍦ㄦ<E98DA6>鏋朵腑娉ㄥ唽妯″潡** (10鍒嗛挓)
|
||
|
||
#### Task 2.4锛氶泦鎴愭祴璇?鈴憋笍 棰勮<E6A3B0>1灏忔椂
|
||
|
||
**娴嬭瘯娓呭崟锛?*
|
||
1. 鉁?涓婁紶Word绋夸欢
|
||
2. 鉁?鐘舵€佽疆璇<E79686>紙5涓<35><E6B693>楠わ級
|
||
3. 鉁?绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級
|
||
4. 鉁?鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛?
|
||
5. 鉁?鎬讳綋璇勫垎璁$畻
|
||
6. 鉁?鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
|
||
7. 鉁?瀵煎嚭PDF
|
||
8. 鉁?澶嶅埗鎶ュ憡鏂囨湰
|
||
9. 鉁?浠诲姟鍒楄〃鏌ヨ<E98F8C>
|
||
10. 鉁?鍒犻櫎浠诲姟
|
||
|
||
---
|
||
|
||
## 馃敡 鎶€鏈<E282AC>粏鑺傝ˉ鍏?
|
||
|
||
### 鍏抽敭渚濊禆澶嶇敤
|
||
|
||
**宸叉湁骞冲彴鑳藉姏锛堝彲鐩存帴澶嶇敤锛夛細**
|
||
```typescript
|
||
// 鉁?鏂囨。鎻愬彇鏈嶅姟锛堝凡鏈夛級
|
||
import { extractionClient } from '@/common/document/ExtractionClient';
|
||
// 鏀<>寔锛歅DF銆乄ord銆乀XT锛屽凡闆嗘垚Python寰<6E>湇鍔?
|
||
|
||
// 鉁?LLM缃戝叧锛堝凡鏈夛級
|
||
import { LLMFactory } from '@/common/llm/adapters/LLMFactory';
|
||
// 鏀<>寔锛欴eepSeek-V3, Qwen-Max, GPT-5-Pro, Claude-4.5
|
||
|
||
// 鉁?瀛樺偍鏈嶅姟锛堝凡鏈夛級
|
||
import { storage } from '@/common/storage';
|
||
// 鏀<>寔锛歀ocalAdapter 鈫?OSSAdapter闆朵唬鐮佸垏鎹?
|
||
|
||
// 鉁?鏃ュ織绯荤粺锛堝凡鏈夛級
|
||
import { logger } from '@/common/logging';
|
||
|
||
// 鉁?RAG鏈嶅姟锛堝凡鏈夛紝PKB闇€瑕侊級
|
||
import { difyClient } from '@/common/rag/DifyClient';
|
||
```
|
||
|
||
### 澶栭儴渚濊禆
|
||
|
||
**PKB妯″潡棰濆<E6A3B0>渚濊禆锛?*
|
||
- 鉁?**Dify骞冲彴**锛氬凡閮ㄧ讲锛屾彁渚汻AG妫€绱㈣兘鍔?
|
||
- 鉁?**tiktoken**锛歍oken璁$畻锛屽凡瀹夎<E780B9>锛坄@dqbd/tiktoken`锛?
|
||
- 鉁?**Python寰<6E>湇鍔?*锛氭枃妗f彁鍙栵紝宸查儴缃?
|
||
|
||
**RVW妯″潡棰濆<E6A3B0>渚濊禆锛?*
|
||
- 鉁?**html2canvas**锛歅DF瀵煎嚭锛堝墠绔<E5A2A0>級锛岄渶瀹夎<E780B9>
|
||
- 鉁?**jspdf**锛歅DF鐢熸垚锛堝墠绔<E5A2A0>級锛岄渶瀹夎<E780B9>
|
||
|
||
### API璺<49>緞瑙勮寖
|
||
|
||
**鏂版灦鏋凙PI璺<49>緞锛?*
|
||
```
|
||
PKB妯″潡锛?
|
||
/api/v1/pkb/knowledge-bases/*
|
||
/api/v1/pkb/documents/*
|
||
|
||
RVW妯″潡锛?
|
||
/api/v1/rvw/upload
|
||
/api/v1/rvw/tasks/*
|
||
```
|
||
|
||
**鏃ф灦鏋凙PI璺<49>緞锛堥渶鍚戝悗鍏煎<E98D8F>锛夛細**
|
||
```
|
||
/api/knowledge-bases/* 锛堝彲淇濈暀锛岄噸瀹氬悜鍒版柊璺<E69F8A>緞锛?
|
||
/api/review/* 锛堝彲淇濈暀锛岄噸瀹氬悜鍒版柊璺<E69F8A>緞锛?
|
||
```
|
||
|
||
---
|
||
|
||
## 馃摑 鏁版嵁杩佺Щ涓庡悜鍚庡吋瀹?
|
||
|
||
### PKB妯″潡
|
||
- 鉁?**鏃犻渶鏁版嵁杩佺Щ**锛歚pkb_schema`宸插瓨鍦ㄤ笖缁撴瀯瀹屾暣
|
||
- 鉁?**API鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫璺<E6A3AB>緞`/api/knowledge-bases`锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?
|
||
|
||
### RVW妯″潡
|
||
- 鈿狅笍 **闇€瑕佹暟鎹<E69A9F>縼绉?*锛歚public.ReviewTask` 鈫?`rvw_schema.review_tasks`
|
||
- 鈿狅笍 **瀛楁<E7809B>鍚嶈皟鏁?*锛氶┘宄板懡鍚?鈫?铔囧舰鍛藉悕锛坄userId` 鈫?`user_id`锛?
|
||
- 鉁?**API鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫璺<E6A3AB>緞`/api/review`锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?
|
||
|
||
**杩佺Щ鑴氭湰妯℃澘锛?*
|
||
```sql
|
||
-- 鍒涘缓鏂癝chema
|
||
CREATE SCHEMA IF NOT EXISTS rvw_schema;
|
||
|
||
-- 鍒涘缓鏂拌〃锛堣泧褰㈠懡鍚嶏級
|
||
CREATE TABLE rvw_schema.review_tasks AS
|
||
SELECT
|
||
id,
|
||
"userId" AS user_id,
|
||
"fileName" AS file_name,
|
||
"fileSize" AS file_size,
|
||
"extractedText" AS extracted_text,
|
||
"wordCount" AS word_count,
|
||
status,
|
||
"modelUsed" AS model_used,
|
||
"overallScore" AS overall_score,
|
||
"editorialReview" AS editorial_review,
|
||
"methodologyReview" AS methodology_review,
|
||
"errorMessage" AS error_message,
|
||
"startedAt" AS started_at,
|
||
"completedAt" AS completed_at,
|
||
"durationSeconds" AS duration_seconds,
|
||
"createdAt" AS created_at
|
||
FROM public."ReviewTask";
|
||
|
||
-- 鍒涘缓绱㈠紩
|
||
CREATE INDEX idx_rvw_tasks_user_id ON rvw_schema.review_tasks(user_id);
|
||
CREATE INDEX idx_rvw_tasks_status ON rvw_schema.review_tasks(status);
|
||
CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);
|
||
```
|
||
|
||
---
|
||
|
||
## 鉁?楠屾敹鏍囧噯
|
||
|
||
### PKB妯″潡杩佺Щ瀹屾垚鏍囧噯
|
||
1. 鉁?鍚庣<E98D9A>浠g爜鍦╜backend/src/modules/pkb/`
|
||
2. 鉁?鍓嶇<E98D93>浠g爜鍦╜frontend-v2/src/modules/pkb/`
|
||
3. 鉁?API璺<49>緞涓篳/api/v1/pkb/*`
|
||
4. 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堢煡璇嗗簱CRUD銆佹枃妗d笂浼犮€佹<E282AC>绱€€佹壒澶勭悊锛?
|
||
5. 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堝垪琛ㄣ€佽<E282AC>鎯呫€佷笂浼犮€佸<E282AC>璇濇<E79287>锛?
|
||
6. 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乻torage銆乪xtractionClient銆乨ifyClient锛?
|
||
7. 鉁?鏂囨。瀹屾暣锛圧EADME.md銆丄PI鏂囨。锛?
|
||
|
||
### RVW妯″潡杩佺Щ瀹屾垚鏍囧噯
|
||
1. 鉁?鍚庣<E98D9A>浠g爜鍦╜backend/src/modules/rvw/`
|
||
2. 鉁?鍓嶇<E98D93>浠g爜鍦╜frontend-v2/src/modules/rvw/`
|
||
3. 鉁?API璺<49>緞涓篳/api/v1/rvw/*`
|
||
4. 鉁?鏁版嵁宸茶縼绉诲埌`rvw_schema.review_tasks`
|
||
5. 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堜笂浼犮€佽瘎浼般€佹姤鍛娿€佸<E282AC>鍑猴級
|
||
6. 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堜笂浼犮€佽繘搴︺€佹姤鍛娿€佸<E282AC>鍑猴級
|
||
7. 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乪xtractionClient銆丩LMFactory锛?
|
||
8. 鉁?Prompt鏂囦欢鍦ㄦā鍧楀唴閮<E594B4>紙`modules/rvw/prompts/`锛?
|
||
|
||
---
|
||
|
||
## 馃摎 鏂囨。鏇存柊娓呭崟
|
||
|
||
### 闇€瑕佹洿鏂扮殑鏂囨。
|
||
|
||
1. **绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?*
|
||
- 鏂囦欢锛歚docs/00-绯荤粺鎬讳綋璁捐<E79281>/00-绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md`
|
||
- 鏇存柊锛歅KB鍜孯VW妯″潡鐘舵€佷粠"宸插畬鎴愶紙鏃ф灦鏋勶級"鏀逛负"鉁?100%锛堟柊鏋舵瀯锛?
|
||
|
||
2. **妯″潡README鍒涘缓**
|
||
- `backend/src/modules/pkb/README.md`
|
||
- `backend/src/modules/rvw/README.md`
|
||
|
||
3. **鍓嶇<E98D93>妯″潡鏂囨。**
|
||
- `frontend-v2/src/modules/pkb/README.md`
|
||
- `frontend-v2/src/modules/rvw/README.md`
|
||
|
||
4. **API鏂囨。鏇存柊**
|
||
- `docs/04-寮€鍙戣<E98D99>鑼?04-API璺<49>敱鎬昏<E98EAC>.md`
|
||
- 娣诲姞PKB鍜孯VW鐨凙PI绔<49>偣娓呭崟
|
||
|
||
5. **杩佺Щ瀹屾垚鎶ュ憡**
|
||
- 鏂板缓锛歚docs/08-椤圭洰绠$悊/PKB鍜孯VW杩佺Щ瀹屾垚鎶ュ憡.md`
|
||
- 璁板綍锛氳縼绉绘椂闂淬€侀亣鍒扮殑闂<E6AE91><E99782>銆佽В鍐虫柟妗堛€佹祴璇曠粨鏋?
|
||
|
||
---
|
||
|
||
## 馃幆 鎬荤粨
|
||
|
||
### 杩佺Щ浼樺娍
|
||
1. 鉁?**鏋舵瀯缁熶竴**锛氭墍鏈夋ā鍧楅伒寰<E4BC92>浉鍚岀殑妯″潡鍖栫粨鏋?
|
||
2. 鉁?**鏄撲簬缁存姢**锛氫唬鐮佺粍缁囨竻鏅帮紝鑱岃矗鏄庣‘
|
||
3. 鉁?**澶嶇敤骞冲彴鑳藉姏**锛氬噺灏戦噸澶嶄唬鐮侊紝鎻愬崌浠g爜璐ㄩ噺
|
||
4. 鉁?**鏀<>寔鐙<E5AF94>珛閮ㄧ讲**锛氭瘡涓<E798A1>ā鍧楀彲鐙<E5BDB2>珛鎵撳寘銆侀儴缃层€侀攢鍞?
|
||
5. 鉁?**Schema闅旂<E99785>**锛氭暟鎹<E69A9F>簱灞傞潰妯″潡鐙<E6BDA1>珛锛岄檷浣庤€﹀悎
|
||
|
||
### 棰勮<E6A3B0>鎬昏€楁椂
|
||
- **PKB妯″潡杩佺Щ**锛?-8灏忔椂
|
||
- **RVW妯″潡杩佺Щ**锛?-9灏忔椂锛堝惈鏁版嵁杩佺Щ锛?
|
||
- **鎬昏<E98EAC>**锛?3-17灏忔椂锛堢害2涓<32>伐浣滄棩锛?
|
||
|
||
### 椋庨櫓璇勪及
|
||
- 鉁?**椋庨櫓浣?*锛氬姛鑳藉凡100%瀹屾垚锛屼唬鐮佽川閲忛珮
|
||
- 鉁?**娴嬭瘯瑕嗙洊**锛氭湁瀹屾暣鐨勬墜鍔ㄦ祴璇曟祦绋?
|
||
- 鉁?**鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫API璺<49>緞锛屼笉褰卞搷鐜版湁鍓嶇<E98D93>
|
||
|
||
---
|
||
|
||
**鏂囨。缁存姢鑰咃細** 鎶€鏈<E282AC>洟闃?
|
||
**鏈€鍚庢洿鏂帮細** 2025-12-28
|
||
**涓嬩竴姝ワ細** 鎵ц<E98EB5>杩佺Щ浠诲姟锛屾寜TODO娓呭崟閫愰」瀹屾垚
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|