Files
AIclinicalresearch/docs/08-项目管理/PKB和RVW功能迁移计划.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

29 KiB
Raw Blame History

PKB锛堜釜浜虹煡璇嗗簱锛夊拰 RVW锛堝<E9949B>绋垮姛鑳斤級杩佺Щ璁″垝

*鍒涘缓鏃ユ湡锛? 2025-12-28
缁存姢鑰咃細 鎶€鏈<E282AC>洟闃? *<EFBFBD>爣锛? 灏嗗凡寮€鍙戠殑PKB鍜孯VW鍔熻兘杩佺Щ鍒版渶鏂扮殑妯″潡鍖栨灦鏋勪笂


馃搵 鎵ц<E98EB5>鎽樿<E98EBD>

杩佺Щ鐩<EFBFBD>

灏嗘棫鐗堟湰锛坄frontend+backend/src/legacy锛変腑鐨?*涓<>汉鐭ヨ瘑搴擄紙PKB锛?*鍜?*瀹ǹ鍔熻兘锛圧VW锛?*杩佺Щ鍒版柊鏋舵瀯锛坄frontend-v2 + backend/src/modules锛夛紝浣垮叾绗﹀悎鏈€鏂扮殑妯″潡鍖栥€佷簯鍘熺敓璁捐<EFBFBD>瑙勮寖銆?

褰撳墠鐘舵€?

鍔熻兘 鏃ф灦鏋勪綅缃? 瀹屾垚搴? 鏁版嵁搴揝chema 鍓嶇<EFBFBD>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锛堜釜浜虹煡璇嗗簱锛夊姛鑳借<EFBFBD>鎯?

1.1 鍔熻兘鐗规€?

*鏍稿績鑳藉姏锛?

  • 鉁?鐭ヨ瘑搴揅RUD锛氬垱寤恒€佹煡鐪嬨€佺紪杈戙€佸垹闄ょ煡璇嗗簱
  • 鉁?閰嶉<EFBFBD>锛氭瘡鐢ㄦ埛3涓<EFBFBD>煡璇嗗簱锛屾瘡搴?0涓<30>枃妗?
  • 鉁?鏂囨。涓婁紶锛氭敮鎸丳DF銆乄ord銆乀XT銆丮arkdown
  • 鉁?**鏂囨。鐘舵€佽拷韪?*锛歶ploading 鈫?parsing 鈫?indexing 鈫?completed/error
  • 鉁?Dify RAG闆嗘垚锛氬熀浜嶥ify骞冲彴鐨勫悜閲忔<EFBFBD>绱?
  • 鉁?**璇<>箟妫€绱?*锛氭敮鎸佸<E98EB8>鐭ヨ瘑搴撹仈鍚堟<E98D9A><EFBFBD>紝top_k=15
  • 鉁?缁熻<EFBFBD>淇℃伅锛氭枃妗暟銆乀oken鏁般€佹<EFBFBD>钀芥暟缁熻<EFBFBD>
  • 鉁?鍏ㄦ枃闃呰<EFBFBD>妯″紡锛圥hase2锛夛細Token闄愬埗銆佹櫤鑳芥枃妗€夋嫨

鎶€鏈<EFBFBD>寒鐐癸細

  • 馃弳 **Python寰<6E>湇鍔¢泦鎴?*锛氳皟鐢╜extraction_service`鎻愬彇鏂囨。鏂囨湰
  • 馃弳 Dify Dataset绠锛氭瘡涓<EFBFBD>煡璇嗗簱瀵瑰簲涓€涓狣ify Dataset
  • 馃弳 Token绮剧锛氫娇鐢╰iktoken璁畻Token鏁帮紝鍙岄噸闄愬埗锛?0鏂囦欢 + 980K tokens锛?
  • 馃弳 鏅鸿兘鏂囨。閫夋嫨锛氬熀浜嶵oken瀹归噺鐨勬櫤鑳芥帹鑽愮畻娉?

1.2 鏁版嵁搴撶粨鏋?

PKB Schema锛坄pkb_schema`锛夛細

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>爜缁撴瀯

