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

18 KiB
Raw Blame History

Dify鐭ヨ瘑搴撻泦鎴愬紑鍙戣<EFBFBD>褰?

**寮€鍙戞棩鏈?: 2026-01-04
**寮€鍙戦樁娈?
: Phase 1.5 - AI瀵硅瘽鑳藉姏
浠诲姟: 闆嗘垚Dify鐭ヨ瘑搴撳疄鐜扮爺绌舵柟妗堟枃妗煡璇? **鐘舵€?*: 鉁?宸插畬鎴?


馃搵 寮€鍙戠洰鏍?

鍦↖IT Manager Agent涓<74>泦鎴怐ify鐭ヨ瘑搴撹兘鍔涳紝浣緼I鑳藉<E991B3>鏌ヨ<E98F8C>鐮旂┒鏂规<E98F82>銆佷鸡鐞嗘枃浠躲€丆RF琛ㄦ牸绛夋枃妗紝骞朵笌宸叉湁鐨凴EDCap瀹炴椂鏁版嵁鏌ヨ<E98F8C>鑳藉姏缁撳悎锛屽疄鐜?*娣峰悎妫€绱<E282AC>紙Hybrid Retrieval锛?*銆?

馃幆 鎶€鏈<E282AC>柟妗?

鏂规<EFBFBD>閫夋嫨

缁村害 鏂规<EFBFBD>A锛氬崟椤圭洰鍗曠煡璇嗗簱 鏂规<EFBFBD>B锛氶」鐩<EFBFBD>垎绫诲<EFBFBD>鐭ヨ瘑搴?
*鐭ヨ瘑搴撴暟閲? 1涓狪IT椤圭洰 鈫?1涓狣ify Dataset 1涓狪IT椤圭洰 鈫?澶氫釜Dataset锛堟柟妗堛€佷鸡鐞嗐€丆RF锛?
*澶嶆潅搴? 鉁?绠€鍗? 鉂?澶嶆潅
*MVP閫傜敤鎬? 鉁?楂? 鉂?浣?
閫夋嫨 鉁?閲囩敤 鉂?鏆備笉閲囩敤

鏂囨。涓婁紶鏂瑰紡

  • 閲囩敤鏂规<EFBFBD>: 閫氳繃Dify Web鐣岄潰鎵嬪姩涓婁紶
  • 鍘熷洜: MVP闃舵<E99783>鏂囨。鏇存柊棰戠巼浣庯紝鎵嬪姩涓婁紶鏇寸伒娲?
  • <EFBFBD>潵浼樺寲: 鍚庣画鍙<E794BB>紑鍙慉PI鑷<49>姩涓婁紶鑳藉姏

椤圭洰鍏宠仈鏂瑰紡

  • 閲囩敤鏂规<EFBFBD>: 鐢ㄦ埛缁戝畾榛樿<E6A69B>椤圭洰锛堝瓨鍌ㄥ湪鏁版嵁搴擄級
  • 瀹炵幇: 鍦╜iit_schema.projects琛ㄤ腑鐨刞dify_dataset_id瀛楁<EFBFBD>瀛樺偍鍏宠仈

馃洜锔?鎶€鏈<E282AC>疄鐜?

1. 鏁版嵁搴揝chema楠岃瘉

<EFBFBD><EFBFBD>: 闇€瑕佸湪iit_schema.projects琛ㄤ腑瀛樺偍Dify鐭ヨ瘑搴揑D

