核查论文参考文献的真实性、信息准确性与撤稿状态,并比对正文论断是否得到指定材料支持。支持 PDF / DOCX / TXT 导入、拍照 / 截图识别、隐藏提示词检测、证据定位与报告下载。
在一项 2023 年研究的特定样本中,GPT-3.5 生成引文的 55% 为虚构,GPT-4 为 18%;这些比例不代表当前模型或所有使用场景。 —— Walters, W. H., & Wilder, E. I. (2023). Fabrication and errors in the bibliographic citations generated by ChatGPT. Scientific Reports, 13, 14045. https://doi.org/10.1038/s41598-023-41032-5
在线试用:引用体检 · 魔搭创空间,不用登录,电脑、手机都能用。平台页面加载较慢,第一次打开要等约半分钟;上传文件请用几 MB 以内的,较大的论文可以直接复制参考文献文字。部署方式见 docs/deployment/MODELSCOPE.md。
和直接问 AI 比:同一批 130 条带真值的引文里,不联网直接问 DeepSeek 会把 23%–33% 的编造引文说成真实;本系统为 0,说“已核实”的全部正确,同一批重跑结论一致。联网的 AI 也很强,详见下文“和‘直接问 AI’的对照”。
| 状态 | 功能 |
|---|---|
| ✅ | 粘贴参考文献列表,自动切分条目(支持 [1]、1. 序号、空行分段、续行合并) |
| ✅ | 识别 GB/T 7714、APA、IEEE 等常见格式,提取 DOI、arXiv 编号、年份、题名、期刊 |
| ✅ | DOI 注册核验(doi.org,覆盖 Crossref、DataCite、中文 DOI 等全部注册机构);知网登记的 DOI 取不到元数据,读中国 DOI 注册机构的解析页,判断它登记的是不是引文这一篇 |
| ✅ | 整条引文模糊检索(Crossref),英文文献查不到时用 OpenAlex 题名检索兜底 |
| ✅ | 中文期刊联网核查:Crossref 没确认的中文期刊论文,用 DeepSeek 的搜索接口(搜索引擎,不是大模型)到知网、万方、维普和期刊官网找原文页,读出作者和卷期再逐字段比对,结论写明来源;没配置密钥时跳过 |
| ✅ | 题名 / 作者 / 年份 / 期刊 / DOI 逐字段比对,支持期刊缩写(Sci. Rep.、PNAS 等) |
| ✅ | 撤稿检查(Crossref 中的 Retraction Watch 数据 + OpenAlex 交叉核对) |
| ✅ | 七类结论:已核实 / 信息有误 / 相近候选 / 疑似不存在 / 撤稿 / 关注声明 / 无法核验;查询故障单独标为未完成 |
| ✅ | 按数据库记录生成 GB/T 7714 或 APA 规范写法,一键复制"修正版清单" |
| ✅ | 规范参考文献:整份列表一键统一成 GB/T 7714 或 APA(APA 按作者排序),数据库确认是同一篇的按记录重写,相近候选、查不到、待人工的保留原文并注明原因;只贴 DOI 也能补全成完整条目 |
| ✅ | 流式返回,逐条显示核查过程(查了哪个库、耗时、为什么这样判) |
| ✅ | DeepSeek 辅助解析:只把规则没解析出题名的条目用 Function Calling 交给模型摘取原文字段,逐条校验后再由数据库核验;无密钥或失败时明确回退 |
| ✅ | 停止核查、截断流检测、未完成报告标注;下载包含原文、问题、数据库记录与查询过程的报告(网页文件,可直接打开、打印或另存为 PDF;另有 Markdown 版) |
| ✅ | 上手引导:第一次打开有约 2 秒开场动画(只播一次,点一下可跳过;系统设了“减少动画”就不播)和 6 步新手引导(压暗页面、朱笔圈出要讲的地方,旁边一张批注卡),最后一步一键载入示例并体检;页眉“怎么用”随时重看;输入框里 Ctrl / ⌘ + Enter 直接开始 |
| ✅ | 界面:单栏工作台,输入在上、结果在下;宽屏页眉吸顶,两个任务一键切换;结果可按结论筛选(含“需要处理”),筛选栏随滚动吸顶,详情平滑展开;动效(滑动高亮、数字滚动、按下晕开、逐条入场)都遵循系统“减少动画”设置 |
| ✅ | 论断证据核查(RAG):DOI 优先读取开放获取全文(Europe PMC / arXiv),没有时用摘要;长材料用混合检索(词面 + 模型扩展中英文检索词 + 模型重排);四类判断、原文引句与定位 |
| ✅ | PDF 文字层 / DOCX / TXT 导入:提取预览、全文或参考文献区域选择、确认后替换输入 |
| ✅ | AI 检索 Agent:对“无法核验 / 只有相近候选”的条目,由 DeepSeek 规划检索、调用 Crossref / OpenAlex / DataCite / DOI 工具,中文期刊用 DeepSeek 联网搜索查知网、万方、维普的论文页,每一步实时显示;候选仍由规则逐字段确认 |
| ✅ | 拍照 / 截图识别:上传或直接粘贴参考文献页的截图、手机照片、扫描件截图,DeepSeek 视觉模型逐条转写,对照原图确认后再由规则核验 |
| ✅ | MCP Server:把“核验参考文献”“核查论断”开放给 Claude、Cursor 等 MCP 客户端(stdio) |
| ✅ | 隐藏提示词检测:导入时找出读者看不见、AI 却会读到的文字(白字、极小字号、不可见渲染、页面外、Word 隐藏格式、Unicode 隐形字符),标出像写给 AI 的指令,并从导入文字中去掉 |
引文原文
│ 本地解析:切分条目、提取 DOI / arXiv / 年份 / 题名 / 期刊(不调外部服务)
▼
有 DOI?──是──► Crossref 按 DOI 取元数据 ──查不到──► doi.org 问注册状态 ──已注册──► 内容协商取元数据
│ └─未注册──► 记为"DOI 不存在"
│ 知网登记、没有元数据 ──► 中国 DOI 注册机构解析页:DOI 登记的是哪篇
▼(没对上同一篇)
Crossref 整条引文模糊检索 ──仍未找到且为英文──► OpenAlex 题名检索兜底
│ └─仍未找到且为中文期刊论文──► DeepSeek 搜索接口查知网 / 万方 / 维普
│ → 读原文页补作者、卷期(知网、期刊官网、Crossref)
▼
对候选逐字段打分,选出最佳匹配 → 撤稿检查 → 给出结论 + 规范写法 + 核查过程
选择 AI 辅助解析 时,在查询数据库前增加 DeepSeek verify_references 工具调用。只有规则没解析出题名、类型又在开放数据库覆盖范围内(期刊、会议、预印本或认不出类型)的条目才发送;只写了一个名称的条目、图书和网页等不发送,规则已解析完整的条目也不发送。服务端固定条目边界,逐条验证原文与字段来源:某条返回的字段缺原文依据、序号重复或漏返回,只有这一条退回规则解析,不影响同批其他条目。模型只补充规则没提取到的字段,保留原文中的错误作者、年份和期刊等证据;摘出的刊名只校验、不用于比对。补上的字段在详情比对表里标“AI 摘出”,页面会提示发送了几条、补上几条、退回几条。模型无法直接给出真实性结论,也不能选择任意网络地址。
10-16 的旧版把全部条目整批交给模型、一条不合格就整批作废:dev 集上比标准规则少核实 1 条、多 1 条误报,3 批中 1 批整批退回。10-17 改为上面的做法,并用同一批数据库应答对照两种模式(规则组运行时录下应答,AI 组回放,只有 AI 补上题名后新发出的检索才联网;对照记录):
| 集合 | 发送 / 补上 / 退回 | 与标准规则相比 |
|---|---|---|
| dev 108 | 6 / 2 / 0 | 结论逐条相同 |
| test 119 | 29 / 23 / 1 | 多核实 2 条(ECML/PKDD 2007 挑战赛、R 包 vegan),多抓出 1 条真错误(第一作者 Olson 被写成 “Carol”) |
| 第五批 108 | 8 / 8 / 0 | 结论逐条相同 |
改版过程中出过四处问题,都已修复并补了测试:
- 把“只有一个名称”的条目整句当题名(test T066);
- 把章节题名当成书名补进刊名(T092);
- 条目自带编号时,输入检查只去一次编号,整批被拒;
- 没有 DOI 的会议论文,题名由模型摘出后两个库都查不到,被判成疑似不存在(第五批 B052)。现在 AI 摘出的题名只用来找候选,查不到时不作为疑似不存在的依据。
结论:最终版本没有新增误报,收益很小,只出现在规则解析不出题名的会议论文和软件包上;test 集今天已用于改版,那 3 条不算独立证据。
AI 检索 Agent(“AI 继续查”):标准核验后,“无法核验”或“只找到相近候选”的条目旁会出现“AI 继续查”按钮。点击后,DeepSeek 先阅读原文、已解析的字段和已经查过的路径,再决定下一步调用哪个工具:
search_crossref:按题名或关键词检索,可加作者姓、年份 ±1;search_openalex:按题名检索,每条最多 1 次;search_datacite:检索软件、数据集、报告、学位论文和预印本;lookup_doi:只能查询引文或检索结果中出现过的 DOI;search_cn_journals:中文期刊论文按题名联网搜索知网、万方、维普的论文页(见下文“中文期刊联网检索”);finish:结束检索。
每次调用都带一句中文理由,检索结果连同规则比对提示(题名、第一作者、年份是否吻合)回传给模型,供它调整下一步。每一步都实时显示在卡片上。规则一旦确认找到同一篇就停止;每条最多检索 4 次、调用模型 4 轮、耗时 80 秒。
结束后,所有候选交给与标准核验相同的规则逐字段比对:
- 模型不能指定哪一篇算数,不能给出真伪结论;
- Agent 只能找到证据,不能制造“疑似不存在”;
- 模型失败、超时或参数不合规时,原结论保持不变并如实说明。
中文期刊联网核查(标准体检):知网、万方、维普没有开放接口,Crossref 和 OpenAlex 对中文期刊文章收录有限,以前标准核验里的中文期刊论文几乎全判“待人工”(四批盲测 96 条中文里 90 条)。2026-10-19 起,Crossref 没确认的中文期刊论文,标准体检会多做一步(cnjournal.ts、cnpage.ts):
- 用 DeepSeek 的 Search 接口(
/v1/tools/search,DeepSeek 自研的搜索引擎,不是大模型)按题名检索,限定知网、万方、维普三站,从搜索结果解析题名、作者、刊名、年期。英文译名后面用方括号附了中文原文的引文,按方括号里的中文原文查。 - 搜索结果没有作者时补作者,拿到能下结论的记录就停:
- 维普的结果本身带作者;
- 读手机知网文章页(
wap.cnki.net/touch/web/Journal/Article/文献编号.html):页面内嵌的数据带作者、刊名、年、期,10-19 实测 23 条取到 22 条。知网阅读页read.cnki.net现在返回 404,DeepSeek 的 Fetch 取回的正文也没有作者,所以不走这两条路;知网页面上的页码多是期内页码,和印刷页码对不上(23 条里只有 1 条一致),不取; - 同题名的记录都还没有作者时,再只查一次维普;
- 不限站点再搜一次,读期刊官网文章页的元数据(
citation_*、DC.*、PRISM,以及勤云、玛格泰克平台网址里的年、卷、期、页;元数据没写年份时取页面上期刊自己写的刊期行),常能补上知网没有的卷号和印刷页码; - 刊物在 Crossref 注册了 DOI 时,按刊物 ISSN(来自期刊官网元数据或知网期刊页)、年、卷、起始页到 Crossref 定位,作者用汉字 ↔ 拼音比对;官网页有 DOI 却缺年份、卷期时,按 DOI 到 Crossref 补。中文期刊的 DOI 多由 ISTIC 或知网注册(地球物理学报的 10.6038 也是),这两家不提供可比对的元数据,所以这一步只对科学出版社等少数刊物有用。
- 学校 WebVPN 镜像(
wap-cnki-net-443.webvpn.*)、学术搜索和文库、机构知识库、个人主页等转载站一律不当来源。只读、不登录、不碰验证码页,请求头如实写明是本工具;有的期刊官网会拒绝这样的请求(HTTP 403),这时跳过。
判定比只看题名严:
- 已核实:题名、刊名、年份一致,作者对得上,并且卷号、期号或起始页至少一项与记录一致。结论写明来源,如“已核实:与知网记录一致(来源:知网)”;卷页取自 Crossref 时写“知网、Crossref”。
- 只差作者核对不了(知网、万方的记录没读到作者),或作者对上了但卷期页码核对不了(引文只写“卷: 页”,知网没有卷号),仍判“相近候选”,附原文链接,并说明差在哪一项。
- 题名、刊名、年份都对上而作者对不上,判“信息有误”并列出记录里的作者:“真题名配假作者”是常见的拼凑式编造,不能因为题名对上就放过。题名一样、刊名或年份对不上的,可能是同名的另一篇,最多给相近候选;引文署名是单位(考古发掘简报这类)时不和执笔人逐个比对,也只给相近候选。
- 联网也查不到时仍判“无法核验”,查不到不说明文献不存在;知网和期刊官网的页面不标注撤稿,核实的结论里注明没有核对撤稿状态。
额度与时限:DeepSeek 搜索接口每个账户限 5 次 / 秒,进程内限到相邻两次至少隔 250 毫秒、同时最多 3 个,结果缓存 6 小时;每次核查请求最多联网核查 30 条(环境变量 CN_SEARCH_BUDGET),单条最多 25 秒,超时就用已经找到的候选比对。Netlify 上整个请求 50 秒,离时限不到 8 秒就不再开始新的联网核查,没查的条目注明原因、结论照旧。连接超时或被重置时搜索重试一次;搜索失败、限流按“没有完成”处理,不当作查不到。没配置 DeepSeek 密钥时整步跳过,结论和以前一样。评测里每条中文期刊论文平均约 2 次搜索、1.2 次页面读取,按官方价格每 1,000 次成功搜索 0.75 美元(2026-10-17 查看),每条约 0.15 美分。境外服务器(如 Netlify 的美国机房)可能读不到知网页面,这时多半只能给相近候选;魔搭部署在国内,还没上线实测。
AI 继续查里的中文期刊检索:10-17 重测时 AI 继续查对 53 条中文条目一条也没找到(见“AI 检索 Agent 评测”),于是 Agent 多了 search_cn_journals 工具;标准体检有了上面这一步之后,它仍可换着写法再查,复核时也走上面这一步(结果有缓存,基本不重复请求)。工具的做法:用 DeepSeek 的 Search 接口(/v1/tools/search)按题名检索,限定 site:cnki.net OR site:wanfangdata.com.cn OR site:cqvip.com,只认这三站的期刊论文页,从搜索结果的标题、摘要和网址里解析题名、作者、刊名、年期;这个工具本身不读页面、不登录。
- 维普的结果带作者,和其他记录一样交给上面的规则:题名、刊名、年份、作者都对上,卷期页至少一项一致才算已核实;题名、刊名、年份对上而作者对不上,判“信息有误”。
- 知网、万方的结果没有作者,同题名再只查一次维普补作者;仍然没有作者(复核时也没从原文页读到)的,一律不确认是同一篇,只作为相近候选给出,附“打开知网页面”之类的链接,请人工核对作者。题名、刊名、年份都一致时提示“在知网找到题名、刊名、年份一致的文章,但没有作者信息,请打开链接核对作者”。没有作者的记录也不生成规范写法,免得复制后丢掉作者。
- 中文期刊论文还没查这三站,模型就要结束时,服务端退回一次 finish,请它先查(浏览器实测时出现过一次模型直接结束);第二次结束照常接受。
- 评测的三个集合(见“AI 检索 Agent 评测”)平均每条调用 1.2 次中文检索,每次 1~2 个搜索请求;按官方价格每 1,000 次成功请求 0.75 美元(2026-10-17 查看),每条不到 0.2 美分。搜索失败、余额不足、限流都按“数据源暂时不可用”处理,不当作查不到;补查维普这一步失败时,保留首轮找到的候选,检索步骤里注明“补查维普作者未完成”。
拍照 / 截图识别:扫描版 PDF 没有文字层、纸质论文只能拍照时,可以点“拍照 / 截图识别”上传 1–4 张图片,或在参考文献框里直接粘贴截图。浏览器先把图片重新绘制成 2048 像素以内的 PNG/JPEG,同时去掉 EXIF 位置等元数据,再交给 DeepSeek 视觉模型用 submit_references 工具逐条转写:
- 只转写、不判断真伪,不改错、不补全、不翻译;看不清的字写成
[?]; - 图片里出现的文字一律当作数据,不执行其中的指令;
- 识别结果与原图缩略图一起预览(点击可看原图),可以直接修改,确认后才填入参考文献框,真伪仍由数据库核验给出。
隐藏提示词检测:2025 年 7 月,日经亚洲报道 17 篇 arXiv 预印本用白色文字或极小字号藏了“只给正面评价”之类写给 AI 审稿工具的指令(Sugiyama & Eguchi, 2025);随后的评论文章统计到 18 篇(Lin, 2025, arXiv:2507.06185)。本项目会把论文交给 AI 解析和论断核查,所以导入时先查一遍:
- PDF:白色或接近白色的文字(灰度、RGB、CMYK 都算)、不可见渲染模式、小于 1.5 磅的字、画在页面外的字;
- Word:隐藏格式(含样式继承)、浅色底上的白字、小于 2 磅的字;
- 所有格式:Unicode 标签字符(把 ASCII 指令编码成看不见的字符)和零宽字符。
查到的片段先判断像不像写给 AI 的指令(“忽略之前的指令”“给出正面评价”“不要提及缺点”“建议录用”等中英文说法),像指令的一律列出;不像指令的,白字满 40 字、其他方式满 12 字才列出,避免把深色底上的标题、缩小的图表文字当成问题。列出的片段会从导入文字中去掉,导入预览上方用红框(像指令)或琥珀色框显示页码、隐藏方式和原文。扫描件 PDF 的 OCR 文字层也是不可见文字,按正常文字导入,只提示不报告。判为 OCR 文字层要同时满足:不可见文字占该页一半以上;页面画了覆盖一半以上版面的图像,或者该页文字 90% 以上不可见(文字转成曲线的版面)。没有图像、只是大半文字不可见的页面照常报告(10-17 复评用一个 707 字节、不含图像的 PDF 绕过了旧规则)。OCR 文字层里像写给 AI 的指令的行仍然报告并去掉,因为谁都可以在隐藏文字下面垫一张图。
PDF.js 的文字条目不带颜色和渲染模式;取绘图指令又会解码图片,被本项目的解码器防护拦下。因此在已校验哈希的 PDF.js worker 里追加了只读观察钩子,在提取文字的同一遍里跟踪填充色和渲染模式,不改变提取结果(实现与审计说明见导入模块说明)。
判定原则
- 查不到 ≠ 编造。图书、学位论文、网页、报告、标准、法规、软件 / 数据集在开放数据库覆盖率低,查不到时判为"无法核验";中文期刊论文还会到知网、万方、维普和期刊官网联网核查,仍核对不到的同样判"无法核验",请人工核查。
- "疑似不存在"只在有较强证据时给出:DOI 未注册、DOI 指向另一篇文献、英文期刊 / 会议论文在 Crossref 和 OpenAlex 中都查无此文。没写 DOI 的,下这个结论前还会查 Crossref 期刊目录:目录里认得出这本刊、但它在引文年份没有登记文献时,改判“无法核验”;比如某刊只登记过 2007–2009 年的文献,2022 年的论文查不到就不算证据。目录认不出的刊名(“J Surg Oncol”这类缩写,或根本不在 Crossref 的刊物)做不了这一步,所以真实刊物上的真实论文仍可能被判“疑似不存在”(第四批盲测的 B040),这类结论要人工复核。
- 判"期刊名不符"之前,先按 ISSN 查该刊在 OpenAlex 登记的其他名称(外文刊名、旧刊名),波兰语、缩写等写法不算错。
- 年份按正式出版、纸本、在线首发三个日期比对,写其中任何一个都不算错。物理、化学期刊常见的"不写题名"引文,按 DOI、作者、刊名、卷号、页码核对。
- 规范写法只依据数据库记录格式化生成,不让大模型编写任何文献信息。
- 中文网页记录(知网、维普、期刊官网)要题名、刊名、年份都对上才算同一篇;判已核实还要作者对得上、卷号 / 期号 / 起始页至少一项一致。知网、万方的搜索结果没有作者、原文页又没读到时,最多给“相近候选”和来源链接;只用题名确认,编造作者的引文就会被判成已核实。
- 相近候选不等于已确认同一篇。只找到相近记录、没能确认是同一篇的条目单独判为“相近候选”:哪一项写错要以确认同一篇为前提,所以它不算“信息有误”,需要人工核对;修正版清单保留原文并要求人工确认,不自动替换成另一篇文献。引用的 DOI 未注册或指向别的文献时,DOI 的错误是确定的,即使另有相近候选也仍判“信息有误”。
- 关注声明与撤稿分别显示。数据库故障、预算不足和核查中断不当作“查无此文”;未完成时不显示健康分,也不允许复制完整修正版。
- 撤稿状态除了读 Crossref,还按 DOI 到 OpenAlex 交叉核对。OpenAlex 有时把一个 DOI 并到登记了另一个 DOI 的记录里(示例中的 arXiv 论文《Attention Is All You Need》就是这样,2026-10-17 实测):题名、第一作者都对得上,才用这条合并记录核对撤稿状态;对不上,或合并记录带撤稿标记,只提示人工核对,不据此判撤稿。
- 健康度仅计算有明确结论的条目,不包含相近候选、待人工核验及关注声明;匹配参考值不是经统计校准的正确概率。
需要 Node.js 22.13+ 和 pnpm(PDF 解析依赖的最低版本)。
pnpm install
cp .env.example .env.local # Windows PowerShell 使用 Copy-Item .env.example .env.local
pnpm dev # http://localhost:3210已有 .env.local 时请直接编辑,不要覆盖。建议设置 CROSSREF_MAILTO;要启用 AI 模式,填入服务端 DEEPSEEK_API_KEY,可选 DEEPSEEK_MODEL(默认 deepseek-flash)与 DEEPSEEK_BASE_URL(默认 https://api.deepseek.com)。修改配置后重启服务。没有密钥也可使用标准核验。
生产构建与启动:pnpm build,然后 pnpm start --port 3210。
项目自带 .npmrc,依赖从 npmmirror 国内镜像安装。
pnpm test # 离线回归:解析、匹配、上游故障、AI协议、接口、流与报告
pnpm lint
pnpm typecheck
pnpm build
pnpm eval --out=eval/results/local.json # 核验引擎访问真实数据库,保存独立结果
pnpm eval:real eval/real-world/dev-2026-10-14.json --out=eval/results/local-real.json # 真实论文参考文献评测
pnpm sample:real --out=eval/real-world/blind-新日期.json # 从 Crossref 抽一批新的真实参考文献(排除已用过的论文);加 --zh 只抽中文参考文献
pnpm eval:real eval/real-world/dev-2026-10-14.json --lang=zh # 只跑中文条目(含中文期刊联网核查);--no-cn 关闭联网核查对照
pnpm smoke:ai # 需服务运行及有效密钥;真实DeepSeek工具调用+数据库核验
pnpm smoke:claims # 真实摘要 + 合成材料支持/矛盾/不足;产生少量模型用量
pnpm eval:retrieval # 论断检索评测:三篇开放全文、24 条论断,对比词面 / 扩展 / 混合检索
pnpm eval:agent eval/real-world/dev-2026-10-14.json eval/results/real-dev-2026-10-15-v2-rules.json # AI 检索 Agent 评测
pnpm smoke:mcp # 用 stdio 启动 MCP Server,真实调用两个工具
python eval/vision/generate.py && pnpm eval:vision # 图片识别评测:生成图片并逐字比对、对比核验结论
pnpm exec tsx scripts/scenario-run.mts # 开发方场景测试:大模型写的 36 条参考文献,与 eval/scenario-2026-10-23/truth.json 对照;--rescore 只重新计分
pnpm exec tsx scripts/scenario-doi.mts # 只贴 DOI:Crossref 随机抽期刊论文,生成的条目与原始记录逐项对照AI 冒烟默认访问 http://localhost:3210(可通过 SMOKE_BASE_URL 指定),会向 DeepSeek 发送两条公开文献引文并产生少量 API 用量;结果保存至 eval/results/ai-smoke-*.json。任何 AI 降级都不会被当作 AI 验收通过。离线测试使用固定响应,不证明模型的真实准确率。
评测集 eval/cases.json 共 29 条:真实正确 8、真实但信息有误 7、编造 7、撤稿 2、超出覆盖范围 5。2026-10-14 完善后重新联网运行结果(完整记录):
| 指标 | 结果 |
|---|---|
| 符合预期判定 | 29 / 29 |
| 编造文献检出 | 7 / 7 |
| 真实文献被误判为"不存在" | 0 / 15 |
这是项目自建的小规模评测集,用于回归测试,不代表真实场景下的准确率。2026-10-15 准确率修复后重跑,结果不变(记录);2026-10-16 再跑仍为 29/29,29 条结论与 10-15 逐条一致(记录)。
评委和用户最常问:为什么不直接把参考文献丢给 ChatGPT、DeepSeek?我们构造了 130 条答案已知的引文(真实 50、改错一项 40、编造 40,含中文 20),同一批交给本系统和 DeepSeek(开深度思考、逐条单独问、允许答“不确定”,这些条件对 AI 有利):
| 做法 | 编造被说成真实 | 改错被说成正确 | 改正写法改对 | 真实英文条目有结论 | 重问一遍结论相同 | 单条用时 |
|---|---|---|---|---|---|---|
| 本系统:规则核验 | 0/40 | 0/40 | 36/36 | 20/40 | 129/130 | 约 2 秒 |
| 本系统:规则 + AI 继续查 | 0/40 | 0/40 | 36/36 | 21/40 | — | 追查条目约 7 秒 |
| 直接问 AI(flash,不联网) | 13/40 | 7/40 | 15/37 | 37/40 | 115/130 | 7.5 秒 |
| 直接问 AI(pro,不联网) | 9/40 | 5/40 | 18/34 | 30/40 | — | 18 秒 |
| AI + 联网搜索(flash) | 0/40 | 0/40 | 39/39 | 40/40 | 108/130 | 8 秒 |
| AI + 联网搜索(pro) | 1/40 | 2/40 | 38/40 | 39/40 | — | 24 秒 |
- 不联网直接问 AI 不能用来核查:会一本正经地确认编造的文献,给出的 DOI 只有 56%–63% 指向正确论文。
- 联网的 AI 是真正的对手:flash 联网同样没有放过编造和改错,覆盖还更广;但 pro 联网把 2 条改过 DOI 的引文说成“与 PubMed 记录一致”,确认了 1 条虚构中文文献,两次运行有 17% 的结论不同。
- 本系统的长处是“说了就算数”:说“已核实”的 19 条全对,改正写法全部来自数据库,重跑结论一致,规则核验不调用模型。短处是网页、报告、图书多判“待人工”,也不检查格式是否完整(如 arXiv 编号多一位),这两点联网 AI 做得更好。
消融:去掉 OpenAlex 兜底,编造条目无法判为疑似不存在(10/30 降到 0);加上 AI 继续查,中文真实条目 8/10 拿到“已核实”或“题名、刊名、年份一致”的链接,虚构的 0/10。数据集、提示词、逐条输出和局限见 对照实验报告。
老师的试用记录还没有收回,先由开发方按两种最常见的用法测试。真值都在运行本系统之前查证,每条附可打开的依据(truth.json);这不是用户研究。
场景一:大模型写的参考文献。 让 DeepSeek(deepseek-flash)按教育、医学、经济三个题目各写 12 条 GB/T 7714 参考文献(中英各半、尽量附 DOI),共 36 条。逐条查证:11 条是编造(DOI 未注册或指向同刊另一篇,题名查不到),22 条真实且写对,3 条真实但有字段写错。每个题目当作一次粘贴,按线上标准体检的参数运行(生成记录、结果、修复前结果):
| 查证结果 | 条数 | 测试时的版本 | 修复后(同一批复测) |
|---|---|---|---|
| 编造 | 11 | 查出 7,交人工 4,说成真实 0 | 查出 10,交人工 1,说成真实 0 |
| 真实且写对 | 22 | 核实 18,交人工 4,误报 0 | 核实 18,交人工 4,误报 0 |
| 真实但有字段写错 | 3 | 查出 1;1 条判成已核实;1 条误报 | 查出 2;1 条误报 |
| 判“已核实”的是否全对 | — | 19 条中 1 条 DOI 是错的 | 18 条全对 |
- 测试中发现:大模型常给文献配上同刊另一篇论文的 DOI,而登记在知网的 DOI 在 doi.org 取不到元数据,配错了也看不出来。现在读中国 DOI 注册机构的解析页,比对这个 DOI 登记的题名、作者:登记的是另一篇,就按“DOI 指向别的文献”处理;登记的就是这一篇时,只说明 DOI 属于它,年份、卷期页仍请人工核对,不据此判已核实;英文写法的中文文献不比对题名。已有评测集里只有 1 条知网 DOI,结论不变。
- 仍有 1 条误报:真论文被写成另一本期刊,卷期页和 DOI 也错,联网又没搜到原文,被判“疑似编造”。交人工的 5 条:3 条知网 DOI 只能核对题名、作者,1 条《经济研究》论文联网没搜到,1 条是没有 DOI 的工作论文(编造的)。
场景二:只贴 DOI。 从 Crossref 随机抽 30 篇期刊论文,每条只贴 DOI,把生成的 GB/T 7714 条目和 Crossref 原始记录逐项对照(题名、前三位作者、年份、刊名、卷、期、页、DOI):30/30 判为已核实。第一次 27/30 逐项一致:2 条 Crossref 把作者单位登记成作者,条目多出单位(已修);1 条是比对脚本没还原刊名里的 &。修复后 30/30,单条中位数 1.7 秒(修复前、修复后)。
限制:样本由开发方生成和查证,没有第二人独立标注;场景一只用了一个模型、三个题目,修复前后各运行一次;修复是看过这批结果后做的,修复后的数字是同一批复测,不是盲测;联网检索结果会随搜索引擎变化。
用脚本模拟第一次来访的用户在桌面和手机上完成体检、筛选、复制修正版、导入 PDF、论断核查等任务,并做 axe-core 无障碍检查(报告)。10-19 按发现的问题修了首屏主按钮、正文段落误当参考文献、报告只能下载 .md(改为可打印的网页)、对比度和焦点框,复测 axe-core 0 处违规。重新部署魔搭后复测又发现两处并已修复:慢网络下脚本到达前粘贴的文字会被清空(现在脚本就绪前输入框不可用并提示“页面还在加载”);论断核查只拿到摘要时,会用“GPT-4 总体 18% 编造”否定“GPT-4 引用的书籍章节七成是编造的”(现在初判为矛盾时复核引句是否单独报告了论断限定的范围,没有就改判证据不足;47 条论断各判 3 次、跑两轮,不该判矛盾的 178 次里错判从 38 次降到 0,见 范围评测)。这不是真人测试;真人测试按 老师试用指南 做,含 SUS 可用性量表。
eval/real-world/ 下有五个集合,都是从 Crossref 按出版社随机抽取 2023 年后发表的论文,再从其参考文献中随机取原文,因此每一条都视为真实存在:
- dev:108 条(中文 36 条),修规则时反复查看。
- test:119 条(中文 24 条),来自另一批论文,修改期间不查看,规则定稿后只运行一次;10-16 为修剩余误报看过,之后不再算盲测。
- blind:110 条(中文 24 条),来自 64 篇另外的论文,出版社组合也换了;规则定稿前后都没有查看,10-16 只运行一次;10-16 晚为修它的误报看过,之后不再算盲测。
- blind2:111 条(中文 24 条),来自 62 篇另外的论文(与前三个集合没有重叠),在 10-16 晚的规则定稿后抽样,只运行一次;复核时已看过,之后不再算盲测。
- blind3:111 条(中文 24 条),来自 63 篇另外的论文(与前四个集合没有重叠),在 10-17 “相近候选”单列定稿后抽样,只运行一次。
旧引擎从会话记录中还原,在 dev 上与原基线 108 条逐条一致后,才拿来在 test 上做对照。
| 集合 | 版本 | 已核实 | 误报(自动统计) | 误报(逐条复核) | 其中"疑似不存在" |
|---|---|---|---|---|---|
| dev 108 | 修复前 | 29(27%) | 19(18%) | 19 | 5 |
| dev 108 | 修复后 | 44(41%) | 0 | 0 | 0 |
| test 119(盲测) | 修复前 | 37(31%) | 24(20%) | 19(16.0%) | 4 |
| test 119(盲测) | 修复后 | 45(38%) | 16(13%) | 12(10.1%) | 4 |
| dev 108 | 10-16 修复后 | 44(41%) | 0 | 0 | 0 |
| test 119(已看过) | 10-16 修复后 | 46(39%) | 3(3%) | 0 | 0 |
| blind 110(盲测) | 10-16 修复后 | 47(43%) | 11(10%) | 10(9.1%) | 2 |
| dev 108 | 10-16 晚修复后 | 45(42%) | 0 | 0 | 0 |
| test 119(已看过) | 10-16 晚修复后 | 48(40%) | 3(3%) | 0 | 0 |
| blind2 111(盲测) | 10-16 晚修复后 | 37(33%) | 13(12%) | 13(11.7%) | 4 |
| blind3 111(盲测) | 10-17 相近候选单列后 | 30(27%) | 23(21%) | 20(18.0%) | 9 |
| dev 108 | 10-17 第四批修复后 | 45(42%) | 0 | 0 | 0 |
| test 119(已看过) | 10-17 第四批修复后 | 50(42%) | 3(3%) | 0 | 0 |
| blind4 108(盲测) | 10-17 第四批修复后 | 51(47%) | 8(7%) | 6(5.6%) | 1 |
表中误报都按旧口径计(“相近候选”也算误报,各行可以直接比较);按新口径,blind3 为 17 条(15.3%),blind4 为 5 条(4.6%),见本节末“第四批盲测集结果”和“第五批盲测集结果”。
自动统计会把源论文本身写错的条目也算成误报,test 集逐条复核(复核记录)后:
- 两版都正确标出了 3 条真实错误:DOI 写错、年份写错、引文错乱各 1 条;
- 另有 1 条(修复前为 2 条)无法确认,没有计入误报;
- 出错的条目均为 Crossref 限流(429)。
dev 上降到 0 有调规则的成分,盲测的 10.1% 才是对新数据的估计(之后三批新盲测集为 9.1%、11.7% 和 18.0%,见本节后文)。盲测中剩下的误报主要有:
- 机构作者的标准;
- 未识别为报告的灰色文献;
- 题名中的 "Dr."、": 2." 被当成句号;
- 西语复姓的缩写;
- 汉字作者与拼音记录的跨文字比对;
- 图书重印本。
2026-10-16 修复盲测剩余误报(这之后 test 集不再算盲测)。逐条看了 12 条误报,按原因修了 9 类规则:
- 题名里的 "Dr."、"No."、": 2." 不再当成句号;ACS 格式的题名到分号为止;
- 识别 "Paper presented at" 这类会议报告、FAO 等机构发布的报告、德语报告和 "Bull. No." 报告编号;
- 引文末尾写了出版社("Indoles; Elsevier, 1996")的按图书处理;去掉条目开头粘着的脚注字母;
- 复姓只写一个姓、另一个变成缩写(Patil MU ↔ Uttam Patil M,Esper RC ↔ Carrillo Esper R);
- 汉字作者与拼音记录互相比对(用 pinyin-pro 转写,多音字姓按姓氏读音);
- Crossref 中文记录的作者顺序常登记错(宫鹏等 2010 那篇,宫鹏在记录里排第 14 位):引文列出的作者都在记录里时,只提示、不判错;英文记录仍按顺序比对;
- 只有一个名称、没有作者、年份和 DOI 的条目判为信息不足;
- 期刊在 Crossref 里开始注册 DOI 的年份晚于引文年份时,查不到不算证据(Indian J Pure Appl Phys 从 2020 年起才有 DOI);期刊目录检索去掉 "&" 和 "and",否则一条也查不到;
- OpenAlex 记录的首要位置是机构知识库时,不把知识库名当期刊名。
验证方式:
- 12 条误报和宫鹏那条逐条联网重跑,全部不再误报;T019 只剩真实的年份错误;
- 新旧两版只用 Crossref(屏蔽 OpenAlex,两边证据相同)各跑一遍 dev 和 test:test 的 6 条“信息有误”误报消失,剩下 3 条正是复核确认的真实错误;两个集合都没有新增误报;
- 解析结果逐条对比,227 条里 17 条有变化,逐条检查后结论都没有变差。
新盲测集结果(2026-10-16):blind-2026-10-16 共 110 条(英文 86、中文 24),来自 64 篇另外的论文(每篇 1–2 条)。出版社组合也换了,8 家英文出版社加入了 SAGE、Cambridge、PLOS 等,另有 2 个中文 DOI 前缀。抽样只输出每组条数,可以用 pnpm sample:real 重抽。规则定稿前后都没有查看条目内容;用定稿规则只运行一次,运行前后都没有为这批数字改规则(运行记录 · 复核记录)。
| 指标 | 结果 |
|---|---|
| 已核实 | 47 / 110(43%):英文 44 / 86,中文 3 / 24 |
| 自动统计误报 | 11(10%):信息有误 9、疑似不存在 2 |
| 逐条复核后误报 | 10(9.1%,95% 区间 5.0%–15.9%),全部是英文条目,其中疑似不存在 2 条 |
| 引文确实写错 / 无法确认 | 0 / 1(无法确认的也算误报时为 11 条,10.0%) |
| 无法核验 | 50,中文占 20 |
| 出错 | 2:1 条 Crossref 限流(429);1 条是程序缺陷,题名中间的 “?” 被 OpenAlex 当成通配符,返回 400 |
复核出的 10 条误报,按原因分:
- 非期刊文献被配到另一条记录(3 条):
- 2008 年的比特币白皮书配到 2019 年 SSRN 上的转载版;
- IUCN 2000 年的指南配到同三位作者 2004 年的另一篇文章;
- 世卫组织《阿拉木图宣言》配到另一本书里的同名章节。
- 软件没有识别(2 条):
- R 包 vegan 2017 年版本被拿去和包级 DOI(首发 2001 年、现任作者)比对;
- R 软件配到一本书里无关的章节。
- 题名边界切错(2 条):
- ViT 论文(ICLR 2021)的题名没有在 “, in:” 处截断;
- 植物命名人 “D. Don” 被当成句号。
- 带网址的新闻网页被当成期刊论文(1 条)。
- 数据库记录本身有差异(2 条):
- Crossref 把一篇 2014 年论文的年份登记为 2020;
- 同一篇论文在 OpenAlex 有期刊和机构库两条记录,配到的机构库记录少一个首字母。
无法确认的 1 条:引文写 2023 年,数据库只有 2025 年的预印本(题名逐字相同)和 2026 年的期刊版,而研究入组到 2024 年 2 月才结束。很可能是引文年份写错,但不能排除有未收录的会议报告。
解读与局限:
- 9.1% 与 10-15 test 盲测的 10.1% 在同一水平,两者的 95% 区间几乎重合(5.0%–15.9% 与 5.9%–16.8%)。10-16 补的 9 类规则让 test 降到 0,但 test 是看过答案的集合;到了新数据上,剩下的误报换成了网页、软件、题名边界等新类型。误报呈长尾分布,逐类补规则在新数据上的收益有限。
- 2 条“疑似不存在”误报都是真实文献,一条新闻网页,一条 ICLR 论文。
- 中文 24 条里 20 条无法核验,这是数据源覆盖不到,不能算判对。
- 样本只有 110 条、64 篇源论文。源论文本身有没有写错,只能按数据库和原始出处判断;复核由开发方完成,没有第二人独立标注。
- 表中题名带 “?” 的那条出错已在这次运行之后修复:OpenAlex 题名检索前把 “?” “*” 换成空格,4xx 拒绝也不再提示“可能被限流”。上表保持当次运行的原样数字,没有重跑。修复后这条不再出错,却变成了“疑似不存在”(见下文“10-16 晚修复”);第三批盲测集没有出错。
10-16 规则下 dev、test 全量重跑,与 10-15 的结果逐条对比(对比记录):
- dev:自动统计误报仍为 0。宫鹏 2010 由“信息有误”改为已核实(Crossref 中文记录作者顺序登记错);其余 3 处变化都是某一次运行遇到 Crossref 429。
- test:10-15 复核的 12 条误报全部消失,1 条无法确认的改为已核实,3 条真实错误仍被标出,复核后误报 0。6 条出错都是 Crossref 429(紧接着 dev 运行),10-15 那次是 2 条。
- 自建 29 条样例仍为 29/29,与 10-15 逐条一致。
OpenAlex 用量比预计少得多:三项评测分别只用了约 8、2、2 次题名检索(无 key 时每天约 100 次)。只有 Crossref 找不到同一篇、又不属于图书或网页等覆盖范围外类型的英文条目,才会去 OpenAlex 检索。
2026-10-16 晚修复新盲测集的误报(这之后 blind 不再算盲测)。复核出的 10 条误报分五类,前四类改规则,第五类逐条判断后也改了:
- 非期刊文献配到别的记录:报告、网页、图书、软件这类开放数据库覆盖不足的类型,年份差两年以上时,题名几乎一致、第一作者也对得上才算同一篇;这时年份差异只提示“可能是另一版本或转载”,也不再直接建议补充那条记录的 DOI(记录本身是期刊论文时,年份仍要对得上)。机构署名的宣言、报告,数据库里作者是个人、这些人又都不在引文中的记录(收录它的图书章节),不算同一篇;机构署名的期刊论文只是不比对个人作者(美国糖尿病学会的指南,Crossref 列的是执笔者)。
- 软件:识别 “R-Core-Team”、“R Foundation for Statistical Computing” 和 CRAN 手册写法 “Package vegan.”;软件包总 DOI 的首发年份、现任作者与引文所写版本不同,只提示核对版本。
- 题名边界:题名在 “, in:” 处截断;“E. coli” 这类物种缩写、学名后的命名人 “D. Don” 不当句号。
- 网页:判断期刊特征前去掉普通网址和访问日期(“Accessed on 31 August, 2023” 的 2023 不是卷号);署名和末尾发布者同名的页面(“D&D Beyond. 2022. “…” D&D Beyond.”)按网页处理。这一条是为问号修复后变成“疑似不存在”的 B030 补的。
- 数据库记录本身有差异:两条都能用另一个数据源或记录本身的信息判断引文没写错,所以也改了规则——Crossref 与 OpenAlex 登记的年份不同、引文与 OpenAlex 一致时,只提示两库不一致(B015:Crossref 登记 2020,OpenAlex 和卷期都是 2014);记录里只有名、缺中间名首字母(OpenAlex 的 “Tim Rhodes”)时,引文多写一个首字母(Rhodes TR)不算错,首字母对不上的仍算错。
验证方式(对比记录):
- 改规则前,用当时的代码把 blind、dev、test 和自建样例各跑一遍、录下全部数据库应答,改完后用同一批应答回放:blind 的 10 条误报和 B030 都不再误报,只剩无法确认的 B077;dev、test、自建样例的结论不变。
- 解析结果逐条对比:仓库里 447 条引文原文中 10 条有变化,都是改进(9 条题名、类型修正,1 条是新加的测试样例)。
- 用定稿规则(b4dd66d)全量重跑,与 10-16 逐条对比:dev 自动统计误报仍为 0,3 处变化都是 Crossref 429 的进出;test 仍只标出 3 条真实错误,8 处变化都是 429 的进出;自建 29 条仍为 29/29,与 10-16 逐条一致(记录)。这次出错的 4 条在回放中改动前后结论相同。
- 新增 19 项回归测试(
real-world-blind-set.test.ts),每类都用真实引文,另有题名以单个大写字母结尾(vitamin D)、期刊论文年份写错、机构署名的期刊论文等保护样例。
第三批盲测集结果(2026-10-16 晚):blind-2026-10-16b 共 111 条(英文 87、中文 24),来自 62 篇另外的论文,与前三个集合没有重叠。在规则定稿后抽样,只看了每组条数;用定稿规则只运行一次,运行后没有为这批数字改规则或重跑(运行记录 · 复核记录)。
| 指标 | 结果 |
|---|---|
| 已核实 | 37 / 111(33%):英文 37 / 87,中文 0 / 24 |
| 自动统计误报 | 13(12%):信息有误 9、疑似不存在 4 |
| 逐条复核后误报 | 13(11.7%,95% 区间 7.0%–19.0%),全部是英文条目,其中疑似不存在 4 条 |
| 引文确实写错 / 无法确认 | 0 / 0 |
| 无法核验 | 61,中文 24 条全在其中 |
| 出错 | 0 |
复核出的 13 条误报,按原因分:
- 作者段格式(2 条):单名作者 “Tikeshwari”、作者之间的空逗号 “, ,”,把题名切错了。
- 会议报告没识别(2 条):原文 “presented at27th” 粘连。
- 非期刊文献配到别的记录或被当成期刊、会议论文(4 条):图书(按初版年份比对)、带丛书号的报告、题名里有 “Conference” 的新闻稿、政府开放数据网页。
- 数据库记录本身有问题(2 条):OpenAlex 把两条文献混成一条;把预印本并进了改名后的会议论文。
- 题名中间的问号被当成题名结束(1 条)。
- 英文转写的中文期刊论文(2 条):期刊 DOI 由中国的 ISTIC 注册,不在 Crossref、OpenAlex 里;其中一条的英文刊名 “Nursing Research” 和美国同名期刊撞名,收录范围检查没起作用。
另有 2 条引文自身有小错,但系统报的不是这些错(新安江模型一条的作者拼法和 “IASH”、CRISPR 会议一条把波士顿写成休斯敦),按复核口径仍计为误报。
解读与局限:
- 三次盲测的误报率是 10.1%、9.1%、11.7%,95% 区间大幅重叠。每轮修过的类型在看过的集合上都清零了,但到了新数据上,误报换成新的格式和数据源问题,误报率没有降下来。逐类补规则在新数据上的收益有限。
- 13 条里 6 条是“只找到相近候选”,4 条是“疑似不存在”,确认为同一篇、又报出字段错误的只有 3 条。
- 中文 24 条全部无法核验,这是数据源覆盖不到,不能算判对。
- 样本只有 111 条、62 篇源论文;复核由开发方完成,没有第二人独立标注。有 2 条(两篇中文护理期刊论文)没能在线查到题录页,按数据集假设计为真实文献。
“相近候选”单列,误报按两种口径报告(2026-10-17)。第三批 13 条误报里有 6 条只是“找到相近文献”,却和确认写错的条目一起显示为“信息有误”。现在这类结论单列为“相近候选”(见上文“判定原则”),评测也跟着分开:
pnpm eval:real同时打印两种误报口径。旧口径把相近候选也算误报,即结果文件里的falseAlarms,与本节以上所有数字同一口径;新口径不算相近候选,即falseAlarmsNew,相近候选的条数另见counts.near_match。结果文件还多记了每条的matchStatus。- 历史结果文件不改写,本节以上的表格都是旧口径。口径测试逐个核对
eval/results下的real-*结果文件(10-17 单列时 12 个,加上第四批为 13 个),按旧口径重算的误报数都与文件里记录的一致,新文件的新口径也一致。 - 三次盲测复核出的误报里,“只找到相近候选”共 9 条(test 2、blind 1、blind2 6),复核没有一条判为引文真写错了。这是改口径的原因,不是新口径的效果:dev、test、blind、blind2 都已看过,不用它们报告新口径下的误报率。新口径的效果在另抽的第四批盲测集上检验,见下文。
- 新口径没有减少人工核对:相近候选仍要用户逐条确认是不是同一篇,只是不再被说成“信息有误”。
第四批盲测集结果:两种口径(2026-10-17):blind-2026-10-17 共 111 条(英文 87、中文 24),来自 63 篇另外的论文,与前四个集合的源论文和原文都没有重叠。在“相近候选”单列(81f6f67)定稿后用 pnpm sample:real --seed=3 抽样,只看了每组条数;用定稿规则只运行一次,运行后没有为这批数据改规则或重跑(运行记录 · 复核记录)。
| 指标 | 结果 |
|---|---|
| 已核实 | 30 / 111(27%):英文 30 / 87,中文 0 / 24 |
| 自动统计误报 | 旧口径 23(21%):信息有误 11、相近候选 3、疑似不存在 9;新口径 20(18%) |
| 逐条复核后误报,旧口径(相近候选也算) | 20(18.0%,95% 区间 12.0%–26.2%),全部是英文条目,其中疑似不存在 9 条 |
| 逐条复核后误报,新口径(相近候选不算) | 17(15.3%,95% 区间 9.8%–23.2%);另单列相近候选 3 条,都是真实文献,候选都不是同一篇 |
| 引文确实写错 / 无法确认 | 3 / 0 |
| 无法核验 | 58,中文 24 条全在其中 |
| 出错 | 0 |
复核出的误报(旧口径 20 条),按原因分:
- 开放数据库覆盖不到、类型又没识别出来,被判“疑似不存在”(7 条):1555 年的手稿、德语研究报告、联邦宪法法院裁定的新闻稿、没写编号的预印本、专利、国际海道测量组织的标准、JICA 项目简报。
- 刊物不在 Crossref、OpenAlex 中(1 条):法国空天军的刊物 Vortex,判“疑似不存在”前的收录范围检查没有拦住。
- 引文格式解析错(6 条):
- “Journal Pre-proof” 水印的残字被当成题名,一条作者、刊名、DOI 全对的引文被说成“DOI 指向另一篇文献,疑似编造”;
- 题名中的分号被当成题名结束;
- 作者之间的空逗号 “, ,”(2 条,同一篇源论文);
- Wiley 粘连写法 “van derValk”;
- DOI 里的连字符是 U+2010,DOI 在这里被截断。
- 配到另一篇或转载的记录(2 条):数学论文配到同组作者的另一篇;IMO 决议配到图书附录里的转载。
- 数据库记录把机构登记为作者(1 条):IUCN 红色名录。
- 只找到相近候选(3 条):一篇学位论文、一份统计公报、一篇 ICML 论文,候选都不是同一篇。
真实错误 3 条,都是作者写错,系统都标成了“信息有误”:一条把 JAMA 论文的作者写成 “Outcomes M.”;另两条出自同一篇源论文,把中国作者的名当成了姓(Han L 写成 Liang H)。
解读与局限:
- 新口径比旧口径少 3 条(18.0% → 15.3%)。这批相近候选只有 3 条,单列只去掉了这一类;剩下的误报主要来自覆盖范围外的文献类型和引文格式。
- 旧口径下这批 18.0% 高于前三次盲测(10.1%、9.1%、11.7%),95% 区间与第三批(7.0%–19.0%)部分重叠。Cambridge 一组 12 条里有 7 条误报(来自 4 篇源论文,引的是法律政策文件、数学论文、专利、航海标准):抽到的源论文学科不同,误报率波动很大。
- 区间按条目独立计算。被标出的 23 条里有 7 对来自同一篇源论文,同一篇论文的条目往往一起出错,实际的不确定性比区间显示的更大。
- 中文 24 条全部无法核验,这是数据源覆盖不到,不能算判对。
- 样本只有 111 条、63 篇源论文;复核由开发方完成,没有第二人独立标注。1555 年的手稿只确认了馆藏号和源论文的描述,没有核对手稿内容。
- 这批数据已经看过,之后不再算盲测。上面的数字是修复前(81f6f67)的结果。
第四批复核后的修复(f36bd3e,2026-10-17):按上面的误报原因改了覆盖范围判断和引文解析——类型认不出、又没写期刊名的引文和没写编号的预印本查不到时改判“无法核验”,新增档案 / 手稿类型,全大写机构缩写署名按机构处理;水印残字和网址不当题名、题名里的分号、作者段的空逗号、粘连的姓氏前缀、DOI 里的 Unicode 连字符都能正确解析。B040 没改:期刊目录认不出缩写刊名,放行会漏掉配缩写刊名的编造文献。改前录下六个集合的全部数据库应答,改后回放比较(记录):
- 第四批:已核实 30 → 36,自动统计误报(旧口径)23 → 9。按已有复核,仍误报的只剩 B040(刊物缩写认不出)和 B057;B048 的空逗号修好后,报的是引文出处确实写错,改记真实错误;另有 3 条相近候选。真实错误 B003、B037、B038 仍被标出。
- 其余五个集合没有新增标出,test 的 3 条真实错误仍标出,自建样例 29 / 29。
- 这批已经看过,回放只能说明修复按预期生效、没有退步,不代表新数据上的误报率。修复后的规则看下面的第五批盲测。
第五批盲测集结果(2026-10-17):blind-2026-10-17b 共 108 条(英文 84、中文 24),来自 63 篇另外的论文,在第四批修复(f36bd3e)之后抽样,抽样时只看了每组条数。规则定稿后只运行一次(结果、复核记录)。
| 指标 | 结果 |
|---|---|
| 已核实 | 51 / 108(47%):英文 49 / 84,中文 2 / 24 |
| 自动统计误报 | 旧口径 8(7%):信息有误 6、相近候选 1、疑似不存在 1;新口径 7(6%) |
| 逐条复核后误报,旧口径 | 6(5.6%,95% 区间 2.6%–11.6%),全是英文,其中疑似不存在 1 条 |
| 逐条复核后误报,新口径 | 5(4.6%,2.0%–10.4%);相近候选 1 条单列 |
| 引文确实写错 / 无法确认 | 1 / 1 |
| 无法核验 | 49,中文 22 条在其中 |
| 出错 | 0 |
复核出的误报(旧口径 6 条),按原因分:
- 数据库元数据与论文不一致(2 条):Crossref 把单位地址登记成了第一作者;IEEE 在 Crossref 登记的作者顺序与论文署名不同(CutMix,arXiv 和 CVF 页面的署名与引文一致)。
- 配到同一研究或同一作者的另一件作品(2 条):同一研究发表在 J Clin Trials 上的另一篇,被配到 BMC Nephrology 的研究方案;2000 年的学位论文被配到同一作者 2020 年重新出版的同名书章。
- 覆盖范围外的类型没识别出来(2 条):LSE 经济史工作论文被判疑似不存在(引文还把编号 266 写成了 206);学位论文只找到同一作者的会议论文,给出相近候选。
唯一一条真实错误是引文里的 DOI 被截断(“10.1002/pits”),系统给出了正确的 DOI。无法确认的一条是工作论文的年份:引文写 2024,SSRN 记录是 2022,查不到是否有 2024 年的修订版。
怎么看这个数字:
- 比前四批(10.1%、9.1%、11.7%、18.0%)低,但 95% 区间与前三批重叠;第四批偏高主要来自 Cambridge 一组的法律政策类文献,这批没有类似的集中。样本只有 108 条、来自 63 篇源论文,复核由开发方完成,没有第二人独立标注,所以不能说误报率已经降到 5% 左右。
- 被标出的 8 条里只有 1 条确认是引文写错,“标出的问题”仍以误报为主;“已核实”和“无法核验”的条目没有逐条建立真值。
- 中文 24 条只看了汇总计数,没有逐条查看,留作以后评估中文检索的样本。
- 运行后改过两处只作用于 AI 辅助解析的代码。用录下的应答以最终代码重放规则模式,108 条的结论、摘要和问题逐条相同。
pnpm eval:agent 从一次规则核验的结果中,取出“无法核验 / 只有相近候选”的条目,逐条交给 Agent。Agent 在 test 集上从没调过,这次是它的盲测。两次运行 OpenAlex 题名检索各限 20 次。
| 集合 | 可追查 | AI 找到并经规则确认 | 结论不变 | 失败 | 变成“疑似不存在” | 每条平均 |
|---|---|---|---|---|---|---|
| dev 108 | 61 | 3(均为已核实) | 58 | 0 | 0 | 3.1 次检索、5.8 千 token、12 秒 |
| test 119(盲测) | 58 | 7(4 条已核实、3 条信息有误) | 51 | 0 | 0 | 2.9 次检索、5.5 千 token、10 秒 |
结论不变的多数条目确实不在这几个库里:知网期刊、网页、标准、年鉴、法规等。中文条目 52 条,Agent 一条也没找到。但这个 0 有混杂(10-17 复评指出):两次运行的 20 次 OpenAlex 题名检索按条目顺序共用,52 条中文里有 47 条(dev 28 / 33、test 19 / 19)记录了“OpenAlex 检索次数已用完,本次未执行”,实际只查了 Crossref 和 DataCite。
10-17 晚用 --lang=zh 只跑中文条目、OpenAlex 额度给足重测(规则已更新,可追查的中文条目为 dev 33、test 20):OpenAlex 实际检索 52 次,仍然一条也没找到(dev · test)。所以中文 0 命中不是额度造成的,这几个库确实收录不到这些中文期刊文章。
另做了一个小探针:DeepSeek 的 Search 接口(/v1/tools/search)对其中 10 条中文期刊引文按题名检索,7 条能找到,6 条直接命中知网、万方或维普的论文页(探针记录)。据此加上了上文的 search_cn_journals,再用 --lang=zh 重跑中文条目:
| 集合 | 可追查中文条目 | 找到三站论文页 | 其中规则确认 | 题名、年份(刊名)一致、只差作者 | 英文译名引用中文文章 | 题名相近的另一篇 | 变成“疑似不存在” |
|---|---|---|---|---|---|---|---|
| dev(已看过) | 33 | 17 | 1(已核实,维普) | 14 | 1 | 1 | 0 |
| test(已看过) | 20 | 9 | 0 | 6 | 3 | 0 | 0 |
| 第五批(首次运行) | 22 | 7 | 0 | 6 | 1 | 0 | 0 |
- 每条平均 2.3~2.7 次工具调用、约 5.8 千 token、7~8 秒(dev · test · 第五批)。
- 逐条看过 33 条找到的论文页:唯一确认的一条(潘乃谷 1997,《民俗研究》)正确;没有把别的文章确认成同一篇。“题名相近的另一篇”是 dev 的 D099,引文写“产朊假丝酵母替代鱼粉蛋白……”,找到的是同刊 2023 年的“双低菜粕替代鱼粉……”,系统给的是“不能确认是同一篇”的相近候选。
- 找到的多是知网、万方的页面,没有作者,所以确认的只有 1 条;把这些写成“已核实”需要作者信息,这一步只能请用户点开链接核对。用 Fetch 抓取知网、万方页面也拿不到作者(知网只有摘要和刊期,万方返回的是登录提示),还要多花 20 秒以上,所以没有用。
- 另取 12 条没找到的已看过期刊论文,换成加引号、加刊名、只限知网、不限站点四种写法再搜,只多找到 1 条(T098),说明主要卡在搜索引擎的收录,没有加这些回退。
- dev、test 两集已在开发中看过,第五批只运行了一次。数据集里的文献都真实存在,所以这里只说明“找得到”和“不误判成疑似不存在”,没有用编造的中文引文测过。按规则,编造的引文要么搜不到(保持“无法核验”),要么配到题名相近的真文章:维普记录的作者对不上判“信息有误”,知网、万方记录没有作者,最多给相近候选,都不会判已核实(有单元测试)。
盲测确认的 7 条逐条复核:
- 已核实的 4 条:3 条正确;1 条匹配到同一作者 2026 年的同名新文章,不是被引的 2008 年章节。
- 信息有误的 3 条:1 条引文确实把作者名写错了;1 条是匹配到 CRS 报告的旧版本,属于误报;1 条无法确认。
盲测之后补了两条保守规则:
- 报告、图书等覆盖不足的类型,AI 找到的记录与引文有出入时,只作为候选给出,不判“信息有误”;
- 图书、学位论文年份差距大时,题名必须几乎逐字一致才算同一篇。
修正后,上面两条误判都不会再出现,但 test 集已经用过,没有重测。dev 集第一次运行发现的两处规则误判也已修正,记录保留在 agent-dev-2026-10-15-first.json。
明细:dev Agent · test Agent。
“中文期刊论文”指解析为期刊论文、题名是中文(或方括号里附了中文原文)的条目,也就是联网核查的对象。“待人工”即“无法核验”。评测时 NODE_USE_ENV_PROXY=1,知网不走代理(NO_PROXY 加 .cnki.net);每条都给联网核查额度,不设整体时限。
回归(已看过的集合,只说明有没有新增误报,不能当效果):dev、test 和四批盲测里的 156 条中文条目用 pnpm eval:real <集合> --lang=zh 重跑,与各集合上一次的规则结果逐条比较(汇总):
| 集合 | 中文期刊论文 | 之前:已核实 / 待人工 | 现在:已核实 / 相近候选 / 待人工 | 信息有误 / 疑似不存在 |
|---|---|---|---|---|
| dev | 31 | 3 / 28 | 12 / 9 / 10 | 0 / 0 |
| test | 17 | 2 / 15 | 10 / 4 / 3 | 0 / 0 |
| 第二批(10-16) | 20 | 3 / 16(另 1 条出错) | 6 / 8 / 6 | 0 / 0 |
| 第三批(10-16 晚) | 18 | 0 / 18 | 4 / 6 / 8 | 0 / 0 |
| 第四批(10-17) | 16 | 0 / 16 | 4 / 9 / 3 | 0 / 0 |
| 第五批(10-17 晚) | 20 | 2 / 18 | 8 / 3 / 9 | 0 / 0 |
| 合计 | 122 | 10 / 111 | 44 / 39 / 39 | 0 / 0 |
待人工从 91% 降到 32%。新口径误报(信息有误、疑似不存在)仍是 0;旧口径把相近候选也算误报,所以从 0 变成 39,全部是原来的“待人工”改成了“相近候选 + 原文链接”。逐条看过这 39 条候选:38 条就是引文的那篇文章(26 条作者等都对上、只差卷期页码),1 条是题名相近的另一篇,卡片上写的是“不能确认是同一篇”。开发过程中在这些集合上修过三处问题:作者写成“王 韦韦”(姓名中间带空格)被当成作者不符、官网记录的 DOI 与 Crossref 英文记录相同被当作重复丢掉、官网页面只写了在线首发年份。
新样本(没看过,规则定稿后只运行一次):pnpm sample:real --zh 从科学出版社 10.3724、中国科学 10.1360、物理学报 10.7498 三组各抽 30 条中文参考文献(52 篇未用过的论文),抽样后只看了条数;10-20 运行一次(结果 · 逐条复核)。“之前”是从这次结果推出来的:联网核查只在 Crossref 没确认之后才做,结论来自网页记录的条目没有它时都会是“无法核验”。
| 范围 | 条数 | 待人工:之前 → 现在 | 已核实 | 相近候选 | 信息有误 / 疑似不存在 |
|---|---|---|---|---|---|
| 中文期刊论文 | 40 | 38(95%)→ 13(32.5%) | 15(联网核查 14:知网 11、期刊官网 3) | 11 | 0 / 0 |
| 全部中文条目 | 90 | 86(95.6%)→ 61(67.8%) | 16 | 11 | 0 / 0 |
- 已核实的 16 条逐条对过,都是引文的那篇文章;相近候选 11 条的候选也都是那篇文章,10 条只差卷期页码、1 条官网页面没有年份。另有 2 条因 Crossref 限流(429)出错,与本功能无关。按旧口径(相近候选也算)误报是 11 条,新口径是 0。
- 全部中文条目里剩下的 61 条待人工:17 条是学位论文、图书、报告、专利、标准、网页;29 条没有题名,其中 28 条是物理类期刊“作者 年份 刊名 卷 页”的写法,按题名查不了;2 条英文译名附中文原文的引文没认出中文原文(题名后的句点没空格、方括号没闭合);13 条三站和不限站点都没搜到,或官网页面连不上、没有元数据。这批已经看过,再改规则要另抽样本。
- 这批都是真实文献,没有用编造的引文测过;拼凑式编造(真题名配假作者)由单元测试和浏览器实测覆盖:知网记录的作者对不上,判“信息有误”并列出记录里的作者。复核由开发方完成,没有第二人独立标注。
- 编造方向另用对照实验的 20 条中文构造引文重跑(真实 10、虚构 10;10-18 已看过,只能算回归;结果):虚构的 10 条没有一条判成已核实或信息有误,9 条待人工,1 条只给了知网上题名相近的另一篇作相近候选,卡片写明不能确认是同一篇;真实的 10 条已核实 3 条(知网 2、Crossref 1),其余 7 条是相近候选,与中文回归时的结论相同(回归复核时这些候选都是引文那篇)。
eval/vision/generate.py 用 16 条真实文献生成三张图:英文截图、中文截图,以及加了纸张底色、2.2° 倾斜、模糊、噪点和 JPEG 压缩的中英混排“手机照片”。pnpm eval:vision 逐条与标准答案比对,再把识别结果和标准答案分别送去核验(记录):
| 图片 | 条目 | 逐字一致 | 字符错误率 | 用时 | 核验结论 |
|---|---|---|---|---|---|
| 英文截图(APA / IEEE) | 5 | 5 | 0% | 4.0 秒 | 与标准答案一致 |
| 中文截图(GB/T 7714) | 5 | 5 | 0% | 4.9 秒 | 与标准答案一致 |
| 模拟手机照片(中英混排) | 6 | 6 | 0% | 2.9 秒 | 与标准答案一致 |
这是合成的小样本:印刷体、排版清楚,只能说明识别链路可用、转写不会改变结论;真实拍照的反光、透视、手写批注没有覆盖,识别结果仍需对照原图核对。
eval/claims-retrieval/cases.json 取三篇 CC BY 开放获取论文的全文,评测时通过 Europe PMC 实时获取,与产品同一条路径:
- Walters & Wilder 2023
- Kung 等 2023
- Bhattacharyya 等 2023
评测者通读全文后写了 24 条原文确实支持的论断,每篇 4 条英文转述、4 条中文表述,用词刻意与原文不同,并标出原文里的出处句子。只评检索:召回的前 6 段里有没有出处句子(记录)。
| 检索方式 | 全部 24 条命中率 | MRR | 英文 12 条 | 中文 12 条 |
|---|---|---|---|---|
| 词面 BM25(原来的做法) | 75% | 0.61 | 100% | 50% |
| + 模型扩展中英文检索词(排名融合) | 100% | 0.79 | 100% | 100% |
| + 模型重排(现在的默认) | 100% | 0.98 | 100% | 100% |
- 24 条的出处句子只有 2 条在摘要里,只读摘要的话,大多数论断找不到证据;
- 中文论断对英文原文时,词面检索只找到一半,查询扩展补上了跨语言的那一半,重排把出处片段排到了第 1 位(23/24);
- 局限:样本小,论断由评测者编写,而且都是原文支持的说法;三篇论文都不长(14–31 段),重排的 20 段候选覆盖了文档的大部分,长文档上重排的提升可能没这么大。这里只评检索,没有评判断。
明细:dev 修复后 · dev 修复前 · test 修复后 · test 修复前 · dev 10-16 · test 10-16 · 新盲测集 · 新盲测集复核 · 10-16 逐条对比 · dev 10-16 晚 · test 10-16 晚 · 10-16 晚逐条对比 · 第三批盲测 · 第三批盲测复核 · 第四批盲测 · 第四批盲测复核。
第一阶段通过 195 项离线测试;原浏览器验收记录覆盖 11 条真实示例、筛选、复制、下载,以及用固定响应模拟的断流、降级与停止流程。
第二阶段最终通过 23 个文件、289 项测试、ESLint、TypeScript 和生产构建(检查记录)。2026-10-15 准确率修复后为 24 个文件、317 项测试;加入 AI 检索 Agent 和 MCP Server 后为 27 个文件、370 项测试;加入拍照 / 截图识别后为 29 个文件、393 项测试;加入隐藏提示词检测后为 30 个文件、419 项测试;修复盲测剩余误报后为 31 个文件、438 项测试;升级论断 RAG 后为 33 个文件、459 项测试;实测 arXiv 全文路径、修复引句校验后为 33 个文件、462 项测试;修复题名带问号时的 OpenAlex 检索出错后为 33 个文件、471 项测试;修复新盲测集的五类误报后为 34 个文件、491 项测试,ESLint、TypeScript 和生产构建全部通过,29 条人工样例仍为 29/29(10-16 晚记录);“相近候选”单列后为 36 个文件、509 项测试,ESLint、TypeScript 和生产构建通过(这次只改结论分类,没有联网重跑评测);10-17 第四批修复、OpenAlex 合并记录、PDF 的 OCR 豁免和 AI 辅助解析改版后为 37 个文件、556 项测试,ESLint、TypeScript 和生产构建通过;加入中文期刊联网检索(含补查失败时保留首轮候选的修复)后为 38 个文件、589 项测试,ESLint、TypeScript 和生产构建通过;部署相关的请求时限、上传上限,以及 10-19 的可用性修复(单名作者解析、正文段落识别、网页版报告)之后为 41 个文件、633 项测试;加入论断“矛盾”范围复核后为 41 个文件、636 项测试;复核改为同时读引句所在片段后为 41 个文件、638 项测试;加入开场动画和新手引导后为 42 个文件、643 项测试;只贴 DOI 的条目改为按 DOI 补全(之前会误判成“DOI 指向另一篇”)、加入规范参考文献后为 42 个文件、653 项测试;标准体检加入中文期刊联网核查后为 43 个文件、702 项测试;联网请求只发往公网地址、Crossref 作者单位不当作者、加入知网 DOI 核对后为 45 个文件、728 项测试,ESLint、TypeScript 和生产构建通过;真实引文回归测试(另见 test 集、盲测集 两个文件)逐条对应上表中修好的误报。开发版浏览器验收覆盖桌面 1440 与手机 390 的文档预览确认、状态保留、引句定位、下载、取消和未完成状态;论断界面使用已录制响应回放,另在生产版复验通过。最终生产接口真实上传普通/中文 PDF 均成功,压缩扩张样例明确拒绝(记录)。
真实论断联网记录四例全部符合预期:一条公开论文摘要,三条明确标为合成材料的支持、矛盾、证据不足。校验包含引句、来源、片段与字符位置。四例只证明流程可用,不能当作开放场景的准确率。失败记录及修复依据保留在评测目录。
真实 AI 调用记录验证了 deepseek-flash 的字段提取与数据库核验衔接,两条结果分别为已核实和期刊有误。该次首次连接超时、一次重试成功,未发生规则降级;此前的两次降级记录也保留在 eval/results/。这项冒烟只证明调用链可用,不代表所有格式的解析质量。
pnpm mcp 以 stdio 方式启动 MCP Server(官方 TypeScript SDK 1.31.0),提供两个只读工具:
| 工具 | 输入 | 输出 |
|---|---|---|
verify_references |
references:参考文献列表(最多 80 条 / 60,000 字符) |
每条的结论、问题、数据库匹配记录和规范写法;逐条发送进度通知 |
check_claim |
claim 加 doi 或 evidence_text(二选一) |
支持 / 部分支持 / 矛盾 / 证据不足,附逐字核对过的原文引句 |
两个工具都同时返回文字摘要和带输出结构定义(outputSchema)的结构化结果。结论分别来自数据库逐字段比对和原文引句校验,与网页端相同;verify_references 的结论从服务端 0.2.0 起多了 near_match(相近候选:只找到相近记录、未确认是同一篇,不算信息有误);check_claim 需要 .env.local 里的 DeepSeek 密钥,没有密钥时返回明确的“未配置”错误。
Claude Desktop(claude_desktop_config.json)或 Cursor(.cursor/mcp.json)中添加:
{
"mcpServers": {
"cite-checkup": {
"command": "pnpm",
"args": ["--silent", "--dir", "D:/Darks/projects/cite-checkup", "mcp"],
"env": { "NODE_USE_ENV_PROXY": "1" }
}
}
}- 把路径换成你的项目目录;
--silent不能省,否则 pnpm 的提示会混进 stdout 的协议消息;- 不走代理时可以去掉
env; - 服务端按脚本位置读取
.env.local,与客户端的工作目录无关。
pnpm smoke:mcp 用同样的命令启动服务端,列出工具,并真实调用两个工具(记录):两条公开文献一条已核实、一条查出年份写错;DOI 摘要论断判为“证据支持”,并附原文引句。
- 前端:Next.js 16(App Router)+ React 19 + TypeScript(strict)+ Tailwind CSS 4
- 接口:
GET /api/check返回 AI 配置可用状态;POST /api/check接收{text, mode: "standard" | "ai"},NDJSON 流式返回阶段、降级提示、结果及完成统计 - 导入:
POST /api/import接收FormData.file,返回纯文字、参考文献区域、格式/页数/警告,以及隐藏文字检测结果hidden(没有时为null)。确认预览后才替换用户输入;不调用 AI、不持久保存原文件。支持 8 MiB、100 页以内的文字 PDF、DOCX、TXT,不支持旧版 DOC 和加密文件;扫描版 PDF 没有文字层,会提示截图后走图片识别。 - 图片识别:
GET /api/vision返回可用状态;POST /api/vision接收FormData.image(1–4 张,合计 8 MiB 以内),按文件头识别 PNG / JPEG / WebP / GIF,返回{entries, text, warnings, model, images}。只转写不核验,实现见src/lib/vision/。 - AI 检索:
GET /api/agent返回可用状态;POST /api/agent接收{raw, index}(单条引文,最多 2,000 字符),以 NDJSON 逐步返回step,最后返回规则复核后的result(含agent追查记录:工具调用次数、模型轮数、token、追查前结论)。实现见src/lib/agent/。 - 论断 RAG:
GET /api/claims返回配置与限制;POST /api/claims接收{claim, doi}或{claim, evidenceText, evidenceLabel?}。- DOI 证据依次尝试:Europe PMC 开放全文(JATS XML,去掉参考文献、表格和公式)、arXiv 预印本 PDF(DOI 本身是 arXiv,或出版社在 Crossref 登记了预印本),PDF 走与导入相同的安全解析器和隐藏文字检测;都没有时用 Crossref / OpenAlex 摘要。
- 固定分块后,长材料(多于 6 段)用混合检索:原论断的 BM25 与模型扩展检索词(
expand_query,中英文同义词、缩写)的 BM25 按倒数排名融合取 20 段,再由模型按 0–3 分重排(rank_evidence),取前 6 段;任一步失败都退回词面检索并在结果里说明。 - DeepSeek
judge_claim输出支持、部分支持、矛盾或不足;服务端校验来源 ID、片段 ID、原文引句及位置。DeepSeek 没有向量接口,所以没有用向量检索。实现见src/lib/claims/(fulltext.ts、assist.ts、retrieval.ts)。
- 数据源:Crossref REST API、doi.org(注册查询 + 内容协商)、OpenAlex API、DataCite API;中文期刊联网核查用 DeepSeek Search API(只认知网、万方、维普的期刊论文页),并直接读取手机知网文章页、知网期刊页和期刊官网文章页的元数据
- 字体:思源宋体、霞鹜文楷、IBM Plex Mono,均自托管并按字符分片加载(不依赖 Google Fonts)
src/
├─ app/
│ ├─ page.tsx 首页
│ └─ api/check/route.ts 流式核查接口
├─ components/ 输入区、结论卡片、体检报告、印章、开场动画与新手引导
└─ lib/verify/ 核验引擎(与 UI 无关,可单独测试)
├─ extract.ts 本地解析
├─ normalize.ts 中英文归一化与相似度
├─ match.ts 逐字段比对与同一篇判定
├─ verify.ts 核查流程编排与结论
├─ format.ts GB/T 7714 / APA 格式化
├─ http.ts 限流、重试、缓存
├─ cnjournal.ts 中文期刊联网核查:三站检索 → 补作者(维普、知网文章页、期刊官网、Crossref)
├─ throttle.ts 进程内限流闸门与小缓存(DeepSeek 搜索每秒不超过 4 次)
└─ sources/ crossref / doi / openalex / datacite 适配;cnweb 为中文期刊联网检索,cnpage 读知网和期刊官网页面
src/lib/ai/ 负责模型请求与工具参数校验;check-request.ts、check-limits.ts 负责输入和调用额度;check-stream.ts 验证前端收到的完整结果流;report.ts 生成可复核的报告。
- 参考文献标准模式把条目发送给公开学术数据库;中文期刊论文的题名还会发给 DeepSeek 的搜索接口(没配置密钥时不发),并直接读取手机知网、期刊官网的公开文章页(请求头写明本工具,不登录、不带 cookie,不碰验证码页)。选择 AI 解析后,还会把条目发送给 DeepSeek。论断核查把论断、最多 20 段候选片段(重排)和最终 6 段(判断)发送给 DeepSeek;请仅提供有权处理的内容,不上传个人隐私。
- 开放全文只访问 www.ebi.ac.uk 和 export.arxiv.org 两个固定主机,不跟随跳转;XML 最多 6 MiB,PDF 最多 8 MiB,正文最多 150,000 字符。查询扩展和重排的输出逐项校验(检索词不能含网址,重排只能用候选片段的编号),它们只决定交给判断的片段,不产生结论。
- API Key 只放在
.env.local,仓库中只提交.env.example。 - 核查接口每 IP 每分钟最多 6 次、每次最多 80 条 / 60,000 字符。AI 每 IP 每分钟 2 次、每进程每小时 30 次、同时 2 次、单次 20,000 字符;超过 AI 限额时明确回退标准核验。
- 限额在当前 Node 进程内计数,重启会清空,多实例不会共享。访客按
x-forwarded-for的第一段区分;魔搭演示是单实例,平台是否转发访客真实地址没有验证,多人同时使用时可能共用额度。正式服务需要可信代理覆盖该请求头,并增加共享限流和账户预算;目前不是生产级账户计费系统。 - AI 检索每 IP 每分钟 6 次、每进程每小时 60 次、同时 2 次;单条最多 4 次检索、4 轮模型调用、80 秒。工具参数逐项校验(工具名白名单、字段白名单、长度、年份范围、DOI 格式),DOI 只能查引文或检索结果中出现过的;检索只访问固定的学术数据源,中文期刊检索只把题名发给 DeepSeek Search,站点限定由服务端写死,模型不能指定网址;模型写的理由和小结会去掉网址,只作为过程说明显示。
- 图片识别把图片发给 DeepSeek,原图只在请求内存中使用、不保存;上传前在浏览器重新编码,去掉 EXIF 等元数据。每 IP 每分钟 4 次、每进程每小时 40 次、同时 2 个;单次最多 4 张图、80 条、60,000 字符,60 秒超时。只接受文件头真实为图片的文件,模型只能调用
submit_references,返回的字段、条数和长度逐项校验。 - 引文工具只允许
verify_references;论断工具只允许judge_claim。未知工具、非法字段、虚构引句、错误来源编号、截断或超大响应均被拒绝;材料中的指令视为待分析数据。取消会停止模型请求及后续查询。 - 论断核查单次论断最多 2,000 字符、证据 160,000 字符;每 IP 每分钟 6 次、每进程同时 2 次、每小时 30 次及输入 240,000 字符。模型和来源失败标为未完成,不伪造判断。导入解析资源与 ZIP/XML 边界详见 导入模块说明。
- 已知瞬时连接错误最多重试一次,共用 60 秒总超时;鉴权、HTTP 错误及内容校验失败不重试。生产日志只输出固定错误分类,不记录引文、密钥、地址或原始异常。
- 中文文献:知网、万方没有开放接口,中文期刊论文靠 DeepSeek 搜索引擎的收录和知网、期刊官网的公开页面核对。没看过的 40 条中文期刊论文里,待人工从 95% 降到 32.5%,但仍有约三成搜不到;引文只写“卷: 页”、知网又没有卷号时只能给相近候选,要用户点开链接核对;物理类期刊不写题名的引文(“作者 年份 刊名 卷 页”)按题名查不了;境外服务器可能读不到知网页面。知网、期刊官网改版或限制访问时这一步会失效,需要跟着修。学位论文、图书、报纸仍需人工核查。
- 作者已支持汉字与拼音互相比对;中文题名对应英文元数据(或反过来)时仍无法比对题名。
- 知网登记的 DOI 只能从中国 DOI 注册机构读到题名、作者,年份、卷期页要靠联网找到原文页才能核对,找不到时判“待人工”。真论文被写成另一本期刊、配上别的 DOI,而联网又没搜到原文时,会被判“疑似编造”(开发方场景测试 36 条中 1 条)。
- 会议论文的期刊名差异较大,目前只对期刊类文献做期刊名比对。
- 论断判断只针对指定来源及召回文字;只有 Europe PMC 开放获取子集和 arXiv 能读到全文,其余 DOI 仍只有摘要;预印本可能与正式版本不同。用户提供的材料真实性未经独立认证,不做跨文献系统综述。原文引句存在也不保证模型解释正确,仍需人工复核;该流程不额外查询撤稿状态。
- AI 检索 Agent 只能查 Crossref、OpenAlex、DataCite、doi.org 覆盖的文献,以及 DeepSeek 搜索引擎收录的知网、万方、维普论文页;图书馆目录仍需人工核查;OpenAlex 无密钥时每天约 100 次题名检索。
- MCP Server 目前只提供 stdio 本地进程,没有远程 HTTP 部署与鉴权;论断核查与网页端共用每进程每小时 30 次的限额。
- 图片识别只转写参考文献条目,不理解图表;评测只覆盖清晰的印刷体,手写、强反光或严重透视的照片可能漏字,需要对照原图修改。iPhone 的 HEIC 照片需先截图或转成 JPG。
- 隐藏文字检测不覆盖:被图片或色块盖住的字、透明度为 0 的字、裁剪掉的字、批注和表单里的字。PDF 没有“背景色”的概念,深色色块上的白字只能靠长度和内容区分;是否有意为之仍需人工判断。
- 规则只认学术数据库的记录:网页、报告、图书多数判“待人工”,也不检查格式是否完整(如作者列表不全、arXiv 编号多一位)。对照实验里联网 AI 在这两点做得更好,下一步是网页类引文打开网址核对标题,并让 AI 只给格式建议、不下真伪结论。
- 没有账户系统或共享限流。魔搭上的公开演示使用平台免费资源、单实例,适合试用和评审,不是正式服务:第一次打开要等约半分钟,所有访客共用 AI 调用额度,接近 8 MiB 的上传在平台上没有验证通过。
操作稿、技术说明 PDF、模拟评分、正式演示视频、可用性走查和对照实验见 参赛材料目录;部署方式见 docs/deployment/。本地验收与阶段进度见 PROJECT_STATE.md。分数是依据官方维度的模拟评审,不是赛事成绩;团队姓名和代码托管访问权限须由参赛者按真实情况补齐。
Crossref(含 Retraction Watch 撤稿数据)· OpenAlex · DOI.org · DataCite · DeepSeek(模型与 Search 接口)
| 角色 | 姓名 | 分工 |
|---|---|---|
| 队长 | 待填写 | |
| 队员 | 待填写 | |
| 队员 | 待填写 | |
| 指导老师 | 待填写 |
第九届传智杯全国大学生数智创新与 AI 应用大赛 · AI WEB 网页开发挑战赛参赛作品。