鏈嶅姟灞傦紙backend/src/legacy/services/锛夛細

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/`锛夛細

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>爜缁撴瀯

涓婚〉闈<EFBFBD>frontend/src/pages/KnowledgePage.tsx锛夛細 281琛?

  • 鐭ヨ瘑搴撳垪琛ㄨ<EFBFBD>鍥?
  • 鐭ヨ瘑搴撹<EFBFBD>鎯呰<EFBFBD>鍥撅紙Tabs锛氭枃妗<EFBFBD>鐞?+ 缁熻<E7BC81>淇℃伅锛?
  • 鍙岃繘搴︽潯瀹归噺鏄剧ず锛堟枃浠舵暟 + Token鏁帮級

缁勪欢锛坄frontend/src/components/knowledge/`锛夛細

KnowledgeBaseList.tsx      // 鐭ヨ瘑搴撳崱鐗囧垪琛?
CreateKBDialog.tsx         // 鍒涘缓瀵硅瘽妗?
EditKBDialog.tsx           // 缂栬緫瀵硅瘽妗?
DocumentList.tsx           // 鏂囨。鍒楄〃锛堝惈鐘舵€佸窘绔狅級
DocumentUpload.tsx         // 鏂囦欢涓婁紶锛堟嫋鎷芥敮鎸侊級

鐘舵€佺<EFBFBD>鐞嗭紙frontend/src/stores/useKnowledgeBaseStore.ts锛夛細

  • Zustand鐘舵€佺<EFBFBD>鐞?
  • API璋冪敤灏佽<EFBFBD>
  • 瀹炴椂鐘舵€佽疆璇<EFBFBD>紙5绉掗棿闅旓級

浜屻€丷VW锛堝<EFBFBD>绋垮姛鑳斤級鍔熻兘璇︽儏

2.1 鍔熻兘鐗规€?

*鏍稿績鑳藉姏锛?

  • 鉁?绋夸欢涓婁紶锛氭敮鎸乄ord鏂囨。锛?doc/.docx锛夛紝鏈€澶?MB
  • 鉁?**鍙岀淮搴﹁瘎浼?*锛?
    • 绋跨害瑙勮寖鎬ц瘎浼帮紙11椤规爣鍑嗭級
    • 鏂规硶瀛﹁瘎浼帮紙3澶ч儴鍒嗭級
  • 鉁?鍩轰簬鐪熷疄鏈熷垔鏍囧噯锛氥€婁腑鍗庡尰瀛﹁秴澹版潅蹇椼€嬬ǹ绾?
  • 鉁?鏅鸿兘鍒嗘瀽锛氫娇鐢↙LM杩涜<EFBFBD>缁撴瀯鍖栬瘎浼?
  • 鉁?瀹屾暣鎶ュ憡锛欽SON鏍煎紡缁撴灉锛屾敮鎸佸<EFBFBD>鍑篜DF/澶嶅埗鏂囨湰
  • 鉁?妯″瀷閫夋嫨锛欴eepSeek-V3 / Qwen3-72B / Qwen-Long
  • 鉁?浠诲姟绠$悊锛氫换鍔″垪琛ㄣ€佺姸鎬佽拷韪<EFBFBD>€佽繘搴︽樉绀?

*璇勪及鏍囧噯锛?

*绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級锛?

  1. 鏂囬<EFBFBD>锛圱itle锛?
  2. 浣滆€咃紙Authors锛?
  3. <EFBFBD>枃鎽樿<EFBFBD>锛圕hinese Abstract锛?
  4. 鑻辨枃鎽樿<EFBFBD>锛圗nglish Abstract锛?
  5. <EFBFBD>枃鍏抽敭璇嶏紙Chinese Keywords锛?
  6. 鑻辨枃鍏抽敭璇嶏紙English Keywords锛?
  7. 枃锛圡ain Text锛?
  8. 鍙傝€冩枃鐚<EFBFBD>紙References锛?
  9. 鍥捐〃锛團igures and Tables锛?
  10. 鍒╃泭鍐茬獊锛圕onflict of Interest锛?
  11. 浼︾悊瀹℃煡锛圗thics Approval锛?

鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛夛細

  1. 绉戠爺璁捐<EFBFBD>锛圧esearch Design锛?
  2. 缁熻<EFBFBD>鏂规硶锛圫tatistical Methods锛?
  3. 缁熻<EFBFBD>鍒嗘瀽锛圫tatistical Analysis锛?

2.2 鏁版嵁搴撶粨鏋?

ReviewTask琛<EFBFBD>紙褰撳墠鍦╜public schema锛岄渶杩佺Щ鍒癭rvw_schema锛夛細

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>爜缁撴瀯