楠岃瘉杩囩▼:

  1. 妫€鏌<EFBFBD>prisma/schema.prisma`鏂囦欢
  2. 鍙戠幇IitProject妯″瀷宸叉湁difyDatasetId瀛楁<EFBFBD>
  3. 閫氳繃SQL鐩存帴鏌ヨ<EFBFBD>鏁版嵁搴撶璁ゅ垪瀛樺湪

缁撹<EFBFBD>: 鏃犻渶鏂板缓鏁版嵁搴撹縼绉伙紝鐩存帴浣跨敤鐜版湁瀛楁<E7809B>

model IitProject {
  id              String    @id @default(uuid())
  name            String
  difyDatasetId   String?   @unique @map("dify_dataset_id")
  // ... 鍏朵粬瀛楁<E7809B>
}

2. 鍒涘缓Dify鐭ヨ瘑搴?

鎿嶄綔姝ラ<EFBFBD>:

  1. 鐧诲綍Dify鎺у埗鍙?
  2. 鍒涘缓鐭ヨ瘑搴擄細Dify_test0102
  3. 涓婁紶鏂囨。锛?
    • 鏂扮敓鍎垮強濠村効鑳嗘眮娣ょН鐥囦腑瑗垮尰鍗忓悓闃熷垪鐮旂┒鏂规<EFBFBD>1210-.docx
    • 閲嶅ぇ鐤戦毦-鐥呬緥鎶ュ憡琛<E686A1>紙CRF锛変慨鏀?208.docx
  4. 绛夊緟鏂囨。澶勭悊瀹屾垚

Dataset ID: b49595b2-bf71-4e47-9988-4aa2816d3c6f

3. 鍏宠仈椤圭洰涓庣煡璇嗗簱

鑴氭湰: link-dify-to-project.ts

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

鏍稿績淇<EFBFBD>: backend/src/modules/iit-manager/services/ChatService.ts

(1) 鎵╁睍鎰忓浘璇嗗埆

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>鏂规硶

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 `銆愮煡璇嗗簱鏌ヨ<E98F8C>澶辫触銆? ${error.message}`;
  }
}

(3) 鏇存柊涓诲<E6B693>璇濇祦绋?

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) 鏇存柊娑堟伅鏋勫缓鏂规硶

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

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>鎺掓煡涓庤В鍐?

<EFBFBD><EFBFBD>1: AI涓嶆煡璇<E785A1>ify锛岃嚜宸辩紪閫犵瓟妗?

鐜拌薄:

  • 鐢ㄦ埛鍦ㄤ紒涓氬井淇¢棶锛?杩欎釜鐮旂┒鐨勭撼鍏ユ爣鍑嗘槸浠€涔堬紵"
  • AI鍥炵瓟浜嗚矊浼煎悎鐞嗙殑鍐呭<EFBFBD>锛屼絾Dify鎺у埗鍙版樉绀?娌℃湁鏌ヨ<EFBFBD>璁板綍*
  • AI鏄庢樉鍦ㄧ紪閫狅紙Hallucination锛?

鎺掓煡杩囩▼:

<EFBFBD>竴姝ワ細妫€鏌ユ剰鍥捐瘑鍒?

鎬€鐤戯細detectIntent鏂规硶娌℃湁璇嗗埆鍑篳query_protocol`鎰忓浘

楠岃瘉:

// 妫€鏌ュ叧閿<E58FA7>瘝鍒楄〃
if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|鐥呬緥鎶ュ憡琛▅绾冲叆|鎺掗櫎|鏍囧噯)/.test(message)) {
  return { intent: 'query_protocol' };
}

鍙戠幇: 鍏抽敭璇嶅垪琛ㄤ腑鏈?绾冲叆"鍜?鏍囧噯"锛屼絾缂哄皯"**鍏ラ€?*"锛?

鐢ㄦ埛闂<EFBFBD>殑鏄?绾冲叆鏍囧噯"锛屼絾瀹為檯鏂囨。涓<E38082>洿澶氫娇鐢?鍏ラ€夋爣鍑?鐨勮〃杩般€?

瑙e喅: 鎵╁厖鍏抽敭璇嶅垪琛?

if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|鐥呬緥鎶ュ憡琛▅绾冲叆|鍏ラ€墊鎺掗櫎|鏍囧噯|鍏ョ粍鏍囧噯|娌荤枟鏂规<E98F82>|璇曢獙璁捐<E79281>|鐮旂┒鐩<E29492>殑|鐮旂┒娴佺▼|瑙傚療鎸囨爣|璇婃柇鏍囧噯|鐤剧梾鏍囧噯)/.test(message)) {
  return { intent: 'query_protocol' };
}

