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>
This commit is contained in:
2026-02-23 13:21:52 +08:00
parent b06daecacd
commit 8f06d4f929
39 changed files with 5605 additions and 417 deletions

View File

@@ -0,0 +1,114 @@
# **Deep Research 需求扩写 Prompt 设计与检索维度指南**
**设计者:** 医学信息官 (MIO)
**应用场景:** ASL Deep Research V2.0 (MVP) \- Step 1 需求转化阶段
**底层引擎:** 本地 DeepSeek-V3 / Qwen-Max (负责扩写) \-\> Unifuncs (负责执行)
## **一、 文献检索维度的解构 (MIO 视角)**
要把用户的“一句话”扩写成一份严谨的检索指令书LLM 必须脑补并结构化以下维度。这些维度将直接决定 Unifuncs 引擎去哪些网页、抓取什么关键词、过滤什么条件。
### **🚨 1\. 必须项 (Mandatory Fields \- 决定检索成败)**
如果用户没提LLM 必须根据医学常识自动补齐其合理范围;如果补不齐,应设置默认的最优标准。
1. **核心疾病/目标人群 (Population):** 必须明确适应症。*(例如用户说“他汀”LLM必须根据常识扩写出可能针对的“高脂血症”或“心血管疾病预防”人群)*。
2. **核心干预措施 (Intervention):** 具体的药物、疗法或器械。
3. **目标文献类型 (Study Design \- 极度重要):** 在循证医学中文献类型决定了证据等级。如果用户没说LLM 默认必须限定为:**高质量的随机对照试验 (RCT)、前瞻性队列研究、系统综述与 Meta 分析**。绝不能让引擎去抓取个案报道 (Case Report) 或动物实验。
4. **获取约束 (Access Rule):** 这是我们系统的硬杠杠。必须强制要求:**仅限开放获取 (Open Access) 且包含完整 PDF 链接的文献**。
### **💡 2\. 可选项 (Optional Fields \- 提升查准率)**
用户如果有提及要强化如果没提及LLM 可以适当发散或留白。
1. **对照组 (Comparison):** 安慰剂 (Placebo) 还是标准疗法 (Standard of Care)。
2. **特定结局指标 (Outcomes):** 比如 OS (总生存期)、MACE (主要心血管不良事件)、AEs (不良反应)。
3. **同义词与 MeSH 词扩展 (Synonyms Expansion):** 这是体现“专业性”的核心!用户可能只输入了 "心衰"LLM 必须在指令书里附带提供 "Heart Failure", "HFrEF", "HFpEF" 等检索词,供 Unifuncs 扩大查全率。
## **二、 核心 System Prompt 设计 (可以直接写入代码)**
请将以下 Prompt 部署到 services/requirementExpansionService.ts 中。
\# Role
你是一名受过严谨训练的“临床医学信息专家Medical Information Officer”与循证医学图书管理员。
\# Task
用户的输入往往是口语化且不完整的临床检索诉求。你的任务是将用户简短的一句话,扩写、翻译并结构化为一份《深度检索指令书》。
这份指令书将直接发送给另一个拥有自主上网能力的 AI 深搜引擎Agent去执行。因此你的语言必须清晰、专业、逻辑严密并利用你的医学知识为用户补全隐含的专业要求。
\# Instructions & Rules
1\. \*\*理解与补全 (PICOS)\*\* 基于用户的输入,识别 P (人群)、I (干预)、C (对照)、O (结局)、S (研究类型)。
2\. \*\*强制文献质量过滤:\*\* 如果用户没有指定文献类型,你必须强制添加:“优先获取 随机对照试验(RCT)、前瞻性队列研究、系统综述与Meta分析排除动物实验、体外研究、个案报道及非英文文献”。
3\. \*\*强制数据可及性:\*\* 必须在指令中强调:“只提取开放获取 (Open Access) 且附带有效 PDF 全文下载链接的文献”。
4\. \*\*扩展专业检索词 (MeSH)\*\* 利用你的医学知识,将用户的中文或俗称,扩展为标准的英文医学主题词 (MeSH) 和常见缩写,写在【扩展检索词库】中,指导深搜引擎扩大召回率。
\# Output Format (严格遵循以下 Markdown 结构,不要输出额外废话)
请帮我执行一次深度的医学文献检索。以下是具体的检索要求:
【核心检索主题】
(一句话总结用户意图例如评估XXX在YYY中的疗效与安全性)
【目标人群与干预措施】
\- 人群 (Population)(详细描述疾病阶段、特征,如无明确要求则合理推断)
\- 干预 (Intervention / Comparison)(具体的药物、疗法及可能的对照)
【关注的结局指标 (Outcomes)】
(列出该领域常见的核心指标,如 OS, PFS, 并发症发生率等。如果用户指定了则用用户的)
【目标文献类型与质量要求】
\- 必须是:随机对照试验 (RCT)、队列研究、系统综述与 Meta 分析。
\- 强制排除:动物实验、体外细胞研究、个案报道。
\- 强制获取要求:必须是开放获取 (Open Access) 的文献,且必须能获取 PDF 全文或完整 XML 数据。对于需要付费墙 (Paywall) 的文献请予以忽略。
【扩展检索词库 (供搜索引擎参考)】
(列出 5-8 个核心的英文专业词汇、MeSH词或缩写用逗号分隔。例如Hydroxymethylglutaryl-CoA Reductase Inhibitors, Heart Failure, MACE...)
## **三、 效果演示 (Before vs After)**
你可以看到,经过这个 Prompt 处理后,原本干瘪的需求变得极其丰满,且直接指导了 Unifuncs 引擎该怎么做。
### **🧑‍⚕️ 医生的粗略输入 (前端传入)**
"替雷利珠单抗治疗非小细胞肺癌只要带PDF的"
### **🤖 LLM 扩写后的指令书 (前端 Step 2 展示给用户确认)**
请帮我执行一次深度的医学文献检索。以下是具体的检索要求:
**【核心检索主题】**
评估替雷利珠单抗Tislelizumab在治疗非小细胞肺癌NSCLC中的疗效与安全性。
**【目标人群与干预措施】**
* **人群 (Population)** 晚期、局部晚期或转移性非小细胞肺癌患者(可包含一线或二线治疗人群)。
* **干预 (Intervention / Comparison)** 替雷利珠单抗单药或联合化疗,对照组可为标准含铂双药化疗或安慰剂。
**【关注的结局指标 (Outcomes)】**
重点关注总生存期 (OS)、无进展生存期 (PFS)、客观缓解率 (ORR) 以及免疫相关不良事件 (irAEs) 的发生率。最好能提取到 HR 值及 95% CI。
**【目标文献类型与质量要求】**
* 必须是:随机对照试验 (RCT)、前瞻性队列研究、系统综述与 Meta 分析。
* 强制排除:动物实验、体外细胞研究、个案报道。
* 强制获取要求:必须是开放获取 (Open Access) 的文献,且必须能获取 PDF 全文或完整 XML 数据。对于需要付费墙 (Paywall) 的文献请予以忽略。
**【扩展检索词库 (供搜索引擎参考)】**
Tislelizumab, BGB-A317, Non-Small Cell Lung Cancer, NSCLC, Carcinoma, Non-Small-Cell Lung (MeSH), PD-1 Inhibitors, Overall Survival.
## **四、 为什么这种设计对 Unifuncs API 特别有效?**
Unifuncs 是一个基于大模型推理的 Agent。如果你只给它扔一句 "替雷利珠单抗治疗非小细胞肺癌",它会像个无头苍蝇一样在网上随便搜几个百度百科或知乎的新闻来交差。
但当你把上面这篇**充斥着 MeSH词、明确排除了动物实验、明确要求找 RCT、并且要求带有 PDF** 的大白话发给 Unifuncs 的 messages 时:
1. Unifuncs 会直接把 Tislelizumab AND NSCLC AND Randomized Controlled Trial 作为 PubMed 的搜索词。
2. 它在阅读网页时,看到没有 PDF 下载链接的,会自动根据指令里的【强制获取要求】执行 Discard放弃动作。
3. 它在总结时,会自动围绕【关注的结局指标】去撰写你的 synthesis\_report。
这就是大模型时代\*\*“用魔法(本地大模型)打败魔法(搜索大模型)”\*\*的最佳实践!