Files
AIclinicalresearch/docs/02-通用能力层/04-DeepResearch引擎/01-Unifuncs DeepSearch API 使用指南.md
HaHafeng 8f06d4f929 feat(asl): Complete Deep Research V2.0 core development
Backend:
- Add SSE streaming client (unifuncsSseClient) replacing async polling
- Add paragraph-based reasoning parser with mergeConsecutiveThinking
- Add requirement expansion service (DeepSeek-V3 PICOS+MeSH)
- Add Word export service with Pandoc, inline hyperlinks, reference link expansion
- Add deep research V2 worker with 2s log flush and Chinese source prompt
- Add 5 curated data sources config (PubMed/ClinicalTrials/Cochrane/CNKI/MedJournals)
- Add 4 API endpoints (generate-requirement/tasks/task-status/export-word)
- Update Prisma schema with 6 new V2.0 fields on AslResearchTask
- Add DB migration for V2.0 fields
- Simplify ASL_DEEP_RESEARCH_EXPANSION prompt (remove strategy section)

Frontend:
- Add waterfall-flow DeepResearchPage (phase 0-4 progressive reveal)
- Add LandingView, SetupPanel, StrategyConfirm, AgentTerminal, ResultsView
- Add react-markdown + remark-gfm for report rendering
- Add custom link component showing visible URLs after references
- Add useDeepResearchTask polling hook
- Add deep research TypeScript types

Tests:
- Add E2E test, smoke test, and Chinese data source test scripts

Docs:
- Update ASL module status (v2.0 - core features complete)
- Update system status (v6.1 - ASL V2.0 milestone)
- Update Unifuncs DeepSearch API guide (v2.0 - SSE mode + Chinese source results)
- Update module auth specification (test script guidelines)
- Update V2.0 development plan

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-23 13:21:52 +08:00