鏈嶅姟灞傦紙backend/src/legacy/services/reviewService.ts锛夛細 453琛?

reviewManuscript()           // 涓诲叆鍙紙寮傛<E5AFAE>鎵ц<E98EB5>锛?
processReviewTask()          // 鍚庡彴澶勭悊浠诲姟
reviewEditorialStandards()   // 绋跨害瑙勮寖鎬ц瘎浼?
reviewMethodology()          // 鏂规硶瀛﹁瘎浼?
parseJSONFromLLMResponse()   // 瀹归敊JSON瑙getReviewTask()              // 鑾峰彇浠诲姟鐘舵€?
getReviewTasks()             // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
deleteReviewTask()           // 鍒犻櫎浠诲姟
getReviewReport()            // 鑾峰彇瀹屾暣鎶ュ憡

Prompt璁捐<EFBFBD>锛坄backend/prompts/`锛夛細

review_editorial_system.txt (210琛?
鈹斺攢鈹€ 11涓<31>瘎浼扮淮搴︾殑璇︾粏鏍囧噯

review_methodology_system.txt (231琛?
鈹斺攢鈹€ 3涓<33>儴鍒嗙殑璇勪及鏍囧噯

у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/reviewController.ts`锛夛細 265琛?

POST   /review/upload                 // 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌?
GET    /review/tasks/:taskId           // 鑾峰彇浠诲姟鐘舵€?
GET    /review/tasks/:taskId/report    // 鑾峰彇瀹℃煡鎶ュ憡
GET    /review/tasks                   // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
DELETE /review/tasks/:taskId           // 鍒犻櫎浠诲姟

2.4 鍓嶇<E98D93>爜缁撴瀯

涓婚〉闈<EFBFBD>frontend/src/pages/ReviewPage.tsx锛夛細 625琛?

  • 娓愬彉鑹叉爣棰樺崱鐗?
  • 3姝ユ祦绋嬶細涓婁紶绋夸欢 鈫?閫夋嫨妯″瀷 鈫?寮€濮嬪<E6BFAE>鏌?
  • 5姝ヨ繘搴﹀睍绀猴細涓婁紶 鈫?鎻愬彇鏂囨湰 鈫?绋跨害璇勪及 鈫?鏂规硶瀛﹁瘎浼?鈫?鐢熸垚鎶ュ憡
  • 鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
  • 瀵煎嚭鍔熻兘锛圥DF鐢熸垚 + 鏂囨湰澶嶅埗锛?

缁勪欢锛坄frontend/src/components/review/`锛夛細

ScoreCard.tsx              // 鍒嗘暟鍗墖锛堥<E9949B>鑹茬紪鐮侊級
EditorialReview.tsx        // 绋跨害瑙勮寖鎬ц瘎浼拌<E6B5BC>鎯?
MethodologyReview.tsx      // 鏂规硶瀛﹁瘎浼拌<E6B5BC>鎯?

*瑙嗚<EFBFBD>璁捐<EFBFBD>锛?

  • 娓愬彉鑹蹭富棰橈細linear-gradient(135deg, #667eea 0%, #764ba2 100%)
  • 鍒嗘暟棰滆壊缂栫爜锛氣墺90浼樼<EFBFBD>锛堢豢锛夈€佲墺80鑹<EFBFBD>ソ锛堣摑锛夈€佲墺70涓<EFBFBD>瓑锛堥粍锛夈€?70闇€鏀硅繘锛堢孩锛?
  • 鎷栨嫿涓婁紶鏀<EFBFBD>
  • 鍝嶅簲寮忓竷灞€

馃幆 杩佺Щ绛栫暐

杩佺Щ鍘熷垯

  1. **淇濇寔鍔熻兘瀹屾暣鎬?*锛?00%淇濈暀鐜版湁鍔熻兘锛屼笉鍋氬垹鍑?
  2. **閬靛惊鏂版灦鏋勮<E98F8B>鑼?*锛氱<E9949B>鍚堟ā鍧楀寲銆丼chema闅旂<E99785>銆佷簯鍘熺敓璁捐<E79281>
  3. 澶嶇敤骞冲彴鑳藉姏锛氫娇鐢╜common`灞傜殑瀛樺偍銆佹棩蹇椼€丩LM銆佹枃妗<E5A697>鐞嗘湇鍔?
  4. **娓愯繘寮忚縼绉?*锛氬厛鍚庣<E98D9A>鍐嶅墠绔<E5A2A0>紝纭<E7B49D>繚姣忔<E5A7A3><EFBFBD>祴璇?
  5. **淇濇寔鏁版嵁鍏煎<E98D8F>**锛氭暟鎹<E69A9F>簱琛ㄧ粨鏋勫钩婊戣縼绉伙紝涓嶄涪澶辨暟鎹?

