- name
- paper-search
- description
- 当需要真正执行文献数据库 API 检索时加载:构建检索式(布尔组合、字段限定)、 调用 OpenAlex / Crossref / arXiv 接口、遵守请求礼仪(限速、UA、指数退避)、 把返回解析为统一 PaperDocument。通常由 literature-search 调用,不直接面向用户。 同义场景:检索执行、API 查询、文献接口调用、query 构建、检索脚本运行、 接口限速与重试、检索结果解析。
- user-invocable
- false
- metadata
- {"domains":["literature"],"last_reviewed":"2026-08-18"}
# paper-search:检索执行规程
## 目的
为上层技能(literature-search 等)提供可执行的检索规程:如何构建 query、
如何调用 `scripts/search_papers.py`、如何遵守各数据源的请求礼仪、
如何解读与排序结果、如何处理失败。
脚本约定(`scripts/search_papers.py`,纯 Python 标准库实现,无第三方依赖):
- 参数:`--query`(必填)、`--provider {openalex,crossref,arxiv}`(必填)、
`--limit N`(默认 10,上限 50,超出自动截断)、`--format json`。
- 成功:stdout 输出 PaperDocument JSON 数组,退出码 0。
- 失败:stdout 输出 `{"error": {"provider", "type", "message"}}`,
type ∈ `network | rate_limited | parse`,退出码 1;永不抛栈崩溃。
- 内置礼仪:请求间隔 ≥0.5s、单请求超时 30s、UA 携带联系邮箱占位。
## 前置检查
1. `scripts/search_papers.py` 存在;`python --version` 可用(3.8+)。
2. 网络可用;目标 provider 可达。
3. 已按上层路由确定 provider 与 query。
## 操作规程
### 1. query 构建
- 关键词以英文为主(三个 provider 对英文支持最好);专业术语保留原文。
- 布尔与字段限定(按 provider 方言):
- OpenAlex:`search` 参数支持 AND / OR 与引号短语,如
`"large language model" AND agent`;复杂字段过滤(年份、类型)由上层
在结果上后置处理,当前脚本只暴露 search。
- Crossref:`query` 为自由文本,偏题录精确匹配;查单篇文献时直接把标题
或 DOI 作为 query 效果最佳。
- arXiv:`search_query` 自动加 `all:` 前缀;需要字段限定时可在 query 中
直接使用 `ti:`(标题)、`abs:`(摘要)、`au:`(作者),组合用 `+AND+` / `+OR+`。
- 单次 query 控制在 2-6 个核心词;过长的 query 会显著降低命中率。
### 2. 执行
```bash
python scripts/search_papers.py --query "large language model agents" \
--provider openalex --limit 20 --format json
```
- 多个 provider 时逐次串行调用,不要并发轰炸同一数据源。
- 结果较大时重定向到临时文件再解析,避免终端输出截断。
### 3. 请求礼仪(politeness)
- 频率 ≤2 req/s;脚本已内置 ≥0.5s 请求间隔,上层批量调用时仍应串行执行。
- UA 中的联系邮箱是占位 `you@example.com`:正式使用前提醒用户替换为真实
邮箱(OpenAlex polite pool 与 Crossref 均以此为诚信标识,提供更稳定服务)。
- 收到 `rate_limited` 时按指数退避重试:2s → 4s → 8s,最多 3 次;
仍失败则把结构化 error 原样交还上层,不无限重试。
### 4. 结果解读与排序建议
- 各源默认相关性排序;解读时注意:
- OpenAlex 结果元数据丰富,适合按「相关性 + 被引 + 年份」二次排序;
- Crossref 偏题录精确匹配,前排结果通常就是目标文献;
- arXiv 偏最新成果,注意区分预印本与正式发表版(条目含 journal_ref 时
优先引用正式版)。
- 建议上层保留原始顺序,另存「建议阅读顺序」,不要在 papers.json 里原地重排。
### 5. 失败处理
- 逐字保留脚本输出的 error JSON,原样写入上层 manifest;
- `parse` 类错误记录响应片段(≤200 字符)便于排查;
- 任何失败都不改写成「0 条结果」。
### 6. provider 查询方言速查
| provider | 端点 | query 要点 |
| --- | --- | --- |
| openalex | `https://api.openalex.org/works?search=...&per-page=` | 支持 AND / OR、引号短语;带 mailto 进 polite pool |
| crossref | `https://api.crossref.org/works?query=...&rows=` | 自由文本题录匹配;查单篇直接给标题或 DOI |
| arxiv | `http://export.arxiv.org/api/query?search_query=all:...` | 字段前缀 ti: / abs: / au:;组合用 +AND+ / +OR+ |
`--limit` 与各源单页上限:脚本上限 50,三源单页均可满足;需要更多结果时
由上层分批翻页(当前脚本不暴露 start / cursor 参数)。
### 7. 常见失败与对策
| error.type | 典型原因 | 对策 |
| --- | --- | --- |
| network | 断网、DNS 失败、TLS 错误、超时 | 检查网络后重试;连续失败则终止并留痕 |
| rate_limited | 触发源站限流(HTTP 429 / 503) | 指数退避 2s→4s→8s,最多 3 次 |
| parse | 响应结构变化、空响应、XML 非法 | 记录响应片段,改小 limit 重试;仍失败则留痕 |
| 超时 | 源站响应慢或链路抖动 | 30s 超时归入 network,稍后重试 |
任何重试都不更换 query 内容;换 query 属于上层 literature-search 的决策。
脚本单请求超时固定 30s,超时归入 `network` 类错误;不要为「快一点」
而调小间隔或并发请求——被封 IP 的代价远大于多等几秒。
## 输出模板
### PaperDocument(stdout,成功时)
```json
[
{
"id": "https://doi.org/10.xxxx/yyyy",
"title": "...",
"authors": ["..."],
"year": 2024,
"venue": "...",
"doi": "10.xxxx/yyyy",
"url": "https://doi.org/10.xxxx/yyyy",
"abstract": "...",
"source": "crossref",
"retrieved_at": "2026-08-18T00:00:00+00:00"
}
]
```
### 错误对象(stdout,失败时,退出码 1)
```json
{"error": {"provider": "crossref", "type": "rate_limited", "message": "HTTP 429 ..."}}
```
## 本技能不做什么
- 不做多源合并与去重(交给 literature-search)。
- 不评价文献质量、不做证据提取(交给 literature-survey)。
- 不抓取付费墙全文;只取 API 公开的元数据与摘要。
- 不支持 openalex / crossref / arxiv 之外的源(扩展需先修改脚本)。
- 不缓存历史检索结果充当新结果。
## 收尾与下一步
1. 把 PaperDocument 数组或 error JSON 原样交还调用方。
2. 提示命中数与建议的二次排序方式。
3. 若连续 `rate_limited`,建议上层降低频率、稍后再试,或更换 provider。
4. 结果为空数组时区分「源站确实无命中」与「检索被静默截断」,
后者按失败处理并留痕。
عرض على GitHub