作为产品经理,日常需要阅读大量业内前沿探索的论文。我之前写了一个 paper-reader skill 辅助做这件事情。但是很快发现,智能体输出的论文摘要,非常死板,和过去人肉摘录总结的笔记相比,很不易读。
本次我们考虑学习 autoresearch 方案,尝试让 AI 来自动优化我们这个 skill,能不能让智能体输出的最终内容,更接近人工笔记的效果。这种成品的论文研读笔记,有几个特征:
为了快速上手,直接采用 npx skills add uditgoenka/autoresearch 来进行本次实验。
autoresearch 的核心思路就是把迭代拆成三段:生成、评测、编排。每次迭代只改一个小切面,然后用同一套评测跑一遍,做到“能对比、能回滚、能解释”。
在 paper reader 这个场景里,有幸的是我过去已经积累了足够的”论文->笔记”数据,可以作为 groundtruth。当然这么多笔记,都用来跑测试,一没有必要,二太浪费 token。
所以,先让 AI 根据过去笔记知识库的目录结构、过去 SKILL.md 中特别提示过的几个重点关注分类,采样了 10 篇笔记,用来跑测试。
然后,规划评分指标。AI 推荐采用规则初筛配合LLM as a judge 多维评分的方案。
规则部分包括:
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 | 明显回退 |
这段看起来提升很大!但其实提升过程最主要的不是什么花式 CoT、也不是堆一堆结构化标题,而是强调了两件最简单基础的事情 —— 让模型看完整篇论文 ,再明确它要写的是“成品笔记”。
1)全文输入与事实边界
智能体在运行时,总偏向偷懒,经常自己执行 sed 命令只查看前几行后几行。毕竟大家都知道论文一开头有个摘要环节,大模型经常选择只看摘要就交差。
而论文的关键内容经常在中段:实验表、算法细节、数据结构、消融结论。只看头尾,很容易导致“写得像懂了,但关键数字缺失”。
当我们把输入策略调整约束为完整的全文输入后,整体理解质量上了一个台阶。
2)把输出目标从“长文导读”改成“笔记成品”
当模型能看全之后,下一步不是让它写得更“完整”,而是让它写得更“像人”。我们把 prompt 往成品靠拢,强调:
这一阶段最终把基线推到了 88.09 分。到这里,纯 prompt 调优基本接近边界:再往上推,靠全局 prompt 很容易出现“顾此失彼”——修好了某类论文的风格,另一类论文就开始丢事实或乱填数字。
当全局 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。
在干净的基线上,autoresearch 还尝试了几次更克制的修改,希望能解决高波动的那两个拖分样本:
可惜都失败了,各种方案,对某些论文是修复,对另一些论文就是误伤。只能全都回滚。