Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/06-开发记录/Phase1.5-AI对话集成REDCap完成记录.md
HaHafeng 2481b786d8 deploy: Complete 0126-27 deployment - database upgrade, services update, code recovery
Major Changes:
- Database: Install pg_bigm/pgvector plugins, create test database
- Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc
- Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports
- Frontend: v1.2 -> v1.3, skip TypeScript check for deployment
- Code recovery: Restore empty files from local backup

Technical Fixes:
- Fix pino-pretty error in production (conditional loading)
- Fix ES Module import paths (add .js extensions)
- Fix OSSAdapter TypeScript errors
- Update Prisma Schema (63 models, 16 schemas)
- Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS)
- Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY)

Documentation:
- Create 0126 deployment folder with 8 documents
- Update database development standards v2.0
- Update SAE deployment status records

Deployment Status:
- PostgreSQL: ai_clinical_research_test with plugins
- Python: v1.1 @ 172.17.173.84:8000
- Backend: v1.7 @ 172.17.173.89:3001
- Frontend: v1.3 @ 172.17.173.90:80

Tested: All services running successfully on SAE
2026-01-27 08:13:27 +08:00

8.5 KiB
Raw Permalink Blame History

Phase 1.5: AI对话集成REDCap真实数据查询 - 开发完成记录

开发日期: 2026-01-03
开发人员: AI Clinical Research Team
版本: Phase 1.5
状态: 已完成


📋 开发目标

实现AI在企业微信中基于REDCap真实数据与PI进行智能对话解决LLM幻觉问题。

核心需求

  1. AI能够查询REDCap真实数据
  2. AI不编造数据基于事实回答
  3. 支持多轮对话上下文记忆
  4. 提供即时"正在查询"反馈

🎯 完成功能

1. 意图识别

  • 查询特定记录: 识别记录ID如"ID 7"、"记录7"
  • 统计记录数: 识别"多少"、"几个"、"几条"等关键词
  • 项目信息: 识别"项目名称"、"项目情况"等
  • 普通对话: 默认处理其他对话

实现方式: 关键词匹配 + 正则表达式

2. REDCap数据查询

  • queryRedcapRecord(): 查询特定记录的详细信息
  • countRedcapRecords(): 统计总记录数
  • getProjectInfo(): 获取项目基本信息

数据来源: 数据库 iit_schema.projects 表 → RedcapAdapter → REDCap API

3. 数据注入LLM

  • 将查询结果注入System消息
  • 新的System Prompt强调"基于真实数据,不编造"
  • 错误处理:查询失败时友好提示

4. 上下文记忆

  • SessionMemory保存最近3轮对话
  • 支持多轮对话理解(如"他"指代之前提到的患者)

5. 即时反馈

  • 收到消息后立即回复"🫡 正在查询,请稍候..."
  • 查询完成后推送最终结果

🏗️ 技术架构

数据流

用户消息(企业微信)
    ↓
WechatCallbackController.handleMessage()
    ↓
ChatService.handleMessage()
    ↓
1. detectIntent() - 意图识别
    ↓
2. queryRedcapRecord() / countRedcapRecords() / getProjectInfo()
    ↓
    prisma.iitProject.findFirst() - 从数据库获取项目配置
        ↓
    new RedcapAdapter(url, token) - 创建API适配器
        ↓
    redcap.exportRecords() - 调用REDCap API
        ↓
    返回真实数据
    ↓
3. buildMessagesWithData() - 构建LLM消息注入数据
    ↓
4. llm.chat() - 调用DeepSeek-V3
    ↓
5. sessionMemory.addMessage() - 记录到上下文
    ↓
AI回复企业微信

关键代码

  • ChatService.ts: 390行新增REDCap查询方法
  • 意图识别: detectIntent(),正则匹配
  • 数据注入: buildMessagesWithData()
  • System Prompt: getSystemPromptWithData()

🧪 测试结果

测试环境

  • 项目: test0102 (REDCap PID: 16)
  • 记录数: 10条ID 1-10
  • 测试用户: FengZhiBo
  • 测试时间: 2026-01-03 22:28

测试场景1: 查询特定记录

用户输入:

帮我查询一下 记录 7的 所有信息

AI回复 (基于真实数据):

根据REDCap查询结果记录7的信息如下

**基本信息**
- 姓名企业微信7 企业微信7
- 出生日期2017-01-04
- 年龄8岁
- 性别:男
- 身高130 cm
- 体重50 kg
- BMI29.6

**联系方式**
- 地址企业微信7
- 邮箱gofeng117@163.com

**其他信息**
- 民族:西班牙裔或拉丁裔
- 治疗史测试7777
- 是否完成:是

所有字段均已填写完成。如需查看完整表单建议登录REDCap系统。

数据验证: 完全匹配REDCap数据库

测试场景2: 统计查询 (预期)

