记一次使用agent在一小时内完整调研上百篇文献的工作流
- 内容介绍
- 文章标签
- 相关推荐
用 AI 处理三十卷期刊文献综述的工程实践
老板节前扔过来三十卷期刊,时间跨度从 1990 年到现在,每卷约十几篇文献,节后要汇报某一特定主题在这几十年间的发展脉络。面对这种人力难以企及的工作量,只能借助 AI 辅助筛选和梳理。但真正动手之前,有两个硬问题必须先解决。
两个核心难点
上下文长度
一次性把所有文献塞进去显然行不通。单纯依靠上下文工程(比如在 system prompt 里约束每轮清空上下文)也很不稳定——经过我的测试,哪怕只是串行读取,进行几轮之后 agent 就会忘掉之前的约束。状态必须外置。
加密 PDF 的识别质量
这批期刊全是加密 PDF,既无法直接提取文本,又普遍采用双栏排版。AI 对双栏布局的识别本来就不稳定,遇到表格或多图交叉引用时幻觉尤其严重。直接扔给网页版 GPT 测试,结果很不理想。
预处理:MinerU 转换 Markdown
第一步用 MinerU 将三十卷期刊批量转换为标准 Markdown 格式。MinerU 能够正确处理双栏布局,将阅读顺序还原为线性文本,同时保留表格结构,这直接消除了识别质量问题,也让后续所有 AI 处理都面对干净的纯文本。
整体流程
MinerU 转换
└─ 第一轮:逐卷建立索引表(每篇文章的主题、关键词、相关度)
└─ 第二轮:按研究方向归类,筛出相关文章
└─ Codex (1M 上下文) 分方向文件夹逐一总结归纳
第一轮以文章为最小单位,提取题目、摘要、研究方向,生成一张结构化索引表,同时过滤掉与目标主题无关的文章。
第二轮根据索引表,按需要调研的几个子方向分别归类,每个方向单独建一个文件夹,只放相关文章的 Markdown 文件。
最终总结在各方向文件夹内调用 Codex(支持 1M token 上下文),对该方向所有文献做横向梳理,输出发展脉络。
方案一:Claude Hooks(Unix / macOS)
Claude Code 的 SubagentStart / SubagentStop hooks 天然适合这个场景:每个 subagent 开始和结束时各触发一个脚本,所有进度集中写在 progress.json 里,这样多个 subagent 并行运行时也不会乱序。
settings.json 配置
{
"hooks": {
"SubagentStart": [
{
"hooks": [
{
"type": "command",
"command": "node \"D:/agent_workspace/Z/器材/文献综述/scripts/track-start.mjs\"",
"timeout": 10
}
]
}
],
"SubagentStop": [
{
"hooks": [
{
"type": "command",
"command": "node \"D:/agent_workspace/Z/器材/文献综述/scripts/track-stop.mjs\"",
"timeout": 10
}
]
}
]
}
}
有几个坑值得提前说明:SubagentStart / SubagentStop 不支持 matcher 字段,不能按任务类型过滤;SubagentStart 也不支持 additionalContext,需要上下文的内容必须在调用方的 prompt 里直接传入。
track-start.mjs 在 subagent 启动时从 stdin 读取事件 JSON,检查 progress.json 是否还有未处理的任务,若有则向 progress.md 追加一条开始记录(当前卷号、文件路径、时间戳)。如果流水线已全部完成则静默退出,任何异常也以 exit 0 结束,不阻断主流程。
track-stop.mjs 在 subagent 结束时做两件事:一是从 event.last_assistant_message 里提取 Markdown 表格行(以 | 开头的行),追加到全局 index.md;二是将 progress.current 加一并回写 progress.json,推进流水线。此外有两道守卫:如果流水线已完成则跳过,如果输出里不含 | 说明没有产出合格的索引表格,同样跳过,避免污染汇总文件。
进度文件结构如下:
{
"current": 3,
"files": ["vol_1990", "vol_1991", "vol_1992", "..."],
"completed": ["vol_1990", "vol_1991", "vol_1992"]
}
方案二:Runner 脚本(Windows 兼容)
codex是个更好的选择,便宜、量大。但是Windows 上 codex 目前原生不支持 hooks,但逻辑完全可以用一个普通的 Node.js runner 脚本来替代,而且控制粒度更高。
核心思路是将 hooks 的"触发-执行-推进"三个动作合并进一个串行循环,由 run-batch.mjs 直接调起 codex exec,同步等待返回后再读取输出、落盘、推进进度,最后进入下一轮。
node run-batch.mjs
└─ 读取 progress.json,取当前任务
└─ 调用 codex exec(spawnSync,同步等待)
└─ 从输出文件读取 last-assistant-message
└─ 落盘到 index.md,推进 progress.json
└─ 循环,直到所有任务完成
run-batch.mjs 支持几个实用的命令行选项:
--once 只处理当前这一条,不循环
--dry-run 打印即将执行的命令,不实际运行
--status 查看当前进度和活跃任务状态
--model MODEL 覆盖本次运行使用的 Codex 模型
--reasoning EFFORT 覆盖推理强度
脚本会在每次运行前检查 active-run.json 是否存在,防止并发写入 progress.json 导致进度混乱。如果上一次运行异常中断留下了锁文件,手动删除 .codex/runtime/active-run.json 即可恢复。
Runner 方案和 hooks 方案在功能上等价,区别在于 runner 是同步串行的(一篇处理完才进下一篇,倒是也可以并行,但是很容易进程堵塞),而 hooks 方案配合 Claude 的并行 subagent 可以同时处理多卷。如果机器性能或 API 并发有限制,runner 反而更安全可控。
网友解答:--【壹】--:
每天到 L 站都能学到崭新的技巧真不错
--【贰】--:
发了30卷期刊,不知道哪里下的完整的一卷一卷的那种
--【叁】--:
MinerU 确实好用,FastGpt做知识库,搭问答工作流的时候处理pdf用过,数学公式也可以识别,只要不是很复杂的化学方程式就好。
--【肆】--:
感谢大佬分享经验!收藏一下,估计不久会用到。
--【伍】--:
学到了用MinerU。
上次转换了200份pdf,一份50页。使用grok-4.1-fast做文字和图片识别,用时1小时。
--【陆】--:
学习了,请问文字识别的效果如何,包括公式这些
--【柒】--:
ai直接转幻觉还是挺强的,而且也浪费token,我觉得还是能用脚本就用脚本
--【捌】--:
mineru还是很强的,基本没有任何问题。如果公式复杂的话走gpu的predict
--【玖】--:
arxiv文章可以直接下载源码其实,用起来更舒服。
--【拾】--:
继续index、继续hooks分批,就这个思路不断嵌套
--【拾壹】--:
补充一下,方案一我claude用的是codex-plugin-cc,单纯claude subagent那纯烧钱去了。。。
这个plugin我看了下似乎也是skill约束的bash脚本,调用的是codex exec,把\codex:rescue放到claude code的subagent里面就行了。
--【拾贰】--:
大佬这个分享非常棒,很有启发意义,感谢大佬的分享
--【拾叁】--:
最近做了一个状态控制为单元的工作流编排,我有空把这个弄成范例
--【拾肆】--:
同一文件夹下的同一方向的文献仍然远超Codex1M上下文呢?比如有100M,有什么好的建议么
--【拾伍】--:
我之前也试过这个 workflow,但是 mineru 解析复杂图片效果实在不太行(会把一幅图拆开)。对于比较新的 arxiv 文章可以用 arxiv2md 直接出 markdown,效果会好很多
--【拾陆】--:
markdown文件里面的图片连接,渲染过后能看到。
我坐文章的分类时,一篇文章一个文件夹。文件夹内是文章的md,以及images文件夹,里面是图片
--【拾柒】--:
我觉得还行吧,我这里也有复杂图片。ai能读懂就行了
要是arxiv确实简单很多了,现在arxiv基本都支持html
--【拾捌】--:
感谢分享小白想问一下PDF里面的图片他们会转变转换成什么
--【拾玖】--:
老板是扔过来pdf了么?我自己调研爱斯维尔的ai只看得到摘要和标题 还得我通过校园网下载喂给她详细内容
用 AI 处理三十卷期刊文献综述的工程实践
老板节前扔过来三十卷期刊,时间跨度从 1990 年到现在,每卷约十几篇文献,节后要汇报某一特定主题在这几十年间的发展脉络。面对这种人力难以企及的工作量,只能借助 AI 辅助筛选和梳理。但真正动手之前,有两个硬问题必须先解决。
两个核心难点
上下文长度
一次性把所有文献塞进去显然行不通。单纯依靠上下文工程(比如在 system prompt 里约束每轮清空上下文)也很不稳定——经过我的测试,哪怕只是串行读取,进行几轮之后 agent 就会忘掉之前的约束。状态必须外置。
加密 PDF 的识别质量
这批期刊全是加密 PDF,既无法直接提取文本,又普遍采用双栏排版。AI 对双栏布局的识别本来就不稳定,遇到表格或多图交叉引用时幻觉尤其严重。直接扔给网页版 GPT 测试,结果很不理想。
预处理:MinerU 转换 Markdown
第一步用 MinerU 将三十卷期刊批量转换为标准 Markdown 格式。MinerU 能够正确处理双栏布局,将阅读顺序还原为线性文本,同时保留表格结构,这直接消除了识别质量问题,也让后续所有 AI 处理都面对干净的纯文本。
整体流程
MinerU 转换
└─ 第一轮:逐卷建立索引表(每篇文章的主题、关键词、相关度)
└─ 第二轮:按研究方向归类,筛出相关文章
└─ Codex (1M 上下文) 分方向文件夹逐一总结归纳
第一轮以文章为最小单位,提取题目、摘要、研究方向,生成一张结构化索引表,同时过滤掉与目标主题无关的文章。
第二轮根据索引表,按需要调研的几个子方向分别归类,每个方向单独建一个文件夹,只放相关文章的 Markdown 文件。
最终总结在各方向文件夹内调用 Codex(支持 1M token 上下文),对该方向所有文献做横向梳理,输出发展脉络。
方案一:Claude Hooks(Unix / macOS)
Claude Code 的 SubagentStart / SubagentStop hooks 天然适合这个场景:每个 subagent 开始和结束时各触发一个脚本,所有进度集中写在 progress.json 里,这样多个 subagent 并行运行时也不会乱序。
settings.json 配置
{
"hooks": {
"SubagentStart": [
{
"hooks": [
{
"type": "command",
"command": "node \"D:/agent_workspace/Z/器材/文献综述/scripts/track-start.mjs\"",
"timeout": 10
}
]
}
],
"SubagentStop": [
{
"hooks": [
{
"type": "command",
"command": "node \"D:/agent_workspace/Z/器材/文献综述/scripts/track-stop.mjs\"",
"timeout": 10
}
]
}
]
}
}
有几个坑值得提前说明:SubagentStart / SubagentStop 不支持 matcher 字段,不能按任务类型过滤;SubagentStart 也不支持 additionalContext,需要上下文的内容必须在调用方的 prompt 里直接传入。
track-start.mjs 在 subagent 启动时从 stdin 读取事件 JSON,检查 progress.json 是否还有未处理的任务,若有则向 progress.md 追加一条开始记录(当前卷号、文件路径、时间戳)。如果流水线已全部完成则静默退出,任何异常也以 exit 0 结束,不阻断主流程。
track-stop.mjs 在 subagent 结束时做两件事:一是从 event.last_assistant_message 里提取 Markdown 表格行(以 | 开头的行),追加到全局 index.md;二是将 progress.current 加一并回写 progress.json,推进流水线。此外有两道守卫:如果流水线已完成则跳过,如果输出里不含 | 说明没有产出合格的索引表格,同样跳过,避免污染汇总文件。
进度文件结构如下:
{
"current": 3,
"files": ["vol_1990", "vol_1991", "vol_1992", "..."],
"completed": ["vol_1990", "vol_1991", "vol_1992"]
}
方案二:Runner 脚本(Windows 兼容)
codex是个更好的选择,便宜、量大。但是Windows 上 codex 目前原生不支持 hooks,但逻辑完全可以用一个普通的 Node.js runner 脚本来替代,而且控制粒度更高。
核心思路是将 hooks 的"触发-执行-推进"三个动作合并进一个串行循环,由 run-batch.mjs 直接调起 codex exec,同步等待返回后再读取输出、落盘、推进进度,最后进入下一轮。
node run-batch.mjs
└─ 读取 progress.json,取当前任务
└─ 调用 codex exec(spawnSync,同步等待)
└─ 从输出文件读取 last-assistant-message
└─ 落盘到 index.md,推进 progress.json
└─ 循环,直到所有任务完成
run-batch.mjs 支持几个实用的命令行选项:
--once 只处理当前这一条,不循环
--dry-run 打印即将执行的命令,不实际运行
--status 查看当前进度和活跃任务状态
--model MODEL 覆盖本次运行使用的 Codex 模型
--reasoning EFFORT 覆盖推理强度
脚本会在每次运行前检查 active-run.json 是否存在,防止并发写入 progress.json 导致进度混乱。如果上一次运行异常中断留下了锁文件,手动删除 .codex/runtime/active-run.json 即可恢复。
Runner 方案和 hooks 方案在功能上等价,区别在于 runner 是同步串行的(一篇处理完才进下一篇,倒是也可以并行,但是很容易进程堵塞),而 hooks 方案配合 Claude 的并行 subagent 可以同时处理多卷。如果机器性能或 API 并发有限制,runner 反而更安全可控。
网友解答:--【壹】--:
每天到 L 站都能学到崭新的技巧真不错
--【贰】--:
发了30卷期刊,不知道哪里下的完整的一卷一卷的那种
--【叁】--:
MinerU 确实好用,FastGpt做知识库,搭问答工作流的时候处理pdf用过,数学公式也可以识别,只要不是很复杂的化学方程式就好。
--【肆】--:
感谢大佬分享经验!收藏一下,估计不久会用到。
--【伍】--:
学到了用MinerU。
上次转换了200份pdf,一份50页。使用grok-4.1-fast做文字和图片识别,用时1小时。
--【陆】--:
学习了,请问文字识别的效果如何,包括公式这些
--【柒】--:
ai直接转幻觉还是挺强的,而且也浪费token,我觉得还是能用脚本就用脚本
--【捌】--:
mineru还是很强的,基本没有任何问题。如果公式复杂的话走gpu的predict
--【玖】--:
arxiv文章可以直接下载源码其实,用起来更舒服。
--【拾】--:
继续index、继续hooks分批,就这个思路不断嵌套
--【拾壹】--:
补充一下,方案一我claude用的是codex-plugin-cc,单纯claude subagent那纯烧钱去了。。。
这个plugin我看了下似乎也是skill约束的bash脚本,调用的是codex exec,把\codex:rescue放到claude code的subagent里面就行了。
--【拾贰】--:
大佬这个分享非常棒,很有启发意义,感谢大佬的分享
--【拾叁】--:
最近做了一个状态控制为单元的工作流编排,我有空把这个弄成范例
--【拾肆】--:
同一文件夹下的同一方向的文献仍然远超Codex1M上下文呢?比如有100M,有什么好的建议么
--【拾伍】--:
我之前也试过这个 workflow,但是 mineru 解析复杂图片效果实在不太行(会把一幅图拆开)。对于比较新的 arxiv 文章可以用 arxiv2md 直接出 markdown,效果会好很多
--【拾陆】--:
markdown文件里面的图片连接,渲染过后能看到。
我坐文章的分类时,一篇文章一个文件夹。文件夹内是文章的md,以及images文件夹,里面是图片
--【拾柒】--:
我觉得还行吧,我这里也有复杂图片。ai能读懂就行了
要是arxiv确实简单很多了,现在arxiv基本都支持html
--【拾捌】--:
感谢分享小白想问一下PDF里面的图片他们会转变转换成什么
--【拾玖】--:
老板是扔过来pdf了么?我自己调研爱斯维尔的ai只看得到摘要和标题 还得我通过校园网下载喂给她详细内容

