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%)
1617 lines
44 KiB
Markdown
1617 lines
44 KiB
Markdown
# AIclinicalresearch 鐜版湁绯荤粺鎶€鏈<E282AC>懜搴曟姤鍛?
|
||
|
||
> **鎶ュ憡鏃ユ湡锛?* 2025-11-06
|
||
> **鎶ュ憡浜猴細** 鎶€鏈<E282AC>洟闃?
|
||
> **鎶ュ憡鐩<E686A1>殑锛?* 鍏ㄩ潰姊崇悊鐜版湁绯荤粺宸插畬鎴愮殑鍔熻兘銆佹妧鏈<E5A6A7>灦鏋勩€佹暟鎹<E69A9F>簱璁捐<E79281>鍜屼唬鐮佸疄鐜帮紝涓哄悗缁<E68297>灦鏋勮<E98F8B>璁烘彁渚涘熀纭€
|
||
|
||
---
|
||
|
||
## 馃搳 鎵ц<E98EB5>鎽樿<E98EBD>
|
||
|
||
### 椤圭洰鍩烘湰淇℃伅
|
||
|
||
| 椤圭洰 | 淇℃伅 |
|
||
|------|------|
|
||
| **椤圭洰鍚嶇О** | AI绉戠爺鍔╂墜锛圓Iclinicalresearch锛?|
|
||
| **寮€鍙戝懆鏈?* | 2025-10-10 鑷充粖锛堢害1涓<31>湀锛?|
|
||
| **寮€鍙戞ā寮?* | 鏁忔嵎杩<E5B58E>唬锛孧VP浼樺厛 |
|
||
| **褰撳墠闃舵<E99783>** | 閲岀▼纰?-1.5瀹屾垚锛孭hase2/3瀹屾垚锛岀ǹ浠跺<E6B5A0>鏌ュ畬鎴?|
|
||
| **浠g爜閲?* | 鍚庣<E98D9A>~12,000琛岋紝鍓嶇<E98D93>~10,000琛岋紝Python寰<6E>湇鍔<E6B987>2,100琛?|
|
||
| **瀹屾垚搴?* | 鏍稿績鍔熻兘85%锛屽熀纭€鏋舵瀯100% |
|
||
|
||
### 鏍稿績鎴愭灉
|
||
|
||
鉁?**宸插畬鎴?澶ф牳蹇冨姛鑳芥ā鍧?*
|
||
鉁?**瀹屾暣鐨勬妧鏈<E5A6A7>灦鏋勪綋绯?*
|
||
鉁?**鎴愮啛鐨凙I闆嗘垚鑳藉姏**
|
||
鉁?**瀹屽杽鐨勬枃妗d綋绯?*
|
||
|
||
---
|
||
|
||
## 馃幆 宸插畬鎴愬姛鑳芥竻鍗?
|
||
|
||
### 1. **AI鏅鸿兘闂<E58598>瓟绯荤粺**锛堥噷绋嬬<E7BB8B>1鏍稿績锛?
|
||
|
||
#### 1.1 鏅鸿兘浣撻厤缃<E58EA4>郴缁?
|
||
**瀹屾垚鏃堕棿锛?* Day 10-11
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?12涓<32>櫤鑳戒綋鐨刌AML閰嶇疆妗嗘灦
|
||
- 鉁?鍔ㄦ€丳rompt妯℃澘鍔犺浇锛圫ystem + User锛?
|
||
- 鉁?鍙橀噺鏇挎崲鍜屾潯浠舵覆鏌?
|
||
- 鉁?鐑<>洿鏂版敮鎸?
|
||
- 鉁?妯″瀷鍙傛暟閰嶇疆锛坱emperature, maxTokens, topP锛?
|
||
|
||
**宸插紑鍙戞櫤鑳戒綋锛?*
|
||
1. **閫夐<E996AB>璇勪环鏅鸿兘浣?* - 鍥涚淮搴﹁瘎浠锋<E6B5A0>鏋讹紙鍒涙柊鎬с€佷复搴婁环鍊笺€佺<E282AC>瀛︽€с€佸彲琛屾€э級
|
||
|
||
**閰嶇疆鏂囦欢锛?*
|
||
- `backend/config/agents.yaml` (348琛?
|
||
- `backend/prompts/topic_evaluation_system.txt` (143琛?
|
||
- `backend/prompts/topic_evaluation_user.txt` (12琛?
|
||
|
||
**鎶€鏈<E282AC>灦鏋勶細**
|
||
```typescript
|
||
// 鏅鸿兘浣撴湇鍔″眰
|
||
backend/src/services/agentService.ts
|
||
- loadAgentConfig() // 鍔犺浇鏅鸿兘浣撻厤缃?
|
||
- getAgentById() // 鑾峰彇鏅鸿兘浣撹<E6B5A3>鎯?
|
||
- renderPrompt() // 娓叉煋Prompt妯℃澘
|
||
- 鏀<EFBFBD>寔鍙橀噺鏇挎崲锛歿{projectBackground}}, {{userInput}}
|
||
- 鏀<EFBFBD>寔鏉′欢娓叉煋锛歿{#if}}...{{/if}}
|
||
```
|
||
|
||
---
|
||
|
||
#### 1.2 澶氳疆瀵硅瘽绯荤粺
|
||
**瀹屾垚鏃堕棿锛?* Day 12-14
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?涓婁笅鏂囩粍瑁咃紙System + 鍘嗗彶 + 鐢ㄦ埛杈撳叆锛?
|
||
- 鉁?鏀<>寔鏈€杩?00鏉″巻鍙叉秷鎭?
|
||
- 鉁?鏅鸿兘鐨勪笂涓嬫枃娉ㄥ叆绛栫暐
|
||
- 鉁?娴佸紡杈撳嚭锛圫SE锛屾墦瀛楁満鏁堟灉锛?
|
||
- 鉁?闈炴祦寮忚緭鍑猴紙鏅<E7B499>€氭ā寮忥級
|
||
|
||
**鎶€鏈<E282AC>疄鐜帮細**
|
||
```typescript
|
||
// 瀵硅瘽鏈嶅姟灞?
|
||
backend/src/services/conversationService.ts (381琛?
|
||
|
||
// 涓婁笅鏂囩粍瑁呯瓥鐣?
|
||
if (isFirstMessage) {
|
||
// 棣栨<E6A3A3>娑堟伅锛氬畬鏁存ā鏉匡紙椤圭洰鑳屾櫙 + 鐢ㄦ埛闂<E59F9B><E99782> + 鐭ヨ瘑搴擄級
|
||
userPrompt = renderTemplate({
|
||
projectBackground,
|
||
userInput,
|
||
knowledgeBaseContext
|
||
});
|
||
} else {
|
||
// 鍚庣画娑堟伅锛氬彧鍙戦€佹柊鍐呭<E98D90>
|
||
userPrompt = knowledgeBaseContext
|
||
? `${userInput}\n\n## 鍙傝€冩枃鐚甛n${knowledgeBaseContext}`
|
||
: userInput;
|
||
}
|
||
|
||
// 娴佸紡杈撳嚭
|
||
for await (const chunk of adapter.chatStream(messages)) {
|
||
reply.raw.write(`data: ${JSON.stringify(chunk)}\n\n`);
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/conversations/:id/messages/stream` - 鍙戦€佹秷鎭<E7A7B7>紙娴佸紡锛?
|
||
- `POST /api/v1/conversations/:id/messages` - 鍙戦€佹秷鎭<E7A7B7>紙闈炴祦寮忥級
|
||
- `GET /api/v1/conversations/:id` - 鑾峰彇瀵硅瘽璇︽儏
|
||
|
||
---
|
||
|
||
#### 1.3 LLM閫傞厤鍣ㄧ郴缁?
|
||
**瀹屾垚鏃堕棿锛?* Day 12-13
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?缁熶竴鐨凩LM鎺ュ彛鎶借薄锛圛LLMAdapter锛?
|
||
- 鉁?3涓狶LM妯″瀷鏀<E780B7>寔锛欴eepSeek-V3銆丵wen3-72B銆丵wen-Long
|
||
- 鉁?娴佸紡鍜岄潪娴佸紡涓ょ<E6B693>妯″紡
|
||
- 鉁?瀹屾暣閿欒<E996BF>澶勭悊鍜孴oken缁熻<E7BC81>
|
||
- 鉁?宸ュ巶妯″紡瀹炵幇锛屾槗浜庢墿灞?
|
||
|
||
**鎶€鏈<E282AC>灦鏋勶細**
|
||
```typescript
|
||
// 閫傞厤鍣ㄦ帴鍙?
|
||
backend/src/adapters/types.ts
|
||
interface ILLMAdapter {
|
||
chat(messages, options): Promise<Response>
|
||
chatStream(messages, options): AsyncGenerator<Chunk>
|
||
}
|
||
|
||
// 鍏蜂綋瀹炵幇
|
||
backend/src/adapters/
|
||
鈹溾攢鈹€ DeepSeekAdapter.ts (150琛? - DeepSeek-V3
|
||
鈹溾攢鈹€ QwenAdapter.ts (162琛? - Qwen3-72B + Qwen-Long
|
||
鈹斺攢鈹€ LLMFactory.ts (75琛? - 宸ュ巶绫?
|
||
```
|
||
|
||
**妯″瀷瀵规瘮锛?*
|
||
| 妯″瀷 | 瀹氫綅 | 浼樺娍 | Token闄愬埗 | 鎴愭湰 |
|
||
|------|------|------|----------|------|
|
||
| **DeepSeek-V3** | 涓诲姏 | 鎬т环姣旀瀬楂?| 64K | 楼1/鐧句竾 |
|
||
| **Qwen3-72B** | 澶囩敤 | 涓<>枃鐞嗚В濂?| 128K | 楼4/鐧句竾 |
|
||
| **Qwen-Long** | 鍏ㄦ枃 | 1M瓒呴暱涓婁笅鏂?| 1M | 楼5/鐧句竾 |
|
||
|
||
---
|
||
|
||
#### 1.4 椤圭洰绠$悊绯荤粺
|
||
**瀹屾垚鏃堕棿锛?* Day 8-9
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?椤圭洰CRUD锛堝垱寤恒€佽<E282AC>鍙栥€佹洿鏂般€佸垹闄わ級
|
||
- 鉁?椤圭洰鑳屾櫙绠$悊锛堝姩鎬佹敞鍏ュ埌AI瀵硅瘽锛?
|
||
- 鉁?杞<>垹闄ゆ満鍒?
|
||
- 鉁?鐢ㄦ埛椤圭洰鍏宠仈
|
||
|
||
**鏁版嵁妯″瀷锛?*
|
||
```prisma
|
||
model Project {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
description String? @db.Text // 椤圭洰鑳屾櫙
|
||
background String? @db.Text // 璇︾粏鑳屾櫙
|
||
researchType String? // 鐮旂┒绫诲瀷
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
deletedAt DateTime? // 杞<>垹闄?
|
||
|
||
user User @relation(fields: [userId], references: [id])
|
||
conversations Conversation[]
|
||
|
||
@@index([userId, deletedAt])
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/projects` - 鍒涘缓椤圭洰
|
||
- `GET /api/v1/projects` - 鑾峰彇椤圭洰鍒楄〃
|
||
- `GET /api/v1/projects/:id` - 鑾峰彇椤圭洰璇︽儏
|
||
- `PUT /api/v1/projects/:id` - 鏇存柊椤圭洰
|
||
- `DELETE /api/v1/projects/:id` - 鍒犻櫎椤圭洰
|
||
|
||
---
|
||
|
||
### 2. **涓<>汉鐭ヨ瘑搴撶郴缁?*锛堥噷绋嬬<E7BB8B>1鏍稿績锛?
|
||
|
||
#### 2.1 鐭ヨ瘑搴撶<E690B4>鐞?
|
||
**瀹屾垚鏃堕棿锛?* Day 18-22
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?鐭ヨ瘑搴揅RUD
|
||
- 鉁?鏂囨。涓婁紶锛圥DF銆乄ord銆乀XT銆丮arkdown锛?
|
||
- 鉁?鏂囨。鐘舵€佽拷韪<E68BB7>紙uploading 鈫?parsing 鈫?indexing 鈫?completed/error锛?
|
||
- 鉁?閰嶉<E996B0>绠$悊锛堟瘡鐢ㄦ埛3涓<33>煡璇嗗簱锛屾瘡搴?0涓<30>枃妗o級
|
||
- 鉁?鏂囦欢鏍煎紡鍜屽ぇ灏忛檺鍒讹紙鏈€澶?0MB锛?
|
||
|
||
**鎶€鏈<E282AC>泦鎴愶細**
|
||
- **Dify骞冲彴** - RAG鐭ヨ瘑搴撶<E690B4>鐞?
|
||
- **Qdrant鍚戦噺鏁版嵁搴?* - Dify鍐呯疆
|
||
- **澶氱<E6BEB6>鎴锋灦鏋?* - 姣忎釜鐭ヨ瘑搴撶嫭绔婦ataset
|
||
|
||
**鏁版嵁妯″瀷锛?*
|
||
```prisma
|
||
model KnowledgeBase {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
description String? @db.Text
|
||
difyDatasetId String @unique // 鏄犲皠鍒癉ify Dataset
|
||
documentCount Int @default(0)
|
||
totalSize BigInt @default(0)
|
||
totalTokens BigInt @default(0) // Phase2鏂板<E98F82>
|
||
tokenLimit BigInt @default(980000) // Phase2鏂板<E98F82>
|
||
documentLimit Int @default(50) // Phase2鏂板<E98F82>
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
user User @relation(fields: [userId], references: [id])
|
||
documents Document[]
|
||
|
||
@@index([userId])
|
||
}
|
||
|
||
model Document {
|
||
id String @id @default(uuid())
|
||
knowledgeBaseId String
|
||
name String
|
||
originalName String
|
||
fileType String
|
||
fileSize BigInt
|
||
difyDocumentId String @unique // 鏄犲皠鍒癉ify Document
|
||
status String // uploading/parsing/indexing/completed/error
|
||
errorMessage String? @db.Text
|
||
|
||
// Phase2鏂板<E98F82>锛氬叏鏂囧瓨鍌?
|
||
fullText String? @db.Text
|
||
tokenCount Int?
|
||
charCount Int?
|
||
extractionMethod String? // nougat/pymupdf/mammoth
|
||
extractionQuality Float?
|
||
detectedLanguage String? // chinese/english
|
||
|
||
uploadedAt DateTime @default(now())
|
||
processedAt DateTime?
|
||
|
||
knowledgeBase KnowledgeBase @relation(fields: [knowledgeBaseId], references: [id])
|
||
|
||
@@index([knowledgeBaseId, status])
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/knowledge-bases` - 鍒涘缓鐭ヨ瘑搴?
|
||
- `GET /api/v1/knowledge-bases` - 鑾峰彇鐭ヨ瘑搴撳垪琛?
|
||
- `GET /api/v1/knowledge-bases/:id` - 鑾峰彇璇︽儏
|
||
- `PUT /api/v1/knowledge-bases/:id` - 鏇存柊鐭ヨ瘑搴?
|
||
- `DELETE /api/v1/knowledge-bases/:id` - 鍒犻櫎鐭ヨ瘑搴?
|
||
- `POST /api/v1/knowledge-bases/:kbId/documents` - 涓婁紶鏂囨。
|
||
- `GET /api/v1/knowledge-bases/:kbId/documents` - 鑾峰彇鏂囨。鍒楄〃
|
||
- `DELETE /api/v1/documents/:id` - 鍒犻櫎鏂囨。
|
||
- `POST /api/v1/documents/:id/reprocess` - 閲嶆柊澶勭悊鏂囨。
|
||
|
||
---
|
||
|
||
#### 2.2 RAG妫€绱㈢郴缁燂紙閲岀▼纰?.5浼樺寲锛?
|
||
**瀹屾垚鏃堕棿锛?* Day 23-27
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?璇<>箟妫€绱<E282AC>紙Dify API锛?
|
||
- 鉁?澶氱煡璇嗗簱鑱斿悎妫€绱?
|
||
- 鉁?@鐭ヨ瘑搴撳姛鑳斤紙鍓嶇<EFBFBD>涓嬫媺閫夋嫨锛?
|
||
- 鉁?妫€绱㈢粨鏋滄敞鍏ュ埌LLM涓婁笅鏂?
|
||
- 鉁?**鏅鸿兘寮曠敤绯荤粺**锛?00%鍑嗙‘婧<E28098>簮锛?
|
||
|
||
**浼樺寲鎴愭灉锛?*
|
||
| 鎸囨爣 | 浼樺寲鍓?| 浼樺寲鍚?| 鎻愬崌 |
|
||
|------|--------|--------|------|
|
||
| 妫€绱㈡暟閲?| 3 chunks | 15 chunks | **5鍊?* |
|
||
| Chunk澶у皬 | 500 tokens | 1500 tokens | **3鍊?* |
|
||
| **鎬昏<E98EAC>鐩?* | **1,500 tokens** | **22,500 tokens** | **15鍊?* |
|
||
| 瑕嗙洊椤垫暟 | ~1椤?| ~15-20椤?| **15-20鍊?* |
|
||
| 瑕嗙洊鐜?| ~5% | ~40-50% | **8-10鍊?* |
|
||
|
||
**鏅鸿兘寮曠敤绯荤粺锛?*
|
||
```typescript
|
||
// 鍚庣<E98D9A>鑷<EFBFBD>姩鏀堕泦寮曠敤淇℃伅
|
||
interface Citation {
|
||
index: number;
|
||
documentName: string;
|
||
segmentIndex: number;
|
||
score: number;
|
||
content: string;
|
||
}
|
||
|
||
// AI鍥炵瓟鏍煎紡
|
||
鏍规嵁[鏉ユ簮1]鍜孾鏉ユ簮5]鐨勭爺绌讹紝闃垮皵鍏规捣榛樼梾涓昏<EFBFBD>鐗瑰緛鍖呮嫭锛?
|
||
1. 璁板繂鍔涘噺閫€[鏉ユ簮1][鏉ユ簮3]
|
||
2. 璁ょ煡鍔熻兘涓嬮檷[鏉ユ簮5]
|
||
|
||
---
|
||
馃摎 **鍙傝€冩枃鐚?*
|
||
[1] 馃搫 **闃垮皵鍏规捣榛樼患杩?023.pdf** - 绗?娈?(鐩稿叧搴?5%)
|
||
"闃垮皵鍏规捣榛樼梾鏄<E6A2BE>竴绉嶇<E7BB89>缁忛€€琛屾€х柧鐥?.."
|
||
```
|
||
|
||
**鍓嶇<E98D93>瑙嗚<E79199>浼樺寲锛?*
|
||
- `[鏉ユ簮N]`锛氳摑鑹查珮浜産adge锛?1890ff锛?
|
||
- 榧犳爣鎮<E788A3>仠锛氳儗鏅<E58497>彉娣憋紙#bae7ff锛?
|
||
- 鐐瑰嚮璺宠浆锛氬钩婊戞粴鍔ㄥ埌寮曠敤璇︽儏
|
||
- 璇︽儏闂<E5848F>儊锛氶粍鑹查珮浜?绉掞紙#fffbe6锛?
|
||
|
||
---
|
||
|
||
#### 2.3 鍏ㄦ枃闃呰<E99783>妯″紡锛圥hase2锛?
|
||
**瀹屾垚鏃堕棿锛?* Day 28-32
|
||
|
||
**鏍稿績鑳藉姏锛?*
|
||
- 鉁?**Python寰<6E>湇鍔?*锛氭枃妗f彁鍙栨湇鍔?
|
||
- 鉁?**澶氭牸寮忔敮鎸?*锛歅DF銆丏ocx銆乀xt
|
||
- 鉁?**鏅鸿兘鎻愬彇**锛歂ougat锛堣嫳鏂囧<E98F82>鏈<EFBFBD>級 + PyMuPDF锛堝厹搴?涓<>枃锛?+ Mammoth锛圖ocx锛?
|
||
- 鉁?**璇<>█妫€娴?*锛氳嚜鍔ㄨ瘑鍒<E79891>腑鑻辨枃锛屼紭鍖栨彁鍙栫瓥鐣?
|
||
- 鉁?**Token绠$悊**锛氱簿纭<E7B0BF><E7BAAD>鏁帮紝鍙岄噸闄愬埗锛?0鏂囦欢 + 980K tokens锛?
|
||
- 鉁?**鍏ㄦ枃瀛樺偍**锛氭暟鎹<E69A9F>簱淇濆瓨瀹屾暣鏂囨湰
|
||
- 鉁?**鏅鸿兘鏂囨。閫夋嫨**锛氬熀浜嶵oken瀹归噺鐨勬櫤鑳芥帹鑽?
|
||
|
||
**鎶€鏈<E282AC>灦鏋勶細**
|
||
```
|
||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹? Frontend (React) 鈹?
|
||
鈹? - 鏂囨。涓婁紶 鈹?
|
||
鈹? - 瀹归噺鏄剧ず锛堝弻杩涘害鏉★級 鈹?
|
||
鈹? - 瀹炴椂杩涘害 鈹?
|
||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹?REST API
|
||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹? Backend (Node.js + Fastify) 鈹?
|
||
鈹? - ExtractionClient 鈹?
|
||
鈹? - TokenService 鈹?
|
||
鈹? - 鏅鸿兘鏂囨。閫夋嫨 鈹?
|
||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹?HTTP
|
||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹? Python Microservice (FastAPI) 鈹?
|
||
鈹? 鈹溾攢鈹€ PyMuPDF (蹇<>€燂紝涓<E7B49D>枃鍙嬪ソ) 鈹?
|
||
鈹? 鈹溾攢鈹€ Nougat (瀛︽湳璁烘枃锛岄珮璐ㄩ噺) 鈹?
|
||
鈹? 鈹溾攢鈹€ Mammoth (Docx 鈫?Markdown) 鈹?
|
||
鈹? 鈹溾攢鈹€ Language Detector 鈹?
|
||
鈹? 鈹斺攢鈹€ Quality Evaluator 鈹?
|
||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
```
|
||
|
||
**鎻愬彇绛栫暐锛?*
|
||
```typescript
|
||
// 璇<>█妫€娴?鈫?閫夋嫨鎻愬彇鏂规硶
|
||
if (language === 'chinese') {
|
||
// 涓<>枃PDF锛歅yMuPDF锛堝揩閫燂級
|
||
text = await pymupdf.extract(pdf);
|
||
} else {
|
||
// 鑻辨枃PDF锛歂ougat锛堥珮璐ㄩ噺锛?+ 闄嶇骇PyMuPDF
|
||
try {
|
||
text = await nougat.extract(pdf);
|
||
if (quality < 0.7) throw new Error('Quality too low');
|
||
} catch {
|
||
// 鑷<>姩闄嶇骇
|
||
text = await pymupdf.extract(pdf);
|
||
}
|
||
}
|
||
```
|
||
|
||
**Python寰<6E>湇鍔℃枃浠剁粨鏋勶細**
|
||
```
|
||
extraction_service/
|
||
鈹溾攢鈹€ main.py (509琛? - FastAPI涓绘湇鍔?
|
||
鈹溾攢鈹€ services/
|
||
鈹? 鈹溾攢鈹€ pdf_extractor.py (242琛? - PDF鎻愬彇鎬诲崗璋?
|
||
鈹? 鈹溾攢鈹€ pdf_processor.py (280琛? - PyMuPDF瀹炵幇
|
||
鈹? 鈹溾攢鈹€ language_detector.py (120琛? - 璇<>█妫€娴?
|
||
鈹? 鈹溾攢鈹€ nougat_extractor.py (242琛? - Nougat瀹炵幇
|
||
鈹? 鈹溾攢鈹€ docx_extractor.py (253琛? - Docx鎻愬彇
|
||
鈹? 鈹斺攢鈹€ txt_extractor.py (316琛? - Txt鎻愬彇锛堝<E9949B>缂栫爜锛?
|
||
鈹溾攢鈹€ requirements.txt
|
||
鈹斺攢鈹€ README.md
|
||
```
|
||
|
||
**Backend闆嗘垚锛?*
|
||
```typescript
|
||
// ExtractionClient.ts (268琛?
|
||
export class ExtractionClient {
|
||
async extractDocument(
|
||
filePath: string,
|
||
fileType: string
|
||
): Promise<ExtractionResult> {
|
||
// 璋冪敤Python寰<6E>湇鍔?
|
||
const response = await axios.post(
|
||
`${this.baseUrl}/api/extract/${fileType}`,
|
||
formData
|
||
);
|
||
return response.data;
|
||
}
|
||
}
|
||
|
||
// TokenService.ts (243琛?
|
||
export class TokenService {
|
||
calculateTokens(text: string): number {
|
||
const encoder = encoding_for_model("gpt-4");
|
||
const tokens = encoder.encode(text);
|
||
return tokens.length;
|
||
}
|
||
|
||
canUploadDocument(
|
||
kbId: string,
|
||
newDocTokens: number
|
||
): Promise<boolean> {
|
||
// 妫€鏌ユ枃妗f暟閲忥紙鈮?0锛?
|
||
// 妫€鏌<E282AC>oken瀹归噺锛堚墹980K锛?
|
||
}
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/knowledge-bases/:id/document-selection` - 鏅鸿兘鏂囨。閫夋嫨
|
||
- `GET /api/v1/knowledge-bases/:id/capacity` - 鑾峰彇瀹归噺淇℃伅
|
||
|
||
---
|
||
|
||
### 3. **鎵瑰<E98EB5>鐞嗘ā寮?*锛圥hase3锛?
|
||
|
||
#### 3.1 鏍稿績鑳藉姏
|
||
**瀹屾垚鏃堕棿锛?* Day 29锛?灏忔椂锛?
|
||
|
||
**瀹氫綅锛?* 浠诲姟寮忎氦浜掞紙闈炲<E99788>璇濓級锛岀粨鏋勫寲鏁版嵁鎻愬彇鍣?
|
||
|
||
**鏍稿績鍔熻兘锛?*
|
||
- 鉁?**棰勮<E6A3B0>妯℃澘**锛氫复搴婄爺绌朵俊鎭<E4BF8A>彁鍙栵紙8瀛楁<E7809B>锛?
|
||
- 鉁?**鑷<>畾涔夋ā鏉?*锛氱敤鎴锋彁绀鸿瘝 鈫?鏂囨湰鍧楁樉绀?
|
||
- 鉁?**鎵归噺澶勭悊**锛?-50绡囨枃鐚?
|
||
- 鉁?**鍥哄畾3骞跺彂**锛坧-queue锛?
|
||
- 鉁?**澶辫触閲嶈瘯鏈哄埗**
|
||
- 鉁?**Excel瀵煎嚭**锛堝弻Sheet璁捐<E79281>锛?
|
||
|
||
**鏁版嵁妯″瀷锛?*
|
||
```prisma
|
||
model BatchTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
templateType String // preset/custom
|
||
templateId String? // 棰勮<E6A3B0>妯℃澘ID
|
||
customPrompt String? @db.Text
|
||
|
||
modelType String // deepseek-v3/qwen3/qwen-long
|
||
concurrency Int @default(3)
|
||
|
||
status String // processing/completed/failed
|
||
totalCount Int
|
||
completedCount Int @default(0)
|
||
failedCount Int @default(0)
|
||
|
||
startedAt DateTime?
|
||
completedAt DateTime?
|
||
duration Int? // 绉?
|
||
|
||
user User @relation(fields: [userId], references: [id])
|
||
results BatchResult[]
|
||
|
||
@@index([userId, status])
|
||
}
|
||
|
||
model BatchResult {
|
||
id String @id @default(uuid())
|
||
taskId String
|
||
documentId String // 鍏宠仈Document
|
||
documentName String
|
||
|
||
status String // success/failed
|
||
extractedData Json? // 鎻愬彇鐨勭粨鏋勫寲鏁版嵁
|
||
rawOutput String? @db.Text
|
||
errorMessage String? @db.Text
|
||
|
||
processingTime Int? // 姣<><E5A7A3>
|
||
tokenUsage Int?
|
||
|
||
task BatchTask @relation(fields: [taskId], references: [id])
|
||
|
||
@@index([taskId, status])
|
||
}
|
||
```
|
||
|
||
**棰勮<E6A3B0>妯℃澘锛堜复搴婄爺绌朵俊鎭<E4BF8A>彁鍙栵級锛?*
|
||
| 瀛楁<E7809B> | 绫诲瀷 | 璇存槑 |
|
||
|------|------|------|
|
||
| research_purpose | text | 鐮旂┒鐩<E29492>殑 |
|
||
| research_design | text | 鐮旂┒璁捐<E79281>锛圧CT/闃熷垪鐮旂┒绛夛級 |
|
||
| research_subjects | text | 鐮旂┒瀵硅薄锛堢撼鍏?鎺掗櫎鏍囧噯锛?|
|
||
| sample_size | **text** | 鏍锋湰閲忥紙淇濈暀鍘熸枃鎻忚堪锛?|
|
||
| intervention_group | text | 骞查<E9AA9E>缁?|
|
||
| control_group | text | 瀵圭収缁?|
|
||
| results_data | longtext | 缁撴灉鍙婃暟鎹?|
|
||
| oxford_level | text | 鐗涙触璇勭骇锛?a/1b/2a/2b/3a/3b/4/5锛?|
|
||
|
||
**鎶€鏈<E282AC>疄鐜帮細**
|
||
```typescript
|
||
// batchService.ts (421琛?
|
||
export class BatchService {
|
||
async executeBatchTask(
|
||
taskId: string,
|
||
documentIds: string[],
|
||
templateType: 'preset' | 'custom',
|
||
options: BatchOptions
|
||
): Promise<void> {
|
||
// 1. 鍔犺浇妯℃澘鎴栬嚜瀹氫箟Prompt
|
||
const template = await this.loadTemplate(templateType, options);
|
||
|
||
// 2. 骞跺彂鎵ц<E98EB5>锛堝浐瀹?骞跺彂锛?
|
||
const queue = new PQueue({ concurrency: 3 });
|
||
const promises = documentIds.map(docId =>
|
||
queue.add(() => this.processDocument(docId, template))
|
||
);
|
||
|
||
// 3. 绛夊緟鎵€鏈変换鍔″畬鎴?
|
||
const results = await Promise.allSettled(promises);
|
||
|
||
// 4. 缁熻<E7BC81>鍜屼繚瀛?
|
||
await this.updateTaskStatistics(taskId, results);
|
||
}
|
||
|
||
async processDocument(
|
||
docId: string,
|
||
template: Template
|
||
): Promise<BatchResult> {
|
||
// 1. 鑾峰彇鏂囨。鍏ㄦ枃
|
||
const document = await this.getDocument(docId);
|
||
|
||
// 2. 鏋勯€燣LM娑堟伅
|
||
const messages = [
|
||
{ role: 'system', content: template.systemPrompt },
|
||
{ role: 'user', content: `${template.userPrompt}\n\n${document.fullText}` }
|
||
];
|
||
|
||
// 3. 璋冪敤LLM
|
||
const response = await llm.chat(messages);
|
||
|
||
// 4. 瑙f瀽JSON锛堥<E9949B>璁炬ā鏉匡級鎴栦繚瀛樻枃鏈<E69E83>紙鑷<E7B499>畾涔夛級
|
||
const extractedData = template.type === 'preset'
|
||
? this.parseJSON(response.content)
|
||
: response.content;
|
||
|
||
return {
|
||
documentId: docId,
|
||
status: 'success',
|
||
extractedData,
|
||
rawOutput: response.content
|
||
};
|
||
}
|
||
}
|
||
|
||
// jsonParser.ts (145琛? - 瀹归敊鐨凧SON瑙f瀽
|
||
export function extractJSON(text: string): object {
|
||
// 鏀<>寔澶氱<E6BEB6>鏍煎紡
|
||
// 1. 绾疛SON锛歿 "key": "value" }
|
||
// 2. 甯﹀墠瑷€锛氳繖鏄<E7B996>粨鏋滐細\n{ ... }
|
||
// 3. 浠g爜鍧楋細```json\n{ ... }\n```
|
||
// 4. 甯﹀悗缂€锛歿 ... }\n\n浠ヤ笂鏄<E7AC82>粨鏋?
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/batch/execute` - 鎵ц<E98EB5>鎵瑰<E98EB5>鐞嗕换鍔?
|
||
- `GET /api/v1/batch/tasks/:taskId` - 鑾峰彇浠诲姟鐘舵€?
|
||
- `GET /api/v1/batch/tasks/:taskId/results` - 鑾峰彇浠诲姟缁撴灉
|
||
- `POST /api/v1/batch/tasks/:taskId/retry-failed` - 閲嶈瘯澶辫触椤?
|
||
- `GET /api/v1/batch/templates` - 鑾峰彇鎵€鏈夋ā鏉?
|
||
|
||
**鏁堢巼鎻愬崌锛?*
|
||
- 鎵嬪姩澶勭悊锛?0绡?脳 10鍒嗛挓 = 100鍒嗛挓
|
||
- 鎵瑰<E98EB5>鐞嗘ā寮忥細10绡?脳 骞冲潎20绉?= ~7鍒嗛挓
|
||
- **鎻愬崌绾?4鍊嶆晥鐜?* 馃殌
|
||
|
||
---
|
||
|
||
### 4. **绋夸欢瀹℃煡鍔熻兘**锛圖ay 30鐙<30>珛寮€鍙戯級
|
||
|
||
#### 4.1 鏍稿績鑳藉姏
|
||
**瀹屾垚鏃堕棿锛?* Day 30锛?澶╋級
|
||
|
||
**瀹氫綅锛?* 鐙<>珛鐨勭ǹ浠舵櫤鑳藉<E991B3>鏌ョ郴缁?
|
||
|
||
**鏍稿績鍔熻兘锛?*
|
||
- 鉁?**鍙岀淮搴﹁瘎浼?*锛氱ǹ绾﹁<E7BBBE>鑼冩€э紙11椤癸級 + 鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛?
|
||
- 鉁?**鏅鸿兘鍒嗘瀽**锛氬熀浜庣湡瀹炴湡鍒婃爣鍑嗭紙涓<E7B499>崕鍖诲<E98D96>瓒呭0鏉傚織锛?
|
||
- 鉁?**瀹屾暣娴佺▼**锛氫笂浼燱ord 鈫?鎻愬彇鏂囨湰 鈫?AI璇勪及 鈫?鐢熸垚鎶ュ憡 鈫?瀵煎嚭PDF
|
||
- 鉁?**鐢ㄦ埛浣撻獙**锛氭笎鍙樺崱鐗囥€佹嫋鎷戒笂浼犮€佸疄鏃惰繘搴︺€侀<E282AC>鑹茬紪鐮?
|
||
|
||
**璇勪及鏍囧噯锛?*
|
||
|
||
**绋跨害瑙勮寖鎬ц瘎浼帮紙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锛?
|
||
|
||
**鏁版嵁妯″瀷锛?*
|
||
```prisma
|
||
model ReviewTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
fileName String
|
||
fileType String
|
||
fileSize BigInt
|
||
|
||
status String // processing/completed/failed
|
||
modelType String // deepseek-v3/qwen3/qwen-long
|
||
|
||
// 璇勪及缁撴灉
|
||
editorialScore Float? // 绋跨害瑙勮寖鎬ф€诲垎
|
||
editorialResult Json? // 璇︾粏璇勪及缁撴灉
|
||
methodologyScore Float? // 鏂规硶瀛︽€诲垎
|
||
methodologyResult Json? // 璇︾粏璇勪及缁撴灉
|
||
|
||
errorMessage String? @db.Text
|
||
processingTime Int? // 姣<><E5A7A3>
|
||
|
||
createdAt DateTime @default(now())
|
||
completedAt DateTime?
|
||
|
||
user User @relation(fields: [userId], references: [id])
|
||
|
||
@@index([userId, status])
|
||
}
|
||
```
|
||
|
||
**Prompt璁捐<E79281>锛?*
|
||
```typescript
|
||
// 绋跨害瑙勮寖鎬ц瘎浼癙rompt (210琛?
|
||
// prompts/editorial_review_system.txt
|
||
|
||
鎮ㄦ槸涓€浣嶄笓涓氱殑鍖诲<EFBFBD>鏈熷垔缂栬緫锛屾偍鐨勪换鍔℃槸鎸夌収銆婁腑鍗庡尰瀛﹁秴澹版潅蹇椼€嬬殑绋跨害瑕佹眰锛屽<EFBFBD>鎻愪氦鐨勭ǹ浠惰繘琛岃<EFBFBD>鑼冩€ц瘎浼般€?
|
||
|
||
璇勪及缁村害锛?
|
||
1. 鏂囬<EFBFBD>
|
||
- 妫€鏌ョ偣锛氬噯纭<EFBFBD>€с€佺畝鏄庢€с€佽<EFBFBD>鑼冩€?
|
||
- 璇勫垎鏍囧噯锛?-10鍒?
|
||
|
||
2. 浣滆€?
|
||
- 妫€鏌ョ偣锛氫綔鑰呬俊鎭<EFBFBD>畬鏁存€с€佹帓搴忋€佸崟浣嶆爣娉?
|
||
- 璇勫垎鏍囧噯锛?-10鍒?
|
||
|
||
...锛堝叡11涓<EFBFBD>淮搴︼級
|
||
|
||
杈撳嚭鏍煎紡锛圝SON锛夛細
|
||
{
|
||
"overall_score": 85.5,
|
||
"items": [
|
||
{
|
||
"dimension": "鏂囬<E98F82>",
|
||
"score": 9.0,
|
||
"status": "绗﹀悎",
|
||
"issues": [],
|
||
"suggestions": []
|
||
},
|
||
...
|
||
]
|
||
}
|
||
```
|
||
|
||
```typescript
|
||
// 鏂规硶瀛﹁瘎浼癙rompt (231琛?
|
||
// prompts/methodology_review_system.txt
|
||
|
||
鎮ㄦ槸涓€浣嶄笓涓氱殑鍖诲<EFBFBD>缁熻<EFBFBD>瀛︿笓瀹讹紝鎮ㄧ殑浠诲姟鏄<EFBFBD>瘎浼板尰瀛︾爺绌剁ǹ浠剁殑鏂规硶瀛﹁川閲忋€?
|
||
|
||
璇勪及缁村害锛?
|
||
1. 绉戠爺璁捐<EFBFBD>
|
||
- 鐮旂┒绫诲瀷璇嗗埆
|
||
- 璁捐<EFBFBD>鍚堢悊鎬?
|
||
- 鏍锋湰閲忚<EFBFBD>绠?
|
||
|
||
2. 缁熻<EFBFBD>鏂规硶
|
||
- 鏂规硶閫夋嫨
|
||
- 鍙傛暟璁剧疆
|
||
- 鍋囪<EFBFBD>妫€楠?
|
||
|
||
3. 缁熻<EFBFBD>鍒嗘瀽
|
||
- 缁撴灉鍛堢幇
|
||
- 鍥捐〃瑙勮寖
|
||
- 缁撹<EFBFBD>鍚堢悊鎬?
|
||
```
|
||
|
||
**鎶€鏈<E282AC>疄鐜帮細**
|
||
```typescript
|
||
// reviewService.ts (437琛?
|
||
export class ReviewService {
|
||
async reviewManuscript(
|
||
userId: string,
|
||
file: File,
|
||
modelType: ModelType
|
||
): Promise<ReviewTask> {
|
||
// 1. 涓婁紶鏂囦欢骞跺垱寤轰换鍔?
|
||
const task = await this.createTask(userId, file);
|
||
|
||
// 2. 鎻愬彇鏂囨。鍏ㄦ枃锛堣皟鐢≒ython寰<6E>湇鍔★級
|
||
const fullText = await extractionClient.extractDocument(file);
|
||
|
||
// 3. 绋跨害瑙勮寖鎬ц瘎浼?
|
||
const editorialResult = await this.evaluateEditorial(fullText, modelType);
|
||
|
||
// 4. 鏂规硶瀛﹁瘎浼?
|
||
const methodologyResult = await this.evaluateMethodology(fullText, modelType);
|
||
|
||
// 5. 淇濆瓨缁撴灉
|
||
await this.updateTaskResult(task.id, {
|
||
editorialScore: editorialResult.overall_score,
|
||
editorialResult: editorialResult,
|
||
methodologyScore: methodologyResult.overall_score,
|
||
methodologyResult: methodologyResult
|
||
});
|
||
|
||
return task;
|
||
}
|
||
}
|
||
```
|
||
|
||
**API绔<49>偣锛?*
|
||
- `POST /api/v1/review/upload` - 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌?
|
||
- `GET /api/v1/review/tasks/:taskId` - 鏌ヨ<E98F8C>浠诲姟鐘舵€?
|
||
- `GET /api/v1/review/tasks/:taskId/report` - 鑾峰彇瀹屾暣鎶ュ憡
|
||
- `GET /api/v1/review/tasks` - 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
|
||
- `DELETE /api/v1/review/tasks/:taskId` - 鍒犻櫎浠诲姟
|
||
|
||
**鍓嶇<E98D93>缁勪欢锛?*
|
||
```tsx
|
||
// ReviewPage.tsx (625琛? - 涓婚〉闈?
|
||
// 鍖呭惈锛氫笂浼犲尯 + 杩涘害鏉?+ 鎶ュ憡灞曠ず + PDF瀵煎嚭
|
||
|
||
// ScoreCard.tsx - 鍒嗘暟鍗$墖锛堥<E9949B>鑹茬紪鐮侊級
|
||
// EditorialReview.tsx - 绋跨害瑙勮寖鎬ц瘎浼拌<E6B5BC>鎯?
|
||
// MethodologyReview.tsx - 鏂规硶瀛﹁瘎浼拌<E6B5BC>鎯?
|
||
```
|
||
|
||
---
|
||
|
||
## 馃彈锔?鎶€鏈<E282AC>灦鏋勬€昏<E282AC>
|
||
|
||
### 1. **鎶€鏈<E282AC>爤**
|
||
|
||
#### 鍚庣<E98D9A>鎶€鏈<E282AC>爤
|
||
```typescript
|
||
鏍稿績妗嗘灦锛?
|
||
- Node.js 18+
|
||
- TypeScript 5.x
|
||
- Fastify 4.x (楂樻€ц兘HTTP妗嗘灦)
|
||
|
||
鏁版嵁灞傦細
|
||
- PostgreSQL 15+ (鍏崇郴鏁版嵁搴?
|
||
- Prisma 5.x (ORM)
|
||
- Redis (缂撳瓨锛屽緟闆嗘垚)
|
||
|
||
AI闆嗘垚锛?
|
||
- DeepSeek-V3 (涓诲姏LLM锛屄?/鐧句竾tokens)
|
||
- Qwen3-72B (澶囩敤LLM锛屄?/鐧句竾tokens)
|
||
- Qwen-Long (瓒呴暱涓婁笅鏂囷紝1M tokens)
|
||
- Dify (RAG骞冲彴锛屽悜閲忔<EFBFBD>绱?
|
||
|
||
鏂囦欢澶勭悊锛?
|
||
- @fastify/multipart (鏂囦欢涓婁紶)
|
||
- @dqbd/tiktoken (Token璁℃暟)
|
||
- axios (HTTP瀹㈡埛绔?
|
||
|
||
骞跺彂鎺у埗锛?
|
||
- p-queue (闃熷垪绠$悊)
|
||
|
||
閰嶇疆绠$悊锛?
|
||
- js-yaml (YAML瑙f瀽)
|
||
- dotenv (鐜<EFBFBD><EFBFBD>鍙橀噺)
|
||
```
|
||
|
||
#### 鍓嶇<E98D93>鎶€鏈<E282AC>爤
|
||
```typescript
|
||
鏍稿績妗嗘灦锛?
|
||
- React 18
|
||
- TypeScript 5.x
|
||
- Vite 5.x (鏋勫缓宸ュ叿)
|
||
|
||
UI缁勪欢锛?
|
||
- Ant Design 5.x (涓昏<EFBFBD>UI搴?
|
||
- TailwindCSS (宸ュ叿绫籆SS)
|
||
- React Router 6 (璺<EFBFBD>敱)
|
||
|
||
鐘舵€佺<EFBFBD>鐞嗭細
|
||
- Zustand (杞婚噺绾х姸鎬佺<EFBFBD>鐞?
|
||
|
||
鏁版嵁璇锋眰锛?
|
||
- Axios (HTTP瀹㈡埛绔?
|
||
- EventSource (SSE娴佸紡杈撳嚭)
|
||
|
||
杈呭姪宸ュ叿锛?
|
||
- react-markdown (Markdown娓叉煋)
|
||
- rehype-raw (HTML娓叉煋)
|
||
- html2canvas + jsPDF (PDF瀵煎嚭)
|
||
- xlsx (Excel瀵煎嚭)
|
||
```
|
||
|
||
#### Python寰<6E>湇鍔?
|
||
```python
|
||
鏍稿績妗嗘灦锛?
|
||
- FastAPI (楂樻€ц兘寮傛<EFBFBD>妗嗘灦)
|
||
- uvicorn (ASGI鏈嶅姟鍣?
|
||
|
||
PDF澶勭悊锛?
|
||
- PyMuPDF (fitz) - 蹇<EFBFBD>€熼€氱敤
|
||
- pdfplumber - 琛ㄦ牸鎻愬彇
|
||
- nougat-ocr - 瀛︽湳璁烘枃楂樿川閲忔彁鍙?
|
||
|
||
Docx澶勭悊锛?
|
||
- mammoth - 杞琈arkdown
|
||
- python-docx - 缁撴瀯鍖栬<EFBFBD>鍙?
|
||
|
||
鏂囨湰澶勭悊锛?
|
||
- chardet - 缂栫爜妫€娴?
|
||
- langdetect - 璇<EFBFBD>█妫€娴?
|
||
|
||
宸ュ叿锛?
|
||
- python-multipart - 鏂囦欢涓婁紶
|
||
- python-dotenv - 閰嶇疆绠$悊
|
||
```
|
||
|
||
---
|
||
|
||
### 2. **鏁版嵁搴撹<E690B4>璁?*
|
||
|
||
#### 鏍稿績琛ㄧ粨鏋勶紙13涓<33>〃锛?
|
||
|
||
**鐢ㄦ埛鐩稿叧锛?涓<>〃锛夛細**
|
||
```prisma
|
||
model User {
|
||
id String @id @default(uuid())
|
||
email String @unique
|
||
password String // bcrypt鍔犲瘑
|
||
name String?
|
||
avatarUrl String?
|
||
role String @default("user")
|
||
status String @default("active")
|
||
kbQuota Int @default(3)
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
}
|
||
```
|
||
|
||
**椤圭洰绠$悊锛?涓<>〃锛夛細**
|
||
```prisma
|
||
model Project {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
description String? @db.Text
|
||
background String? @db.Text
|
||
researchType String?
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
deletedAt DateTime?
|
||
|
||
@@index([userId, deletedAt])
|
||
}
|
||
```
|
||
|
||
**瀵硅瘽绯荤粺锛?涓<>〃锛夛細**
|
||
```prisma
|
||
// 椤圭洰瀵硅瘽
|
||
model Conversation {
|
||
id String @id @default(uuid())
|
||
projectId String
|
||
agentId String
|
||
title String?
|
||
metadata Json?
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
deletedAt DateTime?
|
||
}
|
||
|
||
model Message {
|
||
id String @id @default(uuid())
|
||
conversationId String
|
||
role String // user/assistant
|
||
content String @db.Text
|
||
model String? // deepseek-v3/qwen3/qwen-long
|
||
metadata Json? // 鐭ヨ瘑搴撳紩鐢ㄧ瓑
|
||
createdAt DateTime @default(now())
|
||
}
|
||
|
||
// 閫氱敤瀵硅瘽锛堟櫤鑳介棶绛旓級
|
||
model GeneralConversation {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
title String?
|
||
metadata Json?
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
deletedAt DateTime?
|
||
}
|
||
|
||
model GeneralMessage {
|
||
id String @id @default(uuid())
|
||
conversationId String
|
||
role String
|
||
content String @db.Text
|
||
model String?
|
||
metadata Json?
|
||
createdAt DateTime @default(now())
|
||
}
|
||
```
|
||
|
||
**鐭ヨ瘑搴撶郴缁燂紙2涓<32>〃锛夛細**
|
||
```prisma
|
||
model KnowledgeBase {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
description String? @db.Text
|
||
difyDatasetId String @unique
|
||
documentCount Int @default(0)
|
||
totalSize BigInt @default(0)
|
||
totalTokens BigInt @default(0)
|
||
tokenLimit BigInt @default(980000)
|
||
documentLimit Int @default(50)
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@index([userId])
|
||
}
|
||
|
||
model Document {
|
||
id String @id @default(uuid())
|
||
knowledgeBaseId String
|
||
name String
|
||
originalName String
|
||
fileType String
|
||
fileSize BigInt
|
||
difyDocumentId String @unique
|
||
status String
|
||
errorMessage String? @db.Text
|
||
|
||
// 鍏ㄦ枃瀛樺偍
|
||
fullText String? @db.Text
|
||
tokenCount Int?
|
||
charCount Int?
|
||
extractionMethod String?
|
||
extractionQuality Float?
|
||
detectedLanguage String?
|
||
|
||
uploadedAt DateTime @default(now())
|
||
processedAt DateTime?
|
||
|
||
@@index([knowledgeBaseId, status])
|
||
}
|
||
```
|
||
|
||
**鎵瑰<E98EB5>鐞嗙郴缁燂紙2涓<32>〃锛夛細**
|
||
```prisma
|
||
model BatchTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
name String
|
||
templateType String
|
||
templateId String?
|
||
customPrompt String? @db.Text
|
||
modelType String
|
||
concurrency Int @default(3)
|
||
status String
|
||
totalCount Int
|
||
completedCount Int @default(0)
|
||
failedCount Int @default(0)
|
||
startedAt DateTime?
|
||
completedAt DateTime?
|
||
duration Int?
|
||
|
||
@@index([userId, status])
|
||
}
|
||
|
||
model BatchResult {
|
||
id String @id @default(uuid())
|
||
taskId String
|
||
documentId String
|
||
documentName String
|
||
status String
|
||
extractedData Json?
|
||
rawOutput String? @db.Text
|
||
errorMessage String? @db.Text
|
||
processingTime Int?
|
||
tokenUsage Int?
|
||
|
||
@@index([taskId, status])
|
||
}
|
||
```
|
||
|
||
**绋夸欢瀹℃煡锛?涓<>〃锛夛細**
|
||
```prisma
|
||
model ReviewTask {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
fileName String
|
||
fileType String
|
||
fileSize BigInt
|
||
status String
|
||
modelType String
|
||
editorialScore Float?
|
||
editorialResult Json?
|
||
methodologyScore Float?
|
||
methodologyResult Json?
|
||
errorMessage String? @db.Text
|
||
processingTime Int?
|
||
createdAt DateTime @default(now())
|
||
completedAt DateTime?
|
||
|
||
@@index([userId, status])
|
||
}
|
||
```
|
||
|
||
**杩愯惀绠$悊锛?涓<>〃锛夛細**
|
||
```prisma
|
||
model AdminLog {
|
||
id String @id @default(uuid())
|
||
adminId String
|
||
action String
|
||
targetType String?
|
||
targetId String?
|
||
details Json?
|
||
ipAddress String?
|
||
userAgent String?
|
||
createdAt DateTime @default(now())
|
||
|
||
@@index([adminId, createdAt])
|
||
@@index([action, createdAt])
|
||
}
|
||
```
|
||
|
||
**鎬荤粺璁★細13涓<33>〃锛寏80涓<30>瓧娈?*
|
||
|
||
---
|
||
|
||
### 3. **浠g爜缁撴瀯**
|
||
|
||
#### 鍚庣<E98D9A>浠g爜缁撴瀯
|
||
```
|
||
backend/
|
||
鈹溾攢鈹€ config/
|
||
鈹? 鈹斺攢鈹€ agents.yaml (348琛? - 鏅鸿兘浣撻厤缃?
|
||
鈹溾攢鈹€ prompts/ (441琛?
|
||
鈹? 鈹溾攢鈹€ topic_evaluation_system.txt (143琛?
|
||
鈹? 鈹溾攢鈹€ topic_evaluation_user.txt (12琛?
|
||
鈹? 鈹溾攢鈹€ editorial_review_system.txt (210琛?
|
||
鈹? 鈹斺攢鈹€ methodology_review_system.txt (231琛?
|
||
鈹溾攢鈹€ src/
|
||
鈹? 鈹溾攢鈹€ adapters/ (387琛? - LLM閫傞厤鍣?
|
||
鈹? 鈹? 鈹溾攢鈹€ types.ts (57琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ DeepSeekAdapter.ts (150琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ QwenAdapter.ts (162琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ LLMFactory.ts (18琛?
|
||
鈹? 鈹溾攢鈹€ clients/ (~550琛? - 澶栭儴鏈嶅姟瀹㈡埛绔?
|
||
鈹? 鈹? 鈹溾攢鈹€ DifyClient.ts (282琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ ExtractionClient.ts (268琛?
|
||
鈹? 鈹溾攢鈹€ config/ (56琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ env.ts - 鐜<><E9909C>閰嶇疆
|
||
鈹? 鈹溾攢鈹€ controllers/ (~2,700琛? - 鎺у埗鍣?
|
||
鈹? 鈹? 鈹溾攢鈹€ projectController.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ agentController.ts (197琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ conversationController.ts (247琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ chatController.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseController.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ documentController.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ batchController.ts (429琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ reviewController.ts (265琛?
|
||
鈹? 鈹溾攢鈹€ services/ (~3,000琛? - 涓氬姟閫昏緫
|
||
鈹? 鈹? 鈹溾攢鈹€ projectService.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ agentService.ts (232琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ conversationService.ts (381琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseService.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ documentService.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ batchService.ts (421琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ reviewService.ts (437琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ tokenService.ts (243琛?
|
||
鈹? 鈹溾攢鈹€ templates/ (145琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ clinicalResearch.ts - 鎵瑰<E98EB5>鐞嗛<E9909E>璁炬ā鏉?
|
||
鈹? 鈹溾攢鈹€ utils/ (145琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ jsonParser.ts - 瀹归敊JSON瑙f瀽
|
||
鈹? 鈹溾攢鈹€ routes/ (~250琛? - 璺<>敱
|
||
鈹? 鈹? 鈹溾攢鈹€ projects.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ agents.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ conversations.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ chatRoutes.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ knowledgeBases.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ batchRoutes.ts
|
||
鈹? 鈹? 鈹斺攢鈹€ reviewRoutes.ts
|
||
鈹? 鈹溾攢鈹€ middleware/ (~50琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ validateProject.ts
|
||
鈹? 鈹斺攢鈹€ index.ts (涓诲叆鍙?
|
||
鈹溾攢鈹€ prisma/
|
||
鈹? 鈹溾攢鈹€ schema.prisma (~600琛?
|
||
鈹? 鈹斺攢鈹€ migrations/
|
||
鈹溾攢鈹€ package.json
|
||
鈹斺攢鈹€ tsconfig.json
|
||
|
||
鎬昏<EFBFBD>锛殈12,000琛屼唬鐮?
|
||
```
|
||
|
||
#### 鍓嶇<E98D93>浠g爜缁撴瀯
|
||
```
|
||
frontend/
|
||
鈹溾攢鈹€ src/
|
||
鈹? 鈹溾攢鈹€ api/ (~1,500琛? - API灏佽<E7818F>
|
||
鈹? 鈹? 鈹溾攢鈹€ projectApi.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ agentApi.ts (76琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ conversationApi.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ chatApi.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseApi.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ batchApi.ts (147琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ reviewApi.ts (319琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ request.ts (axios閰嶇疆)
|
||
鈹? 鈹溾攢鈹€ components/ (~5,000琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ chat/ (~3,000琛?
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ MessageList.tsx (鍚<>櫤鑳藉紩鐢?
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ MessageInput.tsx (鍚獲鐭ヨ瘑搴?
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ ModelSelector.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ ModeSelector.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ FullTextMode.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ DeepReadMode.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ BatchMode.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ TaskDefinition.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ DocumentSelection.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ BatchProgress.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ PresetTable.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ CustomTable.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ BatchResults.tsx
|
||
鈹? 鈹? 鈹? 鈹斺攢鈹€ CapacityIndicator.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ knowledge/ (~800琛?
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ KnowledgeBaseList.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ DocumentList.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ DocumentUpload.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ CreateKBDialog.tsx
|
||
鈹? 鈹? 鈹? 鈹斺攢鈹€ EditKBDialog.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ review/ (~500琛?
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ ScoreCard.tsx
|
||
鈹? 鈹? 鈹? 鈹溾攢鈹€ EditorialReview.tsx
|
||
鈹? 鈹? 鈹? 鈹斺攢鈹€ MethodologyReview.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ ProjectSelector.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ CreateProjectDialog.tsx
|
||
鈹? 鈹? 鈹斺攢鈹€ EditProjectDialog.tsx
|
||
鈹? 鈹溾攢鈹€ pages/ (~2,500琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ HomePage.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ AgentChatPage.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ ChatPage.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ KnowledgePage.tsx
|
||
鈹? 鈹? 鈹溾攢鈹€ ReviewPage.tsx (625琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ HistoryPage.tsx
|
||
鈹? 鈹溾攢鈹€ stores/ (~400琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ useProjectStore.ts
|
||
鈹? 鈹? 鈹斺攢鈹€ useKnowledgeBaseStore.ts
|
||
鈹? 鈹溾攢鈹€ hooks/ (~400琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ useChatMode.ts
|
||
鈹? 鈹? 鈹溾攢鈹€ useDeepReadState.ts
|
||
鈹? 鈹? 鈹斺攢鈹€ useBatchTask.ts (198琛?
|
||
鈹? 鈹溾攢鈹€ layouts/ (~200琛?
|
||
鈹? 鈹? 鈹斺攢鈹€ MainLayout.tsx
|
||
鈹? 鈹溾攢鈹€ types/ (~300琛?
|
||
鈹? 鈹? 鈹溾攢鈹€ chat.ts
|
||
鈹? 鈹? 鈹斺攢鈹€ index.ts
|
||
鈹? 鈹斺攢鈹€ App.tsx
|
||
鈹溾攢鈹€ package.json
|
||
鈹斺攢鈹€ vite.config.ts
|
||
|
||
鎬昏<EFBFBD>锛殈10,000琛屼唬鐮?
|
||
```
|
||
|
||
#### Python寰<6E>湇鍔$粨鏋?
|
||
```
|
||
extraction_service/
|
||
鈹溾攢鈹€ services/
|
||
鈹? 鈹溾攢鈹€ pdf_extractor.py (242琛?
|
||
鈹? 鈹溾攢鈹€ pdf_processor.py (280琛?
|
||
鈹? 鈹溾攢鈹€ language_detector.py (120琛?
|
||
鈹? 鈹溾攢鈹€ nougat_extractor.py (242琛?
|
||
鈹? 鈹溾攢鈹€ docx_extractor.py (253琛?
|
||
鈹? 鈹斺攢鈹€ txt_extractor.py (316琛?
|
||
鈹溾攢鈹€ main.py (509琛?
|
||
鈹溾攢鈹€ requirements.txt
|
||
鈹斺攢鈹€ README.md
|
||
|
||
鎬昏<EFBFBD>锛殈2,100琛屼唬鐮?
|
||
```
|
||
|
||
---
|
||
|
||
## 馃搳 鏁版嵁娴佹灦鏋?
|
||
|
||
### 1. **AI瀵硅瘽娴佺▼**
|
||
|
||
```
|
||
鐢ㄦ埛杈撳叆
|
||
鈫?
|
||
鍓嶇<EFBFBD> ChatPage/AgentChatPage
|
||
鈫?POST /api/v1/conversations/:id/messages/stream
|
||
鍚庣<EFBFBD> conversationController
|
||
鈫?
|
||
conversationService
|
||
鈹溾啋 agentService.getAgent() - 鑾峰彇鏅鸿兘浣撻厤缃?
|
||
鈹溾啋 projectService.getProject() - 鑾峰彇椤圭洰鑳屾櫙
|
||
鈹溾啋 conversationService.getHistory() - 鑾峰彇鍘嗗彶瀵硅瘽
|
||
鈹溾啋 knowledgeBaseService.search() - 鐭ヨ瘑搴撴<E690B4>绱<EFBFBD>紙鍙<E7B499>€夛級
|
||
鈹斺啋 缁勮<E7BC81>涓婁笅鏂囷紙System + 鍘嗗彶 + 椤圭洰鑳屾櫙 + 鐭ヨ瘑搴?+ 鐢ㄦ埛杈撳叆锛?
|
||
鈫?
|
||
LLMFactory.getAdapter(modelType)
|
||
鈫?
|
||
DeepSeekAdapter / QwenAdapter
|
||
鈫?HTTP (SSE Stream)
|
||
OpenAI API / DashScope API
|
||
鈫?(娴佸紡杩斿洖)
|
||
鍚庣<EFBFBD> conversationService
|
||
鈹溾啋 瀹炴椂鍐欏叆鏁版嵁搴擄紙messages琛<73>級
|
||
鈹斺啋 SSE娴佸紡杩斿洖鍓嶇<E98D93>
|
||
鈫?
|
||
鍓嶇<EFBFBD> MessageList
|
||
鈹斺啋 瀹炴椂娓叉煋锛堟墦瀛楁満鏁堟灉锛?
|
||
```
|
||
|
||
---
|
||
|
||
### 2. **鐭ヨ瘑搴揜AG娴佺▼**
|
||
|
||
```
|
||
鐢ㄦ埛涓婁紶鏂囨。
|
||
鈫?
|
||
鍓嶇<EFBFBD> DocumentUpload
|
||
鈫?POST /api/v1/knowledge-bases/:id/documents
|
||
鍚庣<EFBFBD> documentController
|
||
鈫?
|
||
documentService.uploadDocument()
|
||
鈹溾啋 淇濆瓨鏂囦欢鍒颁复鏃剁洰褰?
|
||
鈹溾啋 璋冪敤Python寰<6E>湇鍔℃彁鍙栨枃鏈?(Phase2)
|
||
鈹溾啋 璁$畻Token鏁?(Phase2)
|
||
鈹溾啋 妫€鏌ュ<E98F8C>閲忛檺鍒?(Phase2)
|
||
鈹溾啋 涓婁紶鍒癉ify (RAG绱㈠紩)
|
||
鈹溾啋 淇濆瓨鍏ㄦ枃鍒版暟鎹<E69A9F>簱 (Phase2)
|
||
鈹斺啋 鏇存柊鐭ヨ瘑搴撶粺璁?
|
||
鈫?
|
||
鍚庡彴杞<EFBFBD><EFBFBD>Dify澶勭悊鐘舵€?
|
||
鈹斺啋 鏇存柊document.status
|
||
|
||
---
|
||
|
||
鐢ㄦ埛@鐭ヨ瘑搴撴彁闂?
|
||
鈫?
|
||
鍓嶇<EFBFBD> MessageInput (閫夋嫨鐭ヨ瘑搴?
|
||
鈫?POST /api/v1/conversations/:id/messages/stream
|
||
鍚庣<EFBFBD> conversationService
|
||
鈫?
|
||
knowledgeBaseService.search(kbIds, query)
|
||
鈹溾啋 瀵规瘡涓<E798A1>煡璇嗗簱璋冪敤Dify妫€绱<E282AC>PI
|
||
鈹溾啋 杩斿洖Top 15鐩稿叧鏂囨。鐗囨<E99097>
|
||
鈹溾啋 鏍煎紡鍖栵細銆愮煡璇嗗簱锛歺xx銆慭n1. [鐩稿叧搴<E58FA7>X%] 鍐呭<E98D90>...
|
||
鈹斺啋 鏀堕泦寮曠敤淇℃伅 (Phase 1.5)
|
||
鈫?
|
||
娉ㄥ叆鍒癓LM涓婁笅鏂?
|
||
鈹溾啋 鎸囧<E98EB8>AI浣跨敤[鏉ユ簮N]鏍囧噯缂栧彿
|
||
鈹斺啋 杩藉姞寮曠敤娓呭崟锛圚TML鏍煎紡锛?
|
||
鈫?
|
||
鍓嶇<EFBFBD> MessageList
|
||
鈹溾啋 瑙f瀽寮曠敤鏍囪<E98F8D>
|
||
鈹溾啋 楂樹寒鏄剧ず[鏉ユ簮N]
|
||
鈹溾啋 鐐瑰嚮璺宠浆鍒板紩鐢ㄨ<E990A2>鎯?
|
||
鈹斺啋 璇︽儏鍖哄煙楂樹寒闂<E5AF92>儊
|
||
```
|
||
|
||
---
|
||
|
||
### 3. **鎵瑰<E98EB5>鐞嗘祦绋?*
|
||
|
||
```
|
||
鐢ㄦ埛閫夋嫨鏂囩尞 + 閰嶇疆浠诲姟
|
||
鈫?
|
||
鍓嶇<EFBFBD> BatchMode
|
||
鈫?POST /api/v1/batch/execute
|
||
鍚庣<EFBFBD> batchController
|
||
鈫?
|
||
batchService.executeBatchTask()
|
||
鈹溾啋 鍒涘缓BatchTask璁板綍
|
||
鈹溾啋 鍔犺浇棰勮<E6A3B0>妯℃澘鎴栬嚜瀹氫箟Prompt
|
||
鈹斺啋 寮傛<E5AFAE>鎵ц<E98EB5>鎵瑰<E98EB5>鐞?
|
||
鈫?
|
||
骞跺彂闃熷垪锛坧-queue锛屽浐瀹?骞跺彂锛?
|
||
鈹溾啋 processDocument(doc1)
|
||
鈹溾啋 processDocument(doc2)
|
||
鈹斺啋 processDocument(doc3)
|
||
鈫?姣忎釜鏂囨。澶勭悊
|
||
鈹溾啋 鑾峰彇鏂囨。鍏ㄦ枃锛坉atabase锛?
|
||
鈹溾啋 鏋勯€燣LM娑堟伅锛圫ystem + User + 鏂囨。鍏ㄦ枃锛?
|
||
鈹溾啋 璋冪敤LLM API
|
||
鈹溾啋 瑙f瀽JSON锛堥<E9949B>璁撅級鎴栦繚瀛樻枃鏈<E69E83>紙鑷<E7B499>畾涔夛級
|
||
鈹斺啋 淇濆瓨BatchResult璁板綍
|
||
鈫?
|
||
鍚庡彴鏇存柊浠诲姟缁熻<EFBFBD>
|
||
鈹斺啋 completedCount, failedCount, status
|
||
|
||
---
|
||
|
||
鍓嶇<EFBFBD>杞<EFBFBD><EFBFBD>浠诲姟鐘舵€?
|
||
鈫?GET /api/v1/batch/tasks/:taskId (姣?绉?
|
||
鍚庣<EFBFBD>杩斿洖浠诲姟杩涘害
|
||
鈹溾啋 status, totalCount, completedCount, failedCount
|
||
鈹斺啋 棰勪及鍓╀綑鏃堕棿
|
||
鈫?
|
||
浠诲姟瀹屾垚鍚?
|
||
鈫?GET /api/v1/batch/tasks/:taskId/results
|
||
鍚庣<EFBFBD>杩斿洖瀹屾暣缁撴灉
|
||
鈹溾啋 棰勮<E6A3B0>妯℃澘锛?鍒楄〃鏍?
|
||
鈹溾啋 鑷<>畾涔夋ā鏉匡細3鍒楁枃鏈<E69E83>潡
|
||
鈹斺啋 澶辫触椤瑰垪琛?
|
||
鈫?
|
||
鍓嶇<EFBFBD> BatchResults
|
||
鈹溾啋 娓叉煋缁撴灉琛ㄦ牸
|
||
鈹溾啋 瀵煎嚭Excel锛堝弻Sheet锛?
|
||
鈹斺啋 閲嶈瘯澶辫触椤?
|
||
```
|
||
|
||
---
|
||
|
||
## 馃捑 鏁版嵁缁熻<E7BC81>
|
||
|
||
### 浠g爜閲忕粺璁?
|
||
|
||
| 妯″潡 | 鏂囦欢鏁?| 浠g爜琛屾暟 | 鍗犳瘮 |
|
||
|------|-------|---------|------|
|
||
| **鍚庣<E98D9A>涓讳唬鐮?* | 38 | ~12,000 | 50% |
|
||
| **鍓嶇<E98D93>涓讳唬鐮?* | 75 | ~10,000 | 42% |
|
||
| **Python寰<6E>湇鍔?* | 8 | ~2,100 | 8% |
|
||
| **鎬昏<E98EAC>** | **121** | **~24,100** | **100%** |
|
||
|
||
### 鏁版嵁搴撶粺璁?
|
||
|
||
| 绫诲埆 | 鏁伴噺 |
|
||
|------|------|
|
||
| **琛?* | 13 |
|
||
| **瀛楁<E7809B>** | ~80 |
|
||
| **绱㈠紩** | ~20 |
|
||
| **鍏崇郴** | 15 |
|
||
|
||
### API绔<49>偣缁熻<E7BC81>
|
||
|
||
| 妯″潡 | 绔<>偣鏁?|
|
||
|------|-------|
|
||
| 椤圭洰绠$悊 | 5 |
|
||
| 鏅鸿兘浣撶<E6B5A3>鐞?| 4 |
|
||
| 瀵硅瘽绯荤粺 | 8 |
|
||
| 鐭ヨ瘑搴撶<E690B4>鐞?| 12 |
|
||
| 鎵瑰<E98EB5>鐞嗙郴缁?| 5 |
|
||
| 绋夸欢瀹℃煡 | 5 |
|
||
| **鎬昏<E98EAC>** | **39** |
|
||
|
||
---
|
||
|
||
## 馃幆 宸查獙璇佺殑鎶€鏈<E282AC>兘鍔?
|
||
|
||
### 1. AI闆嗘垚鑳藉姏 鉁?
|
||
- 鉁?**澶氭ā鍨嬫敮鎸?*锛欴eepSeek-V3銆丵wen3-72B銆丵wen-Long
|
||
- 鉁?**娴佸紡杈撳嚭**锛歋SE瀹炴椂浼犺緭锛屾墦瀛楁満鏁堟灉
|
||
- 鉁?**涓婁笅鏂囩<E98F82>鐞?*锛氭櫤鑳界粍瑁咃紝鍘嗗彶瀵硅瘽锛岄」鐩<E3808D>儗鏅?
|
||
- 鉁?**閿欒<E996BF>澶勭悊**锛氬畬鏁寸殑閲嶈瘯鏈哄埗鍜岄檷绾х瓥鐣?
|
||
- 鉁?**Token浼樺寲**锛氱簿纭<E7B0BF><E7BAAD>鏁帮紝鎴愭湰鎺у埗
|
||
|
||
### 2. RAG鑳藉姏 鉁?
|
||
- 鉁?**鍚戦噺妫€绱?*锛欴ify + Qdrant锛岃<E9949B>涔夋悳绱?
|
||
- 鉁?**澶氱煡璇嗗簱**锛氳仈鍚堟<E98D9A>绱<EFBFBD>紝缁撴灉鍚堝苟
|
||
- 鉁?**鏅鸿兘寮曠敤**锛?00%鍑嗙‘婧<E28098>簮锛屽彲鐐瑰嚮璺宠浆
|
||
- 鉁?**瑕嗙洊鐜囦紭鍖?*锛氫粠5%鎻愬崌鍒?0-50%锛?5鍊嶆彁鍗囷級
|
||
|
||
### 3. 鏂囨。澶勭悊鑳藉姏 鉁?
|
||
- 鉁?**澶氭牸寮忔敮鎸?*锛歅DF銆丏ocx銆乀xt
|
||
- 鉁?**鏅鸿兘鎻愬彇**锛歂ougat锛堝<E9949B>鏈<EFBFBD><E98F88>鏂囷級 + PyMuPDF锛堝厹搴曪級 + Mammoth锛圖ocx锛?
|
||
- 鉁?**璇<>█妫€娴?*锛氫腑鑻辨枃鑷<E69E83>姩璇嗗埆锛屼紭鍖栨彁鍙栫瓥鐣?
|
||
- 鉁?**璐ㄩ噺璇勪及**锛氭彁鍙栬川閲忚瘎鍒嗭紝鑷<E7B49D>姩闄嶇骇
|
||
- 鉁?**澶ф枃浠跺<E6B5A0>鐞?*锛氭敮鎸?0MB+鏂囨。
|
||
|
||
### 4. 骞跺彂鎺у埗鑳藉姏 鉁?
|
||
- 鉁?**闃熷垪绠$悊**锛歱-queue锛屽浐瀹?骞跺彂
|
||
- 鉁?**瀹归敊鏈哄埗**锛歅romise.allSettled锛屽崟涓<E5B49F>け璐ヤ笉褰卞搷鍏朵粬
|
||
- 鉁?**杩涘害杩借釜**锛氬疄鏃剁粺璁★紝棰勪及鍓╀綑鏃堕棿
|
||
- 鉁?**澶辫触閲嶈瘯**锛氬け璐ラ」鍙<E3808D>崟鐙<E5B49F>噸璇?
|
||
|
||
### 5. 鏁版嵁绠$悊鑳藉姏 鉁?
|
||
- 鉁?**鍏崇郴鏁版嵁搴?*锛歅ostgreSQL + Prisma ORM
|
||
- 鉁?**鏁版嵁闅旂<E99785>**锛氱敤鎴风骇銆侀」鐩<E3808D>骇闅旂<E99785>
|
||
- 鉁?**杞<>垹闄?*锛氬叧閿<E58FA7>暟鎹<E69A9F>彲鎭㈠<E98EAD>
|
||
- 鉁?**浜嬪姟绠$悊**锛欰CID淇濊瘉
|
||
- 鉁?**绱㈠紩浼樺寲**锛氭煡璇㈡€ц兘浼樺寲
|
||
|
||
---
|
||
|
||
## 馃搱 鎬ц兘鎸囨爣
|
||
|
||
### 宸叉祴璇曠殑鎬ц兘鏁版嵁
|
||
|
||
| 鎸囨爣 | 鏁板€?| 璇存槑 |
|
||
|------|------|------|
|
||
| API鍝嶅簲鏃堕棿 | < 500ms | 鏅<>€欰PI绔<49>偣 |
|
||
| LLM棣栧瓧鍝嶅簲 | < 3s | DeepSeek-V3 |
|
||
| 娴佸紡杈撳嚭寤惰繜 | < 100ms | SSE chunk寤惰繜 |
|
||
| 鏂囨。涓婁紶閫熷害 | ~5MB/s | 10MB鏂囨。绾?绉?|
|
||
| PDF鎻愬彇閫熷害锛圥yMuPDF锛?| ~2椤?绉?| 20椤礟DF绾?0绉?|
|
||
| PDF鎻愬彇閫熷害锛圢ougat锛?| ~0.5椤?绉?| 20椤礟DF绾?0绉?|
|
||
| Docx鎻愬彇閫熷害 | ~1绉?MB | 10MB Docx绾?0绉?|
|
||
| Token璁℃暟閫熷害 | ~10ms/1000瀛?| Tiktoken |
|
||
| 鎵瑰<E98EB5>鐞嗛€熷害 | ~20绉?鏂囨。 | 3骞跺彂骞冲潎 |
|
||
| RAG妫€绱㈠欢杩?| < 1s | Dify妫€绱?|
|
||
|
||
### 鎴愭湰鎸囨爣
|
||
|
||
| 椤圭洰 | 鎴愭湰 | 璇存槑 |
|
||
|------|------|------|
|
||
| LLM API鎴愭湰锛圖eepSeek-V3锛?| 楼1/鐧句竾tokens | 涓诲姏妯″瀷 |
|
||
| LLM API鎴愭湰锛圦wen3锛?| 楼4/鐧句竾tokens | 澶囩敤妯″瀷 |
|
||
| LLM API鎴愭湰锛圦wen-Long锛?| 楼5/鐧句竾tokens | 鍏ㄦ枃妯″紡 |
|
||
| 鍗曟<E98D97>瀵硅瘽鎴愭湰 | 楼0.001-0.01 | 500-5000 tokens |
|
||
| 鍏ㄦ枃绮捐<E7BBAE>鎴愭湰锛?0绡囷級 | 楼0.5-1 | 100K-200K tokens |
|
||
| 鎵瑰<E98EB5>鐞嗘垚鏈<E59E9A>紙50绡囷級 | 楼0.3-0.5 | 60K-100K tokens |
|
||
| 绋夸欢瀹℃煡鎴愭湰 | 楼0.05-0.1 | 10K-20K tokens |
|
||
|
||
---
|
||
|
||
## 馃毀 鎶€鏈<E282AC>€哄姟娓呭崟
|
||
|
||
### 楂樹紭鍏堢骇锛堝缓璁<E7BC93>紭鍏堝<E98D8F>鐞嗭級
|
||
|
||
1. **鏃ュ織绯荤粺**
|
||
- 鐜扮姸锛氬ぇ閲廲onsole.log鐢ㄤ簬璋冭瘯
|
||
- 寤鸿<E5AFA4>锛氬紩鍏ユ棩蹇楃骇鍒<E9AA87>帶鍒讹紙winston/pino锛?
|
||
- 褰卞搷锛氱敓浜х幆澧冩棩蹇楃<E8B987>鐞?
|
||
|
||
2. **閿欒<E996BF>鐮佷綋绯?*
|
||
- 鐜扮姸锛氶儴鍒咥PI缂哄皯璇︾粏閿欒<E996BF>淇℃伅
|
||
- 寤鸿<E5AFA4>锛氱粺涓€閿欒<E996BF>鐮佸拰閿欒<E996BF>娑堟伅
|
||
- 褰卞搷锛氬墠绔<E5A2A0>敊璇<E6958A><E79287>鐞嗗拰鐢ㄦ埛浣撻獙
|
||
|
||
3. **绫诲瀷瀹氫箟瀹屽杽**
|
||
- 鐜扮姸锛氶儴鍒嗕娇鐢ㄤ簡`any`绫诲瀷
|
||
- 寤鸿<E5AFA4>锛氳ˉ鍏呭畬鏁寸殑TypeScript绫诲瀷瀹氫箟
|
||
- 褰卞搷锛氫唬鐮佸彲缁存姢鎬?
|
||
|
||
4. **Redis缂撳瓨闆嗘垚**
|
||
- 鐜扮姸锛氬凡閰嶇疆浣嗘湭浣跨敤
|
||
- 寤鸿<E5AFA4>锛氱紦瀛樼儹鐐规暟鎹<E69A9F>紙鏅鸿兘浣撻厤缃<E58EA4>€佺煡璇嗗簱鍒楄〃锛?
|
||
- 褰卞搷锛氭€ц兘浼樺寲
|
||
|
||
### 涓<>紭鍏堢骇锛堝彲鍦ㄩ噷绋嬬<E7BB8B>2-3澶勭悊锛?
|
||
|
||
5. **鍗曞厓娴嬭瘯**
|
||
- 鐜扮姸锛氱己灏戠郴缁熸€ф祴璇?
|
||
- 寤鸿<E5AFA4>锛氭牳蹇冧笟鍔¢€昏緫娣诲姞鍗曞厓娴嬭瘯
|
||
- 褰卞搷锛氫唬鐮佽川閲忓拰閲嶆瀯淇″績
|
||
|
||
6. **WebSocket瀹炴椂鎺ㄩ€?*
|
||
- 鐜扮姸锛氭壒澶勭悊杩涘害浣跨敤HTTP杞<50><E69D9E>
|
||
- 寤鸿<E5AFA4>锛氭敼涓篧ebSocket瀹炴椂鎺ㄩ€?
|
||
- 褰卞搷锛氱敤鎴蜂綋楠屼紭鍖?
|
||
|
||
7. **鏂囨。澶勭悊骞惰<E9AA9E>鍖?*
|
||
- 鐜扮姸锛氭枃妗f彁鍙栦覆琛屽<E7909B>鐞?
|
||
- 寤鸿<E5AFA4>锛氬苟琛屾彁鍙栧<E98D99>涓<EFBFBD>枃妗?
|
||
- 褰卞搷锛氭壒閲忎笂浼犳€ц兘
|
||
|
||
8. **API闄愭祦**
|
||
- 鐜扮姸锛氭棤闄愭祦鏈哄埗
|
||
- 寤鸿<E5AFA4>锛氭坊鍔犻檺娴佷腑闂翠欢
|
||
- 褰卞搷锛氶槻姝<E6A7BB>PI婊ョ敤
|
||
|
||
---
|
||
|
||
## 馃帀 鏍稿績鎴愬氨
|
||
|
||
### 1. **蹇<>€熻凯浠h兘鍔?*
|
||
- 鉁?1涓<31>湀鍐呭畬鎴?澶ф牳蹇冨姛鑳芥ā鍧?
|
||
- 鉁?姣忓懆閮芥湁鍙<E6B981><E98D99>鎴愭灉
|
||
- 鉁?鎶€鏈<E282AC>獙璇佸叏閮ㄩ€氳繃
|
||
|
||
### 2. **AI闆嗘垚娣卞害**
|
||
- 鉁?3涓狶LM妯″瀷瀹屾暣闆嗘垚
|
||
- 鉁?娴佸紡杈撳嚭浣撻獙浼樼<E6B5BC>
|
||
- 鉁?RAG妫€绱㈡晥鏋滄樉钁?
|
||
|
||
### 3. **鏂囨。澶勭悊鑳藉姏**
|
||
- 鉁?Python寰<6E>湇鍔¢珮璐ㄩ噺鎻愬彇
|
||
- 鉁?澶氭牸寮忓叏闈㈡敮鎸?
|
||
- 鉁?鏅鸿兘闄嶇骇绛栫暐鍙<E69A90>潬
|
||
|
||
### 4. **浠g爜璐ㄩ噺**
|
||
- 鉁?TypeScript鍏ㄨ<E98D8F>鐩?
|
||
- 鉁?娓呮櫚鐨勪笁灞傛灦鏋?
|
||
- 鉁?鑹<>ソ鐨勬ā鍧楄В鑰?
|
||
|
||
### 5. **鏂囨。瀹屽杽**
|
||
- 鉁?璇︾粏鐨凱RD鏂囨。
|
||
- 鉁?瀹屾暣鐨勬妧鏈<E5A6A7>枃妗?
|
||
- 鉁?涓板瘜鐨勫紑鍙戞棩蹇楋紙60+绡囷級
|
||
|
||
---
|
||
|
||
## 馃摑 鎬荤粨
|
||
|
||
### 鐜版湁绯荤粺鐨勪紭鍔?
|
||
|
||
1. **鎶€鏈<E282AC>灦鏋勬垚鐔?*
|
||
- 娓呮櫚鐨勪笁灞傛灦鏋勶紙Controller 鈫?Service 鈫?Database锛?
|
||
- 鑹<>ソ鐨勬ā鍧楀寲璁捐<E79281>
|
||
- 瀹屾暣鐨凩LM閫傞厤鍣ㄦ娊璞?
|
||
|
||
2. **鍔熻兘瀹屾暣鎬ч珮**
|
||
- AI瀵硅瘽绯荤粺锛氣渽 瀹屾暣鍙<E69AA3>敤
|
||
- 鐭ヨ瘑搴撶郴缁燂細鉁?瀹屾暣鍙<E69AA3>敤锛圧AG + 鍏ㄦ枃锛?
|
||
- 鎵瑰<E98EB5>鐞嗙郴缁燂細鉁?瀹屾暣鍙<E69AA3>敤
|
||
- 绋夸欢瀹℃煡锛氣渽 瀹屾暣鍙<E69AA3>敤
|
||
|
||
3. **AI鑳藉姏绐佸嚭**
|
||
- 澶氭ā鍨嬫敮鎸侊紝鐏垫椿鍒囨崲
|
||
- RAG妫€绱㈠噯纭<E599AF>紝婧<E7B49D>簮娓呮櫚
|
||
- 鏅鸿兘寮曠敤100%鍑嗙‘
|
||
|
||
4. **宸ョ▼璐ㄩ噺鑹<E599BA>ソ**
|
||
- TypeScript鍏ㄨ<E98D8F>鐩?
|
||
- Prisma ORM锛岀被鍨嬪畨鍏?
|
||
- 娓呮櫚鐨勪唬鐮佺粨鏋?
|
||
|
||
### 鐜版湁绯荤粺鐨勫眬闄?
|
||
|
||
1. **鏋舵瀯灞傞潰**
|
||
- 鉂?缂哄皯SSA銆丼T銆丏C妯″潡锛堟渶鏂伴渶姹傦級
|
||
- 鉂?鏈<>€冭檻绉佹湁鍖栭儴缃插拰鍗曟満鐗?
|
||
- 鉂?鏈<>€冭檻寰<E6AABB>湇鍔℃灦鏋勫拰K8s
|
||
- 鉂?鏈<>€冭檻妯″潡鍖栧敭鍗?
|
||
|
||
2. **鎶€鏈<E282AC>爤灞傞潰**
|
||
- 鉂?缂哄皯R璇<52>█闆嗘垚锛圫SA闇€瑕侊級
|
||
- 鉂?缂哄皯API缃戝叧
|
||
- 鉂?缂哄皯Electron鍗曟満鐗?
|
||
|
||
3. **鏁版嵁搴撳眰闈?*
|
||
- 鉂?鍗曚竴鏁版嵁搴擄紝鏈<E7B49D>€冭檻Schema闅旂<E99785>
|
||
- 鉂?鏈<>€冭檻澶氱<E6BEB6>鎴锋灦鏋?
|
||
|
||
4. **閮ㄧ讲灞傞潰**
|
||
- 鉂?浠呮敮鎸佷簯绔疭aaS锛屾湭鑰冭檻鍏朵粬3绉嶉儴缃叉ā寮?
|
||
- 鉂?鏈<>€冭檻瀹瑰櫒鍖栭儴缃诧紙K8s锛?
|
||
|
||
---
|
||
|
||
## 馃敭 涓嬩竴姝ュ缓璁?
|
||
|
||
鍩轰簬鐜版湁绯荤粺鐨勬妧鏈<EFBFBD>懜搴曪紝寤鸿<EFBFBD>锛?
|
||
|
||
1. **鏄庣‘寮€鍙戦樁娈?*
|
||
- 褰撳墠澶勪簬"闃舵<E99783>涓€锛氭ā鍧楀寲鍗曚綋"
|
||
- 鏄<>惁绔嬪嵆瑙勫垝"闃舵<E99783>浜岋細寰<E7B4B0>湇鍔℃媶鍒?锛?
|
||
- 鏄<>惁绔嬪嵆瑙勫垝Electron鍗曟満鐗堬紵
|
||
|
||
2. **鏄庣‘妯″潡浼樺厛绾?*
|
||
- DC妯″潡锛堟暟鎹<E69A9F>竻娲楋級锛氭牳蹇冨樊寮傚寲
|
||
- ASL妯″潡锛圓I鏅鸿兘鏂囩尞锛夛細宸叉湁閮ㄥ垎PRD
|
||
- SSA妯″潡锛堟櫤鑳界粺璁″垎鏋愶級锛氶渶瑕丷璇<E4B8B7>█
|
||
- ST妯″潡锛堢粺璁″垎鏋愬伐鍏凤級锛氱浉瀵圭畝鍗?
|
||
|
||
3. **鏄庣‘鏋舵瀯婕旇繘璺<E7B998>緞**
|
||
- 鏄<>惁閬靛惊鐧界毊涔︾殑鍒嗛樁娈靛疄鏂斤紵
|
||
- 鏄<>惁绔嬪嵆寮曞叆K8s鍜孉PI缃戝叧锛?
|
||
- 鏄<>惁绔嬪嵆寮曞叆R璇<52>█鍜孭ython寰<6E>湇鍔★紵
|
||
|
||
4. **鏄庣‘鏂囨。鏇存柊绛栫暐**
|
||
- 绔嬪嵆鏇存柊鍝<E69F8A>簺P0绾ф枃妗o紵
|
||
- 濡備綍鏁村悎鐜版湁鏂囨。鍜屾渶鏂伴渶姹傦紵
|
||
|
||
---
|
||
|
||
**鎶ュ憡瀹屾垚鏃ユ湡锛?* 2025-11-06
|
||
**鎶ュ憡缁存姢鑰咃細** 鎶€鏈<E282AC>洟闃?
|
||
**涓嬩竴姝ワ細** 璁ㄨ<E79281>鎬讳綋鎶€鏈<E282AC>灦鏋勩€佹枃妗d綋绯绘瀯寤恒€佸垎姝ラ<E5A79D>瀹炴柦
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|