作为一个写过医学综述、也被 AI 工具坑过的独立开发者,我发现市面上大多数 AI 论文写作工具都有一个致命缺陷:参考文献不可靠。
传统做法的架构缺陷:
结果就是:AI 编的引用、DOI 不存在、正文和引文不匹配。
这篇文章从技术实现角度,分享一下我是怎么解决这个问题的。
核心设计理念:证据链流水线
不要用一个 Prompt 生成全文,而是分成 6 个确定性的步骤。每一步的输出都是下一步的输入,每一步都可以人工审核。
Step 1:让 AI 生成专业检索策略
问题
用户通常只会输入自然语言主题,比如「二甲双胍对多囊卵巢综合征代谢指标的影响」。如果直接用这句话去 PubMed 检索,查全率和查准率都很低。
解决方案
让 LLM 将自然语言主题映射为 MeSH 词 + 布尔逻辑检索式:
产出物:
- PubMed 检索式:("Metformin"[Mesh] OR "Metformin"[tiab]) AND ("Polycystic Ovary Syndrome"[Mesh] OR "PCOS"[tiab]) AND …
- CNKI 检索式:(二甲双胍 OR 格华止) AND (多囊卵巢综合征 OR 多囊卵巢) AND …
Step 2:在真实数据库中执行检索
关键点
绝对不要让 LLM 生成文献列表! 这一步必须调用真实的学术数据库 API。
/ 调用 PubMed E-utilities API
async function searchPubMed({ query, pageNum, pageSize, startYear, endYear }) {
const params = {
db: 'pubmed',
term: query,
retstart: (pageNum – 1) * pageSize,
retmax: pageSize,
sort: 'relevance',
mindate: `${startYear}/01/01`,
maxdate: `${endYear}/12/31`,
datetype: 'pdat',
retmode: 'json',
};
// 调用 E-utilities,解析返回的 PMID 列表
// 然后通过 EFetch 获取详细元数据
}
每篇文献返回的数据结构:
{
"id": "pmid_12345678",
"title": "Metformin effects on metabolic parameters in PCOS…",
"authors": "Zhang S, Li W, Chen X, …",
"journal": "J Clin Endocrinol Metab",
"year": 2024,
"doi": "10.1210/xxxxx",
"pmid": "12345678",
"pmc": "PMCxxxxxx",
"abstract": "OBJECTIVE: To evaluate the effects of…",
"impactFactor": 6.9,
"casZone": "Q1",
"isWarning": false,
"apaFormat": "Zhang, S., Li, W., … (2024). Metformin…",
"gbtFormat": "[1] Zhang S, Li W, … Metformin… [J]. J Clin Endocrinol Metab, 2024."
}
每个字段都来自数据库,零幻觉。
Step 3:提纲生成 + 人机协作编辑
设计思路
提纲是综述的骨架。让 AI 出初稿,人来做决策。
提纲数据结构(递归嵌套):
1. 引言1.1 研究背景。。。。
前端交互:
- 使用 @dnd-kit/core 实现章节拖拽排序
- 将嵌套提纲递归解析为扁平列表 outlineToSections(),编辑后再反向组回嵌套 sectionsToOutline()
- 支持升降级(H1 ↔ H2 ↔ H3 ↔ H4)、增删、AI 润色
Step 4:文献筛选与结构化提取(最核心)
这步是整个系统的「灵魂」
传统做法的问题不是「没有文献」,而是「文献和正文没有关联」。
实现方案
4.1 AI 主题聚类
将文献池中的论文按研究方向自动分组:
# 后端逻辑(简化)
papers = […] # Step 2 中的文献列表
themes = llm.cluster_by_theme(papers)
# 输出: {"流行病学数据": [paper1, paper3], "机制研究": [paper5, paper8], …}
4.2 结构化信息提取
对每篇文献提取标准化的关键信息,为 Step 5 的写作提供「证据数据」:
{
"paperId": "pmid_12345678",
"structuredInfo": {
"researchType": "RCT",
"sampleSize": 1204,
"population": "PCOS patients aged 18-40",
"intervention": "Metformin 1500mg/day",
"comparator": "Placebo",
"coreIndex": "HOMA-IR decreased by 1.2 (95%CI: 0.8-1.6, p<0.01)",
"limitations": "Single center, 24-week follow-up only"
}
}
4.3 纳排标准筛选
用户可设置的筛选条件:
const INCLUDE_CRITERIA = {
RCT: '仅纳入随机对照试验',
COHORT: '纳入队列研究',
SAMPLE_GTE_50: '样本量 ≥ 50',
IF_GTE_3: 'IF ≥ 3.0',
RECENT_3Y: '近3年发表',
};
4.4 文献补充
当文献不够时,支持三种补充方式:
- 引文滚雪球:调用 API 获取某篇文献的参考文献列表
- PDF 上传解析:Grobid + PDFBox 提取 PDF 中的参考文献
- 手动搜索:直接在 PubMed/CNKI 中搜索追加
Step 5:基于证据的正文生成
这一步的 Prompt 结构完全不同
传统方案的 Prompt:
本系统的 Prompt 结构(简化示意):
关键差异:AI 不是「凭记忆写」,而是「看着结构化证据写」。每句引用都对应一条具体的文献记录,该记录有真实的 PMID 和提取出的核心结论。
Step 6:审稿 + 全文润色
6.1 AI 审稿
AI 从四个维度评审:
6.2 逐句 AI 工具
选中文本后可用的 9 种操作:
const AI_TOOLS = {
POLISH: '润色',
REWRITE: '改写',
IMITATE: '仿写',
EXPAND: '扩写',
CONDENSE: '缩写',
PROOFREAD: '校对',
REPHRASE: '降重',
TRANSLATE: '翻译',
SEARCH_CITE: '搜索并引用',
};
6.3 参考文献格式化
技术栈总结
| 前端 | React 19 + Vite 8 |
| 编辑器 | Vditor(WYSIWYG + Markdown) |
| 拖拽 | @dnd-kit |
| 文献检索 | PubMed E-utilities + CNKI API |
| AI 引擎 | GPT-4 / Claude(后端编排) |
| 实时通信 | SSE |
| PDF 解析 | Grobid + PDFBox |
| 导出 | Word (.docx) + Markdown |
总结
这个系统的核心价值不是「用了多强的 AI 模型」,而是把循证医学的写作方法论固化为软件流水线。
每一条引用都对应一篇真实存在的文献,每一篇文献都有提取出的结构化证据,每一段正文都基于这些证据生成——这是一个「先读再写」的架构,不是「凭记忆瞎编」的 prompt。
如果你也想自己搭建类似系统,关键就一句话:把「文献真实性」作为架构约束,而不是事后检查项。
项目地址:TopBeeAi-SCI(见主页链接)

#React #AI写作 #医学综述 #PubMed #全栈开发 #独立开发者




