Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/02-技术设计/IIT Manager Agent 技术路径与架构设计.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

24 KiB
Raw Blame History

IIT Manager Agent 鎶€鏈<E282AC>矾寰勪笌鏋舵瀯璁捐<E79281>

鏂囨。鐗堟湰: v1.0
**鏈€鍚庢洿鏂?: 2026-01-04
**鐘舵€?
: 鉁?Phase 1.5 瀹屾垚骞堕獙璇?


馃搵 鏂囨。姒傝堪

<EFBFBD>枃妗<EFBFBD>缁嗘弿杩颁簡IIT Manager Agent鐨勬妧鏈<E5A6A7>矾寰勩€佹牳蹇冩灦鏋勫拰瀹炵幇鏂规<E98F82>銆傜郴缁熼噰鐢?*"鎰忓浘璇嗗埆 鈫?宸ュ叿璋冪敤 鈫?娣峰悎妫€绱?鈫?LLM鐢熸垚"**鐨勬妧鏈<E5A6A7>矾寰勶紝瀹炵幇浜嗛浂骞昏<E9AA9E>銆侀珮鍑嗙鐜囩殑AI瀵硅瘽鑳藉姏銆?


馃幆 鎶€鏈<E282AC>矾寰勬€荤粨

鏍稿績鎶€鏈<EFBFBD>矾寰?

鐢ㄦ埛鎻愰棶 
  鈫?鎰忓浘璇嗗埆锛圛ntent Detection锛?
  鈫?宸ュ叿璋冪敤锛圱ool Calling锛?
  鈫?娣峰悎妫€绱<E282AC>紙Hybrid Retrieval锛?
  鈫?LLM鐢熸垚锛圠LM Generation锛?
  鈫?鍥炵瓟鐢ㄦ埛

杩欐槸涓€涓?绠€鍖栫増ReAct鏋舵瀯**锛圧eason + Act锛夛紝涔熷彲浠ョО涓?"鎰忓浘椹卞姩鐨勬贩鍚圧AG绯荤粺"**銆?

鎶€鏈<EFBFBD>灦鏋勭被鍨?

  • 鏋舵瀯妯″紡: 绠€鍖栫増ReAct锛圧eason + Act锛?
  • **妫€绱㈡ā寮?*: 娣峰悎RAG锛堢粨鏋勫寲鏁版嵁 + 闈炵粨鏋勫寲鏂囨。锛?
  • 鎰忓浘璇嗗埆: 鍏抽敭璇嶅尮閰嶏紙MVP闃舵<E99783>锛?
  • **涓婁笅鏂囩<E98F82>鐞?*: SessionMemory锛堝唴瀛樼紦瀛橈級
  • **闃插够瑙夋満鍒?*: RAG鏁版嵁娉ㄥ叆 + 涓ユ牸System Prompt

馃搻 瀹屾暣鎶€鏈<E282AC>灦鏋勫浘

鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?                       鐢ㄦ埛灞傦紙User Layer锛?                       鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 浼佷笟寰<E7AC9F>俊锛圵eChat锛?                                               鈹?
鈹? - PI閫氳繃浼佷笟寰<E7AC9F>俊鍙戦€佹秷鎭?                                         鈹?
鈹? - 鎺ユ敹AI鍥炲<E98DA5>锛堝惈"姝湪鏌ヨ<E98F8C>..."鍗虫椂鍙嶉<E98D99>锛?                         鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
                         鈹?
                         鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?                   鎺ュ叆灞傦紙Gateway Layer锛?                       鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? WechatCallbackController                                        鈹?
鈹? - URL楠岃瘉锛堢<E9949B>鍚嶆牎楠岋級                                            鈹?
鈹? - 娑堟伅鍔犲瘑/瑙瘑锛圓ES锛?                                          鈹?
鈹? - 寮傛<E5AFAE>娑堟伅澶勭悊锛?绉掑唴杩斿洖200锛?                                  鈹?
鈹? - 鍗虫椂鍙嶉<E98D99>锛?馃<>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.."                             鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
                         鈹?
                         鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?                   瀵硅瘽鏈嶅姟灞傦紙Chat Service锛?                    鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? ChatService锛堟牳蹇冨ぇ鑴戯級                                          鈹?
