feat(iit-manager): Integrate Dify knowledge base for hybrid retrieval
Completed features: - Created Dify dataset (Dify_test0102) with 2 processed documents - Linked test0102 project with Dify dataset ID - Extended intent detection to recognize query_protocol intent - Implemented queryDifyKnowledge method (semantic search Top 5) - Integrated hybrid retrieval (REDCap data + Dify documents) - Fixed AI hallucination bugs (intent detection + API field path) - Developed debugging scripts - Completed end-to-end testing (5 scenarios passed) - Generated comprehensive documentation (600+ lines) - Updated development plans and module status Technical highlights: - Single project single knowledge base architecture - Smart routing based on user intent - Prevent AI hallucination by injecting real data/documents - Session memory for multi-turn conversations - Reused LLMFactory for DeepSeek-V3 integration Bug fixes: - Fixed intent detection missing keywords - Fixed Dify API response field path error Testing: All scenarios verified in WeChat production environment Status: Fully tested and deployed
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# IIT Manager Agent - Phase 1.5 AI对话能力开发计划
|
||||
|
||||
> **版本**: v2.0(极简版 + 上下文记忆)
|
||||
> **版本**: v3.0(极简版 + 上下文记忆 + Dify知识库)
|
||||
> **创建日期**: 2026-01-03
|
||||
> **完成日期**: 2026-01-03
|
||||
> **状态**: ✅ **已完成**
|
||||
> **实际工作量**: ~1天(极简版)
|
||||
> **核心价值**: PI可在企业微信中自然对话查询REDCap真实数据
|
||||
> **核心成就**: ✅ REDCap数据集成 + ✅ 上下文记忆 + ✅ 解决LLM幻觉
|
||||
> **最新更新**: 2026-01-04
|
||||
> **状态**: ✅ **已完成(含Dify集成)**
|
||||
> **实际工作量**: ~2天(极简版 + Dify知识库)
|
||||
> **核心价值**: PI可在企业微信中自然对话查询REDCap真实数据 + 研究方案文档
|
||||
> **核心成就**: ✅ REDCap数据集成 + ✅ 上下文记忆 + ✅ 解决LLM幻觉 + ✅ **Dify知识库混合检索**
|
||||
|
||||
---
|
||||
|
||||
@@ -36,7 +36,12 @@ const response = await llm.chat(messages, { temperature: 0.7 });
|
||||
- 创建ChatService.ts(2小时)
|
||||
- 创建SessionMemory.ts(2小时)
|
||||
- 修改WechatCallbackController(2小时)
|
||||
❌ 暂不实现: Dify知识库、周报生成、复杂Tool Calling
|
||||
✅ Day 2(4-6小时): Dify知识库集成 + 混合检索(2026-01-04完成)
|
||||
- 关联项目与Dify知识库(1小时)
|
||||
- 集成Dify检索到ChatService(2小时)
|
||||
- 修复意图识别与数据注入bug(2小时)
|
||||
- 端到端测试与文档记录(1小时)
|
||||
❌ 暂不实现: 周报生成、复杂Tool Calling
|
||||
```
|
||||
|
||||
### 极简版架构(复用通用能力层)
|
||||
@@ -2927,17 +2932,166 @@ AI: "查询P001:无不良反应记录" ← 应该自动识别
|
||||
✅ 收集用户反馈
|
||||
✅ 再决定是否做完整版
|
||||
|
||||
**实际执行**:
|
||||
✅ **极简版已完成**(2026-01-03)
|
||||
✅ **Dify知识库已集成**(2026-01-04)
|
||||
✅ **混合检索已实现**:REDCap实时数据 + Dify文档知识库
|
||||
|
||||
---
|
||||
|
||||
## 🎓 八、Dify知识库集成(2026-01-04完成)
|
||||
|
||||
### 8.7 集成背景
|
||||
|
||||
**完成时间**: 2026-01-04
|
||||
**开发工作量**: 4-6小时
|
||||
**集成目标**: 在REDCap实时数据查询基础上,增加研究方案文档查询能力
|
||||
|
||||
**核心价值**:
|
||||
- 📚 **文档查询**: 查询研究方案、CRF表格、伦理文件
|
||||
- 🔀 **混合检索**: 同时支持结构化数据(REDCap)和非结构化文档(Dify)
|
||||
- 🎯 **智能路由**: 根据用户问题自动选择数据源
|
||||
|
||||
### 8.8 技术方案
|
||||
|
||||
#### 方案选择
|
||||
|
||||
| 维度 | 采用方案 |
|
||||
|------|---------|
|
||||
| **知识库架构** | 单项目单知识库(1个IIT项目 → 1个Dify Dataset) |
|
||||
| **文档上传** | Dify Web界面手动上传(MVP阶段) |
|
||||
| **项目关联** | 用户绑定默认项目(存储在`iit_schema.projects.dify_dataset_id`) |
|
||||
|
||||
#### 核心实现
|
||||
|
||||
**1. 扩展意图识别**
|
||||
|
||||
在`ChatService.detectIntent()`中新增`query_protocol`意图:
|
||||
|
||||
```typescript
|
||||
// 识别文档查询(研究方案、伦理、知情同意、CRF等)
|
||||
if (/(研究方案|伦理|知情同意|CRF|病例报告表|纳入|入选|排除|标准|入组标准|治疗方案|试验设计|研究目的|研究流程|观察指标|诊断标准|疾病标准)/.test(message)) {
|
||||
return { intent: 'query_protocol' };
|
||||
}
|
||||
```
|
||||
|
||||
**2. 新增Dify查询方法**
|
||||
|
||||
```typescript
|
||||
private async queryDifyKnowledge(query: string): Promise<string> {
|
||||
// 1. 获取项目的difyDatasetId
|
||||
const project = await prisma.iitProject.findFirst({
|
||||
where: { status: 'active' },
|
||||
select: { name: true, difyDatasetId: true }
|
||||
});
|
||||
|
||||
// 2. 调用Dify API检索
|
||||
const retrievalResult = await difyClient.retrieveKnowledge(
|
||||
project.difyDatasetId,
|
||||
query,
|
||||
{ retrieval_model: { search_method: 'semantic_search', top_k: 5 } }
|
||||
);
|
||||
|
||||
// 3. 格式化检索结果
|
||||
// 修复bug:使用正确的字段路径 record.segment.document.name 和 record.segment.content
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**3. 更新对话流程**
|
||||
|
||||
```typescript
|
||||
async handleMessage(userId: string, userMessage: string): Promise<string> {
|
||||
const { intent, params } = this.detectIntent(userMessage);
|
||||
|
||||
// REDCap查询
|
||||
let toolResult: any = null;
|
||||
if (intent === 'query_record') {
|
||||
toolResult = await this.queryRedcapRecord(params.recordId);
|
||||
}
|
||||
|
||||
// Dify知识库查询
|
||||
let difyKnowledge: string = '';
|
||||
if (intent === 'query_protocol') {
|
||||
difyKnowledge = await this.queryDifyKnowledge(userMessage);
|
||||
}
|
||||
|
||||
// 构建LLM消息(同时注入REDCap数据和Dify知识)
|
||||
const messages = this.buildMessagesWithData(
|
||||
userMessage, context, toolResult, difyKnowledge, userId
|
||||
);
|
||||
|
||||
// 调用LLM生成回答
|
||||
const response = await this.llm.chat(messages);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 8.9 问题排查与修复
|
||||
|
||||
#### 问题1: AI不查询Dify,自己编造答案
|
||||
|
||||
**现象**: 用户问"纳入标准是什么?",AI编造了答案,Dify控制台无查询记录
|
||||
|
||||
**根因1**: 意图识别关键词不全
|
||||
- **缺少**: "入选"、"诊断标准"、"疾病标准"
|
||||
- **解决**: 扩充关键词列表
|
||||
|
||||
**根因2**: Dify API返回字段路径错误
|
||||
- **错误**: `record.document_name`、`record.content` → 返回`undefined`
|
||||
- **正确**: `record.segment.document.name`、`record.segment.content`
|
||||
- **解决**: 修正字段访问路径
|
||||
|
||||
**调试过程**:
|
||||
1. 创建`debug-dify-injection.ts`追踪数据注入流程
|
||||
2. 创建`inspect-dify-response.ts`查看Dify API实际返回结构
|
||||
3. 发现并修复字段路径错误
|
||||
|
||||
### 8.10 测试验证
|
||||
|
||||
| 测试场景 | 问题 | 数据源 | 结果 |
|
||||
|---------|------|--------|------|
|
||||
| **文档查询** | "这个研究的排除标准是什么?" | Dify | ✅ 成功 |
|
||||
| **CRF查询** | "CRF表格中有哪些观察指标?" | Dify | ✅ 成功 |
|
||||
| **患者查询** | "ID 7的患者情况" | REDCap | ✅ 成功 |
|
||||
| **统计查询** | "目前入组了多少人?" | REDCap | ✅ 成功 |
|
||||
| **混合查询** | "这个研究的主要研究目的是什么?" | Dify | ✅ 成功 |
|
||||
|
||||
### 8.11 集成成果
|
||||
|
||||
**技术架构**:
|
||||
```
|
||||
用户提问 → 意图识别 → ┬→ [query_protocol] → Dify API → 文档片段
|
||||
├→ [query_record] → REDCap API → 患者数据
|
||||
└→ [count_records] → REDCap API → 统计数据
|
||||
↓
|
||||
构建LLM Prompt(System + Data + Context)
|
||||
↓
|
||||
DeepSeek-V3
|
||||
↓
|
||||
AI回答
|
||||
```
|
||||
|
||||
**核心能力**:
|
||||
1. ✅ **混合检索**: 同时支持结构化数据和非结构化文档
|
||||
2. ✅ **智能路由**: 根据意图自动选择数据源
|
||||
3. ✅ **防止幻觉**: 所有回答基于真实数据/文档
|
||||
4. ✅ **来源标注**: 清晰标注数据来自REDCap或Dify
|
||||
|
||||
**详细记录**: 参见 [Dify知识库集成开发记录](../06-开发记录/2026-01-04-Dify知识库集成开发记录.md)
|
||||
|
||||
---
|
||||
|
||||
## ✅ 九、总结
|
||||
|
||||
### 核心成就(极简版)
|
||||
### 核心成就(极简版 + Dify集成)
|
||||
|
||||
1. ✅ **2天上线**:最快实现AI对话能力
|
||||
1. ✅ **2天上线**:最快实现AI对话能力(含Dify集成)
|
||||
2. ✅ **上下文记忆**:支持多轮对话(3轮)
|
||||
3. ✅ **正在输入反馈**:避免用户焦虑
|
||||
4. ✅ **代词解析**:"他"能自动识别患者
|
||||
5. ✅ **零成本**:只查REDCap,不用额外服务
|
||||
5. ✅ **混合检索**:同时支持REDCap实时数据 + Dify文档知识库
|
||||
6. ✅ **防止幻觉**:所有回答基于真实数据,绝不编造
|
||||
|
||||
### 技术亮点
|
||||
|
||||
@@ -2954,35 +3108,48 @@ AI: "查询P001:无不良反应记录" ← 应该自动识别
|
||||
- ❌ PI无法主动查询数据
|
||||
- ❌ 需要登录REDCap查看
|
||||
|
||||
**After(Phase 1.5极简版)**:
|
||||
- ✅ PI可以在企业微信中直接问"入组多少人"
|
||||
- ✅ PI可以问"P001有不良反应吗"
|
||||
**After(Phase 1.5 + Dify集成)**:
|
||||
- ✅ PI可以在企业微信中直接问"入组多少人"(REDCap)
|
||||
- ✅ PI可以问"P001有不良反应吗"(REDCap)
|
||||
- ✅ PI可以问"研究的纳入排除标准是什么"(Dify)
|
||||
- ✅ PI可以问"CRF表格中有哪些观察指标"(Dify)
|
||||
- ✅ AI记得上一轮对话,支持代词
|
||||
- ✅ 回复快速(<3秒),有反馈
|
||||
- ✅ 回复快速(<6秒),有反馈
|
||||
- ✅ AI基于真实数据/文档回答,不编造
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Phase 1.5 开发完成总结 (2026-01-03)
|
||||
## 🎉 Phase 1.5 开发完成总结 (2026-01-03 & 2026-01-04)
|
||||
|
||||
### **实际完成情况**
|
||||
- ✅ **Day 1完成**: SessionMemory + ChatService + REDCap集成
|
||||
- ✅ **测试通过**: 企业微信对话 + 真实数据查询
|
||||
- ✅ **核心突破**: 解决LLM幻觉问题
|
||||
- ✅ **Day 1完成** (2026-01-03): SessionMemory + ChatService + REDCap集成
|
||||
- ✅ **Day 2完成** (2026-01-04): Dify知识库集成 + 混合检索
|
||||
- ✅ **测试通过**: 企业微信对话 + 真实数据查询 + 文档查询
|
||||
- ✅ **核心突破**: 解决LLM幻觉问题 + 混合检索架构
|
||||
|
||||
### **关键成果**
|
||||
1. ✅ AI基于REDCap真实数据回答,不编造
|
||||
2. ✅ 从数据库读取项目配置(test0102)
|
||||
3. ✅ 意图识别 + 数据查询 + LLM集成
|
||||
4. ✅ 上下文记忆(最近3轮对话)
|
||||
5. ✅ 即时反馈("正在查询")
|
||||
2. ✅ AI基于Dify知识库文档回答研究方案问题
|
||||
3. ✅ 混合检索:同时支持结构化数据和非结构化文档
|
||||
4. ✅ 从数据库读取项目配置(test0102)
|
||||
5. ✅ 意图识别 + 智能路由 + 数据查询 + LLM集成
|
||||
6. ✅ 上下文记忆(最近3轮对话)
|
||||
7. ✅ 即时反馈("正在查询")
|
||||
|
||||
### **测试验证**
|
||||
- **项目**: test0102 (REDCap PID: 16, 10条记录)
|
||||
- **场景**: 查询ID 7患者信息
|
||||
- **结果**: ✅ 完全匹配真实数据,无编造
|
||||
- **项目**: test0102
|
||||
- REDCap PID: 16, 11条记录
|
||||
- Dify Dataset ID: `b49595b2-bf71-4e47-9988-4aa2816d3c6f`
|
||||
- 文档: 研究方案、CRF表格(2个文件,已处理)
|
||||
- **场景1**: 查询ID 7患者信息(REDCap)→ ✅ 完全匹配真实数据
|
||||
- **场景2**: 查询研究排除标准(Dify)→ ✅ 基于文档准确回答
|
||||
- **场景3**: 查询CRF观察指标(Dify)→ ✅ 基于文档准确回答
|
||||
- **场景4**: 统计入组人数(REDCap)→ ✅ 准确统计11人
|
||||
- **结果**: ✅ 所有测试通过,无编造
|
||||
|
||||
### **详细记录**
|
||||
参见:[Phase 1.5开发完成记录](../06-开发记录/Phase1.5-AI对话集成REDCap完成记录.md)
|
||||
- [Phase 1.5开发完成记录 (REDCap集成)](../06-开发记录/Phase1.5-AI对话集成REDCap完成记录.md)
|
||||
- [Dify知识库集成开发记录](../06-开发记录/2026-01-04-Dify知识库集成开发记录.md)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user