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)
243 lines
10 KiB
Markdown
243 lines
10 KiB
Markdown
# 智能文献检索 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
|
||
// 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
|
||
|
||
---
|
||
|
||
## 🔧 环境变量
|
||
|
||
```bash
|
||
# .env
|
||
UNIFUNCS_API_KEY=sk-xxx
|
||
```
|
||
|
||
---
|
||
|
||
**文档维护者**: 开发团队
|
||
**最后更新**: 2026-01-18
|
||
**文档状态**: ✅ MVP方案确认,开始开发
|