368 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Unifuncs DeepSearch API 使用指南
> **文档版本:** v2.0
> **创建日期:** 2026-02-22
> **最后更新:** 2026-02-23
> **维护者:** 开发团队
> **文档目的:** 指导业务模块正确使用 Unifuncs DeepSearch API明确可用网站、调用模式与最佳策略
---
## 1. 概述
Unifuncs DeepSearch 是一个 AI 驱动的深度搜索引擎,可以在指定的网站范围内自动搜索、阅读和汇总信息。在本平台中,它作为通用能力层的一部分,为文献检索、临床试验查找等场景提供底层搜索能力。
### 核心能力
- 自然语言输入 → AI 自动生成搜索策略
- 多轮迭代搜索(最大深度可配置)
- 自动阅读网页内容并提取关键信息
- 返回结构化结果 + 综合报告
- 支持 SSE 实时流式 + 异步轮询两种调用模式
### API 基础信息
| 项目 | 值 |
|------|---|
| 基础 URL | `https://api.unifuncs.com/deepsearch/v1` |
| 模型 | `s2` |
| 认证 | `Authorization: Bearer {UNIFUNCS_API_KEY}` |
| 环境变量 | `UNIFUNCS_API_KEY`(已配置在 `backend/.env` |
---
## 2. 两种调用模式
### 2.1 SSE 流式模式V2.0 采用,推荐)
通过 OpenAI 兼容协议的 `POST /chat/completions` 端点,设置 `stream: true`,以 SSE 事件流实时返回 AI 思考过程和最终结果。
```typescript
const response = await fetch('https://api.unifuncs.com/deepsearch/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${UNIFUNCS_API_KEY}`,
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
},
body: JSON.stringify({
model: 's2',
messages: [{ role: 'user', content: query }],
stream: true,
introduction: '你是一名专业的临床研究文献检索专家',
max_depth: 25,
domain_scope: ['https://pubmed.ncbi.nlm.nih.gov/'],
reference_style: 'link',
output_prompt: '请输出结构化报告和文献列表',
}),
});
// 解析 SSE 事件流
const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
const trimmed = line.trim();
if (trimmed.startsWith('data: ')) {
const data = trimmed.slice(6);
if (data === '[DONE]') return;
const json = JSON.parse(data);
const delta = json.choices?.[0]?.delta;
if (delta?.reasoning_content) {
// AI 思考过程(逐字流式,实时展示)
}
if (delta?.content) {
// 最终结果内容(逐字流式)
}
}
}
}
```
**SSE 流的数据特征2026-02-23 实测):**
| 指标 | 典型值 |
|------|--------|
| reasoning chunks | 2000~4000+ 个(实时逐条返回) |
| content chunks | 500~1600+ 个 |
| reasoning 总字符数 | 10000~13000 字符 |
| content 总字符数 | 8000~14000 字符 |
| 总耗时 | 4~6 分钟max_depth=25 |
**优点:**
- reasoning_content 实时逐 chunk 返回,可立即展示 AI 思考过程
- 用户体验优秀:搜索、阅读、分析过程实时可见
- 无需轮询,数据推送式
**缺点:**
- 长连接可能因网络中断而失败
- 不返回 statisticsiterations、search_count 等)
### 2.2 异步模式V1.x 曾使用,仅用于备选)
#### 创建任务 POST /v1/create_task
```typescript
const payload = {
model: 's2',
messages: [{ role: 'user', content: query }],
introduction: '你是一名专业的临床研究文献检索专家',
max_depth: 25,
domain_scope: ['https://pubmed.ncbi.nlm.nih.gov/'],
reference_style: 'link',
generate_summary: true,
output_prompt: '请输出结构化报告和文献列表',
};
const res = await fetch('https://api.unifuncs.com/deepsearch/v1/create_task', {
method: 'POST',
headers: {
'Authorization': `Bearer ${UNIFUNCS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
const { data } = await res.json();
// data.task_id → 保存到数据库
```
#### 轮询任务 GET /v1/query_task
```typescript
const params = new URLSearchParams({ task_id: taskId });
const res = await fetch(
`https://api.unifuncs.com/deepsearch/v1/query_task?${params}`,
{ headers: { 'Authorization': `Bearer ${UNIFUNCS_API_KEY}` } }
);
const { data } = await res.json();
// data.status: pending / running / completed / failed
// data.result.content: 最终结果
// data.result.reasoning_content: AI 思考过程(仅在接近完成时才有数据)
// data.progress: { current, total, message }
// data.statistics: { iterations, search_count, read_count, token_usage }
```
**优点:** 任务持久化,离开页面不中断,返回 statistics
**缺点:** reasoning_content 不实时 — 实测中在 12 分钟内仅返回 25%/50%/90% 进度,最后才一次性返回全部思考内容,用户体验差
### 2.3 模式选择建议
| 场景 | 推荐模式 | 原因 |
|------|---------|------|
| 用户在线等待、需要实时反馈 | SSE 流式 | reasoning 实时展示 |
| 后台批量任务、无人值守 | 异步 | 任务持久化、可恢复 |
| V2.0 Deep Research | SSE 流式 | Worker 消费 SSE 流 + DB 持久化 |
---
## 3. 网站覆盖能力
### 3.1 V2.0 精选数据源(前端可选)
| 站点 | 域名 | 类型 | 默认 | 搜索效果 |
|------|------|------|------|----------|
| PubMed | pubmed.ncbi.nlm.nih.gov | 英文 | 默认勾选 | 效果最佳,核心数据源 |
| ClinicalTrials.gov | clinicaltrials.gov | 英文 | 可选 | 英文查询效果好 |
| Cochrane Library | www.cochranelibrary.com | 英文 | 可选 | 系统综述金标准 |
| 中国知网 CNKI | www.cnki.net | 中文 | 可选 | 中文核心期刊 |
| 中华医学期刊网 | medjournals.cn | 中文 | 可选 | 中文医学期刊,效果优秀 |
### 3.2 中文数据源专项测试2026-02-23 实测)
测试条件SSE 流式模式max_depth=10domain_scope 仅包含 CNKI + 中华医学期刊网
**测试 12型糖尿病患者SGLT2抑制剂的肾脏保护作用**
| 指标 | 结果 |
|------|------|
| 耗时 | 268.3s |
| reasoning chunks | 4071 个12555 字符) |
| content chunks | 1671 个8055 字符) |
| 中文字符数 | 2398 |
| 中华医学期刊网链接 | 46 个 |
| CNKI 链接 | 有 |
| PubMed 链接 | 0 个 |
**测试 2非小细胞肺癌免疫治疗的中国临床研究进展**
| 指标 | 结果 |
|------|------|
| 耗时 | 316.4s |
| reasoning chunks | 2675 个9985 字符) |
| content chunks | 3151 个14291 字符) |
| 中文字符数 | 3536 |
| 中华医学期刊网链接 | 94 个 |
| PubMed 链接 | 0 个 |
**测试 3他汀类药物一级预防混合源PubMed + CNKI + 中华医学期刊网)**
| 指标 | 结果 |
|------|------|
| 中文字符数 | 3676 |
| PubMed 链接 | 96 个 |
| 中文源链接 | 0 个 |
### 3.3 关键发现
1. 纯中文 domain_scope 效果好:当仅限定 CNKI + 中华医学期刊网时API 能有效检索中文文献,返回的链接全部指向中文站点。中华医学期刊网效果尤其突出。
2. 混合模式存在偏向性:同时包含 PubMed + 中文源时AI 明显倾向于 PubMed中文文献被忽略。如果用户需要中文文献建议仅选择中文数据库或在 Prompt 中强调中文检索需求。
3. 付费库无法穿透Unifuncs 只能访问公开可达的网页内容不支持传入用户名密码。Web of Science、Embase、Scopus 等需要机构登录的库无法直接搜索。
4. SSE 模式实时性优于异步模式SSE 流的 reasoning_content 真正逐 chunk 实时返回,而异步模式的 query_task 轮询中 reasoning_content 直到接近完成才有数据。
### 3.4 全站覆盖测试2026-02-22 实测,异步模式)
#### 一级:确认可搜索(返回站内直接链接)
| 站点 | 域名 | 类型 | 站内链接数 | 搜索/阅读 | 最佳策略 |
|------|------|------|-----------|-----------|---------|
| PubMed | pubmed.ncbi.nlm.nih.gov | 英文 | 28 | 9/29 | 中/英文查询均可 |
| NCBI/PMC | www.ncbi.nlm.nih.gov | 英文 | 18 | 24/19 | 含 PMC 全文链接 |
| ClinicalTrials.gov | clinicaltrials.gov | 英文 | 38 | 6/24 | 英文查询max_depth≥10 |
| Google Scholar | scholar.google.com | 英文 | 10 | 22/26 | 跨库聚合搜索 |
| CBM/SinoMed | www.sinomed.ac.cn | 中文 | 9 | 17/12 | 中文生物医学文献 |
| 中国知网 CNKI | www.cnki.net | 中文 | 7 | 40/6 | 中文核心期刊 |
| GeenMedical | www.geenmedical.com | 英文 | 5 | 38/3 | 医学搜索聚合引擎 |
| Cochrane Library | www.cochranelibrary.com | 英文 | 4 | 38/12 | 系统综述金标准 |
| 维普 VIP | www.cqvip.com | 中文 | 1 | 33/3 | 可用但链接较少 |
#### 二级:可到达但链接间接
| 站点 | 域名 | 类型 | 其他链接数 | 说明 |
|------|------|------|-----------|------|
| 中华医学期刊网 | medjournals.cn | 中文 | 12 | 搜索活跃,专项测试效果优秀 |
| 万方数据 | www.wanfangdata.com.cn | 中文 | 7 | 搜索活跃,链接可能转跳 |
| 中国临床试验注册中心 | www.chictr.org.cn | 中文 | 7 | 有内容产出 |
| 中国中医药数据库 | cintmed.cintcm.cn | 中文 | 22 | 内容丰富 |
| Scopus | www.scopus.com | 英文 | 15 | 付费墙限制 |
| Embase | www.embase.com | 英文 | 14 | 需机构登录 |
| Web of Science | www.webofscience.com | 英文 | 6 | 付费墙限制 |
---
## 4. 关键参数说明
| 参数 | 类型 | 推荐值 | 说明 |
|------|------|--------|------|
| `model` | string | `"s2"` | 固定值 |
| `stream` | boolean | `true` | SSE 流式模式 |
| `max_depth` | number | 10~25 | 搜索深度。测试用 10生产用 25 |
| `domain_scope` | string[] | 按需配置 | 限定搜索范围,留空则不限 |
| `domain_blacklist` | string[] | `[]` | 排除特定站点 |
| `introduction` | string | 见下方 | 设定 AI 角色和搜索指导 |
| `reference_style` | string | `"link"` | 引用格式,`link``character` |
| `output_prompt` | string | 可选 | 自定义输出格式提示词 |
| `generate_summary` | boolean | `true` | 仅异步模式有效 |
### 推荐的 introduction 模板
```
你是一名专业的临床研究文献检索专家,擅长从多个学术数据库中检索高质量的医学文献。
请根据用户的检索需求,系统性地搜索并返回相关文献的详细信息。
```
### domain_scope 使用策略
| 场景 | domain_scope 配置 | 说明 |
|------|-------------------|------|
| 英文文献检索 | `["https://pubmed.ncbi.nlm.nih.gov/"]` | 核心数据源 |
| 中文文献检索 | `["https://www.cnki.net/", "https://medjournals.cn/"]` | 仅中文源,避免被英文库稀释 |
| 临床试验检索 | `["https://clinicaltrials.gov/"]` | 必须英文查询 |
| 系统综述 | `["https://www.cochranelibrary.com/"]` | Cochrane 专用 |
| 全面检索 | `["https://pubmed.ncbi.nlm.nih.gov/", "https://www.cochranelibrary.com/"]` | 多英文源组合 |
注意:不建议中英文数据源混合,测试表明混合时 AI 偏向英文源,中文文献会被忽略。如需同时检索中英文,建议分两次独立搜索。
---
## 5. 性能预期
| max_depth | 预计耗时 | 搜索/阅读量 | 适用场景 |
|-----------|---------|------------|---------|
| 5 | 1~3 分钟 | 10~40 / 0~20 | 快速探索 |
| 10 | 2~5 分钟 | 20~50 / 10~30 | 常规检索、中文源测试 |
| 15 | 3~8 分钟 | 30~80 / 20~50 | 深度检索 |
| 25 | 5~15 分钟 | 50~150 / 30~80 | 全面研究V2.0 生产配置) |
### 成本估算
- 单次搜索 Token 消耗5万~30万 tokens取决于深度和站点数量
- 估算成本:约 ¥0.1~0.5/次(按 unifuncs 定价)
---
## 6. 平台集成架构
### V2.0 SSE + 异步 Worker 混合架构(当前)
```
前端 DeepResearchPage
→ API: PUT /research/tasks/:taskId/execute
→ pg-boss Job Queue: asl_deep_research_v2
→ deepResearchV2Worker.ts
→ unifuncsSseClient.ts (SSE 流式)
→ 实时解析 reasoning_content → executionLogs → 写入 DB每2s刷写
→ 累积 content → 完成后解析为 synthesisReport + resultList
→ 前端 3s 轮询 DB → AgentTerminal 实时展示日志
```
### 核心文件
| 文件 | 说明 |
|------|------|
| `unifuncsSseClient.ts` | SSE 流式客户端AsyncGenerator 逐 chunk 返回 |
| `unifuncsAsyncClient.ts` | 异步客户端备选create_task / query_task |
| `deepResearchV2Worker.ts` | pg-boss Worker消费 SSE 流并实时写 DB |
| `reasoningParser.ts` | 将 reasoning_content 文本解析为结构化日志 |
| `resultParser.ts` | 将 content 解析为 synthesisReport + resultList |
### 其他模块可复用场景
| 模块 | 潜在用途 |
|------|---------|
| AIA 智能问答 | 智能体联网搜索增强 |
| PKB 个人知识库 | 自动补充知识库文献 |
| RVW 稿件审查 | 自动查找参考文献验证 |
| IIT 研究管理 | 自动检索同类临床试验 |
---
## 7. 测试脚本
| 脚本 | 路径 | 用途 |
|------|------|------|
| 中文数据源专项测试 | `backend/src/modules/asl/__tests__/deep-research-chinese-sources.ts` | SSE 流式模式测试 CNKI + 中华医学期刊网 |
| 全站覆盖测试 | `backend/scripts/test-unifuncs-site-coverage.ts` | 并行测试 18 个医学网站的搜索能力 |
| ClinicalTrials 专项 | `backend/scripts/test-unifuncs-clinicaltrials.ts` | 4 种策略对比测试 ClinicalTrials.gov |
| 快速验证 | `backend/scripts/test-unifuncs-deepsearch.ts` | 单站点 SSE 流式快速测试 |
| E2E 集成测试 | `backend/src/modules/asl/__tests__/deep-research-v2-e2e.ts` | V2.0 全流程端到端测试 |
| Smoke 测试 | `backend/src/modules/asl/__tests__/deep-research-v2-smoke.ts` | V2.0 API 连通性快速验证 |
```bash
# 中文数据源专项测试SSE 流式,约 10~15 分钟)
cd backend
npx tsx src/modules/asl/__tests__/deep-research-chinese-sources.ts
# 全站覆盖测试
npx tsx scripts/test-unifuncs-site-coverage.ts
# E2E 集成测试(需先启动后端服务)
npx tsx src/modules/asl/__tests__/deep-research-v2-e2e.ts
```
---
**维护者:** 开发团队
**最后更新:** 2026-02-23