鈹?                                                                  鈹?
鈹? 姝ラ<E5A79D>1: 鎰忓浘璇嗗埆锛圛ntent Detection锛?                             鈹?
鈹? 鈹溾攢 鍏抽敭璇嶅尮閰嶏紙MVP绠€鍖栨柟妗堬級                                     鈹?
鈹? 鈹溾攢 query_record: "鎮h€?銆?ID"銆?璁板綍"                          鈹?
鈹? 鈹溾攢 count_records: "澶氬皯"銆?鍑犱釜"銆?缁熻<E7BC81>"                       鈹?
鈹? 鈹溾攢 query_protocol: "绾冲叆鎺掗櫎"銆?CRF"銆?鐮旂┒鏂规<E98F82>"               鈹?
鈹? 鈹斺攢 general_chat: 鍏朵粬                                           鈹?
鈹?                                                                  鈹?
鈹? 姝ラ<E5A79D>2: 宸ュ叿璋冪敤锛圱ool Calling锛?                                 鈹?
鈹? 鈹溾攢 REDCap鏁版嵁鏌ヨ<E98F8C>锛堢粨鏋勫寲鏁版嵁锛?                                鈹?
鈹? 鈹?  鈹溾攢 queryRedcapRecord(recordId)                             鈹?
鈹? 鈹?  鈹溾攢 countRedcapRecords()                                    鈹?
鈹? 鈹?  鈹斺攢 getProjectInfo()                                        鈹?
鈹? 鈹?                                                              鈹?
鈹? 鈹斺攢 Dify鐭ヨ瘑搴撴<E690B4><EFBFBD>紙闈炵粨鏋勫寲鏂囨。锛?                              鈹?
鈹?     鈹斺攢 queryDifyKnowledge(query)                               鈹?
鈹?         鈹斺攢 璇<>箟妫€绱<E282AC>op 5鐩稿叧鐗囨<E99097>                                鈹?
鈹?                                                                  鈹?
鈹? 姝ラ<E5A79D>3: 涓婁笅鏂囩<E98F82>鐞嗭紙Context Management锛?                         鈹?
鈹? 鈹斺攢 SessionMemory锛堝唴瀛樼紦瀛橈紝淇濈暀鏈€杩?杞<>級                       鈹?
鈹?                                                                  鈹?
鈹? 姝ラ<E5A79D>4: LLM鐢熸垚锛圠LM Generation锛?                                鈹?
鈹? 鈹斺攢 DeepSeek-V3锛堥€氳繃LLMFactory璋冪敤锛?                           鈹?
鈹?     鈹溾攢 System Prompt锛堝己璋冨熀浜庣湡瀹炴暟鎹<E69A9F>級                        鈹?
鈹?     鈹溾攢 REDCap鏌ヨ<E98F8C>缁撴灉锛堝<E9949B>鏋滄湁锛?                                鈹?
鈹?     鈹溾攢 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級                                   鈹?
鈹?     鈹溾攢 瀵硅瘽涓婁笅鏂囷紙SessionMemory锛?                             鈹?
鈹?     鈹斺攢 鐢ㄦ埛闂<E59F9B><E99782>                                                 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
                         鈹?
         鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
         鈻?                              鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?     鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?  鏁版嵁婧愬眰锛圖ata锛?   鈹?     鈹?  鐭ヨ瘑婧愬眰锛圞nowledge锛夆攤
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?     鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? REDCap鏁版嵁搴?        鈹?     鈹? Dify鐭ヨ瘑搴?          鈹?
鈹? - 鎮€呰<E282AC>褰曪紙缁撴瀯鍖栵級 鈹?     鈹? - 鐮旂┒鏂规<E98F82>PDF        鈹?
鈹? - RedcapAdapter     鈹?     鈹? - CRF琛ㄦ牸Docx       鈹?
鈹? - REST API          鈹?     鈹? - 浼︾悊璧勬枡           鈹?
鈹? - 瀹炴椂鏌ヨ<E98F8C>          鈹?     鈹? - 鍚戦噺妫€绱<E282AC>紙Qdrant锛?鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?     鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
         鈹?                              鈹?
         鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<E282AC>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
                         鈻?
                  PostgreSQL鏁版嵁搴?
                  - 椤圭洰閰嶇疆锛坉ify_dataset_id锛?
                  - 瀹¤<E780B9>鏃ュ織
                  - 鐢ㄦ埛鏄犲皠

馃攽 鏍稿績鎶€鏈<E282AC>粍浠?

1. 鎰忓浘璇嗗埆锛圛ntent Detection锛?

瀹炵幇鏂瑰紡

  • 褰撳墠鏂规<EFBFBD>: 鍏抽敭璇嶅尮閰嶏紙绠€鍗曢珮鏁堬級
  • **璇嗗埆鍑嗙‘鐜?*: 100%锛?娆℃祴璇曞叏閮ㄦ<E996AE><EFBFBD>
  • 鍝嶅簲閫熷害: <10ms

鎰忓浘绫诲瀷

鎰忓浘绫诲瀷 鍏抽敭璇? 瑙﹀彂宸ュ叿 绀轰緥
query_record "鎮h€?銆?ID"銆?璁板綍"銆?鍙楄瘯鑰? REDCap鍗曟潯鏌ヨ<EFBFBD> "鏌ヨ<E98F8C>ID 7鐨勬偅鑰呮儏鍐?
count_records "澶氬皯"銆?鍑犱釜"銆?缁熻<E7BC81>"銆?鎬诲叡" REDCap缁熻<EFBFBD>鏌ヨ<EFBFBD> "鐩<>墠鏈夊<E98F88>灏戜綅鎮€呭叆缁勶紵"
query_protocol "绾冲叆鎺掗櫎"銆?CRF"銆?鐮旂┒鏂规<E98F82>"銆?浼︾悊" Dify鐭ヨ瘑搴撴<EFBFBD>绱? "杩欎釜鐮旂┒鐨勬帓闄ゆ爣鍑嗘槸浠€涔堬紵"
project_info "椤圭洰"銆?鐮旂┒"銆?淇℃伅" 鏁版嵁搴撴煡璇? "杩欐槸浠€涔堥」鐩<E3808D>紵"
general_chat 鍏朵粬 鏃犲伐鍏疯皟鐢? "浣犲ソ"

