arXiv 计算机科学部门主席 Thomas Dietterich 近日向平台用户发出明确警告:论文署名作者必须对论文全部内容承担完整责任,无论这些内容是如何产生的。如果生成式 AI 产出的不当语言、抄袭片段、偏见表述、事实错误、遗漏、错误引用或误导性内容被写入论文,责任不在工具——而在署名人。违规者将面临一年封号处罚。
这条规则没有灰色地带。
署名即担责,没有"AI 写的"这个借口
arXiv 的行为准则一直要求署名作者对论文内容负全责。Dietterich 的发声只是把这条老规则重新对准了新场景:当作者用 ChatGPT、Claude 或其他生成式工具辅助写作时,产出的问题仍然归署名作者。
具体来说,以下几类问题一旦出现在论文中,署名作者无法以"AI 生成的"为由免责:
- 抄袭内容:AI 训练数据中包含他人论文,输出可能直接搬运段落而不标注来源。
- 错误引用:AI 编造不存在的参考文献(hallucinated citations),这在学术圈已是公认的顽疾。
- 事实错误与遗漏:实验数据、方法论描述被 AI 悄悄篡改或遗漏关键步骤。
- 不当语言与偏见:AI 输出带有歧视性表述或不符合学术规范的措辞。
- 误导性内容:结论被过度概括,或与实际实验结果不符。
arXiv 的态度很硬:你署了名,你就是最终把关人。AI 不是合著者,不能替你背锅。
错误引用是最大雷区
在所有 AI 生成问题中,错误引用(hallucinated references)是最容易被忽视、也最容易被查实的。AI 会凭空构造看起来完全合理的参考文献——有真实作者名、相近的标题、甚至合理的年份和期刊名,但这篇论文根本不存在。
一位研究者如果在论文中引用了这样的"幽灵文献",等于在学术记录中植入了虚假信息。后续研究者顺着这条引用去查找原文,浪费时间不说,还可能基于不存在的前提展开工作。
arXiv 把这类问题归入"误导性内容",和故意造假同等对待。
提交前的自检实践
在把论文提交到 arXiv 之前,可以用脚本对参考文献做一轮自动化校验。下面是一个 Python 脚本,逐条检查 BibTeX 中的 arXiv 编号是否真实存在于 arXiv API 中:
#!/usr/bin/env python3
"""check_arxiv_refs.py — 校验 BibTeX 中 arXiv 引用是否真实存在"""
import re
import sys
import json
import urllib.request
import urllib.parse
import time
def extract_arxiv_ids(bibtex_text: str) -> list[str]:
"""从 BibTeX 文本中提取所有 arXiv 编号 (e.g. 2304.01234 或 cs/0701001)"""
# 匹配 eprint 字段和 URL 中的 arXiv ID
pattern = r'eprint\s*=\s*{([^}]+)}|arxiv\.org/abs/([0-9]{4}\.[0-9]{4,5}|[a-z-]+/[0-9]{7})'
matches = re.findall(pattern, bibtex_text)
ids = []
for m in matches:
id_ = m[0] if m[0] else m[1]
ids.append(id_.strip())
return ids
def verify_arxiv_id(arxiv_id: str) -> dict:
"""调用 arXiv API 验证编号是否存在"""
url = f"http://export.arxiv.org/api/query?id_list={urllib.parse.quote(arxiv_id)}"
try:
req = urllib.request.Request(url, headers={"User-Agent": "ref-checker/1.0"})
with urllib.request.urlopen(req, timeout=15) as resp:
body = resp.read().decode("utf-8")
# API 返回 XML; 如果 total_results > 0 则编号存在
if "<total_results>0</total_results>" in body:
return {"id": arxiv_id, "exists": False}
elif "<total_results>" in body:
return {"id": arxiv_id, "exists": True}
else:
return {"id": arxiv_id, "exists": None, "note": "parse error"}
except Exception as e:
return {"id": arxiv_id, "exists": None, "note": str(e)}
def main():
if len(sys.argv) < 2:
print("用法: python check_arxiv_refs.py references.bib")
sys.exit(1)
with open(sys.argv[1], encoding="utf-8") as f:
bibtex = f.read()
ids = extract_arxiv_ids(bibtex)
if not ids:
print("未找到任何 arXiv 编号,请检查 BibTeX 文件格式。")
sys.exit(0)
print(f"找到 {len(ids)} 个 arXiv 引用,开始校验...\n")
problems = []
for i, arxiv_id in enumerate(ids):
result = verify_arxiv_id(arxiv_id)
status = "✅ 存在" if result["exists"] else (
"❌ 不存在" if result["exists"] is False else "⚠️ 无法确认"
)
print(f" [{i+1}/{len(ids)}] {arxiv_id} → {status}")
if result["exists"] is False:
problems.append(arxiv_id)
if result["exists"] is None:
print(f" 备注: {result.get('note', '')}")
time.sleep(0.5) # 避免触发 API 限流
print(f"\n校验完成: {len(ids)} 条引用, {len(problems)} 条问题")
if problems:
print("以下 arXiv 编号不存在,请逐一核实或删除:")
for p in problems:
print(f" - {p}")
sys.exit(1)
else:
print("所有 arXiv 引用校验通过。")
sys.exit(0)
if __name__ == "__main__":
main()
运行方式:
python check_arxiv_refs.py references.bib
脚本会逐条调用 arXiv 公开 API,检查每个 eprint 字段中的编号是否返回有效结果。如果发现"幽灵引用",立即标红并退出码为 1,方便集成到 CI 流程中。
注意:脚本只覆盖 arXiv 编号的引用。非 arXiv 来源(期刊、会议论文集)的引用需要用其他方式核实,比如 CrossRef API 或 Google Scholar。此外,API 限流约为每秒 1 次请求,脚本已内置 0.5 秒间隔;大批量校验时请适当调大。
除了引用,还有哪些检查要做?
自动化工具只能覆盖一部分问题。提交前至少还需要手动完成以下检查:
| 检查项 | 方法 | AI 高风险原因 |
|---|---|---|
| 段落原创性 | 用 Turnitin、iThenticate 等查重工具 | AI 可能搬运训练数据中的原文 |
| 实验数据一致性 | 核对代码与论文中的数字、图表 | AI 概括时可能篡改或遗漏数据 |
| 方法描述完整性 | 对照实际实验流程逐条确认 | AI 容易跳过关键步骤 |
| 术语准确性 | 请领域内同行审阅 | AI 会混用不同子领域的术语 |
| 伦理与偏见表述 | 逐段检查是否有歧视性或不当措辞 | AI 训练数据中存在偏见 |
核心原则:AI 辅助写作可以,但每一句话都必须经过你的逐条确认。 你不是在审阅 AI 的草稿——你是在为最终文本签下学术信用担保。
写在最后
arXiv 的封号一年不是象征性处罚。对活跃研究者来说,一年无法提交预印本意味着错过关键窗口期——想法被他人抢先发表、引用链断裂、合作机会流失。
这条规则的本质不是禁止 AI,而是拒绝把 AI 当作责任防火墙。你可以用 AI 润色语言、整理文献、生成初稿结构,但署名的那一刻,论文里每一个字都是你的。
提交前跑一遍引用校验脚本,再逐段过一遍内容,这两步加起来可能只需要额外两小时。和一年封号相比,这笔时间投入显然划算。