mcpField
P
paper-corpus-rag

paper-corpus-rag

github.com/kalarislabs数据与数据库7357 次安装3 天前更新
代码仓库

关于 paper-corpus-rag

paper-corpus-rag 是用于索引研究者自有论文文件,并以段落级引文回答问题的技能。它从 BM25 检索入手,也介绍了适用于概念查询和较大语料的语义或混合检索。

主要功能

  1. 01索引转换为 Markdown 的论文
  2. 02基于 BM25 搜索并引用文本块
  3. 03语义与混合检索指南
  4. 04论文元数据与按章节切分
  5. 05基于来源引文生成回答

适用场景

  1. 01在本地论文集中查找段落
  2. 02根据已索引论文回答研究问题
  3. 03通过引文比较相互矛盾的发现
  4. 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 层:一分钟内完成可引用的全文搜索(无依赖项)

  1. 先将 PDF 转换为 Markdown(能感知版面的转换器优于原始 PDF 文本):使用 markitdown 或 liteparse 技能,或通过 pip install pypdf 使用内置备用方案。
  2. 建立索引并查询:
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 查找,而不是猜测。

作答规范(基于依据)

  1. 检索 8-20 个分块。如果有交叉编码器可用,则进行重排序。
  2. 仅根据检索到的文本作答。每个事实性句子都要标注 [file#chunk] (或在与书目对应后使用作者-年份)。
  3. 如果语料中没有答案,请如实说明。不要凭记忆填补空缺。
  4. 如果论文观点不一致,请分别列出并附上引文,不要默默选取其中一种。
  5. 对于定量论断,要原样引用数字及其上下文(数据集、指标、划分)。

诚信规则

  • 绝不要编造引文标识或引述内容。每个引用的 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。

评论

支持 Markdown