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:
2026-01-04 15:44:11 +08:00
parent b47079b387
commit dfc472810b
162 changed files with 3093 additions and 62 deletions

View File

@@ -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.ts2小时
- 创建SessionMemory.ts2小时
- 修改WechatCallbackController2小时
❌ 暂不实现: Dify知识库、周报生成、复杂Tool Calling
✅ Day 24-6小时: Dify知识库集成 + 混合检索2026-01-04完成
- 关联项目与Dify知识库1小时
- 集成Dify检索到ChatService2小时
- 修复意图识别与数据注入bug2小时
- 端到端测试与文档记录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 PromptSystem + 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查看
**AfterPhase 1.5极简版**
- ✅ PI可以在企业微信中直接问"入组多少人"
- ✅ PI可以问"P001有不良反应吗"
**AfterPhase 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)
---