Files

1 line
15 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "agents365-ai/zotero-rag-cli", "files": {"README.md": {"0ce989bbbef94dcc96e55b3057460f0494338665": {"t": 1785674237.569848, "n": 10844, "h": "0f471fc371ea5f99", "c": "# rak — Zotero 文献库 RAG 语义检索\n\n[English](README_EN.md)\n\n`rak` 是基于 RAG 的 Zotero 语义检索工具。通过本地嵌入模型将论文向量化,支持语义搜索和混合检索,返回最相关的论文及匹配片段。\n\n## 核心理念\n\n**rak 只做一件事:语义检索。** 找到最相关的论文和匹配的文本片段,交给调用方(Claude Code / LM Studio / 人)决定下一步。\n\n```mermaid\ngraph LR\n A[用户查询] --> B[rak 语义检索]\n B --> C[论文元数据 + 匹配片段]\n C --> D1[Claude Code<br/>直接分析总结]\n C --> D2[LM Studio<br/>MCP 工具调用]\n C --> D3[终端用户<br/>ask / chat 问答]\n```\n\n## 三种检索模式\n\nrak 提供三种检索模式,适用于不同场景:\n\n```mermaid\ngraph LR\n Q[用户查询] --> E[Embedder 嵌入]\n E --> VS[向量搜索<br/>理解语义]\n VS --> R1[结果]\n```\n\n> **向量搜索**(默认):将查询转化为向量,在 ChromaDB 中找语义最相似的论文。能理解同义词和跨语言表达,如 \"细胞命运决定\" 匹配 \"cell fate determination\"。\n\n```mermaid\ngraph LR\n Q[用户查询] --> BM[BM25 搜索<br/>关键词匹配]\n BM --> R2[结果]\n```\n\n> **BM25 关键词搜索**:在索引的全文内容(标题 + 摘要 + PDF 全文)中做关键词匹配和排序。根据词频和文档长度计算相关性 — 确保包含精确关键词(如 \"CRISPR-Cas9\")的论文不被遗漏。\n\n```mermaid\ngraph LR\n Q[用户查询] --> VS[向量搜索]\n Q --> BM[BM25 搜索]\n VS --> RRF[RRF 融合排序]\n BM --> RRF\n RRF --> R3[最终结果]\n```\n\n> **混合搜索**(`--hybrid`):向量 + BM25 两路检索,通过 RRF(Reciprocal Rank Fusion)融合排序。兼顾语义理解和精确关键词,效果最好。\n\n| 模式 | 命令 | 优势 | 适用场景 |\n|------|------|------|----------|\n| **向量搜索** | `rak search \"query\"` | 理解语义和同义词 | 探索性查询 |\n| **BM25 搜索** | 混合搜索的内部组件 | 精确关键词,搜 PDF 全文 | — |\n| **混合搜索** | `rak search \"query\" --hybrid` | 语义 + 关键词,最准 | 推荐默认使用 |\n\n## 三种使用方式\n\n```mermaid\ngraph LR\n S1[rak search] --> S2[返回论文标题 + 匹配片段] --> S3[Claude Code / 脚本解析]\n```\n\n```mermaid\ngraph LR\n A1[rak ask] --> A2[检索论文] --> A3[LLM 生成回答]\n```\n\n```mermaid\ngraph LR\n C1[rak chat] --> C2[检索论文] --> C3[多轮对话 + 上下文记忆]\n```\n\n| 模式 | 命令 | 给谁用 | 需要 LLM? |\n|------|------|--------|:---:|\n| **搜索** | `rak search` | AI 助手 / 脚本 | 不需要 |\n| **问答** | `rak ask` | 人(终端快速提问) | 需要 |\n| **对话** | `rak chat` | 人(深入讨论) | 需要 |\n\n## 安装\n\n```bash\n# 推荐\nuv tool install zotero-rag-cli\n\n# 或者\npip install zotero-rag-cli\n\n# 如需 MCP Server(LM Studio / Cursor)\npip install zotero-rag-cli[mcp]\n```\n\n前置依赖:[`zot`](https://github.com/Agents365-ai/zotero-cli-cc)(Zotero CLI,用于获取文献数据)。\n\n## 快速开始\n\n```bash\n# 1. 索引(增量,自动提取 PDF 全文并分块)\nrak index\n\n# 2. 语义搜索\nrak search \"cell fate determination\"\n\n# 3. 混合搜索(语义 + BM25 关键词)\nrak search \"spatial transcriptomics\" --hybrid\n\n# 4. 终端问答(需要 LLM)\nrak ask \"单细胞聚类的主要方法有哪些?\"\n\n# 5. 查找相似论文(支持 key 或标题模糊匹配)\nrak similar ABC12345\nrak similar \"attention is all you need\"\n\n# 6. 多轮对话(需要 LLM)\nrak chat\n```\n\n## 数据流\n\n```mermaid\ngraph TD\n Z[zot CLI] -->|\"zot --json list\"| I[rak index]\n P[PDF 全文] --> I\n I -->|嵌入 + 分块| V[(ChromaDB<br/>向量存储)]\n I -->|全文| F[(SQLite FTS5<br/>关键词索引)]\n\n Q[用户查询] --> E[Embedder]\n E --> VS[向量搜索]\n Q --> BS[BM25 搜索]\n V --> VS\n F --> BS\n VS --> RRF[RRF 融合排序]\n BS -->|\"--hybrid\"| RRF\n RRF --> R[检索结果<br/>元数据 + 匹配片段]\n\n R --> OUT1[CLI 输出 / JSON]\n R --> OUT2[LLM 问答<br/>ask / chat]\n R --> OUT3[MCP Server<br/>LM Studio 等]\n```\n\n## 命令详解\n\n### 索引\n\n```bash\nrak index # 增量索引(仅新增/变更)\nrak index --full # 全量重建\nrak index --limit 500 # 限制项目数\n```\n\n自动从 `~/Zotero/storage/` 提取 PDF 和 Markdown 附件全文,长文档分割为重叠片段(512 词,64 词重叠)。\n\n### 嵌入模型\n\n默认使用 `all-MiniLM-L6-v2`,支持所有 [sentence-transformers](https://huggingface.co/models?library=sentence-transformers) 模型。切换模型后需重建索引:\n\n```bash\nrak config model_name BAAI/bge-m3\nrak clear --yes && rak index\n```\n\n常用模型推荐:\n\n| 模型 | 维度 | 大小 | 适用场景 |\n|------|------|------|----------|\n| `all-MiniLM-L6-v2` (默认) | 384 | 80MB | 英文论文,速度快 |\n| `all-mpnet-base-v2` | 768 | 420MB | 英文最佳质量 |\n| `BAAI/bge-small-en-v1.5` | 384 | 130MB | 英文,性价比高 |\n| `BAAI/bge-small-zh-v1.5` | 512 | 95MB | 中文论文优化 |\n| `BAAI/bge-m3` | 1024 | 2.2GB | 多语言,最强但较慢 |\n| `intfloat/multilingual-e5-small` | 384 | 470MB | 多语言轻量 |\n| `jinaai/jina-embeddings-v3` | 1024 | 2.3GB | 多语言,长文本支持(8192 tokens) |\n\n### API 嵌入模型\n\n也支持通过 API 使用远程嵌入模型(兼容 OpenAI `/v1/embeddings` 格式):\n\n```bash\n# OpenAI\nrak config embedding_provider api\nrak config embedding_base_url https://api.openai.com/v1\nrak config embedding_api_key sk-your-key\nrak config model_name text-embedding-3-small\nrak clear --yes && rak index\n\n# 通义千问 (Qwen)\nrak config embedding_provider api\nrak config embedding_base_url https://dashscope.aliyuncs.com/compatible-mode/v1\nrak config embedding_api_key sk-your-key\nrak config model_name text-embedding-v3\nrak clear --yes && rak index\n\n# 本地 Ollama\nrak config embedding_provider api\nrak config embedding_base_url http://localhost:11434/v1\nrak config embedding_api_key not-needed\nrak config model_name nomic-embed-text\nrak clear --yes && rak index\n\n# 切回本地模型\nrak config embedding_provider local\nrak config model_name all-MiniLM-L6-v2\nrak clear --yes && rak index\n```\n\n### 搜索\n\n```bash\nrak search \"单细胞 RNA 测序方法\"\nrak search \"CRISPR off-target\" --hybrid\nrak search \"attention\" --limit 5\nrak search \"RNA-seq\" --collection \"My Papers\" --tag \"methods\"\nrak --json search \"spatial omics\" # JSON 输出(含匹配片段)\n```\n\n`--json` 输出示例:\n\n```json\n[\n {\n \"key\": \"ABC123\",\n \"title\": \"Attention Is All You Need\",\n \"score\": 0.89,\n \"source\": \"vector\",\n \"snippet\": \"We propose a new simple network architecture...\"\n }\n]\n```\n\n### 问答\n\n```bash\nrak ask \"关于细胞命运的主要发现是什么?\"\nrak ask \"比较 CRISPR 方法\" --context 10 --hybrid\n```\n\n### 对话\n\n```bash\nrak chat # 启动交互会话\nrak chat --hybrid --context 10 # 混合搜索 + 更多上下文\nrak chat --collection \"My Papers\" # 限定 collection\n```\n\n对话内置命令:`/search <查询>` · `/context` · `/tokens` · `/help` · `/quit`\n\n### 导出\n\n```bash\nrak export \"single cell\" --format csv\nrak export \"CRISPR\" --format bibtex --output refs.bib\n```\n\n### 配置\n\n```bash\nrak config # 显示所有设置\nrak config llm_model deepseek-chat # 设置 LLM 模型\nrak config llm_base_url https://api.deepseek.com\nrak config llm_api_key sk-xxx # 设置 API Key\n```\n\n<details>\n<summary>LLM 配置示例</summary>\n\n```bash\n# DeepSeek(推荐云端)\nrak config llm_base_url https://api.deepseek.com\nrak config llm_model deepseek-chat\nrak config llm_api_key sk-your-key\n\n# OpenAI\nrak config llm_base_url https://api.openai.com/v1\nrak config llm_model gpt-4o\nrak config llm_api_key sk-your-key\n\n# 本地 Ollama(默认)\nrak config llm_base_url http://localhost:11434/v1\nrak config llm_model llama3\nrak config llm_api_key not-needed\n```\n\n</details>\n\n### 其他\n\n```bash\nrak status # 索引状态\nrak clear --yes # 清除所有索引\nrak completion zsh # Shell 补全\neval \"$(rak completion)\" # 启用补全\n```\n\n## 在 Claude Code 中使用\n\n```mermaid\nsequenceDiagram\n participant U as 用户\n participant C as Claude Code\n participant R as rak\n participant Z as zot\n\n U->>C: 帮我找 attention 相关的论文并总结\n C->>R: rak --json search \"attention\"\n R-->>C: [{key, title, score, snippet}, ...]\n C->>C: 基于 snippet 直接总结\n C-->>U: 总结结果 + 论文列表\n\n U->>C: 我想看第一篇的详情\n C->>Z: zot read ABC123\n Z-->>C: 完整元数据 + 摘要\n C-->>U: 论文详情\n```\n\nClaude Code 自身就是大模型,不需要 `rak ask` — 直接用 `rak search` 获取片段后自己分析。\n\n建议在 `~/.claude/CLAUDE.md` 中添加:\n\n```markdown\n### Zotero\n- 语义搜索用 `rak --json search`,精确搜索/CRUD 用 `zot`\n- `rak` 返回匹配片段(snippet),可直接分析,无需读全文\n```\n\n## MCP Server\n\n供 LM Studio / Cursor / Claude Desktop 等支持 MCP 的工具使用。\n\n```bash\npip install zotero-rag-cli[mcp]\n```\n\n```json\n{\n \"mcpServers\": {\n \"rak\": {\n \"command\": \"rak-mcp\"\n }\n }\n}\n```\n\n| 工具 | 功能 |\n|------|------|\n| `search_papers` | 语义/混合搜索,返回论文元数据 + 匹配片段 |\n| `search_papers_bm25` | 纯关键词搜索,无需加载嵌入模型 |\n| `similar_papers` | 根据 Zotero key 或标题查找相似论文 |\n| `ask_papers` | 基于论文上下文的 LLM 问答 |\n| `export_papers` | 导出搜索结果为 CSV 或 BibTeX |\n| `show_config` | 查看当前配置 |\n| `index_status` | 查看索引状态 |\n\n## 搭配 zot 使用\n\n```mermaid\ngraph LR\n subgraph \"zot — CRUD\"\n Z1[精确搜索]\n Z2[阅读论文]\n Z3[笔记 / 标签]\n Z4[添加 / 删除]\n end\n\n subgraph \"rak — RAG 检索\"\n R1[语义搜索]\n R2[混合搜索]\n R3[问答 / 对话]\n end\n\n Z1 -.->|\"互补\"| R1\n```\n\n| 工具 | 职责 | 适用场景 |\n|------|------|----------|\n| `zot` | Zotero CRUD(搜索、阅读、笔记、标签、导出) | 明确知道要找什么 |\n| `rak` | RAG 语义检索 + 问答 | 探索性搜索、AI 辅助分析 |\n\n## 选项速查\n\n| 选项 | 适用命令 | 说明 |\n|------|----------|------|\n| `--json` | 全局 | JSON 输出(含 snippet) |\n| `--hybrid` | search, ask, chat, export | 混合搜索 |\n| `--limit N` | search, similar, export | 结果数量 |\n| `--collection` | search, ask, chat, export | 按 collection 过滤 |\n| `--tag` | search, ask, chat, export | 按标签过滤(可重复,OR 逻辑) |\n| `--full` | index | 全量重建 |\n| `--context N` | ask, chat | 上下文论文数 |\n| `--llm-model` | ask, chat | LLM 模型 |\n| `--llm-url` | ask, chat | LLM 服务地址 |\n| `--format` | export | csv / bibtex |\n| `--output` | export | 输出文件 |\n\n## 同类工具对比\n\n| 特性 | **rak** | [zotero-mcp](https://github.com/54yyyu/zotero-mcp) | [cookjohn/zotero-mcp](https://github.com/cookjohn/zotero-mcp) | [ZoteroBridge](https://github.com/Combjellyshen/ZoteroBridge) |\n|---|:---:|:---:|:---:|:---:|\n| 语义搜索 | **✅** | ✅ | ✅ | ❌ |\n| 混合搜索(向量 + BM25) | **✅** | ❌ | ❌ | ❌ |\n| PDF 分块索引 | **✅** | ❌ | ❌ | ❌ |\n| 匹配片段返回 | **✅** | ❌ | ❌ | ❌ |\n| LLM 问答 | **✅** 本地/云端 | 云 API | 云 API | 云 API |\n| 多轮对话 | **✅** | ❌ | ❌ | ❌ |\n| 100% 本地可用 | **✅** | ❌ | ❌ | ❌ |\n| CLI 终端 | **✅** | ❌ | ❌ | ❌ |\n| MCP 协议 | **✅** | ✅ | ✅ | ✅ |\n| 增量索引 | **✅** | N/A | N/A | N/A |\n\n### 为什么选择 rak?\n\n> **唯一同时提供 CLI + MCP、本地语义检索 + 片段返回的 Zotero RAG 工具。**\n\n- **精准**:PDF 分块 + 混合搜索 + 返回匹配片段,而非整篇论文\n- **本地化**:嵌入、搜索全在本机,搜索模式无需 API Key\n- **灵活**:CLI 给终端和 Claude Code,MCP 给 LM Studio 和 Cursor\n- **隐私**:论文数据永不离开本机\n\n## TODO\n\n- [x] BM25 索引添加 `doc_id` 唯一性约束,防止重复插入导致评分膨胀\n- [x] 重命名 `get_by_metadata` → `get_ids_by_metadata`,明确接口语义\n- [x] 添加 `--verbose` 全局选项,启用 debug 级别日志输出便于排查问题\n- [x] `rak search --bm25` 纯关键词搜索模式,无需加载嵌入模型\n- [x] 索引进度条(Rich progress 替代 `Indexed 50/3038...`)\n- [x] MinerU / Docling PDF 解析支持:`rak config pdf_provider mineru` 或 `docling` 启用高质量 PDF 提取(表格/公式/排版保留),失败自动回退 PyMuPDF\n- [x] `rak similar KEY` 查找与指定论文相似的论文\n- [x] 智能分块:按段落/章节切分替代固定 512 词窗口\n- [x] 提升测试覆盖率:整体 67% → 79%,CLI 50% → 69%,新增 72 个测试\n- [x] 异步 PDF 提取:ThreadPoolExecutor 并行化索引中最慢的环节\n- [x] GitHub Actions CI:自动化测试 + tag 触发 PyPI 发布\n- [x] README 更新:文档化 MCP 工具及 v0.6.1 改进\n\n### 高级功能(未来考虑)\n\n> 超出核心语义搜索范围,待搜索基础稳固后评估。\n\n- [ ] `rak notes`:AI 生成论文摘要 — 从 ChromaDB 提取分块发送至 LLM,生成结构化总结(研究问题/方法/结论),缓存为 `~/Zotero/rak/notes/KEY.md`\n- [ ] `rak cluster`:基于嵌入向量相似度自动聚类论文(HDBSCAN)— 发现研究主题、识别空白、组织文献综述,TF-IDF 主题标签 + 可选 LLM 命名\n- [ ] Web UI:Streamlit 可视化搜索面板\n- [ ] 文档站搭建:MkDocs Material + GitHub Pages\n\n## 相关项目\n\n- **[zotero-cli-cc](https://github.com/Agents365-ai/zotero-cli-cc)** — Zotero CLI CRUD 工具(`rak` 的前置依赖)\n\n---\n\n## 支持作者\n\n<table>\n <tr>\n <td align=\"center\">\n <img src=\"https://raw.githubusercontent.com/Agents365-ai/images_payment/main/qrcode/wechat-pay.png\" width=\"180\" alt=\"微信支付\">\n <br>\n <b>微信支付</b>\n </td>\n <td align=\"center\">\n <img src=\"https://raw.githubusercontent.com/Agents365-ai/images_payment/main/qrcode/alipay.png\" width=\"180\" alt=\"支付宝\">\n <br>\n <b>支付宝</b>\n </td>\n <td align=\"center\">\n <img src=\"https://raw.githubusercontent.com/Agents365-ai/images_payment/main/qrcode/buymeacoffee.png\" width=\"180\" alt=\"Buy Me a Coffee\">\n <br>\n <b>Buy Me a Coffee</b>\n </td>\n </tr>\n</table>\n\n## 许可证\n\nMIT\n"}}}}