系列:00 索引 · 上一篇:05 FastAPI · 下一篇:07 Graph RAG
1. 行业常见问题
| 现象 | 原因 |
|---|---|
| 模型「很会说」但引用不存在 | 无 RAG 或检索差 |
| 专有名词、编号搜不到 | 纯向量语义漂移 |
| 长 PDF 塞满上下文 | 未分块或未检索 |
| 答案无法审计 | 无 chunk_id / 页码 |
段末注释:RAG(retrieval-augmented generation,检索增强生成)= 先检索相关片段,再让模型基于片段生成。
2. 该技术如何解决
- Ingest:解析 → 分块 → 建索引(向量 + 倒排)
- Query:多路检索 → 融合 →(可选)重排
- Generate:只许使用检索块,并 强制 citation
3. 核心原理
3.1 分块(Chunking)
- 按标题/段落切,带 overlap(如 128 token)避免断句
- 元数据:
source、page、section、doc_id
3.2 双路检索
| 路 | 擅长 |
|---|---|
| 向量(dense) | 语义 paraphrase |
| BM25(sparse) | 符号、编号、罕见词 |
3.3 RRF 融合
[
\text{score}(d) = \sum_i \frac{1}{k + \text{rank}_i(d)}
]
常用 (k=60)。不依赖两路分数同量纲。
4. 典型实现与代码示例
混合 RAG 分 Part A 索引构建(MCP Store)与 Part B Agent 调用(AgentRuntime + query_hybrid tool loop)。核心实现在 mcp/mcp_rag_gene/rag/,Literature Agent 负责编排。
4.1 Part A:GeneRagStore 索引
1 | # mcp/mcp_rag_gene/rag/store.py(节选) |
RRF 与 citation 打包分别在 rag/hybrid.py;分块在 rag/chunker.py。
4.2 Part B:MCP tool + AgentRuntime
1 | # mcp/mcp_rag_gene/server.py |
Literature Agent 经 agent/literature/agent.yaml 挂载 MCP;run_tool_loop 自动调用 query_hybrid,Skill 要求回复带 [编号]。
4.3 工程验收
1 | # Part A:样例文献入库 |
全链路编排见 Agent-10-09:uv run python -m agent.orchestrator.cli run --symbol BRCA1 --llm-agents --mock-llm
5. 替代方案与优缺点
| 方案 | 优点 | 缺点 |
|---|---|---|
| Naive RAG(仅向量) | 实现快 | 专有名词弱 |
| Hybrid + RRF | 鲁棒、工业常用 | 两套索引维护 |
| + Cross-encoder Rerank | 精度高 | 延迟与成本升 |
| Long Context 全塞 | 省检索 | 贵、仍可能漏关注 |
| Graph RAG | 多跳关系强 | 建图成本高(见 07) |
| Agentic RAG(多轮检索) | 复杂问答 | 循环成本、需终止条件 |
6. 自检题
- 为什么文献库常要 BM25 + 向量而不是单一路?
- citation 块应放在 user 还是 system?有何安全考虑?
- chunk 过大/过小各有什么问题?
7. 延伸阅读
- Lewis et al., RAG 原始论文
- 下一篇:Agent-10-07 图数据库与 Graph RAG