用户输入: "我们系统中已经有几条记录了?"
预期回复: "当前项目test0102已有 10条 患者数据记录"

测试场景3: 项目信息 (预期)

用户输入: "咱们当前的项目名称是什么?"
预期回复: "当前项目名称为 test0102"

性能指标

  • ⏱️ API查询: 300-700ms
  • ⏱️ LLM响应: 2-3秒
  • ⏱️ 总响应时间: 3-5秒
  • 📊 Token消耗: 约500 tokens/次

🆚 对比解决LLM幻觉

之前(编造数据)

AI: "ID 7的入组日期为 **2023-10-26**(即基线访视日期)"
     ❌ 完全编造
     ❌ 与真实数据不符
     ❌ 项目名称编造为"IIT-2023-001: XX干预对YY疾病..."

现在(真实数据)

AI: "出生日期2017-01-04
     年龄8岁
     身高130 cm
     体重50 kg"
     ✅ 100%真实
     ✅ 来自REDCap数据库
     ✅ 项目名称为test0102真实

💡 技术亮点

1. 架构设计

  • 从数据库读取配置: 不使用环境变量,支持多项目
  • 复用通用能力层: LLMFactory零配置集成
  • 分层清晰: Controller → Service → Adapter → API

2. 意图识别

  • 简单有效: 关键词匹配 + 正则表达式
  • 扩展性好: 易于添加新意图
  • 性能优秀: <1ms识别时间

3. 数据安全

  • Token加密存储: 数据库中加密
  • 动态获取: 每次查询时从数据库读取
  • 权限控制: 基于项目状态过滤

4. 用户体验

  • 即时反馈: "正在查询"消息
  • 准确回答: 基于真实数据
  • 上下文连贯: 支持多轮对话

📊 代码统计

新增文件

  1. SessionMemory.ts - 170行 (上下文记忆)
  2. test-redcap-query-from-db.ts - 250行 (测试脚本)
  3. check-test-project-in-db.ts - 74行 (项目检查)

修改文件

  1. ChatService.ts - 新增200行 (REDCap集成)
  2. WechatCallbackController.ts - 新增即时反馈
  3. routes/index.ts - 新增根路由

删除文件

  1. test-redcap-query-for-ai.ts (使用环境变量,已废弃)
  2. check-env-config.ts (环境变量检查,已废弃)

⚠️ 当前限制

1. 意图识别

  • 仅支持关键词匹配
  • 不支持复杂查询组合
  • 不支持模糊匹配

2. 数据查询

  • 仅支持单项目默认active项目
  • 不支持字段名中文映射
  • 不支持复杂过滤条件

3. 上下文记忆

  • 仅保存最近3轮对话
  • 基于内存,服务重启丢失
  • 不支持跨会话记忆

🚀 后续改进方向

短期优化

  1. 扩展意图识别: 支持更多查询模式
  2. 字段映射: 中文字段名 → REDCap字段名
  3. 错误优化: 更友好的错误提示
  4. 多项目支持: 用户选择查询哪个项目

中期升级 (Phase 2)

  1. Function Calling: 升级为LLM自主决策调用工具
  2. Redis缓存: 缓存查询结果减少API调用
  3. 权限控制: 基于用户角色过滤数据
  4. 性能监控: 记录查询耗时、错误率

长期规划

  1. Dify知识库: 查询研究方案、伦理文件
  2. 智能质控: AI分析数据质量问题
  3. H5前端: 更丰富的交互体验
  4. 多模态: 支持图片、文档上传

📝 技术债务

1. 临时措施

  • ⚠️ 使用关键词匹配应升级为Function Calling
  • ⚠️ SessionMemory基于内存应改为Redis
  • ⚠️ 默认查询第一个active项目应支持项目选择

2. 待实现功能

  • 字段名中文映射
  • 复杂查询条件
  • 数据缓存机制
  • 权限控制

🎯 里程碑意义

技术突破

  1. 解决LLM幻觉: AI不再编造数据
  2. 数据闭环: 数据库 → REDCap → AI → 用户
  3. 架构验证: 从数据库读取配置的方案可行

业务价值

  1. 提升效率: PI无需登录REDCap即可查询数据
  2. 增强信任: AI基于事实回答可信赖
  3. 改善体验: 企业微信直接对话,便捷

团队成长

  1. 架构能力: 理解分层架构的重要性
  2. 问题解决: 从环境变量到数据库配置的演进
  3. 测试驱动: 先测试REDCap API再集成AI

🙏 致谢

感谢团队成员的辛勤付出:

  • 需求分析: 明确AI对话的核心价值
  • 架构设计: 选择从数据库读取配置的方案
  • 代码实现: 高质量的代码和清晰的注释
  • 测试验证: 完整的测试用例和真实场景验证

📚 相关文档


文档维护: 开发团队
最后更新: 2026-01-03
下一步: Phase 2 - Function Calling + Dify知识库