前言¶
DeepSeek Harness(DSH)采用「一切皆插件」的架构,把各类能力拆成独立 bundle。对于医学/生命科学方向的智能体开发,一个常见需求是:检索多个医学数据库、获取题录与摘要、生成规范引用、读取开放获取全文,并在润色时核对「这句话是否有文献支持」。现有方案往往需要自己封装接口或调用多个服务,维护成本高。leexrisy/dsh-plugin-medical-literature 是一个面向 DSH 的插件,把上述流程统一到几个工具里。
插件概述¶
插件由维护者 leexrisy 发布,分类为「联网工具」,目前星标数为 0。它提供检索、题录获取、引用格式化、全文获取与句段核验五个工具,覆盖 PubMed、Europe PMC、arXiv、bioRxiv、medRxiv 五个来源,输出 Vancouver、APA、GB/T 7714、Nature、BibTeX、RIS、CSL-JSON 等格式,并支持将开放获取全文以 Markdown 形式落盘。
五个工具¶
| 工具 | 作用 |
|---|---|
medical_literature_search |
多源检索 + 去重 + CSV/JSON 导出 |
medical_literature_get |
单篇题录(含 volume/issue/pages、撤稿标记)+ 完整摘要 |
medical_literature_cite |
题录 → 格式化引用 / .bib / .ris / CSL-JSON |
medical_literature_fulltext |
开放获取全文 → 章节索引 + 有界正文 + Markdown 落盘 |
medical_literature_check |
句子 → 最相关段落;参考文献表 → 重复/撤稿告警 |
medical_literature_search¶
| 参数 | 类型 | 说明 |
|---|---|---|
query |
string | 共享检索词。自由文本按源自动适配(arXiv 去停用词) |
queries |
object | 推荐。 每个源一条原生 query,值原样发送;键即源名 |
sources |
string[] | 默认 ["pubmed","europepmc","arxiv","biorxiv"];可选 medrxiv |
max_results |
integer | 融合后最终返回条数,1–100,默认 10 |
candidates |
integer | 每个源的召回窗口,1–100,默认 max(20, 3×max_results);预期论文排在源内靠后时调大 |
fusion |
string | rrf(默认,只用各源自己的排名做倒数排名融合)/ source(按源分块)/ bm25(本地词频重排,显式要求才用) |
year_from / year_to |
integer | 出版年闭区间 |
sort |
"relevance" / "date" / "cited" |
默认 relevance;date 按日期倒序;cited 按 Europe PMC 被引次数倒序,只能单源 sources:["europepmc"] |
abstract_chars |
integer | 摘要截断长度,默认 600;0 = 不显示 |
save_path |
string | .csv / .json / .jsonl;相对路径按会话工作目录解析 |
排序策略¶
默认信任各引擎自己的排序——PubMed 的 Best Match 已经综合了 MeSH、字段权重、时间等信号,Europe PMC 和 arXiv 也一样。插件只做 RRF(倒数排名融合):每个源的第 1 名得 1/61、第 2 名 1/62……跨源相加,不重新按词频打分。只有显式写 fusion: "bm25" 才会用本地 BM25 覆盖源排序(它不知道 MeSH/引用量/时间,通常更差)。想扩大召回就调大 candidates / max_results,而不是重排。
经典 vs 前沿¶
被引次数和时间是相反的信号。sort: "cited" 只走 Europe PMC 的 CITED desc,记录会带 cited_by_count;PubMed 没有引文排序。需要两者兼顾时分两次查——第一轨 Europe PMC sort:"cited" 捞 PROSEVA、CAPP2 这类奠基文献,第二轨 PubMed sort:"date"/relevance 捞最新试验,由模型分别呈现,不要混成一个分数。引文排序也偏袒老旧、宽泛的论文,查询里要先加设计过滤器或主题约束。
为什么要分源写 query¶
PubMed 认 [tiab] / [MeSH Terms],Europe PMC 认 TITLE_ABS: / MESH: / SRC:PPR,arXiv 认 ti: / abs: / cat:。同一字符串发给三个引擎,轻则精度暴跌,重则 0 结果。插件会在发请求前拦截跨引擎语法并报错。完整语法见 skills/medical-literature/SKILL.md。
{
"queries": {
"pubmed": "(CRISPR[tiab] OR \"Gene Editing\"[MeSH Terms]) AND 2024:2026[dp]",
"europepmc": "TITLE_ABS:CRISPR AND MESH:\"Gene Editing\" AND PUB_YEAR:[2024 TO 2026]",
"arxiv": "(abs:CRISPR OR abs:\"gene editing\") AND submittedDate:[202401010000 TO 202612312359]",
"biorxiv": "TITLE_ABS:CRISPR AND TITLE_ABS:\"base editing\""
},
"max_results": 20,
"save_path": "crispr_preprints.csv"
}
召回技巧¶
arXiv 用词干/通配符 abs:patholog*、abs:histopatholog*、abs:prognos*,否则 pathology 匹配不到 pathological;totals 远大于返回数时(如 arxiv 5/444),目标方法可能排在 42 位,需按名查或调大 max_results。
已知系统名(如 PathAgent、NOVA、SPARK)不要当概念查:agent 匹配不到 agentic 或 PathAgent 这个 token,SPARK/NOVA 还是会撞上普通词。直接 ti:PathAgent OR ti:NOVA OR ti:SPARK,并注意预印本在 arXiv、正式版在 PubMed/Europe PMC。
单个源失败不会让整个调用失败:错误进 errors,其余源照常返回;只有所有源都失败才抛错。
medical_literature_cite¶
| 参数 | 说明 |
|---|---|
identifier |
一条 DOI / PMID / PMCID / arXiv ID |
identifiers |
多条(最多 50),生成一个参考文献列表 |
output |
vancouver(默认)、apa、gb-t-7714、nature、bibtex、ris、csl-json |
save_path |
可选;.bib / .ris / .json 自动选择对应格式;显式 output 与扩展名冲突会报错 |
// 润色时插入一条引用
{ "identifier": "10.3390/cells13100800", "output": "vancouver" }
// 整理整份参考文献,导出给 Zotero
{ "identifiers": ["10.3390/cells13100800", "PMID:32939066", "arXiv:1706.03762"],
"output": "bibtex", "save_path": "refs.bib" }
输出示例:
# Vancouver
Laurent M, Geoffroy M, Pavani G, Guiraud S. CRISPR-Based Gene Therapies: From Preclinical to
Clinical Treatments. Cells. 2024;13(10):800. doi:10.3390/cells13100800
# APA 7
Laurent, M., Geoffroy, M., Pavani, G., & Guiraud, S. (2024). CRISPR-Based Gene Therapies: From
Preclinical to Clinical Treatments. Cells, 13(10), 800. https://doi.org/10.3390/cells13100800
- 元数据来自 PubMed / Europe PMC / Crossref,工具不会编造作者或年份。
- 模板是标准样式的近似实现,投稿前请按目标期刊的具体规则复核。
- 预印本使用
@misc(BibTeX)、TY - UNPB(RIS)、[EB/OL](GB/T)。
medical_literature_fulltext¶
| 参数 | 说明 |
|---|---|
identifier |
DOI / PMID / PMCID / arXiv ID / URL |
section |
可选,按章节标题过滤(如 "methods") |
max_chars |
返回给模型的正文上限,默认 12000 |
save |
是否保存完整 Markdown,默认 true |
save_path |
可选;默认 literature/<id>/fulltext.md |
{ "identifier": "PMID: 38786024", "section": "discussion", "max_chars": 8000 }
| 来源 | 全文途径 | 实测 |
|---|---|---|
| PMC / Europe PMC OA(有 PMCID) | rest/{PMCID}/fullTextXML(JATS) |
✅ 章节 + 参考文献完整 |
| arXiv | arxiv.org/html/{id} |
✅ 有 HTML 的论文 |
| bioRxiv / medRxiv | 无可靠途径 | ❌ PDF 端点 Cloudflare 429 |
| 付费墙期刊 | 无 | 只有摘要 |
关于 403¶
europepmc.org/articles/...?pdf=render 返回 Cloudflare 人机校验页,pmc.ncbi.nlm.nih.gov/.../pdf/ 返回 reCAPTCHA 页,bioRxiv 返回 429 error code: 1015——这些是下载端点的反爬,不是付费墙,也不是代码问题。插件改用 Europe PMC REST 的 JATS XML 和 arXiv HTML,完全绕开 PDF 端点。
medical_literature_check¶
用于润色时的两件事:找支持句子的段落,以及审校一组参考文献。
| 参数 | 说明 |
|---|---|
claim |
要核对的句子;省略则只做参考文献审计 |
identifier / identifiers |
1–10 条 DOI / PMID / PMCID / arXiv ID |
top_k |
每个来源返回几段,默认 3 |
deep |
是否读取 OA 全文,默认 true;false 只用摘要、更快 |
// 这句话是否有文献支持?
{ "claim": "CRISPR-based therapy has been approved for sickle cell disease",
"identifiers": ["PMID: 38786024"], "top_k": 3 }
// 参考文献表是否有重复 / 撤稿?
{ "identifiers": ["PMID: 38786024", "10.3390/cells13100800"], "deep": false }
输出每段的 coverage(句子关键词命中比例)、score(BM25)和所在章节;同时给出:
- 重复:同一 DOI / 标题对应多条引用
- 撤稿:题录带
retracted时警告 - 极性差异:句子含否定词而最相关段落不含(或反之)时提示人工核对
- 弱匹配:最高 coverage 低于阈值时提示「可能不支持」
必须明确的限制:这是词面检索(BM25 + 关键词覆盖),不是语义蕴含判断。它能可靠地把范围缩到几段,是否真的支持结论仍要读原文。实测中:
- 「CRISPR 疗法已获批用于镰状细胞病」→ 第一段直接命中摘要里 FDA 批准 Casgevy 的那句(coverage 0.71)
- 「碱基编辑不产生双链断裂」→ 正确句在 top 3 内,但缩写 DSB 导致 Cas9 段落排第一,同时触发极性警告
- 「碱基编辑治愈所有实体瘤」→ 无支持段落,触发 partial-match 警告
安装与启用¶
插件按 DSH bundle 规范打包:package.json 声明 dsh.bundle.patch,cordis.patch.yml 插入 medical-literature 行。
从 npm 安装(推荐)¶
包已发布到 npm:https://www.npmjs.com/package/dsh-plugin-medical-literature
cd ~/.dsh/profiles/web
pnpm add dsh-plugin-medical-literature
从本地源码安装(开发用)¶
# 先把 PLUGIN 指向本仓库(任意位置)
PLUGIN=/path/to/dsh-medical-literature-plugin
cd ~/.dsh/profiles/web
pnpm add link:$PLUGIN
把包名加入 package.json 的 dsh.profile.bundles:
{
"dsh": {
"profile": {
"bundles": ["...", "dsh-plugin-medical-literature"]
}
}
}
profile 默认开启配置热重载:改 cordis.patch.yml 或重新 pnpm add 可触发重组。新增或修改工具 schema 时,已运行的 dsh web 仍缓存旧定义,需要新开会话或重启服务;只改 skill 文本则下一次读取即可生效。
安装检索/引用 skill¶
从 npm 安装时:
mkdir -p ~/.dsh/skills
ln -sfn ~/.dsh/profiles/web/node_modules/dsh-plugin-medical-literature/skills/medical-literature \
~/.dsh/skills/medical-literature
从本地源码安装时:
PLUGIN=/path/to/dsh-medical-literature-plugin
mkdir -p ~/.dsh/skills
ln -sfn $PLUGIN/skills/medical-literature ~/.dsh/skills/medical-literature
skill provider 会监听根目录,创建后无需重启即可出现在会话的 skill 目录里。
Skill 自带一个 PICO 拆解模板(人群/干预/对照/结局/研究类型 → MeSH + 自由词 + [pt] 过滤器)和一个 MeSH 映射脚本:
node ~/.dsh/skills/medical-literature/scripts/mesh-map.mjs "chronic kidney disease"
# → PubMed 实际翻译:"renal insufficiency, chronic"[MeSH Terms]
# → descriptor D051436,条目词 Chronic Kidney Diseases / Chronic Renal Insufficiency ...
它还能提前暴露缩写歧义:MACE 会被 PubMed 映射成 Myristica(肉豆蔻),ATTR 映射成 TTR 蛋白。
卸载¶
cd ~/.dsh/profiles/web
pnpm remove dsh-plugin-medical-literature
# 从 dsh.profile.bundles 删除包名
rm ~/.dsh/skills/medical-literature
典型用法¶
以下示例来自 README,可直接在 DSH 会话中调用。
- 多源检索并导出为 CSV
{
"queries": {
"pubmed": "(CRISPR[tiab] OR \"Gene Editing\"[MeSH Terms]) AND 2024:2026[dp]",
"europepmc": "TITLE_ABS:CRISPR AND MESH:\"Gene Editing\" AND PUB_YEAR:[2024 TO 2026]",
"arxiv": "(abs:CRISPR OR abs:\"gene editing\") AND submittedDate:[202401010000 TO 202612312359]",
"biorxiv": "TITLE_ABS:CRISPR AND TITLE_ABS:\"base editing\""
},
"max_results": 20,
"save_path": "crispr_preprints.csv"
}
- 获取单篇题录并生成 Vancouver 引用
{ "identifier": "10.3390/cells13100800", "output": "vancouver" }
- 按章节提取全文
{ "identifier": "PMID: 38786024", "section": "discussion", "max_chars": 8000 }
- 核对一句话是否在文献中
{ "claim": "CRISPR-based therapy has been approved for sickle cell disease",
"identifiers": ["PMID: 38786024"], "top_k": 3 }
适用场景与注意¶
- 适合需要多源医学文献检索、题录管理与引用格式化的 DSH 智能体开发者。
- 插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证(MIT)。
- 全文获取仅对开放获取来源有效,付费墙期刊只能获取摘要。
medical_literature_check是词面检索,需结合人工阅读确认结论支持。
结尾¶
插件把医学文献检索、引用格式化与开放获取全文获取整合到 DSH 生态中,减少自行封装多个接口的工作量。目录页:https://www.skillhub.cn/plugins/leexrisy/dsh-plugin-medical-literature;GitHub:https://github.com/leexrisy/dsh-plugin-medical-literature。