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%)
This commit is contained in:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,9 +1,9 @@
# PKB个人知识库功能审查报告 - 阶段0
# PKB<EFBFBD>汉鐭ヨ瘑搴撳姛鑳藉<EFBFBD>鏌ユ姤鍛?- 闃舵<E99783>0
> **审查日期:** 2026-01-06
> **审查人员:** AI助手
> **审查目标:** 深入理解PKB现有功能为安全迁移做准备
> **状态:** ✅ 进行中
> **瀹℃煡鏃ユ湡锛?* 2026-01-06
> **瀹℃煡浜哄憳锛?* AI鍔╂墜
> **瀹℃煡鐩<EFBFBD>爣锛?* 娣卞叆鐞嗚ВPKB鐜版湁鍔熻兘锛屼负瀹夊叏杩佺Щ鍋氬噯澶?
> **鐘舵€侊細** 鉁?杩涜<E69DA9>涓?
---
@@ -14,35 +14,35 @@
**馃幆 PKB绯荤粺瀹為檯涓婃槸涓や釜绱у瘑鍏宠仈鐨勫姛鑳芥ā鍧楋細**
```
Part 1: PKB知识库管理模块
Part 1: PKB鐭ヨ瘑搴撶<EFBFBD>鐞嗘ā鍧?
鈹溾攢 浣嶇疆锛歜ackend/src/legacy/controllers/knowledgeBaseController.ts
├─ 功能:创建、编辑、删除知识库;上传、管理文档
└─ 数据库pkb_schema独立Schema无需迁移
鈹溾攢 鍔熻兘锛氬垱寤恒€佺紪杈戙€佸垹闄ょ煡璇嗗簱锛涗笂浼犮€佺<E282AC>鐞嗘枃妗?
鈹斺攢 鏁版嵁搴擄細pkb_schema锛堢嫭绔婼chema锛屾棤闇€杩佺Щ锛?
Part 2: AIA鏅鸿兘闂<E58598>瓟妯″潡涓<E6BDA1>殑PKB搴旂敤
鈹溾攢 浣嶇疆锛歜ackend/src/legacy/controllers/chatController.ts
├─ 功能使用知识库进行智能问答3种工作模式
└─ 工作模式:
├─ 全文阅读模式35-50篇文献综合分析
├─ 逐篇精读模式1-5篇文献深度分析
鈹溾攢 鍔熻兘锛氫娇鐢ㄧ煡璇嗗簱杩涜<E69DA9>鏅鸿兘闂<E58598>瓟锛?绉嶅伐浣滄ā寮忥級
鈹斺攢 宸ヤ綔妯″紡锛?
鈹溾攢 鍏ㄦ枃闃呰<E99783>妯″紡锛?5-50绡囨枃鐚<E69E83>患鍚堝垎鏋愶級
鈹溾攢 閫愮瘒绮捐<E7BBAE>妯″紡锛?-5绡囨枃鐚<E69E83>繁搴﹀垎鏋愶級
鈹斺攢 鎵瑰<E98EB5>鐞嗘ā寮忥紙3-50绡囨枃鐚<E69E83>壒閲忔彁鍙栵級
```
---
## 📊 Part 1: PKB知识库管理模块
## 馃搳 Part 1: PKB鐭ヨ瘑搴撶<EFBFBD>鐞嗘ā鍧?
### 1.1 鏂囦欢缁撴瀯
```
backend/src/legacy/
鈹溾攢 controllers/
│ ├─ knowledgeBaseController.ts # API控制器342行
│ └─ documentController.ts # 文档上传控制器
鈹? 鈹溾攢 knowledgeBaseController.ts # APIу埗鍣<EFBFBD>紙342琛岋級
鈹? 鈹斺攢 documentController.ts # 鏂囨。涓婁紶鎺у埗鍣?
鈹溾攢 services/
│ ├─ knowledgeBaseService.ts # 业务逻辑365行
│ ├─ documentService.ts # 文档处理服务
│ └─ tokenService.ts # Token计算和文档选择
鈹? 鈹溾攢 knowledgeBaseService.ts # 涓氬姟閫昏緫锛?65琛岋級
鈹? 鈹溾攢 documentService.ts # 鏂囨。澶勭悊鏈嶅姟
鈹? 鈹斺攢 tokenService.ts # Token璁$畻鍜屾枃妗i€夋嫨
鈹斺攢 routes/
鈹斺攢 knowledgeBases.ts # 璺<>敱瀹氫箟
```
@@ -51,48 +51,48 @@ backend/src/legacy/
#### 鐭ヨ瘑搴撶<E690B4>鐞咥PI
```typescript
// 1. 创建知识库
// 1. 鍒涘缓鐭ヨ瘑搴?
POST /api/v1/knowledge/create
Body: { name: string, description?: string }
kbQuota vs kbUsed
?
kbQuota vs kbUsed?
ify鍒涘缓Dataset
<EFBFBD>
<EFBFBD>
// 2. 获取知识库列表
// 2. 鑾峰彇鐭ヨ瘑搴撳垪琛?
GET /api/v1/knowledge/list
+ <EFBFBD>
// 3. 获取知识库详情
// 3. 鑾峰彇鐭ヨ瘑搴撹<EFBFBD>鎯?
GET /api/v1/knowledge/:id
+
+ ?
// 4. 更新知识库
// 4. 鏇存柊鐭ヨ瘑搴?
PUT /api/v1/knowledge/:id
Body: { name?: string, description?: string }
// 5. 删除知识库
// 5. 鍒犻櫎鐭ヨ瘑搴?
DELETE /api/v1/knowledge/:id
?
Dify Dataset
documents自动删除
ц<EFBFBD>documents<EFBFBD>?
<EFBFBD>
// 6. 检索知识库RAG
// 6. 妫€绱㈢煡璇嗗簱锛圧AG锛?
GET /api/v1/knowledge/:id/search?query=xxx&top_k=15
?
Dify retrieveKnowledge API
樿<EFBFBD>15<EFBFBD>
// 7. 获取知识库统计
// 7. 鑾峰彇鐭ヨ瘑搴撶粺璁?
GET /api/v1/knowledge/:id/stats
Token
<EFBFBD><EFBFBD>oken?
// 8. 鑾峰彇鏂囨。閫夋嫨锛堝叏鏂囬槄璇绘ā寮忥級
GET /api/v1/knowledge/:id/document-selection?max_files=7&max_tokens=750000
Token限制
<EFBFBD>Token闄愬埗锛?
```
#### 鏂囨。绠悊API
@@ -100,21 +100,21 @@ GET /api/v1/knowledge/:id/document-selection?max_files=7&max_tokens=750000
// 9. 涓婁紶鏂囨。
POST /api/v1/documents/upload
Multipart: { file, kbId }
?
SS
PDF/Word/TXT/Markdown
DF/Word/TXT/Markdown?
ify杩涜<EFBFBD>
uploadingparsingindexingcompleted
<EFBFBD>uploading鈫抪arsing鈫抜ndexing鈫抍ompleted?
// 10. 鑾峰彇鏂囨。璇︽儏
GET /api/v1/documents/:id
// 11. 鍒犻櫎鏂囨。
DELETE /api/v1/documents/:id
?
ify鍒犻櫎Document
SS鍒犻櫎鏂囦欢
<EFBFBD>?
```
### 1.3 鏁版嵁搴揝chema
@@ -134,10 +134,10 @@ knowledge_bases
createdAt (DateTime)
updatedAt (DateTime)
-- 文档表
-- 鏂囨。琛?
documents
id (UUID, PK)
kbId (String, FK knowledge_bases.id)
kbId (String, FK ?knowledge_bases.id)
userId (String)
filename (String)
fileType (String) -- pdf/docx/txt/md
@@ -148,10 +148,10 @@ documents
progress (Int, 0-100)
errorMessage (String?)
segmentsCount (Int?) -- Dify绱㈠紩鐨勭墖娈垫暟
tokensCount (Int?) -- 总Token
charCount (Int?) -- 字符数
tokensCount (Int?) -- 鎬籘oken鏁?
charCount (Int?) -- 瀛楃<EFBFBD>鏁?
language (String?)
extractedText (String?) -- 提取的全文(用于全文阅读模式)
extractedText (String?) -- 鎻愬彇鐨勫叏鏂囷紙鐢ㄤ簬鍏ㄦ枃闃呰<EFBFBD>妯″紡锛?
extractionMethod (String?) -- marker/pymupdf/docx
extractionQuality (Float?)
uploadedAt (DateTime)
@@ -161,7 +161,7 @@ documents
batch_tasks
id (UUID, PK)
userId (String)
kbId (String, FK knowledge_bases.id)
kbId (String, FK ?knowledge_bases.id)
name (String)
templateType (String)
templateId (String?)
@@ -181,8 +181,8 @@ batch_tasks
-- 鎵瑰<E98EB5>鐞嗙粨鏋滆〃
batch_results
id (UUID, PK)
taskId (String, FK batch_tasks.id)
documentId (String, FK documents.id)
taskId (String, FK ?batch_tasks.id)
documentId (String, FK ?documents.id)
status (String) -- success/failed
data (Json?) -- 鎻愬彇鐨勭粨鏋勫寲鏁版嵁
rawOutput (String?) -- LLM鍘熷<E98D98>杈撳嚭
@@ -191,7 +191,7 @@ batch_results
tokensUsed (Int?)
createdAt (DateTime)
-- 任务模板表
-- 浠诲姟妯℃澘琛?
task_templates
id (UUID, PK)
userId (String)
@@ -199,7 +199,7 @@ task_templates
description (String?)
prompt (String)
isPublic (Boolean, default: false)
outputFields (Json) -- 期望的输出字段
outputFields (Json) -- 鏈熸湜鐨勮緭鍑哄瓧娈?
createdAt (DateTime)
updatedAt (DateTime)
```
@@ -233,16 +233,16 @@ idx_pkb_batch_results_status (status)
#### 閰嶉<E996B0>
```typescript
// 用户表在platform_schema.users)中的字段
kbQuota: Int @default(3) // 知识库配额
kbUsed: Int @default(0) // 已使用数量
// 鐢ㄦ埛琛<EFBFBD>紙鍦╬latform_schema.users锛変腑鐨勫瓧娈?
kbQuota: Int @default(3) // 鐭ヨ瘑搴撻厤棰?
kbUsed: Int @default(0) // 宸蹭娇鐢ㄦ暟閲?
// 创建知识库时检查
// 鍒涘缓鐭ヨ瘑搴撴椂妫€鏌?
if (user.kbUsed >= user.kbQuota) {
throw new Error('閰嶉<E996B0>宸叉弧');
}
// 创建成功后增加计数
// 鍒涘缓鎴愬姛鍚庡<EFBFBD>鍔犺<EFBFBD>鏁?
await prisma.user.update({
data: { kbUsed: { increment: 1 } }
});
@@ -255,14 +255,14 @@ await prisma.user.update({
#### Dify闆嗘垚
```typescript
// 创建知识库 → 创建Dify Dataset
// 鍒涘缓鐭ヨ瘑搴?鈫?鍒涘缓Dify Dataset
const difyDataset = await difyClient.createDataset({
name: `${userId}_${name}_${Date.now()}`,
description,
indexing_technique: 'high_quality',
});
// 检索知识库 → 调用Dify RAG
// 妫€绱㈢煡璇嗗簱 鈫?璋冪敤Dify RAG
const results = await difyClient.retrieveKnowledge(
difyDatasetId,
query,
@@ -275,13 +275,13 @@ const results = await difyClient.retrieveKnowledge(
);
```
#### 文档Token计算tokenService.ts
#### 鏂囨。Token璁$畻锛坱okenService.ts锛?
```typescript
// Token璁畻瑙勫垯
const TOKEN_LIMITS = {
MAX_FILES: 7, // 最多7篇文献
MAX_TOTAL_TOKENS: 750000, // 总Token限制Qwen-Long: 1M上下文 - 250K对话空间)
MAX_SINGLE_DOC_TOKENS: 200000, // 单篇文献最大Token
MAX_FILES: 7, // 鏈€澶?绡囨枃鐚?
MAX_TOTAL_TOKENS: 750000, // 鎬籘oken闄愬埗锛圦wen-Long: 1M涓婁笅鏂?- 250K瀵硅瘽绌洪棿锛?
MAX_SINGLE_DOC_TOKENS: 200000, // 鍗曠瘒鏂囩尞鏈€澶<EFBFBD>oken鏁?
};
// 鏅鸿兘閫夋嫨绠楁硶
@@ -290,7 +290,7 @@ function selectDocumentsForFullText(
maxFiles,
maxTokens
) {
// 按Token数升序排序
// 鎸塗oken鏁板崌搴忔帓搴?
const sorted = documentTokens.sort((a, b) => a.tokens - b.tokens);
// 璐<>績绠楁硶閫夋嫨
@@ -323,29 +323,29 @@ backend/src/legacy/controllers/
鈹斺攢 chatController.ts # 閫氱敤瀵硅瘽鎺у埗鍣<E59F97>紙鍖呭惈3绉嶆ā寮忥級
frontend/src/
├─ pages/ChatPage.tsx # 主对话页面
鈹溾攢 pages/ChatPage.tsx # 涓诲<EFBFBD>璇濋〉闈?
鈹斺攢 components/
鈹溾攢 FullTextMode.tsx # 鍏ㄦ枃闃呰<E99783>妯″紡缁勪欢
鈹溾攢 DeepReadMode.tsx # 閫愮瘒绮捐<E7BBAE>妯″紡缁勪欢
└─ BatchMode.tsx # 批处理模式组件
鈹斺攢 BatchMode.tsx # 鎵瑰<EFBFBD>鐞嗘ā寮忕粍浠?
```
### 2.2 涓夌<E6B693>宸ヤ綔妯″紡璇﹁В
#### 模式1全文阅读模式Full Text Mode
#### 妯″紡1锛氬叏鏂囬槄璇绘ā寮忥紙Full Text Mode锛?
**用途**35-50篇文献的综合分析
**鐢ㄩ€?*锛?5-50绡囨枃鐚<E69E83>殑缁煎悎鍒嗘瀽
**实现原理:**
**瀹炵幇鍘熺悊锛?*
```typescript
// 1. 前端:用户进入知识库模式 → 选择"全文阅读"
// 1. 鍓嶇<EFBFBD>锛氱敤鎴疯繘鍏ョ煡璇嗗簱妯″紡 鈫?閫夋嫨"鍏ㄦ枃闃呰<E99783>"
const modeState = {
baseMode: 'knowledge_base',
kbMode: 'full_text',
selectedKbId: 'xxx',
};
// 2. 前端:智能加载文献
// 2. 鍓嶇<EFBFBD>锛氭櫤鑳藉姞杞芥枃鐚?
const selection = await knowledgeBaseApi.getDocumentSelection(kbId, {
max_files: 7,
max_tokens: 750000,
@@ -354,26 +354,26 @@ const selection = await knowledgeBaseApi.getDocumentSelection(kbId, {
// 3. 鍓嶇<E98D93>锛氳嚜鍔ㄥ垏鎹㈠埌Qwen-Long妯″瀷
if (modeState.kbMode === 'full_text') {
setSelectedModel('qwen-long'); // 1M上下文
showToast('已自动切换到Qwen-Long模型支持1M上下文');
setSelectedModel('qwen-long'); // 1M涓婁笅鏂?
showToast('宸茶嚜鍔ㄥ垏鎹㈠埌Qwen-Long妯″瀷锛堟敮鎸?M涓婁笅鏂囷級');
}
// 4. 鍓嶇<E98D93>锛氬彂閫佹秷鎭<E7A7B7>椂浼犻€掓枃妗<E69E83>D鍒楄〃
await chatApi.sendMessageStream({
content: userQuestion,
modelType: 'qwen-long',
fullTextDocumentIds: loadedDocs.map(d => d.id), // ✅ 关键参数
fullTextDocumentIds: loadedDocs.map(d => d.id), // 鉁?鍏抽敭鍙傛暟
conversationId,
});
// 5. 后端:加载完整全文
// 5. 鍚庣<EFBFBD>锛氬姞杞藉畬鏁村叏鏂?
if (fullTextDocumentIds && fullTextDocumentIds.length > 0) {
const documents = await prisma.document.findMany({
where: { id: { in: fullTextDocumentIds } },
select: { id, filename, extractedText, tokensCount },
});
// 6. 组装全文上下文
// 6. 缁勮<EFBFBD>鍏ㄦ枃涓婁笅鏂?
const fullTextParts = [];
for (let i = 0; i < documents.length; i++) {
const doc = documents[i];
@@ -381,14 +381,14 @@ if (fullTextDocumentIds && fullTextDocumentIds.length > 0) {
// 鏍煎紡锛氥€愭枃鐚甆锛氭枃浠跺悕銆慭n鍏ㄦ枃鍐呭<E98D90>
fullTextParts.push(
`【文献${docNumber}${doc.filename}\n\n${doc.extractedText}`
`銆愭枃鐚?{docNumber}锛?{doc.filename}銆慭n\n${doc.extractedText}`
);
// 娣诲姞寮曠敤淇℃伅
allCitations.push({
id: docNumber,
fileName: doc.filename,
score: 1.0, // 全文相关度100%
score: 1.0, // 鍏ㄦ枃鐩稿叧搴?00%
content: doc.extractedText.substring(0, 200),
});
}
@@ -397,7 +397,7 @@ if (fullTextDocumentIds && fullTextDocumentIds.length > 0) {
}
// 7. 浼犻€掔粰LLM
const systemPrompt = '你是专业的学术文献分析助手。每篇文献用【文献N文件名】标记。请认真阅读所有文献进行深入的综合分析。在回答时请引用具体文献使用【文献N】格式。';
const systemPrompt = '浣犳槸涓撲笟鐨勫<EFBFBD><EFBFBD>枃鐚<EFBFBD>垎鏋愬姪鎵嬨€傛瘡绡囨枃鐚<EFBFBD>敤銆愭枃鐚甆锛氭枃浠跺悕銆戞爣璁般€傝<EFBFBD>璁ょ湡闃呰<EFBFBD>鎵€鏈夋枃鐚<EFBFBD>紝杩涜<EFBFBD>娣卞叆鐨勭患鍚堝垎鏋愩€傚湪鍥炵瓟鏃惰<EFBFBD>寮曠敤鍏蜂綋鏂囩尞锛屼娇鐢ㄣ€愭枃鐚甆銆戞牸寮忋€?;
const userContent = `${userQuestion}\n\n## 鍙傝€冭祫鏂欙紙鏂囩尞鍏ㄦ枃锛塡n\n${knowledgeBaseContext}`;
@@ -414,28 +414,28 @@ const response = await LLMFactory.getAdapter('qwen-long').chatStream(messages, {
});
```
**关键特点:**
- ✅ 传递完整全文不是RAG片段
- ✅ 智能选择文献基于Token限制
- ✅ 文献来源标记【文献N文件名】
- ✅ 自动切换到Qwen-Long模型1M上下文
- 100%相关度(因为是全文)
- ✅ 适合跨文献比较、趋势分析、研究方法归纳
**鍏抽敭鐗圭偣锛?*
- 鉁?浼犻€掑畬鏁村叏鏂囷紙涓嶆槸RAG鐗囨<E99097>锛?
- 鉁?鏅鸿兘閫夋嫨鏂囩尞锛堝熀浜嶵oken闄愬埗锛?
- 鉁?鏂囩尞鏉ユ簮鏍囪<E98F8D>锛氥€愭枃鐚甆锛氭枃浠跺悕銆?
- 鉁?鑷<>姩鍒囨崲鍒癚wen-Long妯″瀷锛?M涓婁笅鏂囷級
- 鉁?100%鐩稿叧搴︼紙鍥犱负鏄<EFBFBD>叏鏂囷級
- 鉁?閫傚悎璺ㄦ枃鐚<E69E83>瘮杈冦€佽秼鍔垮垎鏋愩€佺爺绌舵柟娉曞綊绾?
**Token使用:**
**Token浣跨敤锛?*
```
上下文:~750K tokens7篇文献全文
涓婁笅鏂囷細~750K tokens锛?绡囨枃鐚<E69E83>叏鏂囷級
瀵硅瘽绌洪棿锛殈250K tokens
输出长度6000 tokens(综合分析需要更长回答)
杈撳嚭闀垮害锛?000 tokens锛堢患鍚堝垎鏋愰渶瑕佹洿闀垮洖绛旓級
```
---
#### 模式2逐篇精读模式Deep Read Mode
#### 妯″紡2锛氶€愮瘒绮捐<EFBFBD>妯″紡锛圖eep Read Mode锛?
**用途**1-5篇文献的深度分析
**鐢ㄩ€?*锛?-5绡囨枃鐚<E69E83>殑娣卞害鍒嗘瀽
**实现原理:**
**瀹炵幇鍘熺悊锛?*
```typescript
// 1. 鍓嶇<E98D93>锛氱敤鎴烽€夋嫨"閫愮瘒绮捐<E7BBAE>"
const modeState = {
@@ -450,12 +450,12 @@ const selectedDocs = [doc1, doc2, doc3]; // 用户手动选择
// 3. 鍓嶇<E98D93>锛氬垏鎹㈠埌鏌愪釜鏂囨。
const currentDoc = selectedDocs[0];
// 4. 前端发送消息时传递当前文档ID用于RAG过滤
// 4. 鍓嶇<EFBFBD>锛氬彂閫佹秷鎭<EFBFBD>椂浼犻€掑綋鍓嶆枃妗<EFBFBD>D锛堢敤浜嶳AG杩囨护锛?
await chatApi.sendMessageStream({
content: userQuestion,
modelType: selectedModel,
knowledgeBaseIds: [kbId], // 鐭ヨ瘑搴揑D
documentIds: [currentDoc.id], // ✅ 关键:只检索当前文档
documentIds: [currentDoc.id], // 鉁?鍏抽敭锛氬彧妫€绱㈠綋鍓嶆枃妗?
conversationId: currentDocConversationId, // 姣忎釜鏂囨。鐙<E38082>珛瀵硅瘽
});
@@ -469,40 +469,40 @@ if (documentIds && documentIds.length > 0) {
retrieval_model: {
search_method: 'semantic_search',
top_k: 15,
document_ids: documentIds, // Dify会只检索这些文档
document_ids: documentIds, // 鉁?Dify浼氬彧妫€绱㈣繖浜涙枃妗?
},
}
);
}
```
**关键特点:**
- ✅ 基于RAG检索不是全文
- ✅ 限定在当前文档范围
- ✅ 每个文档有独立的对话历史
- ✅ 用户可以在文档间切换
- ✅ 适合深度理解单篇文献
**鍏抽敭鐗圭偣锛?*
- 鉁?鍩轰簬RAG妫€绱<E282AC>紙涓嶆槸鍏ㄦ枃锛?
- 鉁?闄愬畾鍦ㄥ綋鍓嶆枃妗h寖鍥?
- 鉁?姣忎釜鏂囨。鏈夌嫭绔嬬殑瀵硅瘽鍘嗗彶
- 鉁?鐢ㄦ埛鍙<E59F9B>互鍦ㄦ枃妗棿鍒囨崲
- 鉁?閫傚悎娣卞害鐞嗚В鍗曠瘒鏂囩尞
---
#### 模式3批处理模式Batch Mode
#### 妯″紡3锛氭壒澶勭悊妯″紡锛圔atch Mode锛?
**用途**3-50篇文献的批量信息提取
**鐢ㄩ€?*锛?-50绡囨枃鐚<E69E83>殑鎵归噺淇℃伅鎻愬彇
**实现原理:**
**瀹炵幇鍘熺悊锛?*
```typescript
// 1. 用户创建批处理任务
// 1. 鐢ㄦ埛鍒涘缓鎵瑰<EFBFBD>鐞嗕换鍔?
POST /api/v1/batch-tasks/create
Body: {
kbId: 'xxx',
name: '鎻愬彇鐮旂┒鏂规硶',
prompt: '请从这篇文献中提取:研究设计、样本量、统计方法',
prompt: '璇蜂粠杩欑瘒鏂囩尞涓<EFBFBD>彁鍙栵細鐮旂┒璁捐<EFBFBD>銆佹牱鏈<EFBFBD>噺銆佺粺璁℃柟娉?,
templateType: 'custom' | 'preset',
modelType: 'deepseek-v3',
concurrency: 3, // 并发数
concurrency: 3, // 骞跺彂鏁?
}
// 2. 后端:创建任务
// 2. 鍚庣<EFBFBD>锛氬垱寤轰换鍔?
const task = await prisma.batchTask.create({
data: {
userId,
@@ -519,7 +519,7 @@ const task = await prisma.batchTask.create({
// 3. 鍚庣<E98D9A>锛氬惎鍔ㄦ壒澶勭悊Worker
async function processBatchTask(taskId) {
// 3.1 获取任务和文档列表
// 3.1 鑾峰彇浠诲姟鍜屾枃妗e垪琛?
const task = await prisma.batchTask.findUnique({
where: { id: taskId },
include: { knowledgeBase: { include: { documents: true } } },
@@ -527,7 +527,7 @@ async function processBatchTask(taskId) {
const documents = task.knowledgeBase.documents.filter(d => d.status === 'completed');
// 3.2 更新任务状态
// 3.2 鏇存柊浠诲姟鐘舵€?
await prisma.batchTask.update({
where: { id: taskId },
data: { status: 'running', startedAt: new Date() },
@@ -547,7 +547,7 @@ async function processBatchTask(taskId) {
{ role: 'user', content: llmPrompt },
]);
// 3.3.2 解析LLM输出期望JSON格式
// 3.3.2 瀽LLM杈撳嚭锛堟湡鏈汮SON鏍煎紡锛?
const data = parseJSONResponse(response.content);
// 3.3.3 淇濆瓨缁撴灉
@@ -601,7 +601,7 @@ async function processBatchTask(taskId) {
// 4. 鍓嶇<E98D93>锛氭煡鐪嬫壒澶勭悊缁撴灉
GET /api/v1/batch-tasks/:id/results
杩斿洖锛?
{
task: { /* 浠诲姟淇℃伅 */ },
results: [
@@ -611,40 +611,40 @@ GET /api/v1/batch-tasks/:id/results
status: 'success',
data: {
鐮旂┒璁捐<E79281>: '',
: '300人',
: 't检验、卡方检验',
鏍锋湰閲? '300?,
<EFBFBD>: 't妫<EFBFBD>?,
},
},
// ...
],
}
// 5. 前端:导出结果(Excel/CSV
// 5. 鍓嶇<EFBFBD>锛氬<EFBFBD>鍑虹粨鏋滐紙Excel/CSV锛?
```
**关键特点:**
- ✅ 批量处理多个文档
- ✅ 并发控制默认3个并发
- ✅ 结构化信息提取
- ✅ 进度实时更新
- ✅ 支持自定义模板
- ✅ 结果可导出(Excel/CSV
- ✅ 错误处理和重试
**鍏抽敭鐗圭偣锛?*
- 鉁?鎵归噺澶勭悊澶氫釜鏂囨。
- 鉁?骞跺彂鎺у埗锛堥粯璁?涓<>苟鍙戯級
- 鉁?缁撴瀯鍖栦俊鎭<E4BF8A>彁鍙?
- 鉁?杩涘害瀹炴椂鏇存柊
- 鉁?鏀<>寔鑷<E5AF94>畾涔夋ā鏉?
- 鉁?缁撴灉鍙<E78189><E98D99>鍑猴紙Excel/CSV锛?
- 鉁?閿欒<E996BF>澶勭悊鍜岄噸璇?
---
### 2.3 三种模式的对比
### 2.3 涓夌<EFBFBD>妯″紡鐨勫<EFBFBD>姣?
| 维度 | 全文阅读 | 逐篇精读 | 批处理 |
| 缁村害 | 鍏ㄦ枃闃呰<E99783> | 閫愮瘒绮捐<E7BBAE> | 鎵瑰<E98EB5>鐞?|
|------|---------|---------|--------|
| **文档数量** | 7篇左右 | 1-5| 3-50|
| **数据来源** | 完整全文 | RAG检索片段 | 完整全文 |
| **LLM调用** | 对话式(多轮) | 对话式(多轮) | 批量(单次) |
| **上下文** | ~750K tokens | ~15K tokens | 单篇全文 |
| **输出方式** | 流式SSE | 流式SSE | 批量保存 |
| **适用场景** | 综合分析、跨文献比较 | 深度理解单篇 | 信息提取、数据表格 |
| **鏂囨。鏁伴噺** | 7绡囧乏鍙?| 1-5绡?| 3-50绡?|
| **鏁版嵁鏉ユ簮** | 瀹屾暣鍏ㄦ枃 | RAG妫€绱㈢墖娈?| 瀹屾暣鍏ㄦ枃 |
| **LLM璋冪敤** | 瀵硅瘽寮忥紙澶氳疆锛?| 瀵硅瘽寮忥紙澶氳疆锛?| 鎵归噺锛堝崟娆★級 |
| **涓婁笅鏂?* | ~750K tokens | ~15K tokens | 鍗曠瘒鍏ㄦ枃 |
| **杈撳嚭鏂瑰紡** | 娴佸紡锛圫SE锛?| 娴佸紡锛圫SE锛?| 鎵归噺淇濆瓨 |
| **閫傜敤鍦烘櫙** | 缁煎悎鍒嗘瀽銆佽法鏂囩尞姣旇緝 | 娣卞害鐞嗚В鍗曠瘒 | 淇℃伅鎻愬彇銆佹暟鎹<E69A9F>〃鏍?|
| **鐢ㄦ埛浜や簰** | 瀹炴椂闂<E6A482>瓟 | 瀹炴椂闂<E6A482>瓟 | 鍚庡彴澶勭悊 |
| **对话历史** | 全局共享 | 每篇独立 | 无对话 |
| **瀵硅瘽鍘嗗彶** | 鍏ㄥ眬鍏变韩 | 姣忕瘒鐙<E79892>珛 | 鏃犲<E98F83>璇?|
---
@@ -653,12 +653,12 @@ GET /api/v1/batch-tasks/:id/results
### PKB绠悊妯″潡API
```
POST /api/v1/knowledge/create # 创建知识库
GET /api/v1/knowledge/list # 获取知识库列表
GET /api/v1/knowledge/:id # 获取知识库详情
PUT /api/v1/knowledge/:id # 更新知识库
DELETE /api/v1/knowledge/:id # 删除知识库
GET /api/v1/knowledge/:id/search # RAG检索
POST /api/v1/knowledge/create # 鍒涘缓鐭ヨ瘑搴?
GET /api/v1/knowledge/list # 鑾峰彇鐭ヨ瘑搴撳垪琛?
GET /api/v1/knowledge/:id # 鑾峰彇鐭ヨ瘑搴撹<EFBFBD>鎯?
PUT /api/v1/knowledge/:id # 鏇存柊鐭ヨ瘑搴?
DELETE /api/v1/knowledge/:id # 鍒犻櫎鐭ヨ瘑搴?
GET /api/v1/knowledge/:id/search # RAG妫€绱?
GET /api/v1/knowledge/:id/stats # 缁熻<E7BC81>淇℃伅
GET /api/v1/knowledge/:id/document-selection # 鏂囨。閫夋嫨锛堝叏鏂囨ā寮忥級
@@ -667,8 +667,8 @@ GET /api/v1/documents/:id # 获取文档详情
DELETE /api/v1/documents/:id # 鍒犻櫎鏂囨。
GET /api/v1/documents/:id/content # 鑾峰彇鏂囨。鍐呭<E98D90>锛堝叏鏂囷級
POST /api/v1/batch-tasks/create # 创建批处理任务
GET /api/v1/batch-tasks/list # 获取批处理任务列表
POST /api/v1/batch-tasks/create # 鍒涘缓鎵瑰<EFBFBD>鐞嗕换鍔?
GET /api/v1/batch-tasks/list # 鑾峰彇鎵瑰<EFBFBD>鐞嗕换鍔″垪琛?
GET /api/v1/batch-tasks/:id # 鑾峰彇浠诲姟璇︽儏
GET /api/v1/batch-tasks/:id/results # 鑾峰彇浠诲姟缁撴灉
DELETE /api/v1/batch-tasks/:id # 鍒犻櫎浠诲姟
@@ -678,11 +678,11 @@ POST /api/v1/task-templates/create # 创建模板
DELETE /api/v1/task-templates/:id # 鍒犻櫎妯℃澘
```
### AIA对话模块API含PKB集成
### AIA瀵硅瘽妯″潡API锛堝惈PKB闆嗘垚锛?
```
POST /api/v1/chat/send-message-stream # 发送消息(流式)
参数:
POST /api/v1/chat/send-message-stream # 鍙戦€佹秷鎭<EFBFBD>紙娴佸紡锛?
鍙傛暟锛?
- content: string
- modelType: 'deepseek-v3' | 'qwen3-72b' | 'qwen-long'
- knowledgeBaseIds?: string[] # RAG妯″紡
@@ -697,79 +697,79 @@ DELETE /api/v1/chat/conversations/:id # 删除对话
---
## 🔗 模块间依赖关系
## 馃敆 妯″潡闂翠緷璧栧叧绯?
```
AIA鏅鸿兘闂<EFBFBD>瓟妯″潡
├─ 依赖 PKB知识库管理模块
│ ├─ 获取知识库列表(选择知识库)
│ ├─ 获取文档列表(选择文档)
│ ├─ 获取文档全文(全文阅读)
│ ├─ RAG检索逐篇精读
│ └─ 文档智能选择(全文阅读)
鈹?
鈹溾攢 渚濊禆 PKB鐭ヨ瘑搴撶<E690B4>鐞嗘ā鍧?
鈹? 鈹溾攢 鑾峰彇鐭ヨ瘑搴撳垪琛<E59EAA>紙閫夋嫨鐭ヨ瘑搴擄級
鈹? 鈹溾攢 鑾峰彇鏂囨。鍒楄〃锛堥€夋嫨鏂囨。锛?
鈹? 鈹溾攢 鑾峰彇鏂囨。鍏ㄦ枃锛堝叏鏂囬槄璇伙級
鈹? 鈹溾攢 RAG妫€绱<E282AC>紙閫愮瘒绮捐<E7BBAE>锛?
鈹? 鈹斺攢 鏂囨。鏅鸿兘閫夋嫨锛堝叏鏂囬槄璇伙級
鈹?
鈹溾攢 渚濊禆 LLM缃戝叧
│ ├─ DeepSeek V3
│ ├─ Qwen3-72B
│ └─ Qwen-Long
鈹? 鈹溾攢 DeepSeek V3
鈹? 鈹溾攢 Qwen3-72B
鈹? 鈹斺攢 Qwen-Long
鈹?
鈹斺攢 渚濊禆 Dify RAG寮曟搸
鈹斺攢 retrieveKnowledge API
```
---
## 🎯 迁移关键点
## 馃幆 杩佺Щ鍏抽敭鐐?
### 1. PKB妯″潡杩佺Щ
```
✅ 简单:
鉁?绠€鍗曪細
- 鏁版嵁搴撳凡鍦╬kb_schema锛屾棤闇€杩佺Щ
- API端点清晰,易于复制
- API<EFBFBD>偣娓呮櫚锛屾槗浜庡<EFBFBD>鍒?
- 涓氬姟閫昏緫鐙<E7B7AB>
⚠️ 注意:
- Dify集成需要保持
- OSS文件上传需要保持
- 配额管理需要保持
鈿狅笍 娉ㄦ剰锛?
- Dify闆嗘垚闇€瑕佷繚鎸?
- OSS鏂囦欢涓婁紶闇€瑕佷繚鎸?
- 閰嶉<EFBFBD>悊闇€瑕佷繚鎸?
```
### 2. AIA妯″潡涓<E6BDA1>殑PKB闆嗘垚杩佺Щ
```
✅ 简单:
- 接口清晰fullTextDocumentIds/documentIds
鉁?绠€鍗曪細
- 鎺ュ彛娓呮櫚锛坒ullTextDocumentIds/documentIds锛?
- 涓夌<E6B693>妯″紡閫昏緫鐙<E7B7AB>
⚠️ 注意:
- chatController.ts需要同时迁移
- 前端3个模式组件需要迁移
- 对话历史管理需要保持
鈿狅笍 娉ㄦ剰锛?
- chatController.ts闇€瑕佸悓鏃惰縼绉?
- 鍓嶇<EFBFBD>3涓<EFBFBD>ā寮忕粍浠堕渶瑕佽縼绉?
- 瀵硅瘽鍘嗗彶绠$悊闇€瑕佷繚鎸?
```
### 3. 娴嬭瘯瑕佺偣
```
必须测试:
PKB CRUD功能
✅ 文档上传和提取
RAG检索功能
✅ 全文阅读模式7篇文献
✅ 逐篇精读模式(文档切换)
✅ 批处理模式(并发处理)
✅ 配额管理
✅ 对话历史管理
✅ 模型切换
蹇呴』娴嬭瘯锛?
鉁?PKB CRUD鍔熻兘
鉁?鏂囨。涓婁紶鍜屾彁鍙?
鉁?RAG妫€绱㈠姛鑳?
鉁?鍏ㄦ枃闃呰<E99783>妯″紡锛?绡囨枃鐚<E69E83>
鉁?閫愮瘒绮捐<E7BBAE>妯″紡锛堟枃妗垏鎹<E59E8F>
鉁?鎵瑰<E98EB5>鐞嗘ā寮忥紙骞跺彂澶勭悊锛?
鉁?閰嶉<E996B0>
鉁?瀵硅瘽鍘嗗彶绠$悊
鉁?妯″瀷鍒囨崲
```
---
## ✅ 阶段0完成标准
## 鉁?闃舵<E99783>0瀹屾垚鏍囧噯
- [x] 深入理解PKB的两个部分
- [x] 娣卞叆鐞嗚ВPKB鐨勪袱涓<EFBFBD>儴鍒?
- [x] 鍒楀嚭鎵€鏈堿PI绔<49>
- [x] 鐞嗚В鏁版嵁搴揝chema
- [x] 鐞嗚В涓夌<E6B693>宸ヤ綔妯″紡
- [x] 理解模块间依赖
- [x] 鐞嗚В妯″潡闂翠緷璧?
- [ ] 鍒涘缓娴嬭瘯鐢ㄤ緥娓呭崟
- [ ] 鍑嗗<E98D91>娴嬭瘯鏁版嵁
@@ -781,8 +781,9 @@ AIA智能问答模块
---
**审查状态:** 🟡 进行中90%完成)
**下一步:** 创建测试用例清单和测试数据准备方案
**瀹℃煡鐘舵€侊細** 馃煛 杩涜<E69DA9><EFBFBD>紙90%瀹屾垚锛?
**涓嬩竴姝ワ細** 鍒涘缓娴嬭瘯鐢ㄤ緥娓呭崟鍜屾祴璇曟暟鎹<E69A9F>噯澶囨柟妗?