RAG-02索引召回-Boolean-Retrieval

本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Boolean Retrieval」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

基于布尔表达式进行规则检索,先过滤语料,再交给语义检。重排。

1
2
3
4
5
6
flowchart TD
Q[用户问题] --> Rule[规则解析]
Rule --> Expr[布尔表达。AND/OR/NOT]
Expr --> IDX[倒排索引执行]
IDX --> F[过滤候选集]
F --> R[后续 Dense/Rerank]

优势与局限

  • 优势:约束强、可控性极高、时延低。
  • 局限:对语义变体不敏感;表达式维护成本会随业务增长。

资源与时延

  • 资源:低。
  • 时延:极低,适合高并发预筛。
  • 维护成本:规则体系需要持续治理。

应用场景

  • 合规风控、权限过滤、时间/地域精确筛选。
  • 作为 Hybrid 检索前置“硬过滤器”。

统一合成数据示例

输入数据片段

1
2
3
4
{
"query": "上海地区 2026 年差旅报销政策",
"boolean_expr": "region:上海 AND year:2026 AND topic:差旅报销"
}

中间结果(布尔过滤候选)

1
2
3
4
[
{"doc_id": "D10", "region": "上海", "year": 2026, "match": true},
{"doc_id": "D11", "region": "北京", "year": 2026, "match": false}
]

最终生成示例(含引用)

1
2
3
4
{
"answer": "上海地区 2026 年差旅报销仍执行机票上限 2000 元的规则。",
"citations": [{"doc_id": "D10", "evidence_span": "机票上限 2000 元"}]
}

原始发表与工程实现

  • 代表性原始发表:Boolean Retrieval (Salton 体系)。
  • 核心解决问题:解决硬约束过滤与合规检索。
  • 成熟实现工具:Elasticsearch/OpenSearch DSL。

详细原理拆解

  • 执行布尔表达式 (A AND B) NOT C 作为硬过滤,保证可控性与合规性。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
def boolean_then_semantic(query, dsl: str, index):
subset = index.filter(dsl) # 硬约束:地域/版本/权限
return index.dense_search(query, subset) # 在子集上做语义

参数示例

1
2
3
filter_fields: [region, year, policy_version, visibility]
dsl_examples: "region:上海 AND year:2026 AND topic:差旅报销"
post_filter_top_k: 30

常见失败案例

  • 失败模式 1:元数据标注滞后,过滤过严把正确文档挡在网外。
  • 失败模式 2:用户口语无「上海」二字,纯布尔召回为空,需 NL→DSL 或 fallback。
  • 失败模式 3:OR 过多导致子集仍巨大,布尔失去预筛意义

Demo 数据带入计算示例

1
2
表达式 region=上海 AND year=2026 AND topic=差旅:D10 全满足 -> 进入后续向量排序;
D11 地域不符 -> False,**不参与语义分比较**。体现布尔是 **硬过滤** 而非相似度。
-------------本文结束感谢您的阅读-------------