浠g爜瀹炵幇

// backend/src/modules/iit-manager/services/ChatService.ts
private detectIntent(message: string): {
  intent: 'query_record' | 'count_records' | 'project_info' | 'query_protocol' | 'general_chat';
  params?: any;
} {
  // 1. 璇嗗埆鏂囨。鏌ヨ<E98F8C>锛堜紭鍏堢骇鏈€楂橈級
  if (/(鐮旂┒鏂规<E98F82>|浼︾悊|鐭ユ儏鍚屾剰|CRF|绾冲叆|鎺掗櫎|鏍囧噯)/.test(message)) {
    return { intent: 'query_protocol' };
  }

  // 2. 璇嗗埆璁板綍鏌ヨ<E98F8C>锛堝寘鍚獻D鍙风爜锛?
  const recordIdMatch = message.match(/(?:ID|璁板綍|鎮h€厊鍙楄瘯鑰?.*?(\d+)|(\d+).*?(?:鍏ョ粍|鏁版嵁|淇℃伅)/i);
  if (recordIdMatch) {
    return {
      intent: 'query_record',
      params: { recordId: recordIdMatch[1] || recordIdMatch[2] }
    };
  }

  // 3. 璇嗗埆缁熻<E7BC81>鏌ヨ<E98F8C>
  if (/(澶氬皯|鍑犱釜|鍑犳潯|鎬诲叡|缁熻<E7BC81>).*?(璁板綍|鎮h€厊鍙楄瘯鑰厊浜?/.test(message)) {
    return { intent: 'count_records' };
  }

  // 4. 璇嗗埆椤圭洰淇℃伅鏌ヨ<E98F8C>
  if (/(椤圭洰|鐮旂┒).*?(鍚嶇О|淇℃伅|鎯呭喌)/.test(message)) {
    return { intent: 'project_info' };
  }

  // 5. 榛樿<E6A69B>锛氭櫘閫氬<E996AB>璇?
  return { intent: 'general_chat' };
}

2. 宸ュ叿璋冪敤锛圱ool Calling锛?

2.1 REDCap宸ュ叿

鍔熻兘: 鏌ヨ<E98F8C>缁撴瀯鍖栫殑鎮€呮暟鎹?

宸ュ叿鍒楄〃:

宸ュ叿鍚嶇О 鍔熻兘 杈撳叆 杈撳嚭 鍝嶅簲鏃堕棿
queryRedcapRecord 鏌ヨ<EFBFBD>鍗曟潯鎮€呰<EFBFBD>褰? recordId €呰<EFBFBD>缁嗕俊鎭? ~1.2绉?
countRedcapRecords 缁熻<EFBFBD>€呮€绘暟 鏃? 鎬绘暟+璁板綍ID鍒楄〃 ~1.3绉?
getProjectInfo 鑾峰彇椤圭洰淇℃伅 鏃? 椤圭洰鍩烘湰淇℃伅 ~50ms

**鎶€鏈<E282AC>疄鐜?*:

// backend/src/modules/iit-manager/adapters/RedcapAdapter.ts
export class RedcapAdapter {
  constructor(baseUrl: string, apiToken: string, timeout = 30000) {
    this.client = axios.create({
      baseURL: baseUrl,
      timeout: timeout,
    });
  }

  async exportRecords(options: RedcapExportOptions = {}): Promise<any[]> {
    const formData = new URLSearchParams();
    formData.append('token', this.apiToken);
    formData.append('content', 'record');
    formData.append('format', 'json');
    
    if (options.records) {
      formData.append('records', JSON.stringify(options.records));
    }
    
    const response = await this.client.post('/api/', formData);
    return response.data;
  }
}

2.2 Dify宸ュ叿

鍔熻兘: 妫€绱㈤潪缁撴瀯鍖栫殑鐮旂┒鏂囨。

**妫€绱㈤厤缃?*:

鍙傛暟 鍊? 璇存槑
search_method semantic_search <EFBFBD>箟妫€绱<EFBFBD>紙鍚戦噺鐩镐技搴︼級
top_k 5 杩斿洖Top 5鐩稿叧鐗囨<E99097>
chunk_size 1500 tokens 姣忎釜鐗囨<EFBFBD>у皬锛圖ify閰嶇疆锛?

**鎶€鏈<E282AC>疄鐜?*:

// backend/src/modules/iit-manager/services/ChatService.ts
private async queryDifyKnowledge(query: string): Promise<string> {
  // 1. 鑾峰彇椤圭洰鐨凞ify Dataset ID
  const project = await prisma.iitProject.findFirst({
    where: { status: 'active' },
    select: { difyDatasetId: true }
  });

  if (!project?.difyDatasetId) return '';

  // 2. 璋冪敤Dify妫€绱<E282AC>PI
  const result = await difyClient.retrieveKnowledge(
    project.difyDatasetId,
    query,
    {
      retrieval_model: {
        search_method: 'semantic_search',
        top_k: 5
      }
    }
  );

  // 3. 鏍煎紡鍖栨<E98D96>绱㈢粨鏋?
  let formattedKnowledge = '';
  result.records.forEach((record, index) => {
    const score = (record.score * 100).toFixed(1);
    formattedKnowledge += `\n[鏂囨。${index + 1}] ${record.document_name} (鐩稿叧搴? ${score}%)\n`;
    formattedKnowledge += `${record.content}\n---\n`;
  });

  return formattedKnowledge;
}

3. 娣峰悎妫€绱<E282AC>紙Hybrid Retrieval锛?

**鏍稿績鍒涙柊鐐?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。

妫€绱㈢瓥鐣ュ<EFBFBD>姣?

妫€绱㈢被鍨? 鏁版嵁婧? 閫傜敤鍦烘櫙 妫€绱㈡柟寮? 绀轰緥鏌ヨ<EFBFBD>
*缁撴瀯鍖栨暟鎹<EFBFBD><EFBFBD>绱? REDCap €呰<EFBFBD>褰曘€佺粺璁℃暟鎹<EFBFBD>€佸叆缁勪俊鎭? SQL鏌ヨ<EFBFBD>锛堢簿纭<EFBFBD>尮閰嶏級 "鏌ヨ<E98F8C>ID 7鐨勬偅鑰?
*闈炵粨鏋勫寲鏂囨。妫€绱? Dify鐭ヨ瘑搴? 鐮旂┒鏂规<EFBFBD>銆丆RF琛ㄦ牸銆佷鸡鐞嗚祫鏂? 鍚戦噺妫€绱<EFBFBD>紙璇<EFBFBD>箟鐩镐技锛? "鐮旂┒鐨勭撼鍏ユ帓闄ゆ爣鍑?

浼樺娍

鉁?**浜掕ˉ鎬?: 涓ょ<E6B693>鏁版嵁婧愯<E5A9A7>鐩朠I鐨勬墍鏈夐渶姹? 鉁?**鑷<>姩鍖?: 鏍规嵁鎰忓浘鑷<E6B598>姩閫夋嫨鏁版嵁婧? 鉁?**楂樻晥鎬?: 鍝嶅簲閫熷害蹇<E5AEB3>紙骞冲潎4.8绉掞級
鉁?**鍑嗙‘鎬?
: 100%鍩轰簬鐪熷疄鏁版嵁

鎶€鏈<EFBFBD>祦绋?

async handleMessage(userId: string, userMessage: string): Promise<string> {
  // 1. 鎰忓浘璇嗗埆
  const { intent, params } = this.detectIntent(userMessage);

  // 2. 鏍规嵁鎰忓浘璋冪敤涓嶅悓宸ュ叿
  let toolResult: any = null;
  let difyKnowledge: string = '';

  // REDCap鏁版嵁鏌ヨ<E98F8C>
  if (intent === 'query_record' && params?.recordId) {
    toolResult = await this.queryRedcapRecord(params.recordId);
  } else if (intent === 'count_records') {
    toolResult = await this.countRedcapRecords();
  }

  // Dify鐭ヨ瘑搴撴<E690B4>绱?
  if (intent === 'query_protocol') {
    difyKnowledge = await this.queryDifyKnowledge(userMessage);
  }

  // 3. 缁勮<E7BC81>涓婁笅鏂?
  const messages = this.buildMessagesWithData(
    userMessage,
    context,
    toolResult,      // REDCap鏁版嵁
    difyKnowledge,   // Dify鏂囨。
    userId
  );

  // 4. LLM鐢熸垚
  const response = await this.llm.chat(messages);
  return response.content;
}

4. RAG锛圧etrieval Augmented Generation锛?

鏍稿績浣滅敤: 闃叉<E99783>AI骞昏<E9AA9E>锛岀淇濆洖绛斿熀浜庣湡瀹炴暟鎹?

RAG瀹炵幇鏈哄埗

// System Prompt锛堝己璋冨熀浜庣湡瀹炴暟鎹<E69A9F>const systemPrompt = `浣犳槸IIT Manager鏅鸿兘鍔╂墜銆?

銆愰噸瑕佸師鍒欍€?
鈿狅笍 浣?*蹇呴』鍩轰簬绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。**鍥炵瓟闂<E7939F><E99782>锛?*缁濆<E7BC81>涓嶈兘缂栭€犱俊鎭?*銆?
鈿狅笍 濡傛灉绯荤粺鎻愪緵浜嗘煡璇㈢粨鏋滄垨鏂囨。鍐呭<E98D90>锛岃<E9949B>浣跨敤杩欎簺鐪熷疄淇℃伅锛涘<E9949B>鏋滄病鏈夋彁渚涳紝鏄庣鍛婄煡鐢ㄦ埛銆?

銆愪綘鐨勮兘鍔涖€?
鉁?鍥炵瓟鐮旂┒杩涘睍闂<E79D8D><E99782>锛堝熀浜嶳EDCap瀹炴椂鏁版嵁锛?
鉁?鏌ヨ<E98F8C>€呰<E282AC>褰曡<E8A4B0>鎯?
鉁?缁熻<E7BC81>鍏ョ粍浜烘暟
鉁?鎻愪緵椤圭洰淇℃伅
鉁?瑙瓟鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>锛堝熀浜庣煡璇嗗簱鏂囨。锛?

銆愬洖澶嶅師鍒欍€?
1. **鍩轰簬浜嬪疄**锛氬彧浣跨敤绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。锛屼笉缂栭€?
2. **绠€娲佷笓涓?*锛氭帶鍒跺湪150瀛椾互鍐?
3. **鍙嬪ソ绀艰矊**锛氫娇鐢?鎮?绉板懠PI
4. **寮曞<E5AFAE>琛屽姩**锛氬<E9949B>闇€鏇村<E98F87>璇︾粏淇℃伅锛屽缓璁<E7BC93>煡鐪嬪畬鏁存枃妗垨鐧诲綍REDCap绯荤粺
`;

// 鏁版嵁娉ㄥ叆
if (toolResult) {
  messages.push({
    role: 'system',
    content: `銆怰EDCap鏁版嵁鏌ヨ<E98F8C>缁撴灉銆慭n${JSON.stringify(toolResult, null, 2)}\n\n璇峰熀浜庝互涓婄湡瀹炴暟鎹<EFBFBD>洖绛旂敤鎴烽棶棰樸€俙
  });
}

