Features: - Integrate unifuncs DeepSearch API (OpenAI compatible protocol) - SSE real-time streaming for AI thinking process display - Natural language input, auto-generate PubMed search strategy - Extract and display PubMed literature links - Database storage for task records (asl_research_tasks) Backend: - researchService.ts - Core business logic with SSE streaming - researchController.ts - SSE stream endpoint - researchWorker.ts - Async task worker (backup mode) - schema.prisma - AslResearchTask model Frontend: - ResearchSearch.tsx - Search page with unified content stream - ResearchSearch.css - Styling (unifuncs-inspired simple design) - ASLLayout.tsx - Enable menu item - api/index.ts - Add research API functions API Endpoints: - POST /api/v1/asl/research/stream - SSE streaming search - POST /api/v1/asl/research/tasks - Async task creation - GET /api/v1/asl/research/tasks/:taskId/status - Task status Documentation: - Development record for DeepSearch integration - Update ASL module status (v1.5) - Update system status (v3.7) Known limitations: - SSE mode, task interrupts when leaving page - Cost ~0.3 RMB per search (unifuncs API)
10 KiB
10 KiB
智能文献检索 DeepSearch 集成方案(MVP)
文档版本: v1.2 MVP
创建日期: 2026-01-18
维护者: 开发团队
模块位置: ASL 模块 → 智能文献检索
技术验证: ✅ unifuncs DeepSearch API 已验证通过
预计工期: 3天
📋 MVP 范围
策略
| 层面 | 策略 | 理由 |
|---|---|---|
| 数据库 | 完整设计,所有字段都留 | 一次性到位,避免后续迁移 |
| 功能开发 | 只做核心,其他先不做 | 快速验证,减少工作量 |
✅ 本次开发
| 功能 | 说明 |
|---|---|
| 搜索输入框 | 自然语言输入 |
| 开始检索按钮 | 触发 unifuncs API |
| 思考过程展示 | 重点功能 - 实时展示 AI 检索思路 |
| 检索进度条 | 状态反馈 |
| 结果列表 | PMID、标题、作者、期刊、年份 |
| PubMed 链接 | 跳转原文 |
🔜 后续迭代
| 功能 | 说明 |
|---|---|
| 左侧检索历史 | 数据库已存,UI后做 |
| 导入到初筛 | 后续开发 |
| 高级筛选 | 年份、研究类型等 |
| 导出功能 | Excel、BibTeX |
| Token 统计展示 | 使用量统计 |
🏗️ 技术架构
┌─────────────────────────────────────────────────────────┐
│ 前端:React + Ant Design + React Query │
│ - ResearchSearch.tsx(主页面) │
└─────────────────────────────────────────────────────────┘
↓ HTTP
┌─────────────────────────────────────────────────────────┐
│ 后端:Fastify + Prisma │
│ - researchService.ts │
│ - researchWorker.ts │
│ - researchController.ts │
└─────────────────────────────────────────────────────────┘
↓ pg-boss
┌─────────────────────────────────────────────────────────┐
│ unifuncs DeepSearch API(异步模式) │
│ - POST /v1/create_task │
│ - GET /v1/query_task │
└─────────────────────────────────────────────────────────┘
💾 数据库设计(完整保留)
// prisma/schema.prisma
/// 智能文献检索任务
model AslResearchTask {
id String @id @default(cuid())
// 关联
projectId String @map("project_id")
userId String @map("user_id")
// 检索输入
query String // 用户的自然语言查询
filters Json? // 🔜 后续:高级筛选
// unifuncs 任务
externalTaskId String? @map("external_task_id")
// 状态
status String @default("pending") // pending/processing/completed/failed
errorMessage String? @map("error_message")
// 结果
resultCount Int? @map("result_count")
rawResult String? @map("raw_result") @db.Text
reasoningContent String? @map("reasoning_content") @db.Text // 思考过程
literatures Json? // 解析后的文献列表
// 统计(🔜 后续展示)
tokenUsage Json? @map("token_usage")
searchCount Int? @map("search_count")
readCount Int? @map("read_count")
iterations Int?
// 时间
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
completedAt DateTime? @map("completed_at")
@@map("asl_research_tasks")
@@schema("asl_schema")
}
🔌 API 设计
本次开发(2个)
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/v1/asl/research/tasks |
创建检索任务 |
GET |
/api/v1/asl/research/tasks/:taskId/status |
获取状态+思考过程+结果 |
后续开发
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/v1/asl/research/history |
🔜 检索历史 |
POST |
/api/v1/asl/research/tasks/:taskId/import |
🔜 导入到初筛 |
🎨 前端设计
页面布局
┌─────────────────────────────────────────────────────────────┐
│ 智能文献检索 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 🔍 输入您的研究问题,AI将自动在PubMed中检索... ││
│ │ ││
│ │ [ ] ││
│ │ ││
│ │ [🚀 开始检索] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 💭 AI 思考过程 [展开 ▼] ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 用户查询:"糖尿病 SGLT2抑制剂 心血管 RCT" ││
│ │ 这是一个关于糖尿病药物的学术文献查询... ││
│ │ ││
│ │ 📊 检索策略: ││
│ │ 1. 核心关键词:SGLT2 inhibitors, cardiovascular ││
│ │ 2. MeSH术语:Sodium-Glucose Transporter 2 Inhibitors ││
│ │ ││
│ │ 🔍 正在执行第 5/15 轮检索... ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ⏳ 检索进度 │
│ ████████████████████░░░░░░░░░░ 65% │
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ 📚 检索结果 (15篇) ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 1. PMID: 26378978 [PubMed ↗] ││
│ │ Empagliflozin, Cardiovascular Outcomes... ││
│ │ Zinman B, et al. | NEJM | 2015 ││
│ ├─────────────────────────────────────────────────────────┤│
│ │ 2. PMID: 28605608 [PubMed ↗] ││
│ │ Canagliflozin and Cardiovascular... ││
│ │ Neal B, et al. | NEJM | 2017 ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
📁 文件结构
后端
backend/src/modules/asl/
├── controllers/
│ └── researchController.ts # 2个API
├── services/
│ └── researchService.ts # 核心逻辑
├── workers/
│ └── researchWorker.ts # unifuncs轮询
└── routes/
└── research.ts # 路由配置
前端
frontend-v2/src/modules/asl/
├── pages/
│ └── ResearchSearch.tsx # 主页面
└── api/
└── research.ts # API函数
📅 开发计划(3天)
| 天数 | 任务 | 产出 |
|---|---|---|
| Day 1 | 数据库 + 后端 Service + Worker | Schema迁移 + 核心逻辑 |
| Day 2 | 后端 Controller + 前端页面 | API + 页面框架 |
| Day 3 | 思考过程展示 + 联调测试 | 重点:思考过程UI |
✅ MVP 验收标准
- 用户可输入研究问题
- 点击"开始检索"后显示进度
- 思考过程实时展示
- 检索完成后显示文献列表
- 文献可跳转到 PubMed
🔧 环境变量
# .env
UNIFUNCS_API_KEY=sk-xxx
文档维护者: 开发团队
最后更新: 2026-01-18
文档状态: ✅ MVP方案确认,开始开发