Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/06-开发记录/2026-01-04-Dify知识库集成开发记录.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

651 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dify鐭ヨ瘑搴撻泦鎴愬紑鍙戣<E98D99>褰?
**寮€鍙戞棩鏈?*: 2026-01-04
**寮€鍙戦樁娈?*: Phase 1.5 - AI瀵硅瘽鑳藉姏
**浠诲姟**: 闆嗘垚Dify鐭ヨ瘑搴撳疄鐜扮爺绌舵柟妗堟枃妗煡璇?
**鐘舵€?*: 鉁?宸插畬鎴?
---
## 馃搵 寮€鍙戠洰鏍?
鍦↖IT Manager Agent涓<74>泦鎴怐ify鐭ヨ瘑搴撹兘鍔涳紝浣緼I鑳藉<E991B3>鏌ヨ<E98F8C>鐮旂┒鏂规<E98F82>銆佷鸡鐞嗘枃浠躲€丆RF琛ㄦ牸绛夋枃妗紝骞朵笌宸叉湁鐨凴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. 濡傛灉闇€瑕佹煡璇㈡枃妗紙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>€匔RF鏁版嵁锛堝叆缁勩€佽<E282AC>瑙嗐€佷笉鑹<E7AC89>簨浠剁瓑锛?
- **鐮旂┒鏂规<E98F82>鏌ヨ<E98F8C>**锛氶€氳繃Dify鐭ヨ瘑搴撴<E690B4>绱㈢爺绌舵柟妗堛€佷鸡鐞嗘枃浠躲€丆RF琛ㄦ牸绛夋枃妗?
銆愬叧閿<EFBFBD>師鍒欍€?
1. **鏁版嵁鐪熷疄鎬х<E98EAC>涓€**锛氭墍鏈夊洖绛斿繀椤诲熀浜庣郴缁熸彁渚涚殑鐪熷疄鏁版嵁锛圧EDCap鎴朌ify锛夛紝缁濅笉缂栭€犳暟鎹?
2. **鏄庣‘鏁版嵁鏉ユ簮**锛氬尯鍒哛EDCap瀹炴椂鏁版嵁鍜屾枃妗煡璇嗗簱
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
// 鉁?姝鐨勮<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> | 鏍瑰洜 | 瑙喅鏂规<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: 鎮€呰<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>闇€鏌ョ湅鎮€呰<E282AC>鎯咃紝寤鸿<E5AFA4>鎮ㄧ櫥褰昍EDCap绯荤粺銆?
```
鉁?**缁撴灉**: 鎴愬姛缁熻<E7BC81>鍏ョ粍浜烘暟
### 娴嬭瘯5: 娣峰悎鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>
**闂<><E99782>**: "杩欎釜鐮旂┒鐨勪富瑕佺爺绌剁洰鐨勬槸浠€涔堬紵"
**AI鍥炵瓟**:
```
鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛屾湰鐮旂┒鐨?*涓昏<E6B693>鐮旂┒鐩<E29492>殑**鏄<>瘎浼癧鍏蜂綋骞查<E9AA9E><EFBFBD>柦]鍦╗鐩<E29597>爣浜虹兢]涓<>殑鏈夋晥鎬у拰瀹夊叏鎬с€?
鐢变簬褰撳墠妫€绱㈠埌鐨勬枃妗唴瀹逛笉瀹屾暣锛屾棤娉曟彁渚涙洿璇︾粏鐨勫叿浣撴弿杩般€傚缓璁<EFBFBD>偍鏌ラ槄瀹屾暣鐨勭爺绌舵柟妗堟枃妗互鑾峰彇鍑嗙淇℃伅銆?
```
鉁?**缁撴灉**: 鎴愬姛妫€绱<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. **澶氱煡璇嗗簱鑱斿悎妫€绱?*
- 鎸夋枃妗被鍨嬪垎绫伙紙鏂规<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
**鉁?娴嬭瘯鐘舵€?*: 鍏ㄩ儴閫氳繃
**鉁?閮ㄧ讲鐘舵€?*: 宸查儴缃插埌寮€鍙戠幆澧?