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:
@@ -1,10 +1,10 @@
|
||||
# AI智能文献模块 - 当前状态与开发指南
|
||||
|
||||
> **文档版本:** v1.4
|
||||
> **文档版本:** v1.5
|
||||
> **创建日期:** 2025-11-21
|
||||
> **维护者:** AI智能文献开发团队
|
||||
> **最后更新:** 2025-12-13 🏆 **Postgres-Only 架构改造完成**
|
||||
> **重大进展:** Platform-Only 架构改造 - 智能双模式处理、任务拆分、断点续传
|
||||
> **最后更新:** 2026-01-18 🆕 **智能文献检索(DeepSearch)MVP完成**
|
||||
> **重大进展:** unifuncs DeepSearch API 集成 - AI驱动的 PubMed 自动检索
|
||||
> **文档目的:** 反映模块真实状态,帮助新开发人员快速上手
|
||||
|
||||
---
|
||||
@@ -27,15 +27,43 @@
|
||||
AI智能文献模块是一个基于大语言模型(LLM)的文献筛选系统,用于帮助研究人员根据PICOS标准自动筛选文献。
|
||||
|
||||
### 当前状态
|
||||
- **开发阶段**:🚧 标题摘要初筛MVP已完成,全文复筛后端已完成,待前端开发
|
||||
- **开发阶段**:🚧 标题摘要初筛MVP已完成,全文复筛后端已完成,智能文献检索MVP已完成
|
||||
- **已完成功能**:
|
||||
- ✅ 标题摘要初筛(Title & Abstract Screening)- 完整流程
|
||||
- ✅ 全文复筛后端(Day 2-5)- LLM服务 + API + Excel导出
|
||||
- ✅ **智能文献检索(DeepSearch)MVP** - unifuncs API 集成,SSE 实时流式
|
||||
- **开发中功能**:
|
||||
- 🚧 全文复筛前端UI(Day 6-8,预计2.5天)
|
||||
- **模型支持**:DeepSeek-V3 + Qwen-Max 双模型筛选
|
||||
- **模型支持**:DeepSeek-V3 + Qwen-Max 双模型筛选 + unifuncs DeepSearch
|
||||
- **部署状态**:✅ 本地开发环境运行正常
|
||||
|
||||
### 🆕 智能文献检索 DeepSearch(2026-01-18 MVP完成)
|
||||
|
||||
**功能概述:**
|
||||
- AI 驱动的自动化 PubMed 文献检索
|
||||
- 自然语言输入研究问题,AI 自动生成检索策略
|
||||
- 实时显示 AI 思考过程和检索进展
|
||||
- 提取并展示 PubMed 文献链接
|
||||
|
||||
**技术实现:**
|
||||
- 集成 unifuncs DeepSearch API(OpenAI 兼容协议)
|
||||
- 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完成)
|
||||
|
||||
**改造目标:**
|
||||
|
||||
313
docs/03-业务模块/ASL-AI智能文献/00-系统设计/unifuncs API接入文档.md
Normal file
313
docs/03-业务模块/ASL-AI智能文献/00-系统设计/unifuncs API接入文档.md
Normal file
@@ -0,0 +1,313 @@
|
||||
unifuncsAPI接入文档
|
||||
|
||||
两种模式:深度研究报告和深度搜索。
|
||||
|
||||
一、 深度研究报告模式
|
||||
Model :选择请求模型。S2
|
||||
API Key:sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ
|
||||
Introduction:设定研究员的角色和口吻
|
||||
Plan Approval:执行研究前,是否生成一份研究计划,并等待用户批准或修改。默认关闭。
|
||||
Reference Style:指定引用文献的输出格式,默认为 link,MarkDown
|
||||
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"
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
242
docs/03-业务模块/ASL-AI智能文献/04-开发计划/06-智能文献检索DeepSearch集成方案.md
Normal file
242
docs/03-业务模块/ASL-AI智能文献/04-开发计划/06-智能文献检索DeepSearch集成方案.md
Normal 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方案确认,开始开发
|
||||
174
docs/03-业务模块/ASL-AI智能文献/05-开发记录/2026-01-18_智能文献检索DeepSearch集成.md
Normal file
174
docs/03-业务模块/ASL-AI智能文献/05-开发记录/2026-01-18_智能文献检索DeepSearch集成.md
Normal 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 1:API 验证
|
||||
- 创建测试脚本 `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)
|
||||
|
||||
Reference in New Issue
Block a user