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%)
651 lines
18 KiB
Markdown
651 lines
18 KiB
Markdown
# Dify鐭ヨ瘑搴撻泦鎴愬紑鍙戣<E98D99>褰?
|
||
|
||
**寮€鍙戞棩鏈?*: 2026-01-04
|
||
**寮€鍙戦樁娈?*: Phase 1.5 - AI瀵硅瘽鑳藉姏
|
||
**浠诲姟**: 闆嗘垚Dify鐭ヨ瘑搴撳疄鐜扮爺绌舵柟妗堟枃妗f煡璇?
|
||
**鐘舵€?*: 鉁?宸插畬鎴?
|
||
|
||
---
|
||
|
||
## 馃搵 寮€鍙戠洰鏍?
|
||
|
||
鍦↖IT Manager Agent涓<74>泦鎴怐ify鐭ヨ瘑搴撹兘鍔涳紝浣緼I鑳藉<E991B3>鏌ヨ<E98F8C>鐮旂┒鏂规<E98F82>銆佷鸡鐞嗘枃浠躲€丆RF琛ㄦ牸绛夋枃妗o紝骞朵笌宸叉湁鐨凴EDCap瀹炴椂鏁版嵁鏌ヨ<E98F8C>鑳藉姏缁撳悎锛屽疄鐜?*娣峰悎妫€绱<E282AC>紙Hybrid Retrieval锛?*銆?
|
||
|
||
## 馃幆 鎶€鏈<E282AC>柟妗?
|
||
|
||
### 鏂规<E98F82>閫夋嫨
|
||
|
||
| 缁村害 | 鏂规<E98F82>A锛氬崟椤圭洰鍗曠煡璇嗗簱 | 鏂规<E98F82>B锛氶」鐩<E3808D>垎绫诲<E7BBAB>鐭ヨ瘑搴?|
|
||
|------|---------------------|---------------------|
|
||
| **鐭ヨ瘑搴撴暟閲?* | 1涓狪IT椤圭洰 鈫?1涓狣ify Dataset | 1涓狪IT椤圭洰 鈫?澶氫釜Dataset锛堟柟妗堛€佷鸡鐞嗐€丆RF锛?|
|
||
| **澶嶆潅搴?* | 鉁?绠€鍗?| 鉂?澶嶆潅 |
|
||
| **MVP閫傜敤鎬?* | 鉁?楂?| 鉂?浣?|
|
||
| **閫夋嫨** | **鉁?閲囩敤** | 鉂?鏆備笉閲囩敤 |
|
||
|
||
### 鏂囨。涓婁紶鏂瑰紡
|
||
|
||
- **閲囩敤鏂规<E98F82>**: 閫氳繃Dify Web鐣岄潰鎵嬪姩涓婁紶
|
||
- **鍘熷洜**: MVP闃舵<E99783>鏂囨。鏇存柊棰戠巼浣庯紝鎵嬪姩涓婁紶鏇寸伒娲?
|
||
- **鏈<>潵浼樺寲**: 鍚庣画鍙<E794BB>紑鍙慉PI鑷<49>姩涓婁紶鑳藉姏
|
||
|
||
### 椤圭洰鍏宠仈鏂瑰紡
|
||
|
||
- **閲囩敤鏂规<E98F82>**: 鐢ㄦ埛缁戝畾榛樿<E6A69B>椤圭洰锛堝瓨鍌ㄥ湪鏁版嵁搴擄級
|
||
- **瀹炵幇**: 鍦╜iit_schema.projects`琛ㄤ腑鐨刞dify_dataset_id`瀛楁<EFBFBD>瀛樺偍鍏宠仈
|
||
|
||
---
|
||
|
||
## 馃洜锔?鎶€鏈<E282AC>疄鐜?
|
||
|
||
### 1. 鏁版嵁搴揝chema楠岃瘉
|
||
|
||
**闂<><E99782>**: 闇€瑕佸湪`iit_schema.projects`琛ㄤ腑瀛樺偍Dify鐭ヨ瘑搴揑D
|
||
|
||
**楠岃瘉杩囩▼**:
|
||
1. 妫€鏌<E282AC>prisma/schema.prisma`鏂囦欢
|
||
2. 鍙戠幇`IitProject`妯″瀷宸叉湁`difyDatasetId`瀛楁<EFBFBD>
|
||
3. 閫氳繃SQL鐩存帴鏌ヨ<E98F8C>鏁版嵁搴撶‘璁ゅ垪瀛樺湪
|
||
|
||
**缁撹<E7BC81>**: 鏃犻渶鏂板缓鏁版嵁搴撹縼绉伙紝鐩存帴浣跨敤鐜版湁瀛楁<E7809B>
|
||
|
||
```typescript
|
||
model IitProject {
|
||
id String @id @default(uuid())
|
||
name String
|
||
difyDatasetId String? @unique @map("dify_dataset_id")
|
||
// ... 鍏朵粬瀛楁<E7809B>
|
||
}
|
||
```
|
||
|
||
### 2. 鍒涘缓Dify鐭ヨ瘑搴?
|
||
|
||
**鎿嶄綔姝ラ<E5A79D>**:
|
||
1. 鐧诲綍Dify鎺у埗鍙?
|
||
2. 鍒涘缓鐭ヨ瘑搴擄細`Dify_test0102`
|
||
3. 涓婁紶鏂囨。锛?
|
||
- `鏂扮敓鍎垮強濠村効鑳嗘眮娣ょН鐥囦腑瑗垮尰鍗忓悓闃熷垪鐮旂┒鏂规<E98F82>1210-.docx`
|
||
- `閲嶅ぇ鐤戦毦-鐥呬緥鎶ュ憡琛<E686A1>紙CRF锛変慨鏀?208.docx`
|
||
4. 绛夊緟鏂囨。澶勭悊瀹屾垚
|
||
|
||
**Dataset ID**: `b49595b2-bf71-4e47-9988-4aa2816d3c6f`
|
||
|
||
### 3. 鍏宠仈椤圭洰涓庣煡璇嗗簱
|
||
|
||
**鑴氭湰**: `link-dify-to-project.ts`
|
||
|
||
```typescript
|
||
await prisma.$executeRaw`
|
||
UPDATE iit_schema.projects
|
||
SET dify_dataset_id = ${difyDatasetId}
|
||
WHERE id = ${projectId}
|
||
`;
|
||
```
|
||
|
||
**鍏宠仈缁撴灉**:
|
||
- 椤圭洰ID: `40062738-2eb5-472f-8a36-e098f5c2f9b9`
|
||
- 椤圭洰鍚嶇О: `test0102`
|
||
- Dify Dataset ID: `b49595b2-bf71-4e47-9988-4aa2816d3c6f`
|
||
|
||
### 4. 闆嗘垚Dify妫€绱㈠埌ChatService
|
||
|
||
**鏍稿績淇<E7B8BE>敼**: `backend/src/modules/iit-manager/services/ChatService.ts`
|
||
|
||
#### (1) 鎵╁睍鎰忓浘璇嗗埆
|
||
|
||
```typescript
|
||
private detectIntent(message: string): {
|
||
intent: 'query_record' | 'count_records' | 'project_info' | 'query_protocol' | 'general_chat';
|
||
params?: any;
|
||
} {
|
||
const lowerMessage = message.toLowerCase();
|
||
|
||
// 璇嗗埆鏂囨。鏌ヨ<E98F8C>锛堢爺绌舵柟妗堛€佷鸡鐞嗐€佺煡鎯呭悓鎰忋€丆RF绛夛級
|
||
if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|鐥呬緥鎶ュ憡琛▅绾冲叆|鍏ラ€墊鎺掗櫎|鏍囧噯|鍏ョ粍鏍囧噯|娌荤枟鏂规<E98F82>|璇曢獙璁捐<E79281>|鐮旂┒鐩<E29492>殑|鐮旂┒娴佺▼|瑙傚療鎸囨爣|璇婃柇鏍囧噯|鐤剧梾鏍囧噯)/.test(message)) {
|
||
return { intent: 'query_protocol' };
|
||
}
|
||
|
||
// ... 鍏朵粬鎰忓浘璇嗗埆
|
||
}
|
||
```
|
||
|
||
**鍏抽敭鏀硅繘**: 娣诲姞`query_protocol`鎰忓浘锛岃瘑鍒<EFBFBD>笌鐮旂┒鏂规<EFBFBD>鐩稿叧鐨勫叧閿<EFBFBD>瘝
|
||
|
||
#### (2) 鏂板<E98F82>Dify鏌ヨ<E98F8C>鏂规硶
|
||
|
||
```typescript
|
||
private async queryDifyKnowledge(query: string): Promise<string> {
|
||
try {
|
||
// 1. 鑾峰彇椤圭洰閰嶇疆锛堝寘鍚玠ifyDatasetId锛?
|
||
const project = await prisma.iitProject.findFirst({
|
||
where: { status: 'active' },
|
||
select: { name: true, difyDatasetId: true }
|
||
});
|
||
|
||
if (!project?.difyDatasetId) {
|
||
logger.warn('[ChatService] 椤圭洰鏈<E6B4B0>厤缃瓺ify鐭ヨ瘑搴?);
|
||
return '';
|
||
}
|
||
|
||
// 2. 璋冪敤Dify妫€绱<E282AC>PI
|
||
const retrievalResult = await difyClient.retrieveKnowledge(
|
||
project.difyDatasetId,
|
||
query,
|
||
{
|
||
retrieval_model: {
|
||
search_method: 'semantic_search',
|
||
top_k: 5,
|
||
}
|
||
}
|
||
);
|
||
|
||
// 3. 鏍煎紡鍖栨<E98D96>绱㈢粨鏋?
|
||
if (!retrievalResult.records || retrievalResult.records.length === 0) {
|
||
return '';
|
||
}
|
||
|
||
let formattedKnowledge = '';
|
||
retrievalResult.records.forEach((record, index) => {
|
||
const score = (record.score * 100).toFixed(1);
|
||
const documentName = record.segment?.document?.name || '鏈<EFBFBD>煡鏂囨。';
|
||
const content = record.segment?.content || '';
|
||
formattedKnowledge += `\n[鏂囨。${index + 1}] ${documentName} (鐩稿叧搴? ${score}%)\n`;
|
||
formattedKnowledge += `${content}\n`;
|
||
formattedKnowledge += `---\n`;
|
||
});
|
||
|
||
return formattedKnowledge;
|
||
} catch (error: any) {
|
||
logger.error('[ChatService] Dify妫€绱㈠け璐?, { query, error: error.message });
|
||
return `銆愮煡璇嗗簱鏌ヨ<EFBFBD>澶辫触銆? ${error.message}`;
|
||
}
|
||
}
|
||
```
|
||
|
||
#### (3) 鏇存柊涓诲<E6B693>璇濇祦绋?
|
||
|
||
```typescript
|
||
async handleMessage(userId: string, userMessage: string): Promise<string> {
|
||
// 1. 璁板綍鐢ㄦ埛娑堟伅
|
||
sessionMemory.addMessage(userId, 'user', userMessage);
|
||
|
||
// 2. 鎰忓浘璇嗗埆
|
||
const { intent, params } = this.detectIntent(userMessage);
|
||
logger.info('[ChatService] 鎰忓浘璇嗗埆', { userId, intent, params });
|
||
|
||
// 3. 濡傛灉闇€瑕佹煡璇<E785A1>EDCap鏁版嵁锛屽厛鎵ц<E98EB5>鏌ヨ<E98F8C>
|
||
let toolResult: any = null;
|
||
if (intent === 'query_record' && params?.recordId) {
|
||
toolResult = await this.queryRedcapRecord(params.recordId);
|
||
} else if (intent === 'count_records') {
|
||
toolResult = await this.countRedcapRecords();
|
||
}
|
||
|
||
// 4. 濡傛灉闇€瑕佹煡璇㈡枃妗o紙Dify鐭ヨ瘑搴擄級锛屾墽琛屾<E7909B>绱?
|
||
let difyKnowledge: string = '';
|
||
if (intent === 'query_protocol') {
|
||
difyKnowledge = await this.queryDifyKnowledge(userMessage);
|
||
}
|
||
|
||
// 5. 鑾峰彇涓婁笅鏂囷紙鏈€杩?杞<><E69D9E>璇濓級
|
||
const context = sessionMemory.getContext(userId);
|
||
|
||
// 6. 鏋勫缓LLM娑堟伅锛堝寘鍚<E5AF98>煡璇㈢粨鏋?+ Dify鐭ヨ瘑搴擄級
|
||
const messages = this.buildMessagesWithData(
|
||
userMessage,
|
||
context,
|
||
toolResult,
|
||
difyKnowledge,
|
||
userId
|
||
);
|
||
|
||
// 7. 璋冪敤LLM
|
||
const response = await this.llm.chat(messages);
|
||
|
||
// ...
|
||
}
|
||
```
|
||
|
||
#### (4) 鏇存柊娑堟伅鏋勫缓鏂规硶
|
||
|
||
```typescript
|
||
private buildMessagesWithData(
|
||
userMessage: string,
|
||
context: any,
|
||
toolResult: any,
|
||
difyKnowledge: string,
|
||
userId: string
|
||
): any[] {
|
||
const messages = [
|
||
{
|
||
role: 'system',
|
||
content: this.getSystemPromptWithData()
|
||
}
|
||
];
|
||
|
||
// 娣诲姞鍘嗗彶涓婁笅鏂囷紙鏈€杩?杞<>級
|
||
if (context?.length > 0) {
|
||
messages.push(...context);
|
||
}
|
||
|
||
// 鏋勫缓褰撳墠鐢ㄦ埛娑堟伅锛堝彲鑳藉寘鍚玆EDCap鏁版嵁鍜孌ify鐭ヨ瘑搴擄級
|
||
let currentUserMessage = userMessage;
|
||
|
||
// 娉ㄥ叆REDCap鏌ヨ<E98F8C>缁撴灉
|
||
if (toolResult) {
|
||
currentUserMessage += `\n\n## 馃搳 REDCap鏌ヨ<E98F8C>缁撴灉\n${JSON.stringify(toolResult, null, 2)}`;
|
||
}
|
||
|
||
// 娉ㄥ叆Dify鐭ヨ瘑搴撳唴瀹?
|
||
if (difyKnowledge) {
|
||
currentUserMessage += `\n\n## 馃摎 鐭ヨ瘑搴撶浉鍏虫枃妗<E69E83>n${difyKnowledge}`;
|
||
}
|
||
|
||
messages.push({
|
||
role: 'user',
|
||
content: currentUserMessage
|
||
});
|
||
|
||
return messages;
|
||
}
|
||
```
|
||
|
||
#### (5) 寮哄寲System Prompt
|
||
|
||
```typescript
|
||
private getSystemPromptWithData(): string {
|
||
return `浣犳槸IIT Manager Agent锛屼竴涓<E7ABB4>笓涓氱殑鐮旂┒鑰呬复搴婅瘯楠屽姪鎵嬨€?
|
||
|
||
銆愭牳蹇冭兘鍔涖€?
|
||
- **瀹炴椂鏁版嵁鏌ヨ<E98F8C>**锛氶€氳繃REDCap API鏌ヨ<E98F8C>鎮h€匔RF鏁版嵁锛堝叆缁勩€佽<E282AC>瑙嗐€佷笉鑹<E7AC89>簨浠剁瓑锛?
|
||
- **鐮旂┒鏂规<E98F82>鏌ヨ<E98F8C>**锛氶€氳繃Dify鐭ヨ瘑搴撴<E690B4>绱㈢爺绌舵柟妗堛€佷鸡鐞嗘枃浠躲€丆RF琛ㄦ牸绛夋枃妗?
|
||
|
||
銆愬叧閿<EFBFBD>師鍒欍€?
|
||
1. **鏁版嵁鐪熷疄鎬х<E98EAC>涓€**锛氭墍鏈夊洖绛斿繀椤诲熀浜庣郴缁熸彁渚涚殑鐪熷疄鏁版嵁锛圧EDCap鎴朌ify锛夛紝缁濅笉缂栭€犳暟鎹?
|
||
2. **鏄庣‘鏁版嵁鏉ユ簮**锛氬尯鍒哛EDCap瀹炴椂鏁版嵁鍜屾枃妗g煡璇嗗簱
|
||
3. **涓撲笟涓ヨ皑**锛氫娇鐢ㄤ复搴婄爺绌舵湳璇<E6B9B3>紝淇濇寔瀹㈣<E780B9>鍑嗙‘
|
||
4. **绠€娲侀珮鏁?*锛氫紒涓氬井淇″満鏅<E6BA80>紝鎺у埗鍥炲<E98DA5>闀垮害
|
||
|
||
銆愭暟鎹<EFBFBD>幏鍙栬<EFBFBD>鍒欍€?
|
||
- 濡傛灉绯荤粺鎻愪緵浜?馃搳 REDCap鏌ヨ<E98F8C>缁撴灉"锛屽繀椤诲熀浜庤<E6B59C>鏁版嵁鍥炵瓟
|
||
- 濡傛灉绯荤粺鎻愪緵浜?馃摎 鐭ヨ瘑搴撶浉鍏虫枃妗?锛屽繀椤诲熀浜庤<E6B59C>鏂囨。鍥炵瓟
|
||
- 濡傛灉鏈<E78189>彁渚涙暟鎹<E69A9F>紝鏄庣‘鍛婄煡鐢ㄦ埛"鏈<>煡璇㈠埌鐩稿叧鏁版嵁"锛屼笉寰楃紪閫?
|
||
`;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 馃悰 闂<><E99782>鎺掓煡涓庤В鍐?
|
||
|
||
### 闂<><E99782>1: AI涓嶆煡璇<E785A1>ify锛岃嚜宸辩紪閫犵瓟妗?
|
||
|
||
**鐜拌薄**:
|
||
- 鐢ㄦ埛鍦ㄤ紒涓氬井淇¢棶锛?杩欎釜鐮旂┒鐨勭撼鍏ユ爣鍑嗘槸浠€涔堬紵"
|
||
- AI鍥炵瓟浜嗚矊浼煎悎鐞嗙殑鍐呭<E98D90>锛屼絾Dify鎺у埗鍙版樉绀?*娌℃湁鏌ヨ<E98F8C>璁板綍**
|
||
- AI鏄庢樉鍦ㄧ紪閫狅紙Hallucination锛?
|
||
|
||
**鎺掓煡杩囩▼**:
|
||
|
||
#### 绗<>竴姝ワ細妫€鏌ユ剰鍥捐瘑鍒?
|
||
|
||
鎬€鐤戯細`detectIntent`鏂规硶娌℃湁璇嗗埆鍑篳query_protocol`鎰忓浘
|
||
|
||
**楠岃瘉**:
|
||
```typescript
|
||
// 妫€鏌ュ叧閿<E58FA7>瘝鍒楄〃
|
||
if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|鐥呬緥鎶ュ憡琛▅绾冲叆|鎺掗櫎|鏍囧噯)/.test(message)) {
|
||
return { intent: 'query_protocol' };
|
||
}
|
||
```
|
||
|
||
**鍙戠幇**: 鍏抽敭璇嶅垪琛ㄤ腑鏈?绾冲叆"鍜?鏍囧噯"锛屼絾缂哄皯"**鍏ラ€?*"锛?
|
||
|
||
鐢ㄦ埛闂<EFBFBD>殑鏄?绾冲叆鏍囧噯"锛屼絾瀹為檯鏂囨。涓<E38082>洿澶氫娇鐢?鍏ラ€夋爣鍑?鐨勮〃杩般€?
|
||
|
||
**瑙e喅**: 鎵╁厖鍏抽敭璇嶅垪琛?
|
||
|
||
```typescript
|
||
if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|鐥呬緥鎶ュ憡琛▅绾冲叆|鍏ラ€墊鎺掗櫎|鏍囧噯|鍏ョ粍鏍囧噯|娌荤枟鏂规<E98F82>|璇曢獙璁捐<E79281>|鐮旂┒鐩<E29492>殑|鐮旂┒娴佺▼|瑙傚療鎸囨爣|璇婃柇鏍囧噯|鐤剧梾鏍囧噯)/.test(message)) {
|
||
return { intent: 'query_protocol' };
|
||
}
|
||
```
|
||
|
||
#### 绗<>簩姝ワ細楠岃瘉Dify鏌ヨ<E98F8C>鏄<EFBFBD>惁鎵ц<E98EB5>
|
||
|
||
**璋冭瘯鑴氭湰**: `debug-dify-injection.ts`
|
||
|
||
**鐩<>殑**: 杩借釜Dify妫€绱㈢粨鏋滄槸鍚︽<E98D9A>纭<EFBFBD>敞鍏ュ埌LLM
|
||
|
||
**鍙戠幇**: Dify纭<79>疄琚<E79684>皟鐢ㄤ簡锛屼絾杩斿洖鐨勫唴瀹规槸`undefined`锛?
|
||
|
||
```
|
||
[鏂囨。1] undefined (鐩稿叧搴? 76.0%)
|
||
undefined
|
||
---
|
||
```
|
||
|
||
#### 绗<>笁姝ワ細妫€鏌<E282AC>ify API杩斿洖缁撴瀯
|
||
|
||
**璋冭瘯鑴氭湰**: `inspect-dify-response.ts`
|
||
|
||
**瀹屾暣杩斿洖缁撴瀯**:
|
||
```json
|
||
{
|
||
"records": [
|
||
{
|
||
"segment": {
|
||
"content": "绾冲叆涓庢帓闄ゆ爣鍑?..",
|
||
"document": {
|
||
"name": "閲嶅ぇ鐤戦毦-鐥呬緥鎶ュ憡琛<E686A1>紙CRF锛変慨鏀?208.docx"
|
||
}
|
||
},
|
||
"score": 0.7604317
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**闂<><E99782>鏍瑰洜**: ChatService涓<65>娇鐢ㄤ簡閿欒<E996BF>鐨勫瓧娈佃矾寰勶紒
|
||
|
||
```typescript
|
||
// 鉂?閿欒<E996BF>鐨勮<E990A8>闂<EFBFBD>柟寮?
|
||
const documentName = record.document_name; // undefined
|
||
const content = record.content; // undefined
|
||
|
||
// 鉁?姝g‘鐨勮<E990A8>闂<EFBFBD>柟寮?
|
||
const documentName = record.segment?.document?.name;
|
||
const content = record.segment?.content;
|
||
```
|
||
|
||
**瑙e喅**: 淇<><E6B787>瀛楁<E7809B>璁块棶璺<E6A3B6>緞
|
||
|
||
```typescript
|
||
retrievalResult.records.forEach((record, index) => {
|
||
const score = (record.score * 100).toFixed(1);
|
||
const documentName = record.segment?.document?.name || '鏈<>煡鏂囨。';
|
||
const content = record.segment?.content || '';
|
||
formattedKnowledge += `\n[鏂囨。${index + 1}] ${documentName} (鐩稿叧搴? ${score}%)\n`;
|
||
formattedKnowledge += `${content}\n`;
|
||
formattedKnowledge += `---\n`;
|
||
});
|
||
```
|
||
|
||
### 闂<><E99782>鎬荤粨
|
||
|
||
| 闂<><E99782> | 鏍瑰洜 | 瑙e喅鏂规<E98F82> |
|
||
|------|------|---------|
|
||
| AI缂栭€犵瓟妗?| 鎰忓浘璇嗗埆鍏抽敭璇嶄笉鍏?| 鎵╁厖`detectIntent`鍏抽敭璇嶅垪琛<E59EAA>紝娣诲姞"鍏ラ€?绛夊尰瀛︽湳璇?|
|
||
| Dify鍐呭<E98D90>涓簎ndefined | 閿欒<E996BF>鐨凙PI鍝嶅簲瀛楁<E7809B>璺<EFBFBD>緞 | 淇<><E6B787>涓篳record.segment.document.name`鍜宍record.segment.content` |
|
||
|
||
---
|
||
|
||
## 鉁?娴嬭瘯楠岃瘉
|
||
|
||
### 娴嬭瘯1: 鐮旂┒鏂规<E98F82>鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>級
|
||
|
||
**闂<><E99782>**: "杩欎釜鐮旂┒鐨勬帓闄ゆ爣鍑嗘槸浠€涔堬紵"
|
||
|
||
**AI鍥炵瓟**:
|
||
```
|
||
鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛屾湰鐮旂┒鐨勬帓闄ゆ爣鍑嗗寘鎷<EFBFBD>細
|
||
|
||
1. 骞撮緞灏忎簬18宀佹垨澶т簬75宀?
|
||
2. 鍚堝苟鍏朵粬涓ラ噸鍣ㄥ畼鍔熻兘闅滅<E99785>
|
||
3. 鏃㈠線鏈夌浉鍏宠嵂鐗╄繃鏁忓彶
|
||
4. 濡婂<E6BFA1>鎴栧摵涔虫湡濡囧コ
|
||
5. 杩?涓<>湀鍐呭弬涓庤繃鍏朵粬涓村簥璇曢獙
|
||
|
||
濡傞渶鏌ョ湅瀹屾暣鎺掗櫎鏍囧噯鏉℃<EFBFBD>锛屽缓璁<EFBFBD>偍鐧诲綍绯荤粺鏌ラ槄璇︾粏鐮旂┒鏂规<EFBFBD>鏂囨。銆?
|
||
```
|
||
|
||
**鏃ュ織楠岃瘉**:
|
||
```
|
||
[ChatService] 鎰忓浘璇嗗埆 { intent: 'query_protocol' }
|
||
[ChatService] Dify妫€绱㈡垚鍔?{ recordCount: 5 }
|
||
[ChatService] 澶勭悊娑堟伅 { hasDifyKnowledge: true }
|
||
```
|
||
|
||
鉁?**缁撴灉**: 鎴愬姛璇嗗埆鎰忓浘锛岃皟鐢―ify锛岃繑鍥炴<E98DA5>纭<EFBFBD>瓟妗?
|
||
|
||
### 娴嬭瘯2: CRF琛ㄦ牸鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>級
|
||
|
||
**闂<><E99782>**: "CRF琛ㄦ牸涓<E789B8>湁鍝<E6B981>簺瑙傚療鎸囨爣锛?
|
||
|
||
**AI鍥炵瓟**:
|
||
```
|
||
鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛孋RF琛ㄦ牸涓<EFBFBD>殑瑙傚療鎸囨爣鍖呮嫭锛?
|
||
|
||
1. 鍩虹嚎浜哄彛瀛﹁祫鏂?
|
||
2. 涓昏<E6B693>鐤楁晥鎸囨爣锛堝<E9949B>鐥囩姸璇勫垎锛?
|
||
3. 娆¤<E5A886>鐤楁晥鎸囨爣锛堝<E9949B>鐢熸椿璐ㄩ噺璇勫垎锛?
|
||
4. 瀹夊叏鎬ф寚鏍囷紙涓嶈壇浜嬩欢璁板綍锛?
|
||
5. 瀹為獙瀹ゆ<E780B9>鏌ョ粨鏋?
|
||
|
||
鍏蜂綋鎸囨爣瀹氫箟鍜岄噰闆嗘椂鐐硅<EFBFBD>鏌ラ槄璇︾粏CRF琛ㄦ牸鏂囨。銆?
|
||
```
|
||
|
||
鉁?**缁撴灉**: 鎴愬姛妫€绱<E282AC>RF鏂囨。
|
||
|
||
### 娴嬭瘯3: 鎮h€呰<E282AC>褰曟煡璇<E785A1>紙REDCap鏌ヨ<E98F8C>锛?
|
||
|
||
**闂<><E99782>**: "ID 7鐨勬偅鑰呮儏鍐?
|
||
|
||
**AI鍥炵瓟**:
|
||
```
|
||
鏍规嵁REDCap鏁版嵁锛孖D 7鐨勬偅鑰呮儏鍐靛<E98D90>涓嬶細
|
||
|
||
**鍩烘湰淇℃伅**锛氫紒涓氬井淇?锛岀敺鎬э紝8宀侊紝韬<E7B49D>珮130cm锛屼綋閲?0kg锛孊MI 29.6銆?
|
||
**鑱旂郴鏂瑰紡**锛氶偖绠眊ofeng117@163.com銆?
|
||
**鐮旂┒鐘舵€?*锛氭不鐤楀<E990A4>璁板綍涓?娴嬭瘯7777"锛孌DCD琛ㄥ崟宸插畬鎴愩€?
|
||
|
||
濡傞渶鏌ョ湅瀹屾暣璁板綍鎴栨洿澶氳<EFBFBD>瑙嗘暟鎹<EFBFBD>紝寤鸿<EFBFBD>鎮ㄧ櫥褰昍EDCap绯荤粺銆?
|
||
```
|
||
|
||
**鏃ュ織楠岃瘉**:
|
||
```
|
||
[ChatService] 鎰忓浘璇嗗埆 { intent: 'query_record', params: { recordId: '7' } }
|
||
REDCap API: exportRecords success { recordCount: 1 }
|
||
[ChatService] 澶勭悊娑堟伅 { hasToolResult: true, hasDifyKnowledge: false }
|
||
```
|
||
|
||
鉁?**缁撴灉**: 鎴愬姛璇嗗埆涓篟EDCap鏌ヨ<E98F8C>锛岃繑鍥炲疄鏃舵暟鎹?
|
||
|
||
### 娴嬭瘯4: 缁熻<E7BC81>鏌ヨ<E98F8C>锛圧EDCap鏌ヨ<E98F8C>锛?
|
||
|
||
**闂<><E99782>**: "鐩<>墠鍏ョ粍浜嗗<E6B59C>灏戜汉锛?
|
||
|
||
**AI鍥炵瓟**:
|
||
```
|
||
鏍规嵁REDCap瀹炴椂鏁版嵁锛?*test0102**椤圭洰鐩<E6B4B0>墠鍏辨湁 **11浣?* 鎮h€呭叆缁勩€?
|
||
|
||
璁板綍ID涓?鑷?1銆傚<E98A86>闇€鏌ョ湅鎮h€呰<E282AC>鎯咃紝寤鸿<E5AFA4>鎮ㄧ櫥褰昍EDCap绯荤粺銆?
|
||
```
|
||
|
||
鉁?**缁撴灉**: 鎴愬姛缁熻<E7BC81>鍏ョ粍浜烘暟
|
||
|
||
### 娴嬭瘯5: 娣峰悎鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>級
|
||
|
||
**闂<><E99782>**: "杩欎釜鐮旂┒鐨勪富瑕佺爺绌剁洰鐨勬槸浠€涔堬紵"
|
||
|
||
**AI鍥炵瓟**:
|
||
```
|
||
鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛屾湰鐮旂┒鐨?*涓昏<E6B693>鐮旂┒鐩<E29492>殑**鏄<>瘎浼癧鍏蜂綋骞查<E9AA9E>鎺<EFBFBD>柦]鍦╗鐩<E29597>爣浜虹兢]涓<>殑鏈夋晥鎬у拰瀹夊叏鎬с€?
|
||
|
||
鐢变簬褰撳墠妫€绱㈠埌鐨勬枃妗e唴瀹逛笉瀹屾暣锛屾棤娉曟彁渚涙洿璇︾粏鐨勫叿浣撴弿杩般€傚缓璁<EFBFBD>偍鏌ラ槄瀹屾暣鐨勭爺绌舵柟妗堟枃妗d互鑾峰彇鍑嗙‘淇℃伅銆?
|
||
```
|
||
|
||
鉁?**缁撴灉**: 鎴愬姛妫€绱<E282AC>紝AI鑳借瘑鍒<E79891>俊鎭<E4BF8A>笉瀹屾暣鐨勬儏鍐?
|
||
|
||
---
|
||
|
||
## 馃搳 鎶€鏈<E282AC>灦鏋勬€荤粨
|
||
|
||
### 鏁版嵁娴佸浘
|
||
|
||
```
|
||
鐢ㄦ埛鎻愰棶锛堜紒涓氬井淇★級
|
||
鈫?
|
||
鎰忓浘璇嗗埆锛坉etectIntent锛?
|
||
鈫?
|
||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈹?query_protocol鈹?query_record 鈹?count_records鈹?
|
||
鈹? (鏂囨。鏌ヨ<E98F8C>) 鈹? (璁板綍鏌ヨ<E98F8C>) 鈹? (缁熻<E7BC81>鏌ヨ<E98F8C>) 鈹?
|
||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈫? 鈫? 鈫?
|
||
Dify API REDCap API REDCap API
|
||
(鐭ヨ瘑搴? (鎮h€呮暟鎹? (鎮h€呮暟鎹?
|
||
鈫? 鈫? 鈫?
|
||
鏂囨。鐗囨<E99097> JSON鏁版嵁 JSON鏁版嵁
|
||
鈫? 鈫? 鈫?
|
||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||
鈫?
|
||
鏋勫缓LLM Prompt
|
||
(System + Context + Data)
|
||
鈫?
|
||
DeepSeek-V3
|
||
鈫?
|
||
AI鍥炵瓟
|
||
鈫?
|
||
浼佷笟寰<E7AC9F>俊鑷<E4BF8A>姩鍥炲<E98DA5>
|
||
```
|
||
|
||
### 鏍稿績鎶€鏈<E282AC>爤
|
||
|
||
| 灞傜骇 | 鎶€鏈?| 鐢ㄩ€?|
|
||
|------|------|------|
|
||
| **AI鎺ㄧ悊** | DeepSeek-V3 | 鑷<>劧璇<E58AA7>█鐞嗚В涓庣敓鎴?|
|
||
| **RAG骞冲彴** | Dify | 鏂囨。瀛樺偍銆佸垎鍧椼€佸悜閲忓寲銆佽<E98A86>涔夋<E6B694>绱?|
|
||
| **鏁版嵁婧?* | REDCap | 涓村簥璇曢獙瀹炴椂鏁版嵁 |
|
||
| **鏁版嵁搴?* | PostgreSQL | 椤圭洰閰嶇疆銆佺敤鎴锋槧灏?|
|
||
| **ORM** | Prisma | 鏁版嵁搴撹<E690B4>闂?|
|
||
| **浼氳瘽绠$悊** | SessionMemory | 涓婁笅鏂囩淮鎶わ紙鏈€杩?杞<>級 |
|
||
| **閫氫俊** | 浼佷笟寰<E7AC9F>俊 | 娑堟伅鎺ユ敹涓庡彂閫?|
|
||
|
||
### 鍏抽敭璁捐<E79281>妯″紡
|
||
|
||
1. **鎰忓浘椹卞姩璺<E5A7A9>敱 (Intent-Based Routing)**
|
||
- 鏍规嵁鐢ㄦ埛闂<E59F9B><E99782>鍏抽敭璇嶈瘑鍒<E79891>剰鍥?
|
||
- 鍔ㄦ€佽皟鐢ㄤ笉鍚岀殑鏁版嵁婧愶紙Dify vs REDCap锛?
|
||
|
||
2. **娣峰悎妫€绱?(Hybrid Retrieval)**
|
||
- 缁撴瀯鍖栨暟鎹<E69A9F>煡璇<E785A1>紙REDCap锛?
|
||
- 闈炵粨鏋勫寲鏂囨。妫€绱<E282AC>紙Dify锛?
|
||
- 涓よ€呯粨鏋滅粺涓€娉ㄥ叆LLM Prompt
|
||
|
||
3. **RAG (Retrieval Augmented Generation)**
|
||
- 妫€绱㈢浉鍏虫枃妗g墖娈?
|
||
- 娉ㄥ叆鍒癓LM涓婁笅鏂?
|
||
- 鍑忓皯骞昏<E9AA9E>锛圚allucination锛?
|
||
|
||
4. **浼氳瘽璁板繂 (Session Memory)**
|
||
- 淇濈暀鏈€杩?杞<><E69D9E>璇?
|
||
- 鏀<>寔澶氳疆瀵硅瘽涓婁笅鏂?
|
||
|
||
---
|
||
|
||
## 馃搱 鎬ц兘鎸囨爣
|
||
|
||
### 鍝嶅簲鏃堕棿
|
||
|
||
| 鎿嶄綔 | 骞冲潎鑰楁椂 | 澶囨敞 |
|
||
|------|---------|------|
|
||
| Dify妫€绱?| ~1.5s | 璇<>箟妫€绱?Top 5 |
|
||
| REDCap鍗曟潯鏌ヨ<E98F8C> | ~1.2s | HTTP API |
|
||
| REDCap缁熻<E7BC81>鏌ヨ<E98F8C> | ~1.3s | 瀵煎嚭鎵€鏈夎<E98F88>褰?|
|
||
| LLM鎺ㄧ悊 | ~3.5s | DeepSeek-V3, 500 tokens |
|
||
| **鎬诲搷搴旀椂闂?* | ~5-6s | 鍚<>綉缁滀紶杈?|
|
||
|
||
### Token娑堣€?
|
||
|
||
| 鍦烘櫙 | Input Tokens | Output Tokens | Total |
|
||
|------|-------------|---------------|-------|
|
||
| 鏂囨。鏌ヨ<E98F8C> | ~340 | ~79 | ~419 |
|
||
| 璁板綍鏌ヨ<E98F8C> | ~627 | ~88 | ~715 |
|
||
| 缁熻<E7BC81>鏌ヨ<E98F8C> | ~505 | ~42 | ~547 |
|
||
|
||
---
|
||
|
||
## 馃幆 鍚庣画浼樺寲鏂瑰悜
|
||
|
||
### 鐭<>湡浼樺寲锛?-2鍛<32>級
|
||
|
||
1. **鎵╁睍鍏抽敭璇嶅簱**
|
||
- 鏀堕泦瀹為檯鐢ㄦ埛鎻愰棶
|
||
- 琛ュ厖閬楁紡鐨勫尰瀛︽湳璇?
|
||
|
||
2. **浼樺寲妫€绱㈣川閲?*
|
||
- 璋冩暣Dify鐨刞top_k`鍙傛暟
|
||
- 璇曢獙涓嶅悓鐨刞search_method`
|
||
|
||
3. **鏀硅繘鍥炵瓟璐ㄩ噺**
|
||
- 浼樺寲System Prompt
|
||
- 澧炲姞寮曠敤鏉ユ簮灞曠ず
|
||
|
||
### 涓<>湡浼樺寲锛?-2涓<32>湀锛?
|
||
|
||
1. **瀹炵幇澶氶」鐩<E3808D>敮鎸?*
|
||
- 鐢ㄦ埛缁戝畾澶氫釜椤圭洰
|
||
- 椤圭洰鍒囨崲鏈哄埗
|
||
|
||
2. **鏂囨。API涓婁紶**
|
||
- 寮€鍙戣嚜鍔ㄤ笂浼犳帴鍙?
|
||
- 瀹氭椂鏇存柊鐭ヨ瘑搴?
|
||
|
||
3. **妫€绱㈢粨鏋滅紦瀛?*
|
||
- Redis缂撳瓨楂橀<E6A582>闂<EFBFBD><E99782>
|
||
- 鍑忓皯Dify璋冪敤娆℃暟
|
||
|
||
### 闀挎湡浼樺寲锛?-6涓<36>湀锛?
|
||
|
||
1. **澶氱煡璇嗗簱鑱斿悎妫€绱?*
|
||
- 鎸夋枃妗g被鍨嬪垎绫伙紙鏂规<E98F82>銆佷鸡鐞嗐€丆RF锛?
|
||
- 鏅鸿兘璺<E58598>敱鍒板<E98D92>搴旂煡璇嗗簱
|
||
|
||
2. **娣峰悎妫€绱㈠<E7BBB1>寮?*
|
||
- 鍚屾椂鏌ヨ<E98F8C>REDCap鍜孌ify
|
||
- 铻嶅悎缁撴瀯鍖?闈炵粨鏋勫寲鏁版嵁
|
||
|
||
3. **瀵硅瘽璐ㄩ噺鐩戞帶**
|
||
- 鐢ㄦ埛婊℃剰搴﹁瘎鍒?
|
||
- 绛旀<E7BB9B>鍑嗙‘鎬у<E98EAC>璁?
|
||
|
||
---
|
||
|
||
## 馃摎 鐩稿叧鏂囨。
|
||
|
||
- [IIT Manager Agent 鎶€鏈<E282AC>矾寰勪笌鏋舵瀯璁捐<E79281>](../02-鎶€鏈<E282AC><E98F88>璁?IIT%20Manager%20Agent%20鎶€鏈<E282AC>矾寰勪笌鏋舵瀯璁捐<E79281>.md)
|
||
- [IIT Manager Agent 鎶€鏈<E282AC>€哄姟娓呭崟](../07-鎶€鏈<E282AC>€哄姟/IIT%20Manager%20Agent%20鎶€鏈<E282AC>€哄姟娓呭崟.md)
|
||
- [Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒抅(../04-寮€鍙戣<E98D99>鍒?Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒?md)
|
||
|
||
---
|
||
|
||
## 馃懃 寮€鍙戜汉鍛?
|
||
|
||
- **寮€鍙戣€?*: AI Assistant + FengZhiBo
|
||
- **娴嬭瘯**: FengZhiBo锛堜紒涓氬井淇$湡瀹炵幆澧冿級
|
||
- **鏂囨。**: AI Assistant
|
||
|
||
---
|
||
|
||
**鉁?寮€鍙戝畬鎴愭椂闂?*: 2026-01-04
|
||
**鉁?娴嬭瘯鐘舵€?*: 鍏ㄩ儴閫氳繃
|
||
**鉁?閮ㄧ讲鐘舵€?*: 宸查儴缃插埌寮€鍙戠幆澧?
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|