馃搵 杩佺Щ浠诲姟娓呭崟

Phase 1: PKB涓<42>汉鐭ヨ瘑搴撹縼绉伙紙浼樺厛锛?

Task 1.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂

*<EFBFBD>爣鐩<EFBFBD>綍锛? backend/src/modules/pkb/

*杩佺Щ姝ラ<EFBFBD>锛?

  1. 鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)

    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/`澶嶅埗鏂囦欢
    • 鏇存柊瀵煎叆璺<EFBFBD>緞锛?
      // 鉂?鏃т唬鐮?
      import { prisma } from '../../config/database.js';
      import { difyClient } from '../../common/rag/DifyClient.js';
      
      // 鉁?鏂颁唬鐮?
      import { prisma } from '@/config/database';
      import { difyClient } from '@/common/rag/DifyClient';
      
    • 浣跨敤骞冲彴鑳藉姏锛?
      // 鉁?浣跨敤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/`澶嶅埗鏂囦欢
    • 鏇存柊瀵煎叆璺<EFBFBD>
    • 绉婚櫎MOCK_USER_ID锛屼粠request.user鑾峰彇锛堝緟瀹炵幇璁よ瘉涓<EFBFBD>棿浠讹級
  4. 鍒涘缓璺<EFBFBD>敱鏂囦欢 (30鍒嗛挓)

    // 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. 鍦ㄤ富鍏ュ彛娉ㄥ唽璺<EFBFBD> (10鍒嗛挓)

    // backend/src/index.ts
    import pkbRoutes from './modules/pkb/routes';
    
    // 娉ㄥ唽PKB璺<42>await fastify.register(pkbRoutes);
    
  6. 鍒涘缓妯″潡README (20鍒嗛挓)

    # 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灏忔椂

*<EFBFBD>爣鐩<EFBFBD>綍锛? frontend-v2/src/modules/pkb/

*杩佺Щ姝ラ<EFBFBD>锛?

  1. 鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)

    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璺<EFBFBD>緞锛歚/api/knowledge-bases 鈫?/api/v1/pkb/knowledge-bases`
  3. *澶嶅埗骞舵洿鏂扮粍浠? (90鍒嗛挓)

    • 浠巂frontend/src/components/knowledge/`澶嶅埗鎵€鏈夌粍浠?
    • 鏇存柊瀵煎叆璺<EFBFBD>
    • 浣跨敤鏂扮殑request瀹炰緥锛堝<EFBFBD>鏋滄湁锛?
    • 淇濇寔Ant Design 6.0缁勪欢鍏煎<EFBFBD>鎬?
  4. 澶嶅埗骞舵洿鏂颁富椤甸潰 (60鍒嗛挓)

    • 浠巂frontend/src/pages/KnowledgePage.tsx`澶嶅埗
    • 鎷嗗垎涓轰袱涓<EFBFBD>〉闈<EFBFBD>細鍒楄〃椤?+ 璇︽儏椤碉紙鍙<E7B499>€夛級
    • 鏇存柊鐘舵€佺<EFBFBD>鐞嗭細Zustand 鈫?React Query鎴栦繚鎸乑ustand
  5. 鍒涘缓妯″潡鍏ュ彛 (30鍒嗛挓)

    // 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. 鍦ㄦ<EFBFBD>鏋朵腑娉ㄥ唽妯″潡 (10鍒嗛挓)

    // 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灏忔椂

*<EFBFBD>爣鐩<EFBFBD>綍锛? backend/src/modules/rvw/

*杩佺Щ姝ラ<EFBFBD>锛?

  1. 鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)

    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`澶嶅埗
    • 鏇存柊瀵煎叆璺<EFBFBD>
    • 浣跨敤骞冲彴鑳藉姏锛?
      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`澶嶅埗
    • 鏇存柊瀵煎叆璺<EFBFBD>
  4. 鍒涘缓璺<EFBFBD>敱鏂囦欢 (30鍒嗛挓)

    // 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. 鍦ㄤ富鍏ュ彛娉ㄥ唽璺<EFBFBD> (10鍒嗛挓)

    // backend/src/index.ts
    import rvwRoutes from './modules/rvw/routes';
    
    await fastify.register(rvwRoutes);
    

Task 2.2锛氭暟鎹<EFBFBD>簱Schema杩佺Щ 鈴憋笍 棰勮<E6A3B0>1灏忔椂

*褰撳墠闂<EFBFBD><EFBFBD>锛? ReviewTask琛ㄥ湪public schema锛岄渶杩佺Щ鍒癭rvw_schema`

