关于 paper-corpus-rag
paper-corpus-rag 是用于索引研究者自有论文文件,并以段落级引文回答问题的技能。它从 BM25 检索入手,也介绍了适用于概念查询和较大语料的语义或混合检索。
主要功能
- 01索引转换为 Markdown 的论文
- 02基于 BM25 搜索并引用文本块
- 03语义与混合检索指南
- 04论文元数据与按章节切分
- 05基于来源引文生成回答
适用场景
- 01在本地论文集中查找段落
- 02根据已索引论文回答研究问题
- 03通过引文比较相互矛盾的发现
- 04使用预期段落评估检索效果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill paper-corpus-rag安装后在 Claude Code 中输入/paper-corpus-rag确认已加载。
附带文件scripts/paper_index.py
详细介绍
对研究论文语料进行 RAG
目标是提供研究人员可核查的答案:每项论断都能追溯到某篇特定论文中的具体段落。检索质量和引文规范比选择哪种向量数据库更重要。
在构建本地论文集之前,要发现新的候选论文,可使用 firecrawl-research-index 搜索托管论文并阅读段落。只保存你有权合法获取的论文,并记录其 DOI 或来源 ID。此技能会为用户自己的文件建立索引;Firecrawl 的托管索引不是本地语料下载。
第 0 层:一分钟内完成可引用的全文搜索(无依赖项)
- 先将 PDF 转换为 Markdown(能感知版面的转换器优于原始 PDF 文本):使用
markitdown或liteparse技能,或通过pip install pypdf使用内置备用方案。 - 建立索引并查询:
python scripts/paper_index.py index papers_md/ --db corpus.sqlite # incremental: re-run after adding papers
python scripts/paper_index.py query "effect of batch size on calibration" --db corpus.sqlite -k 8
python scripts/paper_index.py query '"label smoothing" calibration' --db corpus.sqlite --json --full
每条命中结果都包含 file#chunk、章节标题和 BM25 分数。要精确匹配,请用引号括起词组。
BM25 非常适合包含大量精确术语(基因名称、方法名称、数据集)的科学文本,
因此请先从这里开始,再添加嵌入。
第 1 层:语义检索与混合检索
当查询是概念性的(例如“避免使用标注数据的方法”)时,添加稠密嵌入。
采用混合评分:使用 Reciprocal Rank Fusion(RRF)融合 BM25 和向量排序,
score = Σ 1/(60 + rank)。这种方法稳健且无需调优。
嵌入模型选择:从 sentence-transformers 中选择科学领域模型或性能强劲的通用模型(参见该技能)。对分块进行嵌入,而非整篇论文。将模型名称和维度与索引一同保存,因为更换模型意味着需要重新生成嵌入。
pgvector(Postgres)。 如果你已在运行 Postgres,或需要 SQL 筛选(年份、会议、作者),这是最佳选择:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE chunks (id bigserial PRIMARY KEY, paper_id text, chunk int, section text,
body text, tsv tsvector GENERATED ALWAYS AS (to_tsvector('english', body)) STORED,
embedding vector(768));
CREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops);
CREATE INDEX ON chunks USING gin (tsv);
-- hybrid: fetch top-k from each, fuse with RRF in the application
SELECT id FROM chunks ORDER BY embedding <=> $1 LIMIT 50;
SELECT id FROM chunks WHERE tsv @@ websearch_to_tsquery('english', $2)
ORDER BY ts_rank(tsv, websearch_to_tsquery('english', $2)) DESC LIMIT 50;
Chroma / Qdrant / FAISS。 用于本地优先的原型开发(Chroma)、生产环境中的筛选和负载数据(Qdrant),或大规模内存计算(FAISS)。API 参见 chroma、qdrant-vector-search
和 faiss 技能。将 paper_id、chunk、section、year 作为元数据保存在每个向量上。
论文分块规则
- 每块 800-1500 个字符,重叠率为 10-20%。在段落边界处分割,绝不要在句子中间分割。
- 每块都保留章节标题(例如“Methods > Training details”),以便消除歧义。
- 将图注和表格标题作为独立分块建立索引。从主索引中剔除参考文献列表 (它们会干扰 BM25),但将其保存在单独的表中,以供查询引文。
- 为每篇论文保存书目信息(DOI、标题、作者、年份),根据 DOI 查找,而不是猜测。
作答规范(基于依据)
- 检索 8-20 个分块。如果有交叉编码器可用,则进行重排序。
- 仅根据检索到的文本作答。每个事实性句子都要标注
[file#chunk](或在与书目对应后使用作者-年份)。 - 如果语料中没有答案,请如实说明。不要凭记忆填补空缺。
- 如果论文观点不一致,请分别列出并附上引文,不要默默选取其中一种。
- 对于定量论断,要原样引用数字及其上下文(数据集、指标、划分)。
诚信规则
- 绝不要编造引文标识或引述内容。每个引用的
file#chunk都必须存在于索引输出中。 - 报告数字前,先对照原文段落核实。
评估
在信任某条处理流水线之前,请根据语料编写 20-50 组“问题→预期段落”,并测量检索的 recall@k。论文问答中大多数所谓的“幻觉”其实是检索遗漏。更改分块方式、嵌入模型或语料后,请重新检查。
相关技能
research-knowledge-graph(同一语料的引文/概念图谱)、
markitdown、liteparse、sentence-transformers、chroma、qdrant-vector-search、
faiss、open-notebook、literature-review、firecrawl-research-index。