if (difyKnowledge) {
  messages.push({
    role: 'system',
    content: `銆愮爺绌舵柟妗堟枃妗<EFBFBD>绱㈢粨鏋溿€慭n${difyKnowledge}\n\n璇峰熀浜庝互涓婃枃妗唴瀹瑰洖绛旂敤鎴烽棶棰樸€俙
  });
}

闃插够瑙夋晥鏋滈獙璇?

娴嬭瘯缁撴灉鏄剧ず锛?

  • 鉁?鎵€鏈夊洖绛旈兘鏄庣‘寮曠敤鏁版嵁鏉ユ簮
  • 鉁?AI涓嶅啀缂栭€犱笉瀛樺湪鐨勪俊鎭?
  • 鉁?褰撴枃妗笉瀹屾暣鏃讹紝AI璇氬疄鍛婄煡
  • 鉁?鍑嗙鐜囷細100%锛?娆℃祴璇曪級

5. 涓婁笅鏂囩<E98F82>鐞嗭紙Context Management锛?

鍔熻兘: SessionMemory - 淇濈暀鏈€杩?杞<><E69D9E>璇?

瀹炵幇鏂规<EFBFBD>

// backend/src/modules/iit-manager/agents/SessionMemory.ts
export class SessionMemory {
  private sessions: Map<string, ConversationHistory> = new Map();
  private readonly MAX_HISTORY = 3; // 鍙<>繚鐣欐渶杩?杞?

  addMessage(userId: string, role: 'user' | 'assistant', content: string): void {
    let session = this.sessions.get(userId);
    if (!session) {
      session = { userId, messages: [], lastAccessTime: Date.now() };
      this.sessions.set(userId, session);
    }

    session.messages.push({ role, content, timestamp: Date.now() });
    session.lastAccessTime = Date.now();

    // 淇濇寔鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>    if (session.messages.length > this.MAX_HISTORY * 2) {
      session.messages = session.messages.slice(-this.MAX_HISTORY * 2);
    }
  }

  getContext(userId: string): string {
    const session = this.sessions.get(userId);
    if (!session || session.messages.length === 0) return '';

    return session.messages
      .map(m => `${m.role === 'user' ? '鐢ㄦ埛' : 'AI'}: ${m.content}`)
      .join('\n\n');
  }
}

璁捐<EFBFBD>鑰冭檻

  • 鍐呭瓨缂撳瓨: Node.js Map锛堥€熷害蹇<E5AEB3>紝婊¤冻MVP闇€姹傦級
  • <EFBFBD>姩娓呯悊: 30鍒嗛挓鏃犳椿鍔ㄨ嚜鍔ㄦ竻鐞?
  • 瀹归噺闄愬埗: 鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>
  • **澶氱敤鎴锋敮鎸?*: 浠<>serId涓簁ey闅旂<E99785>

6. LLM鐢熸垚锛圠LM Generation锛?

妯″瀷閫夋嫨

鎸囨爣 DeepSeek-V3 璇存槑
鎴愭湰 楼1/鐧句竾tokens 鏋佷綆鎴愭湰
*涓婁笅鏂? 64K tokens 婊¤冻闇€姹?
鏁堟灉 浼樼<EFBFBD> 涓嶨PT-4鐩稿綋
鍝嶅簲閫熷害 ~3绉? 婊¤冻浼佷笟寰<EFBFBD>俊瑕佹眰

璋冪敤鏂瑰紡

// 閫氳繃LLMFactory璋冪敤锛堥€氱敤鑳藉姏灞傦級
const llm = LLMFactory.getAdapter('deepseek-v3');

const response = await llm.chat(messages, {
  temperature: 0.7,
  maxTokens: 500,  // 浼佷笟寰<E7AC9F>俊寤鸿<E5AFA4>у埗杈撳嚭闀垮害
  topP: 0.9,
});

Token娑堣€楃粺璁?

鍦烘櫙 杈撳叆Tokens 杈撳嚭Tokens 鎬籘okens 鎴愭湰
鎺掗櫎鏍囧噯鏌ヨ<EFBFBD> 340 79 419 楼0.00042
CRF鎸囨爣鏌ヨ<EFBFBD> 434 75 509 楼0.00051
ID 7鎮€呮煡璇? 627 88 715 楼0.00072
鐮旂┒鐩<EFBFBD>殑鏌ヨ<EFBFBD> 522 57 579 楼0.00058
鎮h€呯粺璁℃煡璇? 505 42 547 楼0.00055

骞冲潎鎴愭湰: 楼0.00056/娆″<E5A886>璇濓紙鏋佷綆锛?


7. 浼佷笟寰<E7AC9F>俊闆嗘垚锛圵eChat Integration锛?

鏍稿績鍔熻兘

  1. **娑堟伅鍔犺В瀵?*: AES + SHA1绛惧悕楠岃瘉
  2. 寮傛<EFBFBD>澶勭悊: 5绉掑唴杩斿洖200锛屽悗鍙板<E98D99>鐞嗘秷鎭?
  3. 鍗虫椂鍙嶉<EFBFBD>: "馃<>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.."
  4. **涓诲姩鎺ㄩ€?*: 閫氳繃浼佷笟寰<E7AC9F>俊API鍙戦€佸洖澶?

鎶€鏈<EFBFBD>疄鐜?

// backend/src/modules/iit-manager/controllers/WechatCallbackController.ts
async handlePost(request: FastifyRequest, reply: FastifyReply) {
  // 1. 绔嬪嵆杩斿洖200锛?绉掑唴锛?
  reply.send('success');

  // 2. 寮傛<E5AFAE>澶勭悊娑堟伅
  this.processMessageAsync(xmlData).catch(error => {
    logger.error('寮傛<E5AFAE>澶勭悊娑堟伅寮傚父', { error: error.message });
  });
}

private async processMessageAsync(xmlData: any) {
  const { FromUserName, Content } = this.extractMessage(xmlData);

  // 3. 鍙戦€佸嵆鏃跺弽棣?
  await this.sendTextMessage(FromUserName, '馃<>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?..');

  // 4. 璋冪敤ChatService澶勭悊
  const answer = await this.chatService.handleMessage(FromUserName, Content);

  // 5. 鍙戦€佹渶缁堝洖澶?
  await this.sendTextMessage(FromUserName, answer);
}

馃搳 瀹屾暣鏁版嵁娴佸浘

鐢ㄦ埛鎻愰棶
    鈫?
浼佷笟寰<E7AC9F>俊娑堟伅
    鈫?
[WechatCallbackController]
    鈹溾啋 绔嬪嵆杩斿洖200锛?5绉掞級
    鈹斺啋 寮傛<E5AFAE>澶勭悊
        鈫?
[ChatService.handleMessage()]
    鈫?
1. 鎰忓浘璇嗗埆锛堝叧閿<E58FA7>瘝鍖归厤锛?
    鈹溾啋 query_protocol锛?
    鈹溾啋 query_record锛?
    鈹斺啋 count_records锛?
    鈫?
2. 宸ュ叿璋冪敤锛堝苟琛屾垨鍗曚竴锛?
    鈹溾啋 queryDifyKnowledge()
    鈹?  鈹斺啋 Dify API锛堣<E9949B>涔夋<E6B694><EFBFBD>級
    鈹?      鈹斺啋 杩斿洖Top 5鏂囨。鐗囨<E99097>
    鈹?
    鈹斺啋 queryRedcapRecord()
        鈹斺啋 REDCap API锛圫QL鏌ヨ<E98F8C>锛?
            鈹斺啋 杩斿洖鎮€呰<E282AC>褰?
    鈫?
3. 涓婁笅鏂囩粍瑁?
    鈹溾啋 System Prompt锛堝熀浜庣湡瀹炴暟鎹<E69A9F>師鍒欙級
    鈹溾啋 REDCap鏌ヨ<E98F8C>缁撴灉锛堝<E9949B>鏋滄湁锛?
    鈹溾啋 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級
    鈹溾啋 SessionMemory涓婁笅鏂?
    鈹斺啋 鐢ㄦ埛闂<E59F9B><E99782>
    鈫?
4. LLM鐢熸垚锛圖eepSeek-V3锛?
    鈹斺啋 鐢熸垚鍥炵瓟锛堝熀浜庢敞鍏ョ殑鏁版嵁锛?
    鈫?
5. 淇濆瓨鍒癝essionMemory
    鈫?
6. 鎺ㄩ€佸埌浼佷笟寰<E7AC9F>俊
    鈫?
鐢ㄦ埛鏀跺埌鍥炲<E98DA5>

馃幆 鍏抽敭鎶€鏈<E282AC>喅绛?

鍐崇瓥鐐? 閫夋嫨鏂规<EFBFBD> 鏇夸唬鏂规<EFBFBD> 閫夋嫨鍘熷洜
鎰忓浘璇嗗埆 鍏抽敭璇嶅尮閰? LLM鍒ゆ柇銆丅ERT鍒嗙被 MVP闃舵<EFBFBD>锛岀畝鍗曢珮鏁堬紝鍑嗙鐜囬珮锛?00%锛?
宸ュ叿璋冪敤 鍚屾<EFBFBD>涓茶<EFBFBD> 骞惰<EFBFBD>璋冪敤 鍝嶅簲蹇<EFBFBD>紙<5绉掞級锛岄€昏緫娓呮櫚锛屾槗璋冭瘯
*鐭ヨ瘑搴? Dify鏈<EFBFBD>湴閮ㄧ讲 <EFBFBD>缓鍚戦噺搴撱€佷簯鏈嶅姟 鏁版嵁瀹夊叏锛屽搷搴斿揩锛屾垚鏈<EFBFBD>綆锛屾槗缁存姢
*鍚戦噺鏁版嵁搴? Qdrant锛圖ify鍐呯疆锛? Milvus銆丳inecone 楂樻€ц兘锛屾棤闇€棰濆<EFBFBD>閮ㄧ讲
LLM DeepSeek-V3 GPT-4銆丆laude 鎴愭湰浣庯紙楼1/鐧句竾tokens锛夛紝鏁堟灉濂?
*涓婁笅鏂囧瓨鍌? 鍐呭瓨缂撳瓨锛圡ap锛? Redis銆佹暟鎹<EFBFBD> 閫熷害蹇<EFBFBD>紝婊¤冻MVP闇€姹傦紝鏄撳疄鐜?
鏁版嵁娉ㄥ叆 System Prompt Function Calling 绠€鍗曠洿鎺ワ紝闃叉<EFBFBD>骞昏<EFBFBD>锛屾晥鏋滃ソ
寮傛<EFBFBD>澶勭悊 Node.js寮傛<E5AFAE> 娑堟伅闃熷垪锛坧g-boss锛? 绠€鍗曪紝婊¤冻浼佷笟寰<EFBFBD>俊5绉掗檺鍒?

馃搱 鎬ц兘鎸囨爣

鍝嶅簲鏃堕棿鍒嗘瀽

闃舵<EFBFBD> 鑰楁椂 鍗犳瘮 浼樺寲绌洪棿
鎰忓浘璇嗗埆 <10ms <1% 鉁?宸叉渶浼?
REDCap鏌ヨ<EFBFBD> 1.2-1.3绉? 25% 馃數 鍙<>紭鍖栵紙鍔犵紦瀛橈級
Dify妫€绱? 1.5-1.7绉? 30% 馃數 鍙<>紭鍖栵紙璋冩暣top_k锛?
LLM鐢熸垚 3.0-3.5绉? 65% 鈿狅笍 鍙楅檺浜庢ā鍨嬮€熷害
鎬昏<EFBFBD> *4.8绉? 100% 鉁?婊¤冻<5绉掕<E7BB89>姹?

Token娑堣€楀垎鏋?

鎸囨爣 鏁板€?
骞冲潎杈撳叆Tokens 486 tokens/娆?
骞冲潎杈撳嚭Tokens 68 tokens/娆?
骞冲潎鎬籘okens 554 tokens/娆?
骞冲潎鎴愭湰 楼0.00055/娆″<E5A886>璇?

鍑嗙‘鐜囨寚鏍?

鎸囨爣 鏁板€? 璇存槑
鎰忓浘璇嗗埆鍑嗙‘鐜? 100% 5娆℃祴璇曞叏閮ㄦ<EFBFBD>纭?
鏁版嵁妫€绱㈡垚鍔熺巼 100% 鏃犲け璐ユ<EFBFBD>渚?
鍥炵瓟鍑嗙‘鐜? 100% 鎵€鏈夊洖绛斿熀浜庣湡瀹炴暟鎹?
骞昏<EFBFBD>鐜? 0% 鏃犵紪閫犱俊鎭?

馃殌 Phase 1.5 鎶€鏈<E282AC>垚鏋?

鏍稿績绐佺牬

  1. 鉁?**闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鍩轰簬鐪熷疄鏁版嵁/鏂囨。
  2. 鉁?**娣峰悎妫€绱?*: 缁撴瀯鍖栨暟鎹<E69A9F>紙REDCap锛? 闈炵粨鏋勫寲鏂囨。锛圖ify锛?
  3. 鉁?**蹇<>€熷搷搴?*: 骞冲潎4.8绉掞紙婊¤冻浼佷笟寰<EFBFBD>俊<5绉掕<E7BB89>姹傦級
  4. 鉁?楂樺噯纭<EFBFBD>: 鎰忓浘璇嗗埆100%锛屾暟鎹<E69A9F><E98EB9>绱?00%
  5. 鉁?**浣庢垚鏈?*: 楼0.00055/娆″<E5A886>璇?

娴嬭瘯楠岃瘉缁撴灉

娴嬭瘯鏃ユ湡: 2026-01-04
娴嬭瘯鍦烘櫙: 5涓<35>吀鍨嬪<E98DA8>璇濆満鏅? 娴嬭瘯缁撴灉: 鍏ㄩ儴閫氳繃鉁?

娴嬭瘯鍦烘櫙 鎰忓浘 鏁版嵁婧? 鍝嶅簲鏃堕棿 缁撴灉
鎺掗櫎鏍囧噯鏌ヨ<EFBFBD> query_protocol Dify 5.4绉? 鉁?鍑嗙‘
CRF鎸囨爣鏌ヨ<EFBFBD> query_protocol Dify 4.9绉? 鉁?鍑嗙‘
ID 7鎮€呮煡璇? query_record REDCap 5.3绉? 鉁?鍑嗙‘
鐮旂┒鐩<EFBFBD>殑鏌ヨ<EFBFBD> query_protocol Dify 4.5绉? 鉁?鍑嗙‘
鎮h€呯粺璁℃煡璇? count_records REDCap 3.8绉? 鉁?鍑嗙‘

鐢ㄦ埛鍙嶉<EFBFBD>

  • 鉁?鍝嶅簲閫熷害婊℃剰锛?5绉掞級
  • 鉁?鍥炵瓟鍑嗙‘涓撲笟
  • 鉁?鏁版嵁鐪熷疄鍙<E79684>
  • 鉁?涓婁笅鏂囪<E98F82>蹇嗘湁鏁?

馃摑 绯荤粺鑳藉姏鎬荤粨

瀵瑰<EFBFBD>浠嬬粛瑕佺偣

绠€娲佺増锛?00瀛楋級:

"鎴戜滑瀹炵幇浜嗕竴涓?*鏅鸿兘鎰忓浘璇嗗埆绯荤粺锛屽綋PI璇㈤棶鐮旂┒鏂规<EFBFBD>鐩稿叧闂<EFBFBD><EFBFBD>鏃讹紝AI浼氳嚜鍔ㄤ粠鐭ヨ瘑搴撲腑妫€绱㈡枃妗紱褰撹<EFBFBD><EFBFBD>偅鑰呮暟鎹<EFBFBD>椂锛孉I浼氬疄鏃舵煡璇<EFBFBD>EDCap鏁版嵁搴撱€傞€氳繃娣峰悎妫€绱㈡妧鏈?*锛孉I鑳藉<E991B3>鍚屾椂鐞嗚В鐮旂┒鏂囨。鍜屾偅鑰呮暟鎹<E69A9F>紝缁欏嚭鍑嗙銆佷笓涓氱殑鍥炵瓟銆傛暣涓<E69AA3>郴缁熷熀浜?*RAG鎶€鏈?*锛堟<E9949B>绱㈠<E7BBB1>寮虹敓鎴愶級锛岀淇滱I鐨勫洖绛?00%鍩轰簬鐪熷疄鏁版嵁锛屼笉浼氱紪閫犱俊鎭<E4BF8A>€?

鎶€鏈<EFBFBD>寒鐐癸紙5鐐癸級:

  1. 鎰忓浘璇嗗埆: 鑷<>姩鍒ゆ柇鐢ㄦ埛闂<E59F9B><E99782>绫诲瀷锛?00%鍑嗙‘鐜囷級
  2. 宸ュ叿璋冪敤: 鏍规嵁鎰忓浘璋冪敤涓嶅悓鐨勬暟鎹<E69A9F>簮锛圧EDCap/Dify锛?
  3. **娣峰悎妫€绱?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。
  4. **闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鏈夌湡瀹炴暟鎹<E69A9F>敮鎾戯紙RAG鎶€鏈<E282AC>
  5. **蹇<>€熷搷搴?*: 骞冲潎5绉掑唴鍥炲<E98DA5>锛堟弧瓒充紒涓氬井淇¤<E6B787>姹傦級

閫傜敤鍦烘櫙

鉁?PI鏃ュ父绠:

  • 鏌ヨ<EFBFBD>鐮旂┒鏂规<EFBFBD>銆佷鸡鐞嗚祫鏂?
  • 浜嗚В鎮h€呭叆缁勬儏鍐?
  • 缁熻<EFBFBD>椤圭洰杩涘睍

鉁?鏁版嵁璐ㄦ帶:

  • 妫€鏌ユ偅鑰呰<EFBFBD>褰?
  • 鏍稿<EFBFBD>鏁版嵁瀹屾暣鎬?

鉁?鐭ヨ瘑鏌ヨ<EFBFBD>:

  • CRF琛ㄦ牸鍐呭<EFBFBD>
  • 绾冲叆鎺掗櫎鏍囧噯
  • 鐮旂┒娴佺▼

馃敆 鐩稿叧鏂囨。

  • [IIT Manager Agent 寮€鍙戣<E98D99>褰昡(../06-寮€鍙戣<E98D99>褰?)
  • IIT Manager Agent 鎶€鏈<E282AC>€哄姟娓呭崟
  • [MVP寮€鍙戜换鍔℃竻鍗昡(../04-寮€鍙戣<E98D99>鍒?MVP寮€鍙戜换鍔℃竻鍗?md)
  • [Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒抅(../04-寮€鍙戣<E98D99>鍒?Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒?md)

鏂囨。缁存姢: 鎶€鏈<E282AC>洟闃? **鏈€鍚庢洿鏂?*: 2026-01-04
鐗堟湰鍘嗗彶:

  • v1.0 (2026-01-04): 鍒濆<E98D92>鐗堟湰锛孭hase 1.5瀹屾垚