# 用 Claude Code 做一次文献综述

一次真实的演示：在 Claude Code 里多角度检索顶会 Paper，顺着引用往前往后追，读全文，列对比表，最后逐句对照原文核查。

发布于 2026-10-01

在 Claude Code 里让它列一下某个方向的相关工作，几秒钟就能拿到一份整整齐齐的参考文献。其中有些是真的。模型写参考文献和写别的东西一样，靠的是记忆，所以标题可能没错，会议却张冠李戴，年份差一年，结论还是从另一篇 Paper 搬来的。这种情况有多常见、为什么会发生，我们在[另一篇文章](https://luneresearch.com/zh-Hans/blog/ai-hallucinated-citations)里专门写过。

换个更好的提示词解决不了这个问题。要解决，得给智能体一座文献库和一套方法，再逼它把依据摆出来。下面是一次完整的真实综述，主题是提示词注入（prompt injection）的防御，工具是接上 Lune 的 Claude Code。文中所有表格、数字和引文，都出自同一次会话。

## 把 Claude Code 接上文献库

Lune 以 Claude Code 插件的形式发布，里面打包了 MCP 服务器和三个科研 Skills。在 Claude Code 里运行：

```
/plugin marketplace add RetrogradeLabs/lune
/plugin install lune@retrograde-labs-lune
/mcp
```

在 `/mcp` 列表里选 `plugin:lune:lune`，然后在弹出的浏览器页面登录，不用复制粘贴任何密钥。习惯用终端的话，先 `npm install -g @retrograde-labs/lune-cli`，再 `lune login` 和 `lune install --client claude-code`，接入的是同一套工具，只是没有本文最后用到的插件 Skills。

接好之后，Claude 多了十二个科研工具。这次综述用到其中五个：`search_papers_many`、`get_paper_citations`、`search_papers`、`extract_from_papers` 和 `verify_claims`。你不用记这些名字，直接用中文或英文提问，插件里的文献综述 Skill 会替你挑工具。

## 先撒网，再精搜

一条检索词只能捞到一簇 Paper。相邻子领域的作者常用不同的说法描述同一件事，所以同一个问题要从几个角度去问。下面是这次综述实际用的四个角度，一字未改：

```
1. defenses that make LLM-integrated applications robust to prompt injection
   attacks hidden in retrieved data or tool outputs
2. structured queries or fine-tuning that separate trusted instructions from
   untrusted data to stop prompt injection
3. benchmarks and formal frameworks for evaluating prompt injection attacks
   and defenses
4. prompt injection attacks against autonomous LLM agents that use tools and
   browse the web
```

四个角度合成一次 `search_papers_many` 调用，返回 15 篇 Paper，来自 USENIX Security、IEEE S&P、CCS、NDSS、ICLR、ACL 和 EMNLP，发表于 2024 到 2026 年。每条结果都标明是哪几个角度找到的。[Formalizing and Benchmarking Prompt Injection Attacks and Defenses](https://luneresearch.com/zh-Hans/papers/c9787b94-61a0-4e72-9dc7-ace327ebac77)（USENIX Security 2024）在其中两个角度里排第一，正好做这次综述的锚点。真正值得细看的，是只有一个角度找到的那几篇：它们正好说明其他检索词漏掉了什么。

## 顺着引用，往前追，也往后追

检索找到的是用了你那套说法的 Paper，引用关系找到的是互相继承的 Paper，不管它们用什么说法。软件工程领域管这叫滚雪球（snowballing），做系统综述时常引用 [Wohlin 的指南](https://doi.org/10.1145/2601248.2601268)（EASE 2014）：向后查一篇 Paper 的参考文献，向前查引用了它的后续工作。

从 [StruQ](https://luneresearch.com/zh-Hans/papers/549eb273-9f08-43b7-afc7-bba2111b870b)（USENIX Security 2025）往前追，`get_paper_citations` 列出了库里 46 篇引用它的 Paper。其中有 LLM 应用的安全架构 [ACE](https://luneresearch.com/zh-Hans/papers/961d2212-4de1-477c-8576-6a3ce730d4f4)（NDSS 2026），还有检验指令层级到底靠不靠得住的 [Control Illusion](https://luneresearch.com/zh-Hans/papers/434464ef-d75b-4878-b6a7-29d475ae1d1a)（AAAI 2026）。这两篇在撒网阶段都没出现。前后各追一跳引用，是最便宜的保险，免得你在论文里写下「目前还没有工作研究过这个问题」，而别人去年就解决了。

## 重要的 Paper 要读全文

摘要是写来推销的，数字、基线和局限都在正文里。StruQ 的摘要只说系统「significantly improves resistance to prompt injection attacks, with little or no impact on utility」。具体数字在实验部分，而且实验部分紧接着承认，防御后的模型对最强的攻击「is not completely immune」。这句话应该写进你的相关工作，而摘要里一个字都没提。

这次综述里，读全文的是 `extract_from_papers` 和 `verify_claims`。想自己读某篇时，`get_paper_fulltext` 可以只取指定章节，Claude 能只读一篇 Paper 的实验或局限部分，不用整篇拉下来。全文只留给那几篇你要引用或对比的 Paper。每读一次都算一次请求，读了又不引，额度和时间都白花了。

## 把几篇 Paper 摆在一张表里

看清一片文献的全貌，最快的办法是一张表：每篇 Paper 同样几列。`extract_from_papers` 会逐篇读全文，按你定义的列填表。我要了四样：防御怎么做、要不要训练模型、原文报告的核心结果、作者自己承认的局限。压缩后是这样：

| 防御                                                                                | 做法                                                         | 训练模型 | 原文报告的核心结果                                     |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------ | -------- | ------------------------------------------------------ |
| [StruQ](https://luneresearch.com/zh-Hans/papers/549eb273-9f08-43b7-afc7-bba2111b870b)，USENIX Security 2025 | 用保留分隔符把提示词和数据分开，再微调模型只听提示词里的指令 | 是       | Llama 上 TAP 成功率从 97% 降到 9%，GCG 从 97% 降到 58% |
| [SecAlign](https://luneresearch.com/zh-Hans/papers/1eb8f454-16fc-470b-9b13-3f0e4f58be3c)，CCS 2025          | 用偏好优化让模型倾向正常回答，而不是恶意指令诱导的回答       | 是       | 优化类攻击的成功率不到 StruQ 的四分之一                |
| [DataSentinel](https://luneresearch.com/zh-Hans/papers/c42c511e-b7be-4d96-b9af-1ec253382938)，IEEE S&P 2025 | 通过与自适应攻击者的博弈微调检测器，识别夹带恶意指令的输入   | 是       | 误报接近零，对多种攻击的漏报也接近零                   |
| [DRIP](https://luneresearch.com/zh-Hans/papers/830316da-3fe9-4d80-a4f9-954316ac57f1)，CCS 2026              | 编辑数据 token 的表示，把它推离指令空间                      | 是       | 攻击成功率比现有防御低 66%                             |
| [Referencing](https://luneresearch.com/zh-Hans/papers/3129dcb0-838c-4737-b410-42e7b166af14)，ACL 2026       | 让模型标出自己在执行哪条指令，丢掉标错的回答                 | 否       | 部分场景下攻击成功率为 0%                              |

五篇 Paper，五次请求，几分钟就有了一张原本要花一下午的表。但它只是笔记，不是定论。这次综述的最后一步之所以存在，就是因为这种表可能错得像对的一样。

## 按方法写，别一篇一篇地写

逐篇介绍的相关工作读起来像带注释的参考文献列表。Google DeepMind 的 Sebastian Farquhar 在 [How to Write ML Papers](https://sebastianfarquhar.com/on-research/2024/11/04/how_to_write_ml_papers/) 里说得很直接：「Good prior work sections are methodological.」他也说，逐篇罗列的写法当初稿可以，但之后要改成按方法组织。

有了这张表，按方法组织一眼就能看出来。五个防御里四个要训练模型，Referencing 不用训练，靠指令标记和输出过滤；四个阻止注入的指令生效，一个在输入到达模型之前就把它识别出来。这两条分界线就是你段落的骨架，而且每个论断都已经挂着一篇 Paper。Farquhar 这类建议收录在 Lune 的最佳实践库里，Claude 通过 `search_research_guidance` 就能查到，边写边用。

## 每句话留下之前，先核查

接着我故意犯了几个真实草稿里常见的错误：一个「记错」的数字，外加一个听起来很合理的概括。`verify_claims` 核查了四句话：

- **StruQ 把 Llama 上 TAP 的成功率从 97% 降到 9%。** 成立，引文是「Our Llama model has significantly increased robustness against TAP (97% → 9% ASR) and GCG (97% → 58%), but is not completely immune to such attacks.」
- **StruQ 把 Llama 上 GCG 的成功率降到 10% 以下。** 不成立。同一份实验报告的是从 97% 降到 58%。
- **SecAlign 把优化类攻击的成功率降到 StruQ 的四分之一以下。** 成立。
- **微调类防御对训练时没见过的攻击同样有效。** 不成立，[一篇 CCS 2024 的 Paper](https://luneresearch.com/zh-Hans/papers/d029a7fd-c200-43b5-af89-e205530e9986) 原文写道，基于微调的防御「either have limited effectiveness for prompt injection attacks that are not considered during finetuning or sacrifice generality of the LLM」。

再对表格里的三行做第二轮核查，查出来的东西比错别字有用得多。DataSentinel 漏报接近零，是在它自己测试过的攻击上成立。[ObliInjection](https://luneresearch.com/zh-Hans/papers/e180c011-6c8f-4fa4-bfb7-f77501530277)（NDSS 2026）拿 DataSentinel 和一个困惑度过滤器去对付一种新攻击，两者的漏报率都很高，用作者的话说，它们「fail to reliably detect contaminated segments crafted by ObliInjection」。两个结论都是真的。综述只写前一个，就是在歪曲这个领域，Farquhar 说这种做法「poisons the field, annoys your colleagues, and makes reviewers angry」。

判定附有引文时，服务器已经确认这段引文确实出现在检索到的原文中，你可以直接贴进笔记，不用再翻 PDF。

## 把整套流程变成一句话

步骤熟了以后，就不必每次都写清楚。插件里的文献综述 Skill 已经按同样的顺序编排好（撒网、筛选、精读、查漏），像下面这样一句话就能跑完整个综述：

```
综述 2024 年以来针对 LLM 智能体的提示词注入防御。
多角度检索，引用前后各追一跳，按机制、训练成本和核心结果列表，
然后按方法写两段相关工作，给我看之前逐句核查。
```

想直接调用这个 Skill，输入 `/lune:lune-literature-review` 再加上主题即可。

## 花多少额度，边界在哪

这次综述一共用了 18 次请求：撒网 4 次，追引用 1 次，查 StruQ 摘要 1 次，列表 5 次，核查 7 次。超过免费版每天 10 次的额度，只占 Pro 每天 300 次的一小部分。

这座文献库收什么，是有意取舍过的。截至 2026 年 9 月，它收录 23 个 CORE 与 CCF 排名的计算机顶会，多数 Paper 有全文，多数会议回溯到 2020 年。研讨会论文、期刊文章和刚挂上 arXiv 的预印本都不在里面，遇到这些，智能体应该直说，再去网上搜，而不是现编。这条边界恰恰是重点：Lune 返回的每篇 Paper 都打得开，所以草稿里那条追溯不到任何返回记录的参考文献，就是该删的。
