feat(asl): Add DeepSearch smart literature retrieval MVP

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)
This commit is contained in:
2026-01-18 19:15:55 +08:00
parent 57fdc6ef00
commit 1ece9a4ae8
20 changed files with 2052 additions and 16 deletions

View File

@@ -1,14 +1,13 @@
# AIclinicalresearch 系统当前状态与开发指南
> **文档版本:** v3.6
> **文档版本:** v3.7
> **创建日期:** 2025-11-28
> **维护者:** 开发团队
> **最后更新:** 2026-01-18
> **重大进展:** 🎉 **AIA V2.1 完成Prompt管理系统集成!**
> - 🆕 AIA 10个智能体 Prompt 迁移到数据库
> - 🏆 支持管理端在线配置和调试提示词
> - ✅ 灰度预览调试者看DRAFT普通用户看ACTIVE
> - ✅ 三级容灾(数据库→缓存→兜底)
> **重大进展:** 🎉 **ASL 智能文献检索DeepSearchMVP 完成!**
> - 🆕 集成 unifuncs DeepSearch APIAI 驱动的 PubMed 自动检索
> - ✅ SSE 实时流式显示 AI 思考过程
> - ✅ 自然语言输入,自动生成检索策略
> **部署状态:** ✅ 生产环境运行中 | 公网地址http://8.140.53.236/
> **文档目的:** 快速了解系统当前状态为新AI助手提供上下文
@@ -44,7 +43,7 @@
|---------|---------|---------|---------|---------|--------|
| **AIA** | AI智能问答 | 12个智能体选题→方案→评审→写作 | ⭐⭐⭐⭐⭐ | 🎉 **V2.1完成90%** - Prompt管理集成 | **P0** |
| **PKB** | 个人知识库 | RAG问答、私人文献库 | ⭐⭐⭐ | ✅ **核心功能完成90%** | P1 |
| **ASL** | AI智能文献 | 文献筛选、Meta分析、证据图谱 | ⭐⭐⭐⭐⭐ | 🚧 **正在开发** | **P0** |
| **ASL** | AI智能文献 | 文献筛选、Meta分析、证据图谱 | ⭐⭐⭐⭐⭐ | 🎉 **智能检索MVP完成60%** - DeepSearch集成 | **P0** |
| **DC** | 数据清洗整理 | ETL + 医学NER百万行级数据 | ⭐⭐⭐⭐⭐ | ✅ **Tool B完成 + Tool C 99%(异步架构+性能优化-99%+多指标转换+7大功能** | **P0** |
| **IIT** | IIT Manager Agent | AI驱动IIT研究助手 - 智能质控+REDCap集成 | ⭐⭐⭐⭐⭐ | 🎉 **Phase 1.5完成60%- AI对话+REDCap数据集成** | **P0** |
| **SSA** | 智能统计分析 | 队列/预测模型/RCT分析 | ⭐⭐⭐⭐⭐ | 📋 规划中 | P2 |
@@ -157,6 +156,39 @@
---
### 🆕 ASL 智能文献检索 DeepSearch MVP2026-01-18
#### ✅ 功能完成
**核心功能:**
- ✅ 集成 unifuncs DeepSearch APIOpenAI 兼容协议)
- ✅ 自然语言输入研究问题AI 自动生成 PubMed 检索策略
- ✅ SSE 实时流式显示 AI 思考过程
- ✅ 提取并展示 PubMed 文献链接
- ✅ 数据库存储任务记录
**技术实现:**
- 后端:`researchService.ts` + `researchController.ts`SSE 流式接口)
- 前端:`ResearchSearch.tsx`(统一内容流展示)
- 数据库:`asl_schema.asl_research_tasks`
**API 端点:**
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/asl/research/stream` | SSE 流式检索 |
| POST | `/api/v1/asl/research/tasks` | 异步任务(备用) |
| GET | `/api/v1/asl/research/tasks/:taskId/status` | 任务状态 |
**前端入口:**
- 路由:`/literature/research/search`
- 菜单AI智能文献 → 2. 智能文献检索
**已知限制:**
- ⚠️ SSE 模式,离开页面任务中断
- ⚠️ 每次检索成本约 0.3 元unifuncs API
---
### 🏆 历史进展:通用能力层重大升级 + AIA V2.02026-01-14
#### ✅ Phase 1: 通用流式响应服务OpenAI Compatible

View File

@@ -1,10 +1,10 @@
# AI智能文献模块 - 当前状态与开发指南
> **文档版本:** v1.4
> **文档版本:** v1.5
> **创建日期:** 2025-11-21
> **维护者:** AI智能文献开发团队
> **最后更新:** 2025-12-13 🏆 **Postgres-Only 架构改造完成**
> **重大进展:** Platform-Only 架构改造 - 智能双模式处理、任务拆分、断点续传
> **最后更新:** 2026-01-18 🆕 **智能文献检索DeepSearchMVP完成**
> **重大进展:** unifuncs DeepSearch API 集成 - AI驱动的 PubMed 自动检索
> **文档目的:** 反映模块真实状态,帮助新开发人员快速上手
---
@@ -27,15 +27,43 @@
AI智能文献模块是一个基于大语言模型LLM的文献筛选系统用于帮助研究人员根据PICOS标准自动筛选文献。
### 当前状态
- **开发阶段**:🚧 标题摘要初筛MVP已完成全文复筛后端已完成待前端开发
- **开发阶段**:🚧 标题摘要初筛MVP已完成全文复筛后端已完成智能文献检索MVP已完成
- **已完成功能**
- ✅ 标题摘要初筛Title & Abstract Screening- 完整流程
- ✅ 全文复筛后端Day 2-5- LLM服务 + API + Excel导出
-**智能文献检索DeepSearchMVP** - unifuncs API 集成SSE 实时流式
- **开发中功能**
- 🚧 全文复筛前端UIDay 6-8预计2.5天)
- **模型支持**DeepSeek-V3 + Qwen-Max 双模型筛选
- **模型支持**DeepSeek-V3 + Qwen-Max 双模型筛选 + unifuncs DeepSearch
- **部署状态**:✅ 本地开发环境运行正常
### 🆕 智能文献检索 DeepSearch2026-01-18 MVP完成
**功能概述:**
- AI 驱动的自动化 PubMed 文献检索
- 自然语言输入研究问题AI 自动生成检索策略
- 实时显示 AI 思考过程和检索进展
- 提取并展示 PubMed 文献链接
**技术实现:**
- 集成 unifuncs DeepSearch APIOpenAI 兼容协议)
- Server-Sent Events (SSE) 实时流式通信
- 数据库存储:`asl_schema.asl_research_tasks`
**API 端点:**
- `POST /api/v1/asl/research/stream` - SSE 流式检索
- `POST /api/v1/asl/research/tasks` - 异步任务创建(备用)
- `GET /api/v1/asl/research/tasks/:taskId/status` - 任务状态查询
**前端入口:**
- 路由:`/literature/research/search`
- 菜单AI智能文献 → 2. 智能文献检索
**已知限制:**
- ⚠️ SSE 模式,离开页面任务中断
- ⚠️ 每次检索成本约 0.3 元unifuncs API
- ⏳ 搜索历史、高级筛选等功能待开发
### 🏆 Postgres-Only 架构改造2025-12-13完成
**改造目标:**

View File

@@ -0,0 +1,313 @@
unifuncsAPI接入文档
两种模式:深度研究报告和深度搜索。
一、 深度研究报告模式
Model 选择请求模型。S2
API Keysk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ
Introduction设定研究员的角色和口吻
Plan Approval执行研究前是否生成一份研究计划并等待用户批准或修改。默认关闭。
Reference Style指定引用文献的输出格式默认为 linkMarkDown
Max Depth研究的最大深度建议在25轮为最佳
Domain Scope自定义搜索网站限定范围内研究英文逗号分隔
Domain Blacklist搜索网站黑名单排除特定网站的内容英文逗号分隔
Output Type预期输出的文体类型默认为report
Output Prompt自定义输出提示词覆盖output_type的默认提示词。支持嵌入 {{introduction}} / {{output_length}} / {{content}} 占位符content为用户提问。
Output Length预期输出内容的长度模型不一定遵守
Stream是否流式响应
二、 深度搜索模式
[https://unifuncs.com/api\#deepsearch](https://unifuncs.com/api#deepsearch)
参数说明:
Model S2
API Key: sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ
Introduction:设定研究员的角色和口吻
Reference Style: link 和 character
指定引用文献的输出格式,默认为 link
Max Depth研究的最大深度建议在25轮为最佳
Domain Scope自定义搜索网站限定范围内研究英文逗号分隔
Domain Blacklist搜索网站黑名单排除特定网站的内容英文逗号分隔
Output Prompt自定义输出提示词覆盖output\_type的默认提示词。支持嵌入 {{introduction}} / {{output\_length}} / {{content}} 占位符content为用户提问。
Generate Summary: 是否开启异步任务完成后自动生成标题和摘要,默认关闭 (只有异步模式才有)
Stream是否流式响应只有**Open AI 兼容协议模式才有**
2种调用方式
**一、Open AI兼容协议**
适用于直接接入到支持 OpenAI 协议的客户端,如 Cherry Studio / Dify 或 OpenAI SDK等。
// Please install OpenAI SDK first: \`npm install openai\`
import OpenAI from 'openai';
const client \= new OpenAI({
baseURL: 'https://api.unifuncs.com/deepsearch/v1',
apiKey: 'sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ',
});
async function main() {
const stream \= await client.chat.completions.create({
model: 's2',
messages: \[{ role: 'user', content: 'hi' }\],
stream: true,
introduction: "你是一名医学研究专家,负责检索文献",
max\_depth: 25,
domain\_scope: \["https://pubmed.ncbi.nlm.nih.gov/"\],
domain\_blacklist: \["wanfang.com"\],
output\_prompt: "输出文献内容",
reference\_style: "link"
});
let thinking \= false;
for await (const chunk of stream) {
if (chunk.choices\[0\]?.delta?.reasoning\_content) {
if (\!thinking) {
process.stdout.write('\<think\>\\n');
thinking \= true;
}
process.stdout.write(chunk.choices\[0\]?.delta?.reasoning\_content);
} else {
if (thinking) {
process.stdout.write('\\n\</think\>\\n\\n');
thinking \= false;
}
process.stdout.write(chunk.choices\[0\]?.delta?.content || '');
}
}
}
main();
**二、 异步模式:**
####
#### **1\. 创建任务 /v1/create\_task**
提交研究需求后立即返回 task\_id后端在后台执行。
// Node 18+ has fetch built-in
const payload \= {
"model": "s2",
"messages": \[
{
"role": "user",
"content": "hi"
}
\],
"introduction": "你是一名医学研究专家,负责检索文献",
"max\_depth": 25,
"domain\_scope": \[
"https://pubmed.ncbi.nlm.nih.gov/"
\],
"domain\_blacklist": \[
"wanfang.com"
\],
"output\_prompt": "输出文献内容",
"reference\_style": "link"
};
const res \= await fetch("https://api.unifuncs.com/deepsearch/v1/create\_task", {
method: "POST",
headers: {
"Authorization": "Bearer sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await res.json());
示例响应:
{
"code": 0,
"message": "OK",
"data": {
"task\_id": "3aff2a91-7795-4b73-8dab-0593551a27a1",
"status": "pending",
"created\_at": "2025-12-09T03:52:40.771Z"
},
"requestId": "cd17faad-7310-4370-ba0c-0c2af6bc0597"
}
#### **2\. 查询任务 /v1/query\_task**
支持 GET / POST传入 task\_id 即可轮询状态;完成后会返回摘要与最终回答。
// Node 18+ has fetch built-in
const params \= new URLSearchParams({ task\_id: "3aff2a91-7795-4b73-8dab-0593551a27a1" });
const res \= await fetch("https://api.unifuncs.com/deepsearch/v1/query\_task?" \+ params.toString(), {
headers: {
"Authorization": "Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx"
}
});
console.log(await res.json());
示例响应,已完成:
{
"code": 0,
"message": "OK",
"data": {
"task\_id": "3aff2a91-7795-4b73-8dab-0593551a27a1",
"status": "completed",
"result": {
"content": "你好我是U深搜一个专业的网络信息深度搜索专家 🤖\\n\\n我可以帮助你\\n- 🔍 精准搜索和提取关键信息\\n- 📊 进行深度分析和多源验证\\n- 🕒 获取最新、最可靠的信息\\n- 💡 提供结构化的洞察和建议\\n\\n有什么问题想要我帮你深入搜索和分析吗无论是技术资讯、市场动态、学术研究还是其他任何话题我都能为你提供专业、准确的信息服务",
"reasoning\_content": "用户只是简单地说了\\"hi\\",这是一个普通的问候。根据指导原则,如果是普通聊天或无法回答的问题,我应该使用友好的语气直接回复用户问题或介绍自己。\\n\\n这不需要进行任何搜索我应该直接友好地回复并简单介绍一下自己是U深搜这个深度搜索专家。"
},
"created\_at": "2025-12-09T03:52:40.771Z",
"updated\_at": "2025-12-09T03:52:45.912Z",
"progress": {
"current": 100,
"total": 100,
"message": "任务已完成"
},
"statistics": {
"iterations": 1,
"search\_count": 0,
"read\_count": 0,
"token\_usage": {
"prompt\_tokens": 4381,
"completion\_tokens": 167,
"total\_tokens": 4548
}
},
"session": {
"session\_id": "d3bee7f1-a44e-48b0-9283-a6866de723c3",
"status": "finished",
"model": "s2",
"title": "开启generate\_summary时生成标题",
"summary": "开启generate\_summary时生成摘要",
"question": "hi"
}
}
}

View File

@@ -0,0 +1,242 @@
# 智能文献检索 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方案确认开始开发

View File

@@ -0,0 +1,174 @@
# 智能文献检索DeepSearch集成开发记录
> **开发日期:** 2026-01-18
> **开发者:** AI 开发助手
> **状态:** ✅ MVP 功能完成
> **模块:** ASL - AI智能文献
---
## 📋 功能概述
### 需求背景
临床研究者需要从 PubMed 检索高质量文献,传统方式需要手动构建检索式,效率低下。通过集成 unifuncs DeepSearch API实现 AI 驱动的自动化深度文献检索。
### 核心功能
- 自然语言输入研究问题
- AI 自动生成专业检索策略
- 实时显示 AI 思考过程
- 深度检索 PubMed 数据库
- 提取并展示 PubMed 文献链接
---
## 🛠️ 技术实现
### 架构方案
```
用户输入 → 前端 SSE 请求 → 后端调用 unifuncs API → 流式返回 → 实时展示
```
**关键技术选型:**
- **API 协议**unifuncs OpenAI 兼容协议Streaming 模式)
- **前后端通信**Server-Sent Events (SSE)
- **数据存储**PostgreSQL (asl_schema.asl_research_tasks)
### 文件结构
```
backend/
├── src/modules/asl/
│ ├── controllers/researchController.ts # SSE 流式接口
│ ├── services/researchService.ts # 核心业务逻辑
│ ├── workers/researchWorker.ts # 异步任务处理(备用)
│ └── routes/index.ts # 路由注册
├── prisma/schema.prisma # 数据库模型
frontend-v2/
└── src/modules/asl/
├── pages/ResearchSearch.tsx # 检索页面
├── pages/ResearchSearch.css # 样式
└── api/index.ts # API 函数
```
### API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/asl/research/stream` | SSE 流式检索(推荐) |
| POST | `/api/v1/asl/research/tasks` | 创建异步任务(备用) |
| GET | `/api/v1/asl/research/tasks/:taskId/status` | 查询任务状态 |
### 数据库 Schema
```prisma
model AslResearchTask {
id String @id @default(cuid())
projectId String @map("project_id")
userId String @map("user_id")
query String
filters Json?
externalTaskId String? @map("external_task_id")
status String @default("pending")
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")
}
```
---
## 🎯 开发过程
### Phase 1API 验证
- 创建测试脚本 `scripts/test-unifuncs-deepsearch.ts`
- 验证 unifuncs DeepSearch API 可用性
- 确认 OpenAI 兼容协议Streaming可行
### Phase 2后端开发
1. 数据库 Schema 设计与迁移
2. ResearchService 核心逻辑
3. ResearchController API 接口
4. 路由注册
### Phase 3前端开发
1. 检索页面 UI 设计(参考 unifuncs 简洁风格)
2. SSE 流式接收实现
3. 实时内容展示
4. PubMed 链接列表
### Phase 4联调优化
1. 修复 userId 获取问题
2. 从异步轮询改为 SSE 实时流式
3. UI 合并为统一内容流
4. 链接提取逻辑优化
---
## ⚠️ 已知问题与遗留
### 当前限制
1. **非真正异步**离开页面任务会中断SSE 连接断开)
2. **成本较高**:每次检索约 0.3 元unifuncs API 费用)
3. **格式待优化**:思考过程和结果的排版可进一步美化
### 后续改进方向
- [ ] 真正的异步任务(用户可离开页面)
- [ ] 搜索历史记录 UI
- [ ] 高级筛选(年份、研究类型)
- [ ] 导出功能Excel/BibTeX
- [ ] Token 消耗统计展示
- [ ] 一键导入到标题摘要初筛
---
## 📊 测试结果
### 功能测试
| 测试项 | 状态 | 备注 |
|--------|------|------|
| 创建检索任务 | ✅ | 正常 |
| SSE 实时流式 | ✅ | 思考过程实时显示 |
| PubMed 链接提取 | ✅ | 正确提取 |
| 数据库存储 | ✅ | 任务记录保存 |
| 错误处理 | ✅ | 网络错误、API 错误 |
### 性能数据
- 平均检索时间1-3 分钟
- 返回文献数量10-20 篇(视查询复杂度)
---
## 📝 配置说明
### 环境变量
```bash
# backend/.env
UNIFUNCS_API_KEY=sk-xxxx
```
### 前端入口
- 路由:`/literature/research/search`
- 菜单AI智能文献 → 2. 智能文献检索
---
## 📚 参考资料
- [unifuncs DeepSearch API 文档](https://unifuncs.com/docs)
- [Postgres-Only 异步任务处理指南](../../02-通用能力层/Postgres-Only异步任务处理指南.md)
- [数据库开发规范](../../04-开发规范/09-数据库开发规范.md)