<EFBFBD>簩姝ワ細楠岃瘉Dify鏌ヨ<EFBFBD><EFBFBD>惁鎵ц<EFBFBD>

璋冭瘯鑴氭湰: debug-dify-injection.ts

<EFBFBD>: 杩借釜Dify妫€绱㈢粨鏋滄槸鍚︽<E98D9A><EFBFBD>敞鍏ュ埌LLM

鍙戠幇: Dify纭<79>疄琚<E79684>皟鐢ㄤ簡锛屼絾杩斿洖鐨勫唴瀹规槸undefined锛?

[鏂囨。1] undefined (鐩稿叧搴? 76.0%)
undefined
---

<EFBFBD>笁姝ワ細妫€鏌<EFBFBD>ify API杩斿洖缁撴瀯

璋冭瘯鑴氭湰: inspect-dify-response.ts

瀹屾暣杩斿洖缁撴瀯:

{
  "records": [
    {
      "segment": {
        "content": "绾冲叆涓庢帓闄ゆ爣鍑?..",
        "document": {
          "name": "閲嶅ぇ鐤戦毦-鐥呬緥鎶ュ憡琛<E686A1>紙CRF锛変慨鏀?208.docx"
        }
      },
      "score": 0.7604317
    }
  ]
}

<EFBFBD><EFBFBD>鏍瑰洜: ChatService涓<65>娇鐢ㄤ簡閿欒<E996BF>鐨勫瓧娈佃矾寰勶紒

