Agent-10-06.混合检索RAG

系列:00 索引 · 上一篇:05 FastAPI · 下一篇:07 Graph RAG


1. 行业常见问题

现象 原因
模型「很会说」但引用不存在 无 RAG 或检索差
专有名词、编号搜不到 纯向量语义漂移
长 PDF 塞满上下文 未分块或未检索
答案无法审计 无 chunk_id / 页码

段末注释:RAG(retrieval-augmented generation,检索增强生成)= 先检索相关片段,再让模型基于片段生成。


2. 该技术如何解决

  1. Ingest:解析 → 分块 → 建索引(向量 + 倒排)
  2. Query:多路检索 → 融合 →(可选)重排
  3. Generate:只许使用检索块,并 强制 citation

3. 核心原理

3.1 分块(Chunking)

  • 按标题/段落切,带 overlap(如 128 token)避免断句
  • 元数据:sourcepagesectiondoc_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# mcp/mcp_rag_gene/rag/store.py(节选)
class GeneRagStore:
def ingest_document(self, collection, source_path, *, pmid=None, gene_id=None, title=""):
# chunk 落盘字段(chunks.json 每条):
# chunk_id — query_hybrid / RRF 融合的主键
# text — BM25 与向量检索的正文
# pmid — 引用块 header 与 grounded 回答标注
# source_path — citation 审计路径
# gene_id / title — collection 元数据与 UI 展示
...

def query_hybrid(self, collection, question, top_k=5) -> dict:
# 返回 query_hybrid MCP tool 结构:
# citations[] — pack_citations:chunk_id/text/pmid/source_path/title
# context — build_grounded_context:带 [编号] 的证据块,注入 LLM user 消息
fused = rrf_fuse([bm25_ranked, dense_ranked], top_n=top_k)
return {"citations": ..., "context": ...}

RRF 与 citation 打包分别在 rag/hybrid.py;分块在 rag/chunker.py

4.2 Part B:MCP tool + AgentRuntime

1
2
3
4
5
# mcp/mcp_rag_gene/server.py
@mcp.tool()
def query_hybrid(collection: str, query: str, top_k: int = 5) -> dict:
"""混合检索,返回 citations 与 context(供 LLM grounded 生成)。"""
return _store.query_hybrid(collection, query, top_k=top_k)

Literature Agent 经 agent/literature/agent.yaml 挂载 MCP;run_tool_loop 自动调用 query_hybrid,Skill 要求回复带 [编号]

4.3 工程验收

1
2
3
4
5
6
7
# Part A:样例文献入库
uv run python -m agent.literature.cli ingest-samples --collection brca1_gene
uv run python -m agent.literature.cli smoke-query brca1_gene "BRCA1 siRNA 转录本选择依据?"

# Part B:AgentRuntime + MCP(Mock LLM 可离线)
uv run python -m agent.literature.cli chat --mock-llm \
"BRCA1 siRNA 设计应优先选哪条转录本?请先 query_hybrid 检索 brca1_gene。"

全链路编排见 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. 自检题

  1. 为什么文献库常要 BM25 + 向量而不是单一路?
  2. citation 块应放在 user 还是 system?有何安全考虑?
  3. chunk 过大/过小各有什么问题?

7. 延伸阅读

-------------本文结束感谢您的阅读-------------