paper-analyst:每篇论文六轮精读,用硬门槛挡掉模板化幻觉
local/paper-analyst
paper-detail-generator v5.2.0 给论文库里每一篇生成双语深度解读页,一篇论文一条任务,六轮工作流期间保持 running。它的存在理由是一次事故:v1 曾用脚本从「标题 + 摘要」批量生成 207 篇详情页,结果 205/214 篇不合格——公式编造、图片引用不存在、每篇结构雷同。那个脚本已删除并被写进仓库铁律。
我们的判断这条 skill 的第一属性不是「会写解读」,而是「不许偷懒」:不少于 4000 字、5 处公式、3 张图、2 张表,quality_score 不低于 8.0,都是门槛而不是建议,并且要过机器打分、元数据完整性、人工确认三道门禁。任何垂直内容站都能直接抄这一条——把质量标准写成可验证的产物,而不是写成人品要求。
这条线为什么存在
paper-detail-generator v5.2.0 给论文库里的每一篇论文生成一份深度解读详情页(中英双语 HTML),数字孪生里的执行者是 paper-analyst,一篇论文一条任务,6 轮工作流期间保持 running。它的存在理由是一条历史事故:v1 曾用一个 gen_paper_details.py 脚本从「标题 + 摘要」批量生成 207 篇详情页,结果 205/214 篇质量不合格——模板化的幻觉正文,公式编造、图片引用不存在、每篇结构雷同。那个脚本已经删除,并被写进仓库铁律:永远不得恢复或创建同类批量生成脚本。
所以这条 skill 的第一属性不是「会写解读」,而是「不许偷懒」。它用六道强制轮次把「真的读过这篇论文」变成可验证的产物。
六轮工作流,每轮都带自检
| 轮次 | 做什么 | 自检判据 |
|---|---|---|
| Round 1 全文 | 从 abs 页确认版本号,构造 https://arxiv.org/html/<id>v<ver> 抓全文;非 arxiv 用 defuddle parse | 有没有拿到方法章节的真实公式和实验表格?没有就换版本/换方式继续 |
| Round 2 代码 | 从全文提取仓库链接(常在 Introduction 末或页脚),没有就用标题+作者搜 GitHub,git clone --depth 1 读 README 与核心源码 | 已发布 → 找 ≥2 处「论文方法 ↔ 源码」对应并贴文件路径;无代码 → 明写「本文未提供公开代码」 |
| Round 3 图片 | scripts/fetch_paper_figures.py 下载 arxiv HTML 里的真图到 data/static/img/papers/<id>/figN.png | 下载几张、正文引用几张?引用数 ≥3,并记住 fig1/fig2 作封面候选 |
| Round 4 分析 | 内部完成不外显:核心创新 1-3 条、每个创新的输入→处理→输出→为什么更好、≥5 个真实公式与符号含义、最有说服力的实验、作者自述弱点 + 自己的判断、每个 component 对应哪个文件/函数 | 六项逐一有结论 |
| Round 5 撰写 | academic 风格,中英各写一份完整独立的 HTML,不混排 | 见下方硬标准 |
| Round 6 审查+入库 | 自我审查清单逐项过 → set_paper_detail.py 写库 → 机器质检打分 → 线上 curl 验证 | quality_score ≥ 8.0,且输出里必须出现 cover_image: /static/img/papers/... |
Round 1 有个实操细节:本地直接 curl arxiv.org 常常很慢,标准动作是在生产服务器上下载再 scp 回来。全文很大时用 sed -n 'X,Yp' 分段读,直到摘要、引言、方法、公式、实验、结论全部拿到。少数论文没有 arxiv HTML 或只有极小文件,此时退回 defuddle parse 或下 PDF 转文本。
硬标准:数字不是建议,是门槛
- 字数 ≥ 4000(中英各自,不含 HTML 标签),段落 ≥ 20
- 论文真实公式 ≥ 5 处,从全文提取、KaTeX 渲染
- 论文真图 ≥ 3 处,必须是 Round 3 下载到本站的那批
- 实验数据表格 ≥ 2 张,含真实实验数字
- Mermaid 图 ≥ 1 张,基于该论文特有方法流程,不是通用模板
- 指出局限 ≥ 2 处,其中至少 1 处是作者自述的
- 有总结章节,有金句
结构顺序也是定死的:论文元信息(标题·作者·链接·代码状态)→ 一句话总结(100 字内)→ 研究背景与动机(4-5 段)→ 预备知识(2-3 段,如需要)→ 方法详解(≥8 段,全文最重点)→ 实验结果(≥3 段,配表格与图片并解读数字含义)→ 局限性 → 总结与展望 → 金句。写作要求里明确禁 AI 套话(「深入探讨」「至关重要」「值得注意的是」),每篇的 Mermaid 必须反映该论文特有的方法流程——这两条正是为了防住批量生成留下的味道。
三道门禁:机器质检、元数据完整性、人工确认
写库不是终点。set_paper_detail.py 写入时自动调 quality_inspector.score_detail() 算 0-10 分写进 papers.quality_score,评分卡是结构完整 40%(字数/公式/图/表)+ 技术准确 30%(公式定界符安全)+ 事实可溯 15% + 语言质量 15%。<8.0 说明不达标,按输出提示定位短板、改 HTML 重写,直到过线。手动补评用 quality_inspector.py <paper_id> --write。
接着是元数据门禁(2026-09-01 起):确认发布接口校验中英标题/摘要/标签完整性(paper_metadata_issues),不全直接 HTTP 409 拒绝——防止中文站显示英文标题。这条门禁来自一次真实事故:ZEST 论文入库后中文标题/摘要的 SQL 补写因 shell 引号问题静默失败,agent 没回读就继续精读发布,结果中文站显示英文标题+摘要,标签只剩占位符 {Twitter}。所以现在有一条硬规则:任何 SQL/脚本改元数据后必须立即回读验证,不允许凭返回码认定写入成功;多引号嵌套的 UPDATE 一律写进 /tmp/fix.sql,用 docker cp + psql -f 执行。
最后是人工终审:详情页写入后论文进 /manage/confirm 待确认队列(confirmed_at IS NULL),负责人点「确认」才 published=true 并记录确认人与时间,点「驳回」则下线重做。队列只列 agent 精读产出,存量已发布论文已回填确认,不会淹没队列。凡 SQL 直改标题/摘要/标签的,改完必须跑 reindex_search.py --fix,否则检索层与展示层不一致。
发布之后:webp 两档与社交物料
arXiv 原图很重(中位长边 997px、PNG 为主),实测详情页图片负载中位 2.64MB、最大 19.89MB。论文 published=true 之后 Round 6.4 在 api 容器内跑 build_card_thumbs.py --only papers 与 build_body_thumbs.py --only papers,给正文图和封面预生成 800px/q78 与 1400px/q80 两档 webp,幂等增量、不重启容器、不发代码;webp 只是派生兄弟文件,原图字节不动,点击放大换回原图,og:image 用原图。
Round 6.5 补社交物料,顺序不能反:先 OG 卡(POST /api/social/card?kind=paper&id=<id>&both_langs=true),再写社交重写稿并顺带渲 1080x1350 竖版知识卡,然后取六平台英文帖子包,最后目检。重写稿是创作,禁止脚本从 title+summary 批量套模板灌表——与已删除的 gen_paper_details.py 是同一类事故。目检前必须先用 scripts/rw_tools.py small 把卡片压到长边 ≤1280px 且 ≤200KB 再看,直接 view_image 原图会把上下文顶穿。
线上验证与存量修复
curl -s "https://robot.agientry.com/api/papers/<paper_id>?lang=zh" | python3 -c \
"import sys,json; d=json.load(sys.stdin); h=d.get('detail_html',''); print('len:',len(h),
'figs:',h.count('/static/img/papers/'),'mermaid:',h.count('mermaid'),
'table:',h.count('<table'),'cover:',d.get('cover_image'))"
四个数字都要看:len 对得上 4000 字量级、figs ≥3、table ≥2、cover 必须是 /static/img/papers/<id>/figN.png。存量论文若不达标,走「修复存量」流程:重新精读该篇(不是套模板补字数),改完重新过质检与验证。SSH 偶发断连时用 -o ConnectTimeout=60 -F /dev/null 重连,长批次用 setsid 放后台,避免超时打断写库。