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:
@@ -1,139 +1,139 @@
|
||||
# IIT Manager Agent 鎶€鏈<E282AC>矾寰勪笌鏋舵瀯璁捐<E79281>
|
||||
|
||||
**鏂囨。鐗堟湰**: v1.0
|
||||
**最后更新**: 2026-01-04
|
||||
**状态**: ✅ Phase 1.5 完成并验证
|
||||
**鏈€鍚庢洿鏂?*: 2026-01-04
|
||||
**鐘舵€?*: 鉁?Phase 1.5 瀹屾垚骞堕獙璇?
|
||||
|
||||
---
|
||||
|
||||
## 馃搵 鏂囨。姒傝堪
|
||||
|
||||
本文档详细描述了IIT Manager Agent的技术路径、核心架构和实现方案。系统采用**"意图识别 → 工具调用 → 混合检索 → LLM生成"**的技术路径,实现了零幻觉、高准确率的AI对话能力。
|
||||
鏈<EFBFBD>枃妗h<EFBFBD>缁嗘弿杩颁簡IIT Manager Agent鐨勬妧鏈<EFBFBD>矾寰勩€佹牳蹇冩灦鏋勫拰瀹炵幇鏂规<EFBFBD>銆傜郴缁熼噰鐢?*"鎰忓浘璇嗗埆 鈫?宸ュ叿璋冪敤 鈫?娣峰悎妫€绱?鈫?LLM鐢熸垚"**鐨勬妧鏈<E5A6A7>矾寰勶紝瀹炵幇浜嗛浂骞昏<E9AA9E>銆侀珮鍑嗙‘鐜囩殑AI瀵硅瘽鑳藉姏銆?
|
||||
|
||||
---
|
||||
|
||||
## 馃幆 鎶€鏈<E282AC>矾寰勬€荤粨
|
||||
|
||||
### 核心技术路径
|
||||
### 鏍稿績鎶€鏈<EFBFBD>矾寰?
|
||||
|
||||
```
|
||||
鐢ㄦ埛鎻愰棶
|
||||
→ 意图识别(Intent Detection)
|
||||
→ 工具调用(Tool Calling)
|
||||
→ 混合检索(Hybrid Retrieval)
|
||||
→ LLM生成(LLM Generation)
|
||||
→ 回答用户
|
||||
鈫?鎰忓浘璇嗗埆锛圛ntent Detection锛?
|
||||
鈫?宸ュ叿璋冪敤锛圱ool Calling锛?
|
||||
鈫?娣峰悎妫€绱<E282AC>紙Hybrid Retrieval锛?
|
||||
鈫?LLM鐢熸垚锛圠LM Generation锛?
|
||||
鈫?鍥炵瓟鐢ㄦ埛
|
||||
```
|
||||
|
||||
这是一个**简化版ReAct架构**(Reason + Act),也可以称为**"意图驱动的混合RAG系统"**。
|
||||
杩欐槸涓€涓?*绠€鍖栫増ReAct鏋舵瀯**锛圧eason + Act锛夛紝涔熷彲浠ョО涓?*"鎰忓浘椹卞姩鐨勬贩鍚圧AG绯荤粺"**銆?
|
||||
|
||||
### 技术架构类型
|
||||
### 鎶€鏈<EFBFBD>灦鏋勭被鍨?
|
||||
|
||||
- **架构模式**: 简化版ReAct(Reason + Act)
|
||||
- **检索模式**: 混合RAG(结构化数据 + 非结构化文档)
|
||||
- **意图识别**: 关键词匹配(MVP阶段)
|
||||
- **上下文管理**: SessionMemory(内存缓存)
|
||||
- **防幻觉机制**: RAG数据注入 + 严格System Prompt
|
||||
- **鏋舵瀯妯″紡**: 绠€鍖栫増ReAct锛圧eason + Act锛?
|
||||
- **妫€绱㈡ā寮?*: 娣峰悎RAG锛堢粨鏋勫寲鏁版嵁 + 闈炵粨鏋勫寲鏂囨。锛?
|
||||
- **鎰忓浘璇嗗埆**: 鍏抽敭璇嶅尮閰嶏紙MVP闃舵<E99783>锛?
|
||||
- **涓婁笅鏂囩<EFBFBD>鐞?*: SessionMemory锛堝唴瀛樼紦瀛橈級
|
||||
- **闃插够瑙夋満鍒?*: RAG鏁版嵁娉ㄥ叆 + 涓ユ牸System Prompt
|
||||
|
||||
---
|
||||
|
||||
## 馃搻 瀹屾暣鎶€鏈<E282AC>灦鏋勫浘
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 用户层(User Layer) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ 企业微信(WeChat) │
|
||||
│ - PI通过企业微信发送消息 │
|
||||
│ - 接收AI回复(含"正在查询..."即时反馈) │
|
||||
└────────────────────────┬────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 接入层(Gateway Layer) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ WechatCallbackController │
|
||||
│ - URL验证(签名校验) │
|
||||
│ - 消息加密/解密(AES) │
|
||||
│ - 异步消息处理(5秒内返回200) │
|
||||
│ - 即时反馈:"🫡 正在查询,请稍候..." │
|
||||
└────────────────────────┬────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 对话服务层(Chat Service) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ ChatService(核心大脑) │
|
||||
│ │
|
||||
│ 步骤1: 意图识别(Intent Detection) │
|
||||
│ ├─ 关键词匹配(MVP简化方案) │
|
||||
│ ├─ query_record: "患者"、"ID"、"记录" │
|
||||
│ ├─ count_records: "多少"、"几个"、"统计" │
|
||||
│ ├─ query_protocol: "纳入排除"、"CRF"、"研究方案" │
|
||||
│ └─ general_chat: 其他 │
|
||||
│ │
|
||||
│ 步骤2: 工具调用(Tool Calling) │
|
||||
│ ├─ REDCap数据查询(结构化数据) │
|
||||
│ │ ├─ queryRedcapRecord(recordId) │
|
||||
│ │ ├─ countRedcapRecords() │
|
||||
│ │ └─ getProjectInfo() │
|
||||
│ │ │
|
||||
│ └─ Dify知识库检索(非结构化文档) │
|
||||
│ └─ queryDifyKnowledge(query) │
|
||||
│ └─ 语义检索Top 5相关片段 │
|
||||
│ │
|
||||
│ 步骤3: 上下文管理(Context Management) │
|
||||
│ └─ SessionMemory(内存缓存,保留最近3轮) │
|
||||
│ │
|
||||
│ 步骤4: LLM生成(LLM Generation) │
|
||||
│ └─ DeepSeek-V3(通过LLMFactory调用) │
|
||||
│ ├─ System Prompt(强调基于真实数据) │
|
||||
│ ├─ REDCap查询结果(如果有) │
|
||||
│ ├─ Dify检索结果(如果有) │
|
||||
│ ├─ 对话上下文(SessionMemory) │
|
||||
│ └─ 用户问题 │
|
||||
└────────────────────────┬────────────────────────────────────────┘
|
||||
│
|
||||
┌───────────────┴───────────────┐
|
||||
▼ ▼
|
||||
┌──────────────────────┐ ┌──────────────────────┐
|
||||
│ 数据源层(Data) │ │ 知识源层(Knowledge)│
|
||||
├──────────────────────┤ ├──────────────────────┤
|
||||
│ REDCap数据库 │ │ Dify知识库 │
|
||||
│ - 患者记录(结构化) │ │ - 研究方案PDF │
|
||||
│ - RedcapAdapter │ │ - CRF表格Docx │
|
||||
│ - REST API │ │ - 伦理资料 │
|
||||
│ - 实时查询 │ │ - 向量检索(Qdrant) │
|
||||
└──────────────────────┘ └──────────────────────┘
|
||||
│ │
|
||||
└───────────────┬───────────────┘
|
||||
▼
|
||||
PostgreSQL数据库
|
||||
- 项目配置(dify_dataset_id)
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 鐢ㄦ埛灞傦紙User Layer锛? 鈹?
|
||||
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 浼佷笟寰<E7AC9F>俊锛圵eChat锛? 鈹?
|
||||
鈹? - PI閫氳繃浼佷笟寰<EFBFBD>俊鍙戦€佹秷鎭? 鈹?
|
||||
鈹? - 鎺ユ敹AI鍥炲<EFBFBD>锛堝惈"姝e湪鏌ヨ<E98F8C>..."鍗虫椂鍙嶉<E98D99>锛? 鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹?
|
||||
鈻?
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 鎺ュ叆灞傦紙Gateway Layer锛? 鈹?
|
||||
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? WechatCallbackController 鈹?
|
||||
鈹? - URL楠岃瘉锛堢<EFBFBD>鍚嶆牎楠岋級 鈹?
|
||||
鈹? - 娑堟伅鍔犲瘑/瑙e瘑锛圓ES锛? 鈹?
|
||||
鈹? - 寮傛<EFBFBD>娑堟伅澶勭悊锛?绉掑唴杩斿洖200锛? 鈹?
|
||||
鈹? - 鍗虫椂鍙嶉<EFBFBD>锛?馃<> 姝e湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.." 鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹?
|
||||
鈻?
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 瀵硅瘽鏈嶅姟灞傦紙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鏁版嵁鏌ヨ<EFBFBD>锛堢粨鏋勫寲鏁版嵁锛? 鈹?
|
||||
鈹? 鈹? 鈹溾攢 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锛堝己璋冨熀浜庣湡瀹炴暟鎹<EFBFBD>級 鈹?
|
||||
鈹? 鈹溾攢 REDCap鏌ヨ<EFBFBD>缁撴灉锛堝<EFBFBD>鏋滄湁锛? 鈹?
|
||||
鈹? 鈹溾攢 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級 鈹?
|
||||
鈹? 鈹溾攢 瀵硅瘽涓婁笅鏂囷紙SessionMemory锛? 鈹?
|
||||
鈹? 鈹斺攢 鐢ㄦ埛闂<E59F9B><E99782> 鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹?
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈻? 鈻?
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 鏁版嵁婧愬眰锛圖ata锛? 鈹? 鈹? 鐭ヨ瘑婧愬眰锛圞nowledge锛夆攤
|
||||
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? REDCap鏁版嵁搴? 鈹? 鈹? Dify鐭ヨ瘑搴? 鈹?
|
||||
鈹? - 鎮h€呰<EFBFBD>褰曪紙缁撴瀯鍖栵級 鈹? 鈹? - 鐮旂┒鏂规<E98F82>PDF 鈹?
|
||||
鈹? - RedcapAdapter 鈹? 鈹? - CRF琛ㄦ牸Docx 鈹?
|
||||
鈹? - REST API 鈹? 鈹? - 浼︾悊璧勬枡 鈹?
|
||||
鈹? - 瀹炴椂鏌ヨ<EFBFBD> 鈹? 鈹? - 鍚戦噺妫€绱<EFBFBD>紙Qdrant锛?鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈻?
|
||||
PostgreSQL鏁版嵁搴?
|
||||
- 椤圭洰閰嶇疆锛坉ify_dataset_id锛?
|
||||
- 瀹¤<E780B9>鏃ュ織
|
||||
- 鐢ㄦ埛鏄犲皠
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔑 核心技术组件
|
||||
## 馃攽 鏍稿績鎶€鏈<E282AC>粍浠?
|
||||
|
||||
### 1. 意图识别(Intent Detection)
|
||||
### 1. 鎰忓浘璇嗗埆锛圛ntent Detection锛?
|
||||
|
||||
#### 瀹炵幇鏂瑰紡
|
||||
- **褰撳墠鏂规<E98F82>**: 鍏抽敭璇嶅尮閰嶏紙绠€鍗曢珮鏁堬級
|
||||
- **识别准确率**: 100%(5次测试全部正确)
|
||||
- **璇嗗埆鍑嗙‘鐜?*: 100%锛?娆℃祴璇曞叏閮ㄦ<E996AE>纭<EFBFBD>級
|
||||
- **鍝嶅簲閫熷害**: <10ms
|
||||
|
||||
#### 鎰忓浘绫诲瀷
|
||||
|
||||
| 意图类型 | 关键词 | 触发工具 | 示例 |
|
||||
| 鎰忓浘绫诲瀷 | 鍏抽敭璇?| 瑙﹀彂宸ュ叿 | 绀轰緥 |
|
||||
|---------|--------|----------|------|
|
||||
| `query_record` | "患者"、"ID"、"记录"、"受试者" | REDCap单条查询 | "查询ID 7的患者情况" |
|
||||
| `count_records` | "多少"、"几个"、"统计"、"总共" | REDCap统计查询 | "目前有多少位患者入组?" |
|
||||
| `query_protocol` | "纳入排除"、"CRF"、"研究方案"、"伦理" | Dify知识库检索 | "这个研究的排除标准是什么?" |
|
||||
| `project_info` | "项目"、"研究"、"信息" | 数据库查询 | "这是什么项目?" |
|
||||
| `general_chat` | 其他 | 无工具调用 | "你好" |
|
||||
| `query_record` | "鎮h€?銆?ID"銆?璁板綍"銆?鍙楄瘯鑰? | REDCap鍗曟潯鏌ヨ<EFBFBD> | "鏌ヨ<EFBFBD>ID 7鐨勬偅鑰呮儏鍐? |
|
||||
| `count_records` | "澶氬皯"銆?鍑犱釜"銆?缁熻<E7BC81>"銆?鎬诲叡" | REDCap缁熻<E7BC81>鏌ヨ<E98F8C> | "鐩<>墠鏈夊<E98F88>灏戜綅鎮h€呭叆缁勶紵" |
|
||||
| `query_protocol` | "绾冲叆鎺掗櫎"銆?CRF"銆?鐮旂┒鏂规<E98F82>"銆?浼︾悊" | Dify鐭ヨ瘑搴撴<E690B4>绱?| "杩欎釜鐮旂┒鐨勬帓闄ゆ爣鍑嗘槸浠€涔堬紵" |
|
||||
| `project_info` | "椤圭洰"銆?鐮旂┒"銆?淇℃伅" | 鏁版嵁搴撴煡璇?| "杩欐槸浠€涔堥」鐩<E3808D>紵" |
|
||||
| `general_chat` | 鍏朵粬 | 鏃犲伐鍏疯皟鐢?| "浣犲ソ" |
|
||||
|
||||
#### 浠g爜瀹炵幇
|
||||
|
||||
@@ -148,8 +148,8 @@ private detectIntent(message: string): {
|
||||
return { intent: 'query_protocol' };
|
||||
}
|
||||
|
||||
// 2. 识别记录查询(包含ID号码)
|
||||
const recordIdMatch = message.match(/(?:ID|记录|患者|受试者).*?(\d+)|(\d+).*?(?:入组|数据|信息)/i);
|
||||
// 2. 璇嗗埆璁板綍鏌ヨ<EFBFBD>锛堝寘鍚獻D鍙风爜锛?
|
||||
const recordIdMatch = message.match(/(?:ID|璁板綍|鎮h€厊鍙楄瘯鑰?.*?(\d+)|(\d+).*?(?:鍏ョ粍|鏁版嵁|淇℃伅)/i);
|
||||
if (recordIdMatch) {
|
||||
return {
|
||||
intent: 'query_record',
|
||||
@@ -158,7 +158,7 @@ private detectIntent(message: string): {
|
||||
}
|
||||
|
||||
// 3. 璇嗗埆缁熻<E7BC81>鏌ヨ<E98F8C>
|
||||
if (/(多少|几个|几条|总共|统计).*?(记录|患者|受试者|人)/.test(message)) {
|
||||
if (/(澶氬皯|鍑犱釜|鍑犳潯|鎬诲叡|缁熻<E7BC81>).*?(璁板綍|鎮h€厊鍙楄瘯鑰厊浜?/.test(message)) {
|
||||
return { intent: 'count_records' };
|
||||
}
|
||||
|
||||
@@ -167,28 +167,28 @@ private detectIntent(message: string): {
|
||||
return { intent: 'project_info' };
|
||||
}
|
||||
|
||||
// 5. 默认:普通对话
|
||||
// 5. 榛樿<EFBFBD>锛氭櫘閫氬<EFBFBD>璇?
|
||||
return { intent: 'general_chat' };
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 工具调用(Tool Calling)
|
||||
### 2. 宸ュ叿璋冪敤锛圱ool Calling锛?
|
||||
|
||||
#### 2.1 REDCap宸ュ叿
|
||||
|
||||
**功能**: 查询结构化的患者数据
|
||||
**鍔熻兘**: 鏌ヨ<EFBFBD>缁撴瀯鍖栫殑鎮h€呮暟鎹?
|
||||
|
||||
**宸ュ叿鍒楄〃**:
|
||||
|
||||
| 宸ュ叿鍚嶇О | 鍔熻兘 | 杈撳叆 | 杈撳嚭 | 鍝嶅簲鏃堕棿 |
|
||||
|---------|------|------|------|----------|
|
||||
| `queryRedcapRecord` | 查询单条患者记录 | recordId | 患者详细信息 | ~1.2秒 |
|
||||
| `countRedcapRecords` | 统计患者总数 | 无 | 总数+记录ID列表 | ~1.3秒 |
|
||||
| `getProjectInfo` | 获取项目信息 | 无 | 项目基本信息 | ~50ms |
|
||||
| `queryRedcapRecord` | 鏌ヨ<EFBFBD>鍗曟潯鎮h€呰<EFBFBD>褰?| recordId | 鎮h€呰<EFBFBD>缁嗕俊鎭?| ~1.2绉?|
|
||||
| `countRedcapRecords` | 缁熻<EFBFBD>鎮h€呮€绘暟 | 鏃?| 鎬绘暟+璁板綍ID鍒楄〃 | ~1.3绉?|
|
||||
| `getProjectInfo` | 鑾峰彇椤圭洰淇℃伅 | 鏃?| 椤圭洰鍩烘湰淇℃伅 | ~50ms |
|
||||
|
||||
**技术实现**:
|
||||
**鎶€鏈<EFBFBD>疄鐜?*:
|
||||
|
||||
```typescript
|
||||
// backend/src/modules/iit-manager/adapters/RedcapAdapter.ts
|
||||
@@ -220,15 +220,15 @@ export class RedcapAdapter {
|
||||
|
||||
**鍔熻兘**: 妫€绱㈤潪缁撴瀯鍖栫殑鐮旂┒鏂囨。
|
||||
|
||||
**检索配置**:
|
||||
**妫€绱㈤厤缃?*:
|
||||
|
||||
| 参数 | 值 | 说明 |
|
||||
| 鍙傛暟 | 鍊?| 璇存槑 |
|
||||
|------|-----|------|
|
||||
| `search_method` | semantic_search | 璇<>箟妫€绱<E282AC>紙鍚戦噺鐩镐技搴︼級 |
|
||||
| `top_k` | 5 | 杩斿洖Top 5鐩稿叧鐗囨<E99097> |
|
||||
| `chunk_size` | 1500 tokens | 每个片段大小(Dify配置) |
|
||||
| `chunk_size` | 1500 tokens | 姣忎釜鐗囨<EFBFBD>澶у皬锛圖ify閰嶇疆锛?|
|
||||
|
||||
**技术实现**:
|
||||
**鎶€鏈<EFBFBD>疄鐜?*:
|
||||
|
||||
```typescript
|
||||
// backend/src/modules/iit-manager/services/ChatService.ts
|
||||
@@ -253,11 +253,11 @@ private async queryDifyKnowledge(query: string): Promise<string> {
|
||||
}
|
||||
);
|
||||
|
||||
// 3. 格式化检索结果
|
||||
// 3. 鏍煎紡鍖栨<EFBFBD>绱㈢粨鏋?
|
||||
let formattedKnowledge = '';
|
||||
result.records.forEach((record, index) => {
|
||||
const score = (record.score * 100).toFixed(1);
|
||||
formattedKnowledge += `\n[文档${index + 1}] ${record.document_name} (相关度: ${score}%)\n`;
|
||||
formattedKnowledge += `\n[鏂囨。${index + 1}] ${record.document_name} (鐩稿叧搴? ${score}%)\n`;
|
||||
formattedKnowledge += `${record.content}\n---\n`;
|
||||
});
|
||||
|
||||
@@ -267,25 +267,25 @@ private async queryDifyKnowledge(query: string): Promise<string> {
|
||||
|
||||
---
|
||||
|
||||
### 3. 混合检索(Hybrid Retrieval)
|
||||
### 3. 娣峰悎妫€绱<EFBFBD>紙Hybrid Retrieval锛?
|
||||
|
||||
**核心创新点**: 结合结构化数据和非结构化文档
|
||||
**鏍稿績鍒涙柊鐐?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。
|
||||
|
||||
#### 检索策略对比
|
||||
#### 妫€绱㈢瓥鐣ュ<EFBFBD>姣?
|
||||
|
||||
| 检索类型 | 数据源 | 适用场景 | 检索方式 | 示例查询 |
|
||||
| 妫€绱㈢被鍨?| 鏁版嵁婧?| 閫傜敤鍦烘櫙 | 妫€绱㈡柟寮?| 绀轰緥鏌ヨ<E98F8C> |
|
||||
|---------|--------|---------|---------|----------|
|
||||
| **结构化数据检索** | REDCap | 患者记录、统计数据、入组信息 | SQL查询(精确匹配) | "查询ID 7的患者" |
|
||||
| **非结构化文档检索** | Dify知识库 | 研究方案、CRF表格、伦理资料 | 向量检索(语义相似) | "研究的纳入排除标准" |
|
||||
| **缁撴瀯鍖栨暟鎹<EFBFBD><EFBFBD>绱?* | REDCap | 鎮h€呰<E282AC>褰曘€佺粺璁℃暟鎹<E69A9F>€佸叆缁勪俊鎭?| SQL鏌ヨ<E98F8C>锛堢簿纭<E7B0BF>尮閰嶏級 | "鏌ヨ<EFBFBD>ID 7鐨勬偅鑰? |
|
||||
| **闈炵粨鏋勫寲鏂囨。妫€绱?* | Dify鐭ヨ瘑搴?| 鐮旂┒鏂规<E98F82>銆丆RF琛ㄦ牸銆佷鸡鐞嗚祫鏂?| 鍚戦噺妫€绱<E282AC>紙璇<E7B499>箟鐩镐技锛?| "鐮旂┒鐨勭撼鍏ユ帓闄ゆ爣鍑? |
|
||||
|
||||
#### 浼樺娍
|
||||
|
||||
✅ **互补性**: 两种数据源覆盖PI的所有需求
|
||||
✅ **自动化**: 根据意图自动选择数据源
|
||||
✅ **高效性**: 响应速度快(平均4.8秒)
|
||||
✅ **准确性**: 100%基于真实数据
|
||||
鉁?**浜掕ˉ鎬?*: 涓ょ<E6B693>鏁版嵁婧愯<E5A9A7>鐩朠I鐨勬墍鏈夐渶姹?
|
||||
鉁?**鑷<>姩鍖?*: 鏍规嵁鎰忓浘鑷<E6B598>姩閫夋嫨鏁版嵁婧?
|
||||
鉁?**楂樻晥鎬?*: 鍝嶅簲閫熷害蹇<E5AEB3>紙骞冲潎4.8绉掞級
|
||||
鉁?**鍑嗙‘鎬?*: 100%鍩轰簬鐪熷疄鏁版嵁
|
||||
|
||||
#### 技术流程
|
||||
#### 鎶€鏈<EFBFBD>祦绋?
|
||||
|
||||
```typescript
|
||||
async handleMessage(userId: string, userMessage: string): Promise<string> {
|
||||
@@ -303,12 +303,12 @@ async handleMessage(userId: string, userMessage: string): Promise<string> {
|
||||
toolResult = await this.countRedcapRecords();
|
||||
}
|
||||
|
||||
// Dify知识库检索
|
||||
// Dify鐭ヨ瘑搴撴<EFBFBD>绱?
|
||||
if (intent === 'query_protocol') {
|
||||
difyKnowledge = await this.queryDifyKnowledge(userMessage);
|
||||
}
|
||||
|
||||
// 3. 组装上下文
|
||||
// 3. 缁勮<EFBFBD>涓婁笅鏂?
|
||||
const messages = this.buildMessagesWithData(
|
||||
userMessage,
|
||||
context,
|
||||
@@ -325,31 +325,31 @@ async handleMessage(userId: string, userMessage: string): Promise<string> {
|
||||
|
||||
---
|
||||
|
||||
### 4. RAG(Retrieval Augmented Generation)
|
||||
### 4. RAG锛圧etrieval Augmented Generation锛?
|
||||
|
||||
**核心作用**: 防止AI幻觉,确保回答基于真实数据
|
||||
**鏍稿績浣滅敤**: 闃叉<EFBFBD>AI骞昏<EFBFBD>锛岀‘淇濆洖绛斿熀浜庣湡瀹炴暟鎹?
|
||||
|
||||
#### RAG瀹炵幇鏈哄埗
|
||||
|
||||
```typescript
|
||||
// System Prompt锛堝己璋冨熀浜庣湡瀹炴暟鎹<E69A9F>級
|
||||
const systemPrompt = `你是IIT Manager智能助手。
|
||||
const systemPrompt = `浣犳槸IIT Manager鏅鸿兘鍔╂墜銆?
|
||||
|
||||
【重要原则】
|
||||
⚠️ 你**必须基于系统提供的数据和文档**回答问题,**绝对不能编造信息**。
|
||||
⚠️ 如果系统提供了查询结果或文档内容,请使用这些真实信息;如果没有提供,明确告知用户。
|
||||
銆愰噸瑕佸師鍒欍€?
|
||||
鈿狅笍 浣?*蹇呴』鍩轰簬绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。**鍥炵瓟闂<E7939F><E99782>锛?*缁濆<E7BC81>涓嶈兘缂栭€犱俊鎭?*銆?
|
||||
鈿狅笍 濡傛灉绯荤粺鎻愪緵浜嗘煡璇㈢粨鏋滄垨鏂囨。鍐呭<E98D90>锛岃<E9949B>浣跨敤杩欎簺鐪熷疄淇℃伅锛涘<E9949B>鏋滄病鏈夋彁渚涳紝鏄庣‘鍛婄煡鐢ㄦ埛銆?
|
||||
|
||||
【你的能力】
|
||||
✅ 回答研究进展问题(基于REDCap实时数据)
|
||||
✅ 查询患者记录详情
|
||||
✅ 统计入组人数
|
||||
✅ 提供项目信息
|
||||
✅ 解答研究方案相关问题(基于知识库文档)
|
||||
銆愪綘鐨勮兘鍔涖€?
|
||||
鉁?鍥炵瓟鐮旂┒杩涘睍闂<E79D8D><E99782>锛堝熀浜嶳EDCap瀹炴椂鏁版嵁锛?
|
||||
鉁?鏌ヨ<E98F8C>鎮h€呰<E282AC>褰曡<E8A4B0>鎯?
|
||||
鉁?缁熻<E7BC81>鍏ョ粍浜烘暟
|
||||
鉁?鎻愪緵椤圭洰淇℃伅
|
||||
鉁?瑙g瓟鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>锛堝熀浜庣煡璇嗗簱鏂囨。锛?
|
||||
|
||||
【回复原则】
|
||||
1. **基于事实**:只使用系统提供的数据和文档,不编造
|
||||
2. **简洁专业**:控制在150字以内
|
||||
3. **友好礼貌**:使用"您"称呼PI
|
||||
銆愬洖澶嶅師鍒欍€?
|
||||
1. **鍩轰簬浜嬪疄**锛氬彧浣跨敤绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。锛屼笉缂栭€?
|
||||
2. **绠€娲佷笓涓?*锛氭帶鍒跺湪150瀛椾互鍐?
|
||||
3. **鍙嬪ソ绀艰矊**锛氫娇鐢?鎮?绉板懠PI
|
||||
4. **寮曞<E5AFAE>琛屽姩**锛氬<E9949B>闇€鏇村<E98F87>璇︾粏淇℃伅锛屽缓璁<E7BC93>煡鐪嬪畬鏁存枃妗f垨鐧诲綍REDCap绯荤粺
|
||||
`;
|
||||
|
||||
@@ -369,19 +369,19 @@ if (difyKnowledge) {
|
||||
}
|
||||
```
|
||||
|
||||
#### 防幻觉效果验证
|
||||
#### 闃插够瑙夋晥鏋滈獙璇?
|
||||
|
||||
测试结果显示:
|
||||
- ✅ 所有回答都明确引用数据来源
|
||||
- ✅ AI不再编造不存在的信息
|
||||
- ✅ 当文档不完整时,AI诚实告知
|
||||
- ✅ 准确率:100%(5次测试)
|
||||
娴嬭瘯缁撴灉鏄剧ず锛?
|
||||
- 鉁?鎵€鏈夊洖绛旈兘鏄庣‘寮曠敤鏁版嵁鏉ユ簮
|
||||
- 鉁?AI涓嶅啀缂栭€犱笉瀛樺湪鐨勪俊鎭?
|
||||
- 鉁?褰撴枃妗d笉瀹屾暣鏃讹紝AI璇氬疄鍛婄煡
|
||||
- 鉁?鍑嗙‘鐜囷細100%锛?娆℃祴璇曪級
|
||||
|
||||
---
|
||||
|
||||
### 5. 上下文管理(Context Management)
|
||||
### 5. 涓婁笅鏂囩<EFBFBD>鐞嗭紙Context Management锛?
|
||||
|
||||
**功能**: SessionMemory - 保留最近3轮对话
|
||||
**鍔熻兘**: SessionMemory - 淇濈暀鏈€杩?杞<><E69D9E>璇?
|
||||
|
||||
#### 瀹炵幇鏂规<E98F82>
|
||||
|
||||
@@ -389,7 +389,7 @@ if (difyKnowledge) {
|
||||
// backend/src/modules/iit-manager/agents/SessionMemory.ts
|
||||
export class SessionMemory {
|
||||
private sessions: Map<string, ConversationHistory> = new Map();
|
||||
private readonly MAX_HISTORY = 3; // 只保留最近3轮
|
||||
private readonly MAX_HISTORY = 3; // 鍙<EFBFBD>繚鐣欐渶杩?杞?
|
||||
|
||||
addMessage(userId: string, role: 'user' | 'assistant', content: string): void {
|
||||
let session = this.sessions.get(userId);
|
||||
@@ -401,7 +401,7 @@ export class SessionMemory {
|
||||
session.messages.push({ role, content, timestamp: Date.now() });
|
||||
session.lastAccessTime = Date.now();
|
||||
|
||||
// 保持最近3轮对话(6条消息)
|
||||
// 淇濇寔鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>級
|
||||
if (session.messages.length > this.MAX_HISTORY * 2) {
|
||||
session.messages = session.messages.slice(-this.MAX_HISTORY * 2);
|
||||
}
|
||||
@@ -421,22 +421,22 @@ export class SessionMemory {
|
||||
#### 璁捐<E79281>鑰冭檻
|
||||
|
||||
- **鍐呭瓨缂撳瓨**: Node.js Map锛堥€熷害蹇<E5AEB3>紝婊¤冻MVP闇€姹傦級
|
||||
- **自动清理**: 30分钟无活动自动清理
|
||||
- **容量限制**: 最近3轮对话(6条消息)
|
||||
- **多用户支持**: 以userId为key隔离
|
||||
- **鑷<EFBFBD>姩娓呯悊**: 30鍒嗛挓鏃犳椿鍔ㄨ嚜鍔ㄦ竻鐞?
|
||||
- **瀹归噺闄愬埗**: 鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>級
|
||||
- **澶氱敤鎴锋敮鎸?*: 浠<EFBFBD>serId涓簁ey闅旂<EFBFBD>
|
||||
|
||||
---
|
||||
|
||||
### 6. LLM生成(LLM Generation)
|
||||
### 6. LLM鐢熸垚锛圠LM Generation锛?
|
||||
|
||||
#### 妯″瀷閫夋嫨
|
||||
|
||||
| 鎸囨爣 | DeepSeek-V3 | 璇存槑 |
|
||||
|------|-------------|------|
|
||||
| **鎴愭湰** | 楼1/鐧句竾tokens | 鏋佷綆鎴愭湰 |
|
||||
| **上下文** | 64K tokens | 满足需求 |
|
||||
| **涓婁笅鏂?* | 64K tokens | 婊¤冻闇€姹?|
|
||||
| **鏁堟灉** | 浼樼<E6B5BC> | 涓嶨PT-4鐩稿綋 |
|
||||
| **响应速度** | ~3秒 | 满足企业微信要求 |
|
||||
| **鍝嶅簲閫熷害** | ~3绉?| 婊¤冻浼佷笟寰<E7AC9F>俊瑕佹眰 |
|
||||
|
||||
#### 璋冪敤鏂瑰紡
|
||||
|
||||
@@ -451,35 +451,35 @@ const response = await llm.chat(messages, {
|
||||
});
|
||||
```
|
||||
|
||||
#### Token消耗统计
|
||||
#### Token娑堣€楃粺璁?
|
||||
|
||||
| 鍦烘櫙 | 杈撳叆Tokens | 杈撳嚭Tokens | 鎬籘okens | 鎴愭湰 |
|
||||
|------|-----------|-----------|----------|------|
|
||||
| 鎺掗櫎鏍囧噯鏌ヨ<E98F8C> | 340 | 79 | 419 | 楼0.00042 |
|
||||
| CRF鎸囨爣鏌ヨ<E98F8C> | 434 | 75 | 509 | 楼0.00051 |
|
||||
| ID 7患者查询 | 627 | 88 | 715 | ¥0.00072 |
|
||||
| ID 7鎮h€呮煡璇?| 627 | 88 | 715 | 楼0.00072 |
|
||||
| 鐮旂┒鐩<E29492>殑鏌ヨ<E98F8C> | 522 | 57 | 579 | 楼0.00058 |
|
||||
| 患者统计查询 | 505 | 42 | 547 | ¥0.00055 |
|
||||
| 鎮h€呯粺璁℃煡璇?| 505 | 42 | 547 | 楼0.00055 |
|
||||
|
||||
**平均成本**: ¥0.00056/次对话(极低)
|
||||
**骞冲潎鎴愭湰**: 楼0.00056/娆″<EFBFBD>璇濓紙鏋佷綆锛?
|
||||
|
||||
---
|
||||
|
||||
### 7. 企业微信集成(WeChat Integration)
|
||||
### 7. 浼佷笟寰<EFBFBD>俊闆嗘垚锛圵eChat Integration锛?
|
||||
|
||||
#### 鏍稿績鍔熻兘
|
||||
|
||||
1. **消息加解密**: AES + SHA1签名验证
|
||||
2. **异步处理**: 5秒内返回200,后台处理消息
|
||||
3. **即时反馈**: "🫡 正在查询,请稍候..."
|
||||
4. **主动推送**: 通过企业微信API发送回复
|
||||
1. **娑堟伅鍔犺В瀵?*: AES + SHA1绛惧悕楠岃瘉
|
||||
2. **寮傛<EFBFBD>澶勭悊**: 5绉掑唴杩斿洖200锛屽悗鍙板<EFBFBD>鐞嗘秷鎭?
|
||||
3. **鍗虫椂鍙嶉<EFBFBD>**: "馃<EFBFBD> 姝e湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.."
|
||||
4. **涓诲姩鎺ㄩ€?*: 閫氳繃浼佷笟寰<E7AC9F>俊API鍙戦€佸洖澶?
|
||||
|
||||
#### 技术实现
|
||||
#### 鎶€鏈<EFBFBD>疄鐜?
|
||||
|
||||
```typescript
|
||||
// backend/src/modules/iit-manager/controllers/WechatCallbackController.ts
|
||||
async handlePost(request: FastifyRequest, reply: FastifyReply) {
|
||||
// 1. 立即返回200(5秒内)
|
||||
// 1. 绔嬪嵆杩斿洖200锛?绉掑唴锛?
|
||||
reply.send('success');
|
||||
|
||||
// 2. 寮傛<E5AFAE>澶勭悊娑堟伅
|
||||
@@ -491,13 +491,13 @@ async handlePost(request: FastifyRequest, reply: FastifyReply) {
|
||||
private async processMessageAsync(xmlData: any) {
|
||||
const { FromUserName, Content } = this.extractMessage(xmlData);
|
||||
|
||||
// 3. 发送即时反馈
|
||||
await this.sendTextMessage(FromUserName, '🫡 正在查询,请稍候...');
|
||||
// 3. 鍙戦€佸嵆鏃跺弽棣?
|
||||
await this.sendTextMessage(FromUserName, '馃<EFBFBD> 姝e湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?..');
|
||||
|
||||
// 4. 璋冪敤ChatService澶勭悊
|
||||
const answer = await this.chatService.handleMessage(FromUserName, Content);
|
||||
|
||||
// 5. 发送最终回复
|
||||
// 5. 鍙戦€佹渶缁堝洖澶?
|
||||
await this.sendTextMessage(FromUserName, answer);
|
||||
}
|
||||
```
|
||||
@@ -508,60 +508,60 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
```
|
||||
鐢ㄦ埛鎻愰棶
|
||||
↓
|
||||
鈫?
|
||||
浼佷笟寰<EFBFBD>俊娑堟伅
|
||||
↓
|
||||
鈫?
|
||||
[WechatCallbackController]
|
||||
├→ 立即返回200(<5秒)
|
||||
鈹溾啋 绔嬪嵆杩斿洖200锛?5绉掞級
|
||||
鈹斺啋 寮傛<E5AFAE>澶勭悊
|
||||
↓
|
||||
鈫?
|
||||
[ChatService.handleMessage()]
|
||||
↓
|
||||
1. 意图识别(关键词匹配)
|
||||
├→ query_protocol?
|
||||
├→ query_record?
|
||||
└→ count_records?
|
||||
↓
|
||||
2. 工具调用(并行或单一)
|
||||
鈫?
|
||||
1. 鎰忓浘璇嗗埆锛堝叧閿<EFBFBD>瘝鍖归厤锛?
|
||||
鈹溾啋 query_protocol锛?
|
||||
鈹溾啋 query_record锛?
|
||||
鈹斺啋 count_records锛?
|
||||
鈫?
|
||||
2. 宸ュ叿璋冪敤锛堝苟琛屾垨鍗曚竴锛?
|
||||
鈹溾啋 queryDifyKnowledge()
|
||||
│ └→ Dify API(语义检索)
|
||||
│ └→ 返回Top 5文档片段
|
||||
│
|
||||
鈹? 鈹斺啋 Dify API锛堣<EFBFBD>涔夋<EFBFBD>绱<EFBFBD>級
|
||||
鈹? 鈹斺啋 杩斿洖Top 5鏂囨。鐗囨<E99097>
|
||||
鈹?
|
||||
鈹斺啋 queryRedcapRecord()
|
||||
└→ REDCap API(SQL查询)
|
||||
└→ 返回患者记录
|
||||
↓
|
||||
3. 上下文组装
|
||||
鈹斺啋 REDCap API锛圫QL鏌ヨ<EFBFBD>锛?
|
||||
鈹斺啋 杩斿洖鎮h€呰<E282AC>褰?
|
||||
鈫?
|
||||
3. 涓婁笅鏂囩粍瑁?
|
||||
鈹溾啋 System Prompt锛堝熀浜庣湡瀹炴暟鎹<E69A9F>師鍒欙級
|
||||
├→ REDCap查询结果(如果有)
|
||||
鈹溾啋 REDCap鏌ヨ<EFBFBD>缁撴灉锛堝<EFBFBD>鏋滄湁锛?
|
||||
鈹溾啋 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級
|
||||
├→ SessionMemory上下文
|
||||
鈹溾啋 SessionMemory涓婁笅鏂?
|
||||
鈹斺啋 鐢ㄦ埛闂<E59F9B><E99782>
|
||||
↓
|
||||
4. LLM生成(DeepSeek-V3)
|
||||
└→ 生成回答(基于注入的数据)
|
||||
↓
|
||||
鈫?
|
||||
4. LLM鐢熸垚锛圖eepSeek-V3锛?
|
||||
鈹斺啋 鐢熸垚鍥炵瓟锛堝熀浜庢敞鍏ョ殑鏁版嵁锛?
|
||||
鈫?
|
||||
5. 淇濆瓨鍒癝essionMemory
|
||||
↓
|
||||
鈫?
|
||||
6. 鎺ㄩ€佸埌浼佷笟寰<E7AC9F>俊
|
||||
↓
|
||||
鈫?
|
||||
鐢ㄦ埛鏀跺埌鍥炲<EFBFBD>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 关键技术决策
|
||||
## 馃幆 鍏抽敭鎶€鏈<E282AC>喅绛?
|
||||
|
||||
| 决策点 | 选择方案 | 替代方案 | 选择原因 |
|
||||
| 鍐崇瓥鐐?| 閫夋嫨鏂规<E98F82> | 鏇夸唬鏂规<E98F82> | 閫夋嫨鍘熷洜 |
|
||||
|-------|---------|---------|---------|
|
||||
| **意图识别** | 关键词匹配 | LLM判断、BERT分类 | MVP阶段,简单高效,准确率高(100%) |
|
||||
| **鎰忓浘璇嗗埆** | 鍏抽敭璇嶅尮閰?| LLM鍒ゆ柇銆丅ERT鍒嗙被 | MVP闃舵<E99783>锛岀畝鍗曢珮鏁堬紝鍑嗙‘鐜囬珮锛?00%锛?|
|
||||
| **宸ュ叿璋冪敤** | 鍚屾<E98D9A>涓茶<E6B693> | 骞惰<E9AA9E>璋冪敤 | 鍝嶅簲蹇<E7B0B2>紙<5绉掞級锛岄€昏緫娓呮櫚锛屾槗璋冭瘯 |
|
||||
| **知识库** | Dify本地部署 | 自建向量库、云服务 | 数据安全,响应快,成本低,易维护 |
|
||||
| **向量数据库** | Qdrant(Dify内置) | Milvus、Pinecone | 高性能,无需额外部署 |
|
||||
| **LLM** | DeepSeek-V3 | GPT-4、Claude | 成本低(¥1/百万tokens),效果好 |
|
||||
| **上下文存储** | 内存缓存(Map) | Redis、数据库 | 速度快,满足MVP需求,易实现 |
|
||||
| **鐭ヨ瘑搴?* | Dify鏈<79>湴閮ㄧ讲 | 鑷<>缓鍚戦噺搴撱€佷簯鏈嶅姟 | 鏁版嵁瀹夊叏锛屽搷搴斿揩锛屾垚鏈<E59E9A>綆锛屾槗缁存姢 |
|
||||
| **鍚戦噺鏁版嵁搴?* | Qdrant锛圖ify鍐呯疆锛?| Milvus銆丳inecone | 楂樻€ц兘锛屾棤闇€棰濆<EFBFBD>閮ㄧ讲 |
|
||||
| **LLM** | DeepSeek-V3 | GPT-4銆丆laude | 鎴愭湰浣庯紙楼1/鐧句竾tokens锛夛紝鏁堟灉濂?|
|
||||
| **涓婁笅鏂囧瓨鍌?* | 鍐呭瓨缂撳瓨锛圡ap锛?| Redis銆佹暟鎹<E69A9F>簱 | 閫熷害蹇<E5AEB3>紝婊¤冻MVP闇€姹傦紝鏄撳疄鐜?|
|
||||
| **鏁版嵁娉ㄥ叆** | System Prompt | Function Calling | 绠€鍗曠洿鎺ワ紝闃叉<E99783>骞昏<E9AA9E>锛屾晥鏋滃ソ |
|
||||
| **异步处理** | Node.js异步 | 消息队列(pg-boss) | 简单,满足企业微信5秒限制 |
|
||||
| **寮傛<EFBFBD>澶勭悊** | Node.js寮傛<EFBFBD> | 娑堟伅闃熷垪锛坧g-boss锛?| 绠€鍗曪紝婊¤冻浼佷笟寰<E7AC9F>俊5绉掗檺鍒?|
|
||||
|
||||
---
|
||||
|
||||
@@ -571,62 +571,62 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
| 闃舵<E99783> | 鑰楁椂 | 鍗犳瘮 | 浼樺寲绌洪棿 |
|
||||
|------|------|------|----------|
|
||||
| 意图识别 | <10ms | <1% | ✅ 已最优 |
|
||||
| REDCap查询 | 1.2-1.3秒 | 25% | 🔵 可优化(加缓存) |
|
||||
| Dify检索 | 1.5-1.7秒 | 30% | 🔵 可优化(调整top_k) |
|
||||
| LLM生成 | 3.0-3.5秒 | 65% | ⚠️ 受限于模型速度 |
|
||||
| **总计** | **4.8秒** | **100%** | ✅ 满足<5秒要求 |
|
||||
| 鎰忓浘璇嗗埆 | <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消耗分析
|
||||
### Token娑堣€楀垎鏋?
|
||||
|
||||
| 指标 | 数值 |
|
||||
| 鎸囨爣 | 鏁板€?|
|
||||
|------|------|
|
||||
| 平均输入Tokens | 486 tokens/次 |
|
||||
| 平均输出Tokens | 68 tokens/次 |
|
||||
| 平均总Tokens | 554 tokens/次 |
|
||||
| 平均成本 | ¥0.00055/次对话 |
|
||||
| 骞冲潎杈撳叆Tokens | 486 tokens/娆?|
|
||||
| 骞冲潎杈撳嚭Tokens | 68 tokens/娆?|
|
||||
| 骞冲潎鎬籘okens | 554 tokens/娆?|
|
||||
| 骞冲潎鎴愭湰 | 楼0.00055/娆″<EFBFBD>璇?|
|
||||
|
||||
### 准确率指标
|
||||
### 鍑嗙‘鐜囨寚鏍?
|
||||
|
||||
| 指标 | 数值 | 说明 |
|
||||
| 鎸囨爣 | 鏁板€?| 璇存槑 |
|
||||
|------|------|------|
|
||||
| 意图识别准确率 | 100% | 5次测试全部正确 |
|
||||
| 数据检索成功率 | 100% | 无失败案例 |
|
||||
| 回答准确率 | 100% | 所有回答基于真实数据 |
|
||||
| 幻觉率 | 0% | 无编造信息 |
|
||||
| 鎰忓浘璇嗗埆鍑嗙‘鐜?| 100% | 5娆℃祴璇曞叏閮ㄦ<E996AE>纭?|
|
||||
| 鏁版嵁妫€绱㈡垚鍔熺巼 | 100% | 鏃犲け璐ユ<EFBFBD>渚?|
|
||||
| 鍥炵瓟鍑嗙‘鐜?| 100% | 鎵€鏈夊洖绛斿熀浜庣湡瀹炴暟鎹?|
|
||||
| 骞昏<EFBFBD>鐜?| 0% | 鏃犵紪閫犱俊鎭?|
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Phase 1.5 技术成果
|
||||
## 馃殌 Phase 1.5 鎶€鏈<EFBFBD>垚鏋?
|
||||
|
||||
### 鏍稿績绐佺牬
|
||||
|
||||
1. ✅ **零幻觉**: 所有回答都基于真实数据/文档
|
||||
2. ✅ **混合检索**: 结构化数据(REDCap)+ 非结构化文档(Dify)
|
||||
3. ✅ **快速响应**: 平均4.8秒(满足企业微信<5秒要求)
|
||||
4. ✅ **高准确率**: 意图识别100%,数据检索100%
|
||||
5. ✅ **低成本**: ¥0.00055/次对话
|
||||
1. 鉁?**闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鍩轰簬鐪熷疄鏁版嵁/鏂囨。
|
||||
2. 鉁?**娣峰悎妫€绱?*: 缁撴瀯鍖栨暟鎹<E69A9F>紙REDCap锛? 闈炵粨鏋勫寲鏂囨。锛圖ify锛?
|
||||
3. 鉁?**蹇<>€熷搷搴?*: 骞冲潎4.8绉掞紙婊¤冻浼佷笟寰<EFBFBD>俊<5绉掕<E7BB89>姹傦級
|
||||
4. 鉁?**楂樺噯纭<E599AF>巼**: 鎰忓浘璇嗗埆100%锛屾暟鎹<E69A9F><E98EB9>绱?00%
|
||||
5. 鉁?**浣庢垚鏈?*: 楼0.00055/娆″<EFBFBD>璇?
|
||||
|
||||
### 娴嬭瘯楠岃瘉缁撴灉
|
||||
|
||||
**娴嬭瘯鏃ユ湡**: 2026-01-04
|
||||
**测试场景**: 5个典型对话场景
|
||||
**测试结果**: 全部通过✅
|
||||
**娴嬭瘯鍦烘櫙**: 5涓<EFBFBD>吀鍨嬪<EFBFBD>璇濆満鏅?
|
||||
**娴嬭瘯缁撴灉**: 鍏ㄩ儴閫氳繃鉁?
|
||||
|
||||
| 测试场景 | 意图 | 数据源 | 响应时间 | 结果 |
|
||||
| 娴嬭瘯鍦烘櫙 | 鎰忓浘 | 鏁版嵁婧?| 鍝嶅簲鏃堕棿 | 缁撴灉 |
|
||||
|---------|------|--------|----------|------|
|
||||
| 排除标准查询 | query_protocol | Dify | 5.4秒 | ✅ 准确 |
|
||||
| CRF指标查询 | query_protocol | Dify | 4.9秒 | ✅ 准确 |
|
||||
| ID 7患者查询 | query_record | REDCap | 5.3秒 | ✅ 准确 |
|
||||
| 研究目的查询 | query_protocol | Dify | 4.5秒 | ✅ 准确 |
|
||||
| 患者统计查询 | count_records | REDCap | 3.8秒 | ✅ 准确 |
|
||||
| 鎺掗櫎鏍囧噯鏌ヨ<EFBFBD> | query_protocol | Dify | 5.4绉?| 鉁?鍑嗙‘ |
|
||||
| CRF鎸囨爣鏌ヨ<EFBFBD> | query_protocol | Dify | 4.9绉?| 鉁?鍑嗙‘ |
|
||||
| ID 7鎮h€呮煡璇?| query_record | REDCap | 5.3绉?| 鉁?鍑嗙‘ |
|
||||
| 鐮旂┒鐩<EFBFBD>殑鏌ヨ<EFBFBD> | query_protocol | Dify | 4.5绉?| 鉁?鍑嗙‘ |
|
||||
| 鎮h€呯粺璁℃煡璇?| count_records | REDCap | 3.8绉?| 鉁?鍑嗙‘ |
|
||||
|
||||
### 鐢ㄦ埛鍙嶉<E98D99>
|
||||
|
||||
- ✅ 响应速度满意(<5秒)
|
||||
- ✅ 回答准确专业
|
||||
- ✅ 数据真实可靠
|
||||
- ✅ 上下文记忆有效
|
||||
- 鉁?鍝嶅簲閫熷害婊℃剰锛?5绉掞級
|
||||
- 鉁?鍥炵瓟鍑嗙‘涓撲笟
|
||||
- 鉁?鏁版嵁鐪熷疄鍙<E79684>潬
|
||||
- 鉁?涓婁笅鏂囪<E98F82>蹇嗘湁鏁?
|
||||
|
||||
---
|
||||
|
||||
@@ -634,28 +634,28 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
### 瀵瑰<E780B5>浠嬬粛瑕佺偣
|
||||
|
||||
**简洁版(100字)**:
|
||||
> "我们实现了一个**智能意图识别系统**,当PI询问研究方案相关问题时,AI会自动从知识库中检索文档;当询问患者数据时,AI会实时查询REDCap数据库。通过**混合检索技术**,AI能够同时理解研究文档和患者数据,给出准确、专业的回答。整个系统基于**RAG技术**(检索增强生成),确保AI的回答100%基于真实数据,不会编造信息。"
|
||||
**绠€娲佺増锛?00瀛楋級**:
|
||||
> "鎴戜滑瀹炵幇浜嗕竴涓?*鏅鸿兘鎰忓浘璇嗗埆绯荤粺**锛屽綋PI璇㈤棶鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>鏃讹紝AI浼氳嚜鍔ㄤ粠鐭ヨ瘑搴撲腑妫€绱㈡枃妗o紱褰撹<E8A4B0>闂<EFBFBD>偅鑰呮暟鎹<E69A9F>椂锛孉I浼氬疄鏃舵煡璇<E785A1>EDCap鏁版嵁搴撱€傞€氳繃**娣峰悎妫€绱㈡妧鏈?*锛孉I鑳藉<E991B3>鍚屾椂鐞嗚В鐮旂┒鏂囨。鍜屾偅鑰呮暟鎹<E69A9F>紝缁欏嚭鍑嗙‘銆佷笓涓氱殑鍥炵瓟銆傛暣涓<E69AA3>郴缁熷熀浜?*RAG鎶€鏈?*锛堟<E9949B>绱㈠<E7BBB1>寮虹敓鎴愶級锛岀‘淇滱I鐨勫洖绛?00%鍩轰簬鐪熷疄鏁版嵁锛屼笉浼氱紪閫犱俊鎭<E4BF8A>€?
|
||||
|
||||
**鎶€鏈<E282AC>寒鐐癸紙5鐐癸級**:
|
||||
1. **意图识别**: 自动判断用户问题类型(100%准确率)
|
||||
2. **工具调用**: 根据意图调用不同的数据源(REDCap/Dify)
|
||||
3. **混合检索**: 结合结构化数据和非结构化文档
|
||||
4. **零幻觉**: 所有回答都有真实数据支撑(RAG技术)
|
||||
5. **快速响应**: 平均5秒内回复(满足企业微信要求)
|
||||
1. **鎰忓浘璇嗗埆**: 鑷<EFBFBD>姩鍒ゆ柇鐢ㄦ埛闂<EFBFBD><EFBFBD>绫诲瀷锛?00%鍑嗙‘鐜囷級
|
||||
2. **宸ュ叿璋冪敤**: 鏍规嵁鎰忓浘璋冪敤涓嶅悓鐨勬暟鎹<EFBFBD>簮锛圧EDCap/Dify锛?
|
||||
3. **娣峰悎妫€绱?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。
|
||||
4. **闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鏈夌湡瀹炴暟鎹<E69A9F>敮鎾戯紙RAG鎶€鏈<E282AC>級
|
||||
5. **蹇<EFBFBD>€熷搷搴?*: 骞冲潎5绉掑唴鍥炲<E98DA5>锛堟弧瓒充紒涓氬井淇¤<E6B787>姹傦級
|
||||
|
||||
### 閫傜敤鍦烘櫙
|
||||
|
||||
✅ **PI日常管理**:
|
||||
- 查询研究方案、伦理资料
|
||||
- 了解患者入组情况
|
||||
鉁?**PI鏃ュ父绠$悊**:
|
||||
- 鏌ヨ<EFBFBD>鐮旂┒鏂规<EFBFBD>銆佷鸡鐞嗚祫鏂?
|
||||
- 浜嗚В鎮h€呭叆缁勬儏鍐?
|
||||
- 缁熻<E7BC81>椤圭洰杩涘睍
|
||||
|
||||
✅ **数据质控**:
|
||||
- 检查患者记录
|
||||
- 核对数据完整性
|
||||
鉁?**鏁版嵁璐ㄦ帶**:
|
||||
- 妫€鏌ユ偅鑰呰<EFBFBD>褰?
|
||||
- 鏍稿<EFBFBD>鏁版嵁瀹屾暣鎬?
|
||||
|
||||
✅ **知识查询**:
|
||||
鉁?**鐭ヨ瘑鏌ヨ<E98F8C>**:
|
||||
- CRF琛ㄦ牸鍐呭<E98D90>
|
||||
- 绾冲叆鎺掗櫎鏍囧噯
|
||||
- 鐮旂┒娴佺▼
|
||||
@@ -664,15 +664,15 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
## 馃敆 鐩稿叧鏂囨。
|
||||
|
||||
- [IIT Manager Agent 开发记录](../06-开发记录/)
|
||||
- [IIT Manager Agent 寮€鍙戣<EFBFBD>褰昡(../06-寮€鍙戣<E98D99>褰?)
|
||||
- [IIT Manager Agent 鎶€鏈<E282AC>€哄姟娓呭崟](../07-鎶€鏈<E282AC>€哄姟/)
|
||||
- [MVP开发任务清单](../04-开发计划/MVP开发任务清单.md)
|
||||
- [Phase1.5-AI对话能力开发计划](../04-开发计划/Phase1.5-AI对话能力开发计划.md)
|
||||
- [MVP寮€鍙戜换鍔℃竻鍗昡(../04-寮€鍙戣<E98D99>鍒?MVP寮€鍙戜换鍔℃竻鍗?md)
|
||||
- [Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<EFBFBD>鍒抅(../04-寮€鍙戣<E98D99>鍒?Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒?md)
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 技术团队
|
||||
**最后更新**: 2026-01-04
|
||||
**鏂囨。缁存姢**: 鎶€鏈<EFBFBD>洟闃?
|
||||
**鏈€鍚庢洿鏂?*: 2026-01-04
|
||||
**鐗堟湰鍘嗗彶**:
|
||||
- v1.0 (2026-01-04): 鍒濆<E98D92>鐗堟湰锛孭hase 1.5瀹屾垚
|
||||
|
||||
@@ -692,3 +692,4 @@ private async processMessageAsync(xmlData: any) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user