// 鉂?閿欒<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>

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`;
});

<EFBFBD><EFBFBD>鎬荤粨

<EFBFBD><EFBFBD> 鏍瑰洜 喅鏂规<EFBFBD>
AI缂栭€犵瓟妗? 鎰忓浘璇嗗埆鍏抽敭璇嶄笉鍏? 鎵╁厖detectIntent鍏抽敭璇嶅垪琛<EFBFBD>紝娣诲姞"鍏ラ€?绛夊尰瀛︽湳璇?
Dify鍐呭<EFBFBD>涓簎ndefined 閿欒<EFBFBD>鐨凙PI鍝嶅簲瀛楁<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>涓篳record.segment.document.name鍜宍record.segment.content

鉁?娴嬭瘯楠岃瘉

娴嬭瘯1: 鐮旂┒鏂规<E98F82>鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>

<EFBFBD><EFBFBD>: "杩欎釜鐮旂┒鐨勬帓闄ゆ爣鍑嗘槸浠€涔堬紵"

AI鍥炵瓟:

鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛屾湰鐮旂┒鐨勬帓闄ゆ爣鍑嗗寘鎷<EFBFBD>細

1. 骞撮緞灏忎簬18宀佹垨澶т簬75宀?
2. 鍚堝苟鍏朵粬涓ラ噸鍣ㄥ畼鍔熻兘闅滅<E99785>
3. 鏃㈠線鏈夌浉鍏宠嵂鐗╄繃鏁忓彶
4. 濡婂<E6BFA1>鎴栧摵涔虫湡濡囧コ
5. 杩?涓<>湀鍐呭弬涓庤繃鍏朵粬涓村簥璇曢獙

濡傞渶鏌ョ湅瀹屾暣鎺掗櫎鏍囧噯鏉℃<E98F89>锛屽缓璁<E7BC93>偍鐧诲綍绯荤粺鏌ラ槄璇︾粏鐮旂┒鏂规<E98F82>鏂囨。銆?

鏃ュ織楠岃瘉:

[ChatService] 鎰忓浘璇嗗埆 { intent: 'query_protocol' }
[ChatService] Dify妫€绱㈡垚鍔?{ recordCount: 5 }
[ChatService] 澶勭悊娑堟伅 { hasDifyKnowledge: true }

鉁?缁撴灉: 鎴愬姛璇嗗埆鎰忓浘锛岃皟鐢―ify锛岃繑鍥炴<E98DA5><EFBFBD>瓟妗?

娴嬭瘯2: CRF琛ㄦ牸鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>

<EFBFBD><EFBFBD>: "CRF琛ㄦ牸涓<E789B8>湁鍝<E6B981>簺瑙傚療鎸囨爣锛?

AI鍥炵瓟:

鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛孋RF琛ㄦ牸涓<EFBFBD>殑瑙傚療鎸囨爣鍖呮嫭锛?

1. 鍩虹嚎浜哄彛瀛﹁祫鏂?
2. 涓昏<E6B693>鐤楁晥鎸囨爣锛堝<E9949B>鐥囩姸璇勫垎锛?
3. 娆¤<E5A886>鐤楁晥鎸囨爣锛堝<E9949B>鐢熸椿璐ㄩ噺璇勫垎锛?
4. 瀹夊叏鎬ф寚鏍囷紙涓嶈壇浜嬩欢璁板綍锛?
5. 瀹為獙瀹ゆ<E780B9>鏌ョ粨鏋?

鍏蜂綋鎸囨爣瀹氫箟鍜岄噰闆嗘椂鐐硅<E99090>鏌ラ槄璇︾粏CRF琛ㄦ牸鏂囨。銆?

鉁?缁撴灉: 鎴愬姛妫€绱<E282AC>RF鏂囨。

娴嬭瘯3: 鎮€呰<E282AC>褰曟煡璇<E785A1>紙REDCap鏌ヨ<E98F8C>锛?

<EFBFBD><EFBFBD>: "ID 7鐨勬偅鑰呮儏鍐?

AI鍥炵瓟:

鏍规嵁REDCap鏁版嵁锛孖D 7鐨勬偅鑰呮儏鍐靛<E98D90>涓嬶細

**鍩烘湰淇℃伅**锛氫紒涓氬井淇?锛岀敺鎬э紝8宀侊紝韬<E7B49D>珮130cm锛屼綋閲?0kg锛孊MI 29.6銆?
**鑱旂郴鏂瑰紡**锛氶偖绠眊ofeng117@163.com銆?
**鐮旂┒鐘舵€?*锛氭不鐤楀<E990A4>璁板綍涓?娴嬭瘯7777"锛孌DCD琛ㄥ崟宸插畬鎴愩€?

濡傞渶鏌ョ湅瀹屾暣璁板綍鎴栨洿澶氳<E6BEB6>瑙嗘暟鎹<E69A9F>紝寤鸿<E5AFA4>鎮ㄧ櫥褰昍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>锛?

<EFBFBD><EFBFBD>: "鐩<>墠鍏ョ粍浜嗗<E6B59C>灏戜汉锛?

AI鍥炵瓟:

鏍规嵁REDCap瀹炴椂鏁版嵁锛?*test0102**椤圭洰鐩<E6B4B0>墠鍏辨湁 **11浣?* 鎮h€呭叆缁勩€?

璁板綍ID涓?鑷?1銆傚<E98A86>闇€鏌ョ湅鎮€呰<E282AC>鎯咃紝寤鸿<E5AFA4>鎮ㄧ櫥褰昍EDCap绯荤粺銆?

鉁?缁撴灉: 鎴愬姛缁熻<E7BC81>鍏ョ粍浜烘暟

娴嬭瘯5: 娣峰悎鏌ヨ<E98F8C>锛圖ify妫€绱<E282AC>

<EFBFBD><EFBFBD>: "杩欎釜鐮旂┒鐨勪富瑕佺爺绌剁洰鐨勬槸浠€涔堬紵"

AI鍥炵瓟:

鏍规嵁鐮旂┒鏂规<EFBFBD>鏂囨。锛屾湰鐮旂┒鐨?*涓昏<E6B693>鐮旂┒鐩<E29492>殑**鏄<>瘎浼癧鍏蜂綋骞查<E9AA9E><EFBFBD>柦]鍦╗鐩<E29597>爣浜虹兢]涓<>殑鏈夋晥鎬у拰瀹夊叏鎬с€?

鐢变簬褰撳墠妫€绱㈠埌鐨勬枃妗唴瀹逛笉瀹屾暣锛屾棤娉曟彁渚涙洿璇︾粏鐨勫叿浣撴弿杩般€傚缓璁<E7BC93>偍鏌ラ槄瀹屾暣鐨勭爺绌舵柟妗堟枃妗互鑾峰彇鍑嗙淇℃伅銆?

鉁?缁撴灉: 鎴愬姛妫€绱<E282AC>紝AI鑳借瘑鍒<E79891>俊鎭<E4BF8A>笉瀹屾暣鐨勬儏鍐?


馃搳 鎶€鏈<E282AC>灦鏋勬€荤粨

鏁版嵁娴佸浘

鐢ㄦ埛鎻愰棶锛堜紒涓氬井淇★級
    鈫?
鎰忓浘璇嗗埆锛坉etectIntent锛?
    鈫?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?query_protocol鈹?query_record  鈹?count_records鈹?
鈹? (鏂囨。鏌ヨ<E98F8C>)   鈹? (璁板綍鏌ヨ<E98F8C>)   鈹? (缁熻<E7BC81>鏌ヨ<E98F8C>)  鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹?
        鈫?              鈫?             鈫?
   Dify API        REDCap API    REDCap API
   (鐭ヨ瘑搴?        (鎮h€呮暟鎹?    (鎮h€呮暟鎹?
        鈫?              鈫?             鈫?
    鏂囨。鐗囨<E99097>          JSON鏁版嵁       JSON鏁版嵁
        鈫?              鈫?             鈫?
        鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
                    鈫?
            鏋勫缓LLM Prompt
         (System + Context + Data)
                    鈫?
              DeepSeek-V3
                    鈫?
               AI鍥炵瓟
                    鈫?
          浼佷笟寰<E7AC9F>俊鑷<E4BF8A>姩鍥炲<E98DA5>

鏍稿績鎶€鏈<EFBFBD>

灞傜骇 鎶€鏈? 鐢ㄩ€?
AI鎺ㄧ悊 DeepSeek-V3 <EFBFBD>劧璇<EFBFBD>█鐞嗚В涓庣敓鎴?
RAG骞冲彴 Dify 鏂囨。瀛樺偍銆佸垎鍧椼€佸悜閲忓寲銆佽<EFBFBD>涔夋<EFBFBD>绱?
*鏁版嵁婧? REDCap 涓村簥璇曢獙瀹炴椂鏁版嵁
*鏁版嵁搴? PostgreSQL 椤圭洰閰嶇疆銆佺敤鎴锋槧灏?
ORM Prisma 鏁版嵁搴撹<EFBFBD>闂?
浼氳瘽绠$悊 SessionMemory 涓婁笅鏂囩淮鎶わ紙鏈€杩?杞<>
閫氫俊 浼佷笟寰<EFBFBD> 娑堟伅鎺ユ敹涓庡彂閫?

鍏抽敭璁捐<EFBFBD>妯″紡

  1. 鎰忓浘椹卞姩璺<EFBFBD>敱 (Intent-Based Routing)

    • 鏍规嵁鐢ㄦ埛闂<EFBFBD><EFBFBD>鍏抽敭璇嶈瘑鍒<EFBFBD>剰鍥?
    • 鍔ㄦ€佽皟鐢ㄤ笉鍚岀殑鏁版嵁婧愶紙Dify vs REDCap锛?
  2. 娣峰悎妫€绱?(Hybrid Retrieval)

    • 缁撴瀯鍖栨暟鎹<EFBFBD>煡璇<EFBFBD>紙REDCap锛?
    • 闈炵粨鏋勫寲鏂囨。妫€绱<EFBFBD>紙Dify锛?
    • 涓よ€呯粨鏋滅粺涓€娉ㄥ叆LLM Prompt
  3. RAG (Retrieval Augmented Generation)

    • 妫€绱㈢浉鍏虫枃妗g墖娈?
    • 娉ㄥ叆鍒癓LM涓婁笅鏂?
    • 鍑忓皯骞昏<EFBFBD>锛圚allucination锛?
  4. 浼氳瘽璁板繂 (Session Memory)

    • 淇濈暀鏈€杩?杞<><E69D9E>璇?
    • <EFBFBD>寔澶氳疆瀵硅瘽涓婁笅鏂?

馃搱 鎬ц兘鎸囨爣

鍝嶅簲鏃堕棿

鎿嶄綔 骞冲潎鑰楁椂 澶囨敞
Dify妫€绱? ~1.5s <EFBFBD>箟妫€绱?Top 5
REDCap鍗曟潯鏌ヨ<EFBFBD> ~1.2s HTTP API
REDCap缁熻<EFBFBD>鏌ヨ<EFBFBD> ~1.3s 瀵煎嚭鎵€鏈夎<EFBFBD>褰?
LLM鎺ㄧ悊 ~3.5s DeepSeek-V3, 500 tokens
*鎬诲搷搴旀椂闂? ~5-6s <EFBFBD>綉缁滀紶杈?

Token娑堣€?

鍦烘櫙 Input Tokens Output Tokens Total
鏂囨。鏌ヨ<EFBFBD> ~340 ~79 ~419
璁板綍鏌ヨ<EFBFBD> ~627 ~88 ~715
缁熻<EFBFBD>鏌ヨ<EFBFBD> ~505 ~42 ~547

馃幆 鍚庣画浼樺寲鏂瑰悜

<EFBFBD>湡浼樺寲锛?-2鍛<32>

  1. 鎵╁睍鍏抽敭璇嶅簱

    • 鏀堕泦瀹為檯鐢ㄦ埛鎻愰棶
    • 琛ュ厖閬楁紡鐨勫尰瀛︽湳璇?
  2. *浼樺寲妫€绱㈣川閲?

    • 璋冩暣Dify鐨刞top_k`鍙傛暟
    • 璇曢獙涓嶅悓鐨刞search_method`
  3. 鏀硅繘鍥炵瓟璐ㄩ噺

    • 浼樺寲System Prompt
    • 澧炲姞寮曠敤鏉ユ簮灞曠ず

<EFBFBD>湡浼樺寲锛?-2涓<32>湀锛?

  1. *瀹炵幇澶氶」鐩<EFBFBD>敮鎸?

    • 鐢ㄦ埛缁戝畾澶氫釜椤圭洰
    • 椤圭洰鍒囨崲鏈哄埗
  2. 鏂囨。API涓婁紶

    • 寮€鍙戣嚜鍔ㄤ笂浼犳帴鍙?
    • 瀹氭椂鏇存柊鐭ヨ瘑搴?
  3. *妫€绱㈢粨鏋滅紦瀛?

    • Redis缂撳瓨楂橀<EFBFBD><EFBFBD><EFBFBD>
    • 鍑忓皯Dify璋冪敤娆℃暟

闀挎湡浼樺寲锛?-6涓<36>湀锛?

  1. *澶氱煡璇嗗簱鑱斿悎妫€绱?

    • 鎸夋枃妗被鍨嬪垎绫伙紙鏂规<EFBFBD>銆佷鸡鐞嗐€丆RF锛?
    • 鏅鸿兘璺<EFBFBD>敱鍒板<EFBFBD>搴旂煡璇嗗簱
  2. *娣峰悎妫€绱㈠<EFBFBD>寮?

    • 鍚屾椂鏌ヨ<EFBFBD>REDCap鍜孌ify
    • 铻嶅悎缁撴瀯鍖?闈炵粨鏋勫寲鏁版嵁
  3. 瀵硅瘽璐ㄩ噺鐩戞帶

    • 鐢ㄦ埛婊℃剰搴﹁瘎鍒?
    • 绛旀<EFBFBD>鍑嗙у<EFBFBD>璁?

馃摎 鐩稿叧鏂囨。


馃懃 寮€鍙戜汉鍛?

  • **寮€鍙戣€?*: AI Assistant + FengZhiBo
  • 娴嬭瘯: FengZhiBo锛堜紒涓氬井淇湡瀹炵幆澧冿級
  • 鏂囨。: AI Assistant

**鉁?寮€鍙戝畬鎴愭椂闂?: 2026-01-04
**鉁?娴嬭瘯鐘舵€?
: 鍏ㄩ儴閫氳繃
**鉁?閮ㄧ讲鐘舵€?*: 宸查儴缃插埌寮€鍙戠幆澧?