记一次使用agent在一小时内完整调研上百篇文献的工作流

2026-04-11 10:391阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

用 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只看得到摘要和标题 还得我通过校园网下载喂给她详细内容

标签:人工智能