*杩佺Щ姝ラ<EFBFBD>锛?

  1. 鏇存柊Prisma Schema (20鍒嗛挓)

    // 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鍒嗛挓)

    -- 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. 杩愯<EFBFBD>杩佺Щ (20鍒嗛挓)

    # 鐢熸垚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灏忔椂

*<EFBFBD>爣鐩<EFBFBD>綍锛? frontend-v2/src/modules/rvw/

*杩佺Щ姝ラ<EFBFBD>锛?

  1. 鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)

    frontend-v2/src/modules/rvw/
    鈹溾攢鈹€ index.tsx
    鈹溾攢鈹€ api/
    鈹?  鈹斺攢鈹€ index.ts
    鈹溾攢鈹€ pages/
    鈹?  鈹溾攢鈹€ ReviewPage.tsx
    鈹?  鈹斺攢鈹€ ReviewList.tsx (<EFBFBD>€?
    鈹溾攢鈹€ components/
    鈹?  鈹溾攢鈹€ ScoreCard.tsx
    鈹?  鈹溾攢鈹€ EditorialReview.tsx
    鈹?  鈹斺攢鈹€ MethodologyReview.tsx
    鈹溾攢鈹€ hooks/
    鈹?  鈹斺攢鈹€ useReviewTask.ts
    鈹斺攢鈹€ types/
        鈹斺攢鈹€ index.ts
    
  2. *澶嶅埗骞舵洿鏂癆PI灞? (30鍒嗛挓)

    • 浠巂frontend/src/api/reviewApi.ts`澶嶅埗
    • 鏇存柊API璺<EFBFBD>緞锛歚/api/review 鈫?/api/v1/rvw`
  3. *澶嶅埗骞舵洿鏂扮粍浠? (60鍒嗛挓)

    • 浠巂frontend/src/components/review/`澶嶅埗鎵€鏈夌粍浠?
    • 淇濇寔瑙嗚<EFBFBD>璁捐<EFBFBD>锛堟笎鍙樿壊銆侀<EFBFBD>鑹茬紪鐮侊級
  4. 澶嶅埗骞舵洿鏂颁富椤甸潰 (90鍒嗛挓)

    • 浠巂frontend/src/pages/ReviewPage.tsx`澶嶅埗
    • 淇濇寔瀹屾暣UI娴佺▼
    • 鏇存柊CSS瀵煎叆锛堝<EFBFBD>鏋滈渶瑕侊級
  5. 鍒涘缓妯″潡鍏ュ彛 (30鍒嗛挓)

    // 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. 鍦ㄦ<EFBFBD>鏋朵腑娉ㄥ唽妯″潡 (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>粏鑺傝ˉ鍏?

鍏抽敭渚濊禆澶嶇敤

宸叉湁骞冲彴鑳藉姏锛堝彲鐩存帴澶嶇敤锛夛細

// 鉁?鏂囨。鎻愬彇鏈嶅姟锛堝凡鏈夛級
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妯″潡棰濆<EFBFBD>渚濊禆锛?

  • 鉁?Dify骞冲彴锛氬凡閮ㄧ讲锛屾彁渚汻AG妫€绱㈣兘鍔?
  • 鉁?tiktoken锛歍oken璁畻锛屽凡瀹夎<EFBFBD>锛坄@dqbd/tiktoken`锛?
  • 鉁?**Python寰<6E>湇鍔?*锛氭枃妗f彁鍙栵紝宸查儴缃?

*RVW妯″潡棰濆<EFBFBD>渚濊禆锛?

  • 鉁?html2canvas锛歅DF瀵煎嚭锛堝墠绔<EFBFBD>級锛岄渶瀹夎<EFBFBD>
  • 鉁?jspdf锛歅DF鐢熸垚锛堝墠绔<EFBFBD>級锛岄渶瀹夎<EFBFBD>

API璺<EFBFBD>緞瑙勮寖

*鏂版灦鏋凙PI璺<EFBFBD>緞锛?

PKB妯″潡锛?
  /api/v1/pkb/knowledge-bases/*
  /api/v1/pkb/documents/*

RVW妯″潡锛?
  /api/v1/rvw/upload
  /api/v1/rvw/tasks/*

鏃ф灦鏋凙PI璺<EFBFBD>緞锛堥渶鍚戝悗鍏煎<EFBFBD>锛夛細

/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锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?

*杩佺Щ鑴氭湰妯℃澘锛?

-- 鍒涘缓鏂癝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>爜鍦╜backend/src/modules/pkb/`
  2. 鉁?鍓嶇<E98D93>爜鍦╜frontend-v2/src/modules/pkb/`
  3. 鉁?API璺<49>緞涓篳/api/v1/pkb/*`
  4. 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堢煡璇嗗簱CRUD銆佹枃妗笂浼犮€佹<E282AC>绱€€佹壒澶勭悊锛?
  5. 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堝垪琛ㄣ€佽<E282AC>鎯呫€佷笂浼犮€佸<E282AC>璇濇<E79287>锛?
  6. 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乻torage銆乪xtractionClient銆乨ifyClient锛?
  7. 鉁?鏂囨。瀹屾暣锛圧EADME.md銆丄PI鏂囨。锛?

RVW妯″潡杩佺Щ瀹屾垚鏍囧噯

  1. 鉁?鍚庣<E98D9A>爜鍦╜backend/src/modules/rvw/`
  2. 鉁?鍓嶇<E98D93>爜鍦╜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. 鍓嶇<EFBFBD>妯″潡鏂囨。

    • 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绔<EFBFBD>偣娓呭崟
  5. 杩佺Щ瀹屾垚鎶ュ憡

    • 鏂板缓锛歚docs/08-椤圭洰绠$悊/PKB鍜孯VW杩佺Щ瀹屾垚鎶ュ憡.md`
    • 璁板綍锛氳縼绉绘椂闂淬€侀亣鍒扮殑闂<EFBFBD><EFBFBD>銆佽В鍐虫柟妗堛€佹祴璇曠粨鏋?

馃幆 鎬荤粨

杩佺Щ浼樺娍

  1. 鉁?鏋舵瀯缁熶竴锛氭墍鏈夋ā鍧楅伒寰<EFBFBD>浉鍚岀殑妯″潡鍖栫粨鏋?
  2. 鉁?鏄撲簬缁存姢锛氫唬鐮佺粍缁囨竻鏅帮紝鑱岃矗鏄庣‘
  3. 鉁?澶嶇敤骞冲彴鑳藉姏锛氬噺灏戦噸澶嶄唬鐮侊紝鎻愬崌浠g爜璐ㄩ噺
  4. 鉁?<EFBFBD>寔鐙<EFBFBD>珛閮ㄧ讲锛氭瘡涓<EFBFBD>ā鍧楀彲鐙<EFBFBD>珛鎵撳寘銆侀儴缃层€侀攢鍞?
  5. 鉁?**Schema闅旂<E99785>**锛氭暟鎹<E69A9F>簱灞傞潰妯″潡鐙<E6BDA1>珛锛岄檷浣庤€﹀悎

棰勮<EFBFBD>鎬昏€楁椂

  • PKB妯″潡杩佺Щ锛?-8灏忔椂
  • RVW妯″潡杩佺Щ锛?-9灏忔椂锛堝惈鏁版嵁杩佺Щ锛?
  • **鎬昏<E98EAC>**锛?3-17灏忔椂锛堢害2涓<32>伐浣滄棩锛?

椋庨櫓璇勪及

  • 鉁?**椋庨櫓浣?*锛氬姛鑳藉凡100%瀹屾垚锛屼唬鐮佽川閲忛珮
  • 鉁?娴嬭瘯瑕嗙洊锛氭湁瀹屾暣鐨勬墜鍔ㄦ祴璇曟祦绋?
  • 鉁?**鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫API璺<49>緞锛屼笉褰卞搷鐜版湁鍓嶇<E98D93>

鏂囨。缁存姢鑰咃細 鎶€鏈<E282AC>洟闃? 鏈€鍚庢洿鏂帮細 2025-12-28
涓嬩竴姝ワ細 鎵ц<E98EB5>杩佺Щ浠诲姟锛屾寜TODO娓呭崟閫愰」瀹屾垚