关于 Keystone
Keystone 从 arXiv 论文的 LaTeX 中提取引用立场、作者明示的假设及论文间关联,并将结果锚定到页面原文。它面向研究者,使用确定性规则而非 LLM 推断,并展示触发判断的句子与线索。
主要功能
- 01分类引用所表达的立场
- 02提取作者明示的假设
- 03将结果锚定到页面文本
- 04浏览论文间可遍历的引用图
- 05分析提供 LaTeX 源码的 arXiv 论文
适用场景
- 01追踪论文采用或反驳的方法
- 02检查论文陈述假设时提供的依据
- 03沿引用关系查看论文的研究脉络
- 04核对判断对应的原文位置
MCP 相关
Keystone 提供位于 `/api/mcp` 的 MCP 服务。客户端可借此访问项目的论文分析能力;输入说明未列出具体 MCP 工具。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://keystone-research.vercel.app/api/mcpclaude mcp add --transport http srikarmk-keystone https://keystone-research.vercel.app/api/mcp{"mcpServers":{"srikarmk-keystone":{"type":"http","url":"https://keystone-research.vercel.app/api/mcp"}}}在 Cursor 中打开{"servers":{"srikarmk-keystone":{"type":"http","url":"https://keystone-research.vercel.app/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"srikarmk-keystone":{"type":"http","url":"https://keystone-research.vercel.app/api/mcp"}}}{"mcpServers":{"srikarmk-keystone":{"serverUrl":"https://keystone-research.vercel.app/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Keystone
这篇论文立足于什么?
在线体验: https://keystone-research.vercel.app
没有哪篇论文能独立存在。每篇论文都会采用某人的方法,与另一个人争论,并对一些事情深信不疑却不予说明。Keystone 直接从论文自身的 LaTeX 中读出这三者——不是摘要,不是检索索引,也不让模型参与——并将每一项标注到论文明确写出相关内容的页面像素位置。
这个名字就是它的论点,而它是经过一次转向才得以确立的。拱门失去顶石便会坍塌,而对几乎每篇论文来说,那块顶石都属于别人。
三项内容,全部是引用,而非推断:
- 它立足于什么。 引用并非中立的指向。“遵循
\cite{ba2016layer},我们对每一层进行归一化”和“与\cite{ba2016layer}不同,我们跨批次进行归一化”是对同一篇论文截然相反的表述,而这种差异被明确记录下来。系统根据提示短语对每处引用进行分类,并展示提示短语,因此你可以对这种解读提出异议。 - 它深信什么。 体裁要求作者声明自己的假设——“我们假设”“为简单起见”“众所周知”。每条假设都会与论文在同一句中提供的依据一并引用:一处引用、指向论文自身证据的指示,或什么依据都没有。
- 关系图。 如果被引用的论文也在文库中,这条边就可以双向遍历,因此一篇论文既能展示自己立足于什么,也能展示哪些论文立足于它。在 234 篇论文中,共有 548 条链接,每条都附有将其建立起来的句子;这条链才是真正的脉络:VGG → ResNet → Transformer → BERT / ViT / LLaMA,批归一化和层归一化也由此串联起来。
文库会沿着自身引用不断扩展。keystone expand 会读取文库中已解析到 arXiv 的每条参考文献,根据有多少篇论文对其表明立场进行排序,并获取排名靠前的论文——因此每篇新论文加入时至少已连上一条边,而不是成为孤立节点。
ResNet 的核心假设——残差映射比没有引用的映射更容易优化——只在引言中陈述了一次,却没有提供任何依据。 第 2 页。
而且它常常保持沉默,有时也会出错。 如果从不合适的位置读出提示,就会得出自信却相反的结论,而不是含糊的答案。因此,我们会公布错误率,而非含糊带过——并使用他人标注的数据进行测量,因为若在规则所依据的同一批论文上测量,得到的就不是错误率,而是重述。
对照 SciCite(11,014 个引用语境,Cohan 等人,2019 年)和 ACL-ARC(1,941 个,Jurgens 等人,2018 年)的评估结果如下;这两个数据集都没有贡献任何提示短语:
| 引用 | 已判读 | 其中,判读正确 | |
|---|---|---|---|
| SciCite | 11,014 | 4.0% | 80.0% [76–84%] |
| ACL-ARC | 1,941 | 8.3% | 68.9% [61–76%] |
| 这两个数字都很重要。Keystone 的设计原则是宁可不报也不乱报:没有记录下来的提示短语,没有报告的立场,也没有展示出来的内容。在广泛语料上,这意味着它会拒绝大多数引用——“using CMet cardiac metric software [12]”就是一个真实的采用案例,唯一的证据只是知道 CMet 是什么。它的宏平均 F1 为 0.325 和 0.204,低于 2000 年基于提示短语的系统在 ACL-ARC 上取得的 0.273,也远低于训练所得神经分类器的 0.84–0.889,因为宏平均 F1 对沉默的惩罚与对错误的惩罚一样重。这个数字也已发表;省略它才是图省事的做法。 |
在这个库中,由人工标注的 90 条引用上,准确率为 87%[78–92%],宏平均 F1 为 0.84;同一批句子上的词袋分类器则为 0.59。这个样本说明规则内部一致,并不代表它们能适用于其他场景——参见 eval/corpora/README.md,其中也记录了在公开标签评分中发现并修复的三个真实缺陷。大约每五次判读就有一次出错,无论是误报还是漏报,这就是为什么每一行都会展示句子及其匹配的提示。
为什么不审计计算过程? 最初的版本就是这样,而且已经发布。论文中的数字只能以未发现错误的形式报告,而严谨的论文不会有错误:在九篇奠基性论文中,检查套件正确地产生了零条发现,因此它能给出的最佳结果就是一张白纸。数值分析仍在这里——追溯到表格单元格的主张、索引的每个数字、根据所引用论文核对的基线——但它位于谱系分析之下,细节就该放在那里。转向过程见 RELEASE.md。
领域概况
有两点事实值得直截了当地说明。
主流工具——SciSpace、ChatPDF、Elicit、Paperguide、NotebookLM——用的都是同一套流程:切块、嵌入、检索、回答、引用页码。它们在语料规模和精致程度上竞争,而非能力。
但 Keystone 并不是第一个将论文批评意见定位到页面上的工具。 Loupe(Apache 2.0)会先以低成本进行一轮分诊审查,随后可选择深入分析,并将每项发现定位到经视觉模型验证的边界框。有人独立地探索出将发现精确定位到像素的方向,证明这条路走对了。Keystone 的不同之处:
| Loupe | Keystone | |
|---|---|---|
| 判定 | 大模型判断 | 确定性代码——重新计算 statcheck/GRIM、重新推导算术、追溯摘要↔表格 |
| 定位 | MinerU → markdown,再通过视觉检查确认边界框 | 词级几何定位,经测量:99.94% 已验证,359 个锚点中 0 个为伪造 |
| 真值来源 | OCR 识别的 markdown | arXiv LaTeX 源文件——精确公式、表格数字、\cite 键 |
| 引用 | 标记“需要引用” | 获取被引用论文并检查是否蕴含 |
| 发现结构 | 按严重程度排序的扁平列表 | 带有承重程度排序的主张 DAG |
| 重点 | 证明和推理缺陷 | 实证缺陷——基线公平性、数据泄漏、方差、SOTA 范围 |
Loupe 的问题分类体系(逻辑、量词范围、缺失步骤)针对的是证明。Keystone 的分类体系针对实验,因为 ML/CS 论文实际出错之处就在实验。
状态
已在 https://keystone-research.vercel.app 上线。下方数据取自构建时写入的生成 JSON,因此与生成这些数据的那次运行一致。
| 分析的论文 | 234 |
| 引文解读 | 1524,其中 90.7% 锚定到页面 |
| 假设 | 973,其中 838 条没有说明任何支持依据 |
| 可遍历的论文间边 | 548 |
| 测试 | 274 个 Python 测试,49 个 JavaScript 测试 |
锚点层。 紧密锚点通过 MuPDF 执行独立的几何往返验证,而不是依赖匹配器自身的索引;门槛为 ≥99%,低于该标准时测试套件会拒绝构建。真实片段绝不会被拒绝,伪造引文绝不会被锚定——这两项的门槛都设为零。论文中约 93% 的 LaTeX 句子可以在其 PDF 中找到;如果某份源文件与其 PDF 的匹配率不到抽样句子的四分之一,就会被直接拒绝,而不会发布。
基于他人标注评分的线索规则。 在 SciCite(11,014 个引文上下文)上,这些规则会为 4% 的引文报告立场,其中 80% 判断正确,95% CI 为 76–84%。与接近 0.84 的神经分类器相比,Macro-F1 为 0.325,这种差距是有意为之:Macro-F1 对沉默的惩罚与对错误的惩罚一样严厉,而本项目的设计原则是在句子没有线索时保持沉默。请参阅网站上的 /method。
已实现的功能。 带有像素级锚定高亮的阅读器、供已登录读者使用的高亮和笔记、支持跨设备同步的 Google 登录、搜索和文库指南、覆盖整个文库的视图(/timeline、/contested、/assumptions)、新研究动态(/news)、对任何附带 LaTeX 源文件的 arXiv 论文按需分析、位于 /api/mcp 的 MCP 服务,以及无 Cookie 分析。
刻意不实现的功能。 访客追踪,以及解析器无法锚定的任何说法。确定性数值检查大多已弃用:在经过仔细审查的论文上,它们最好的结果不过是返回空白页;项目的价值最终在于溯源,而非算术。请参阅 RELEASE.md。
为何锚点层受到如此多的关注
所有下游论断都依赖它。如果一项发现指出“摘要报告为 94.2%,但表 3 给出的是 93.8%”,读者却无法点击并定位到这两个数字,那么这项发现就毫无价值。为实现这一点,我们进行了多轮测量;有意思的是,前三次失败出在测试而非代码:
- 往返验证最初只有 67.6%。原因:显示公式中的高大的
(合理地伸入正文行,导致精确字符串包含检查失败。 - 合并边界框会让一个高大的字形(
→∞)把某行的高亮延伸到下一行的整行范围。这是真实缺陷;现已通过使用中位数行框修复。 - 内容流中的单词顺序与裁剪文本的顺序在分栏和表格行之间确实可能不同,因此任何整段排序断言都不成立。现在按矩形检查,因为其中的顺序没有歧义——这是更严格的测试,而非更宽松的测试。
- 模糊匹配接受了 5.9% 的伪造引文,却没有匹配到 1846 个真实片段中的任何一个。
partial_ratio会为最佳窗口评分,因此替换一个词几乎不会改变分数:"Trade, feature 9-50"与"Trade, pages 9-50"的匹配分数为 93.6。对于一款旨在验证论文内容的工具来说,这是最糟糕的失效模式。现在模糊匹配需显式启用,并增加了词语替换保护。
锚点会自行报告精度(tight / approximate),验证过程也会按照各自的约定对其进行检查。在堆叠几何结构中——例如分数的分子位于分母上方——任何轴对齐矩形都无法做到紧密,因此锚点会明确说明这一点,而不会暗示其不具备的精度。
检查给我们的启示
这套测试迄今产生的每个误报都是触发条件错误,而非算术错误——这正是确定性检查的特有风险。检查计算正确,却基于错误前提触发,就会确信无疑地得出荒谬结论,比模型带有保留的猜测更糟。曾出现在真实论文中的四个问题:
- 子字符串标签匹配。
"sum" in "summarization"和"avg" in "avg pool"将方法名称和层名称识别成了汇总行,导致正确表格出现 21 条高严重性问题。现在会完整匹配标签。 - 假定表格方向。 有些表格中,粗体标记的是列中最佳值;另一些则是行中最佳值。假定第一种情况,曾在一张正确的 InstructGPT 表格中产生 31 条确信无疑的问题。现在会逐表推断方向并验证。
- 忽略分区结构。 结果表格可能按区段排列——先列出先前工作,再列出一条规则,最后列出作者的行;而“最佳”是针对某个区段而言的。按整列检查 Transformer 的表 2,会把最佳集成模型误报为中游值。现在会将
\midrule保留为结构,而非当作格式剥除。 - 比较不同类型的数值。 一个 ResNet 行中,两个数据集对应的 [email protected] 和 mAP@[.5,.95] 被从头到尾进行比较,结果较小的指标被误报为并非最佳。现在,如果最内层列标题重复,行比较会按该标题分组。
每种情况的共同补救方法相同:检查必须先验证自身前提,再给出结论。 只有在某个总计行与其他列的数值相加吻合时,才会报告它有误;只有当这种解读也能解释论文中的其他标记时,才会将强调样式解读为“最佳”。
召回率的限制因素不是算术,而是判断框架:表格是按列比较还是按行比较,以及哪些行彼此可比。计划正是将这类判断交给模型——由模型负责提取和路由——而判定结果仍由算术给出。
目录结构
services/core/keystone/ingest/
├── normalize.py skeleton projection: ligatures, accents, dashes, hyphenation
├── pdf.py MuPDF word geometry — the ground truth
├── anchors.py quote -> rectangles, with the rejection path
├── verify.py independent round-trip through MuPDF, per precision contract
├── regions.py stacked geometry, rotated lines, maths classification
├── furniture.py running heads, page numbers, the rotated arXiv stamp
├── latex.py arXiv source: equations, tables, citations, sentence runs
├── arxiv_source.py e-print fetch, unpack, main-file resolution
├── tables.py LaTeX tabular -> typed cells, with emphasis and bands
├── assemble.py ingested sources -> Paper
└── sampling.py span sampling for the anchor audit
services/core/keystone/
├── lineage/stance.py the cue rules: adopts / extends / disputes / compares
├── lineage/assumptions.py what a paper takes on faith, and what it offers for it
├── lineage/graph.py paper-to-paper edges, for the library views
├── audit/numbers.py number parsing that preserves reported precision
├── audit/registry.py check registration and the runner
├── audit/checks/tables.py table consistency checks
├── graph/models.py the typed structures checks reason over
├── eval/external.py scoring the cue rules on SciCite and ACL-ARC
└── eval/planted.py planting known defects to measure detection
阅读器及其提供的所有内容:
apps/web/
├── app/ routes: the reader, the library views, /news, /stats
├── app/api/ account, marks, chat, guide, feed, mcp, track
├── app/api/ingest.py Python function: analyse any arXiv paper on request
├── components/ the reader, the page view, the graph, the timeline
├── lib/ marks geometry, anchors, analytics, feeds, the store
├── test/ node --test, no framework
└── public/dossiers/ the built library, committed so the site needs no database
运行
cd services/core && uv sync
获取测试语料(十篇公开的 arXiv PDF):
./eval/fetch_corpus.sh
运行各项门禁:
cd services/core && uv run pytest -q
审核整个语料中的锚点准确率:
cd services/core && uv run keystone audit ../../eval/corpus/pdf/*.pdf --samples 150 --hyphen-samples 40
测量 arXiv LaTeX 源码锚定回各 PDF 的效果:
cd services/core && uv run keystone source-audit ../../eval/corpus/pdf/*.pdf
运行确定性检查,并用人为植入的缺陷测量效果:
cd services/core && uv run keystone check 1706.03762 1810.04805
cd services/core && uv run keystone planted-audit 1706.03762 1512.03385 1810.04805 --verbose
检查一段引文,并将其高亮渲染成图像以便目视检查:
cd services/core && uv run keystone probe ../../eval/corpus/pdf/1706.03762.pdf "The Transformer allows for significantly more parallelization"
arXiv 源码路径
对于任何 arXiv 论文,都可以通过 arxiv.org/e-print/{id} 获取实际的 LaTeX 源码,其中包含准确的公式、作者编写的表格编号,以及真实的 \cite 键——这些信息都无法可靠地从渲染后的字符中还原。随后,会将源代码提取的文本锚定回 PDF,使这些信息仍有像素坐标。
通过四项基于测量发现的修复,句子级对齐率达到了 93.5%:展开不带参数的用户宏(如 \etal、方法简称),避免 PDF 中有文本而对齐结果中留下空缺;用匹配大括号的方式移除宏定义,因为嵌套大括号会让正则表达式失效;排除页面装饰元素;以及将文本段拆分成句子。
对于封装了预编译 PDF(\includepdf)的投稿,会抛出 SourceUnavailable,而不是返回空文档——声称“没有公式、没有表格”是对论文内容的错误陈述,而不是对信息缺失的描述。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。