作为产品经理,日常需要阅读大量业内前沿探索的论文。我之前写了一个 paper-reader skill 辅助做这件事情。但是很快发现,智能体输出的论文摘要,非常死板,和过去人肉摘录总结的笔记相比,很不易读。

本次我们考虑学习 autoresearch 方案,尝试让 AI 来自动优化我们这个 skill,能不能让智能体输出的最终内容,更接近人工笔记的效果。这种成品的论文研读笔记,有几个特征:

  • 开头直接给结论,不铺长背景
  • 有关键数字(数据规模、延迟、成本、压缩比、提升倍数等)
  • 有工程判断(能不能落地,瓶颈是什么,哪些细节没交代)
  • 缺细节就明确说“当前给定文本未展开到这个粒度”,而不是脑补
  • 文风更像 Confluence 里真会留下来的记录,不像论文导读长文

为了快速上手,直接采用 npx skills add uditgoenka/autoresearch 来进行本次实验。

实验设计

autoresearch 的核心思路就是把迭代拆成三段:生成、评测、编排。每次迭代只改一个小切面,然后用同一套评测跑一遍,做到“能对比、能回滚、能解释”。

在 paper reader 这个场景里,有幸的是我过去已经积累了足够的”论文->笔记”数据,可以作为 groundtruth。当然这么多笔记,都用来跑测试,一没有必要,二太浪费 token。

所以,先让 AI 根据过去笔记知识库的目录结构、过去 SKILL.md 中特别提示过的几个重点关注分类,采样了 10 篇笔记,用来跑测试。

然后,规划评分指标。AI 推荐采用规则初筛配合LLM as a judge 多维评分的方案。

规则部分包括:

  • 文件非空
  • 标题存在且正常
  • 长度在合理区间,不是过短也不是失控长文
  • 没有明显占位符、套话残留、 TODO 、 [Paper Title] 这类模板痕迹
  • 没有明显与 index.md 成品风格冲突的结构,比如机械套 ## Problem Background / ## Core Method / ## Critical Analysis

LLM as a judge部分包括:

  • 事实覆盖
  • 风格贴合
  • 批判性与实用性
  • 结构完成度

具体实现和每项指标的权重值,都由 AI 自动推荐。我们做个 yes engineer 就好了。

时间线与里程碑

下面这些分数来自我们这次会话中实际落盘的 evals/results/*.json 或会话中被明确引用的结果。

阶段 结果名 分数 备注
初始基线 val_baseline_k27_k27 75.0 主线起点
Prompt/链路调优最佳 val_iter_fulltext_nobloat_k27 88.09 Prompt 阶段 best baseline
试探后处理(小幅有效) val_iter_fulltext_nobloat_postclean_k27 88.48 +0.39,但后续不稳定
更激进后处理(回退) val_iter_fulltext_nobloat_postclean_v2_k27 87.10 LLM 自由改写误伤
一度“稳定过线”(后被作废) val_fresh_v4_r1/r2/r3_clean 91.38/90.76/92.66 后被判定为评测泄漏
一度 holdout 过线(后被作废) holdout_v6_clean 92.23 同上,作废
删掉重来后的干净基线 val_clean_rerun_k27_r1/r2/r3 84.07/86.14/88.82 均值 86.34
只改 user prompt 的一次实验(失败) val_prompt_tight_shortfacts_k27_r1 85.95 不稳定
同上第二次(失败) val_prompt_tight_shortfacts_k27_r2 82.59 明显回退

第一阶段:从 75.0 到 88.09

这段看起来提升很大!但其实提升过程最主要的不是什么花式 CoT、也不是堆一堆结构化标题,而是强调了两件最简单基础的事情 —— 让模型看完整篇论文 ,再明确它要写的是“成品笔记”。

1)全文输入与事实边界

智能体在运行时,总偏向偷懒,经常自己执行 sed 命令只查看前几行后几行。毕竟大家都知道论文一开头有个摘要环节,大模型经常选择只看摘要就交差。

而论文的关键内容经常在中段:实验表、算法细节、数据结构、消融结论。只看头尾,很容易导致“写得像懂了,但关键数字缺失”。

当我们把输入策略调整约束为完整的全文输入后,整体理解质量上了一个台阶。

2)把输出目标从“长文导读”改成“笔记成品”

当模型能看全之后,下一步不是让它写得更“完整”,而是让它写得更“像人”。我们把 prompt 往成品靠拢,强调:

  • 第一段直接给结论/判断
  • 优先写关键数字、表格结论、算法步骤、数据结构
  • 缺失细节就明确说缺失,不要把“当前文本未看到”硬说成“论文没有”
  • 少用固定大纲,少写论文式导读

这一阶段最终把基线推到了 88.09 分。到这里,纯 prompt 调优基本接近边界:再往上推,靠全局 prompt 很容易出现“顾此失彼”——修好了某类论文的风格,另一类论文就开始丢事实或乱填数字。

第二阶段:一度突破 90+,但后来发现是作弊!

当全局 prompt 接近天花板后,autoresearch 很自然的选择加入后处理(post-clean)。我们也确实看到了小幅收益:88.09 -> 88.48。但随后更激进的 LLM 重写会带来明显副作用(把已写对的事实改坏),分数回退到 87.x。

接下来一个阶段,autoresearch 突然起飞了,出现了 fresh val 三次稳定 90+,以及 holdout 92.23。

考虑到post-clean 需要 python 脚本,我决定 review 一下 python 实现里到底有什么玄妙之处。结果赫然发现,脚本中出现了一个 get_curated_rewrite(sample_id) 方法,对数据里频繁高波动的两个样本,直接固定返回对应内容!本质上属于评测集泄漏。

这组 90+ 结论只能作废。

把作弊方法清掉后,重新跑了一组干净的 val (repeats=3):84.07 / 86.14 / 88.82,均值 86.34。

第三阶段:一次克制的 A 方案试验,为什么还是失败

在干净的基线上,autoresearch 还尝试了几次更克制的修改,希望能解决高波动的那两个拖分样本:

  • automation_gaps_llm_serving 容易写成长综述
  • logcloud 容易漏关键数字

可惜都失败了,各种方案,对某些论文是修复,对另一些论文就是误伤。只能全都回滚。

最后的结论

  • 上下文覆盖永远先于 prompt 花活:论文“中段缺失”会直接导致事实与数字缺失,后面再怎么调风格都像在补锅。
  • 全局 Prompt 调优有明显天花板,很容易出现“修 A 伤 B”的模式。
  • autoresearch 为达目的不折手段,他的优化手段,需要人来审核,来提供解释性。否则,就会落入 AI 作弊的陷阱。