rule-based-retrieval
用结构化规则让 RAG 检索精确可控,告别向量相似度的"大海捞针"
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用结构化规则让 RAG 检索精确可控,告别向量相似度的"大海捞针"
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一个场景:你手头有一份 500 页的法律合同,需要问 LLM 一个高度专业化的问题——"这份合同中关于违约金的上限是多少?"普通 RAG(Retrieval Augmented Generation)会怎么做?它把问题转成向量,在整个文档库里做语义搜索,返回最相关的片段。听起来没问题,但问题在于:LLM 可能从错误的地方"捞"到答案,尤其是当向量数据库里有成百上千份文档时。
这正是 Rule-based Retrieval 试图解决的核心痛点:让检索变得可控、可预测,而不只是依赖向量相似度的玄学匹配。
Rule-based Retrieval(后简称 RBR)由独立开发者 Tom Smoker 创建,是一个 Python 包,定位为 RAG 应用的结构化检索层。它最初聚焦于 Pinecone 作为向量数据库,后来逐步扩展支持 Milvus 和 Qdrant,形成了完整的多后端支持矩阵。
项目采用标准的 Python 包结构(src/whyhow_rbr/),代码量约 5000 行,遵循 MIT 许可证,作者维护活跃,配有完整的 mkdocs 文档站。截至 2024 年 10 月已有 248 颗 GitHub Stars。
RBR 的灵魂是一个叫 Rule 的数据结构。每一个 Rule 代表一条明确的检索规则,包含三个维度:
1. 文件名过滤(filename)
指定只从哪个 PDF 文件中检索。例如 filename="contract.pdf",RBR 就会把向量搜索范围限定在这个文件内,而不是在整个向量数据库里漫无目的地搜索。
2. 页码过滤(page_numbers)
进一步精确到特定页面。当你知道答案在第 40 页时,可以直接写 page_numbers=[40],避免向量搜索在其他无关页面"漂移"。这在处理长文档时特别有价值。
3. 关键词触发(keywords)
这是一个可选但极其强大的功能。当用户问题中包含某些关键词时,RBR 会自动激活对应的规则。比如问"Harry Potter 喜欢吃什么?"时,关键词 ["food", "favorite"] 会触发专门检索食物相关段落的规则,而不是让向量相似度"猜"一个答案。
这三个维度组合起来,就形成了一个 "精确制导"的检索系统——不是靠向量相似度"猜"答案,而是靠规则"锁定"答案。
RBR 的代码架构非常清晰,核心模块如下:
| 模块 | 职责 |
|---|---|
Client | 主入口,管理 Pinecone/Milvus/Qdrant 连接,执行上传、查询等核心操作 |
Rule | 检索规则的数据类,定义了 filename、page_numbers、keywords 三个过滤维度 |
processing | PDF 解析与文本分块,使用 PyPDFLoader + RecursiveCharacterTextSplitter |
embedding | 向量生成,统一使用 OpenAI 的 text-embedding-3-small 模型 |
rag.py | 核心 RAG 逻辑:向量化存储 → 规则过滤 → 上下文拼接 → LLM 生成 |
在查询阶段,Client.query() 的执行流程如下:
keyword_trigger=True,则根据用户问题中的关键词筛选激活哪些 Ruleprocess_rules_separately=True 时每个 Rule 独立执行再合并结果,False 时所有规则联合查询answer(回答)、matches(检索到的文档片段)、used_contexts(实际用到的片段索引)值得注意的是,RBR 并没有魔改 LangChain——它大量复用 LangChain 的组件(langchain_core、langchain_community、langchain_openai),只是在上层封装了一个规则过滤的抽象层。这种设计策略很聪明:站在巨人的肩膀上,专注于自己擅长的检索规则逻辑。
从 pyproject.toml 可以看出项目在工程实践上有较高追求:
strict_equality、disallow_untyped_defs 等),强制标注所有函数签名类型RBR 的代码质量评分可以给到 85/100,主要扣分项是没有 Docker 支持(部署依赖较多外部服务),以及开源社区活跃度有限。
RBR 最适合以下几类场景:
以下场景则不太适合:
RBR 最大的局限在于规则维护成本。每增加一个新的文档或查询维度,就需要新增或修改 Rule。对于有几十上百份文档的场景,Rule 的管理工作会变成新的瓶颈。
此外,项目对向量数据库的选择偏向商业化方案(Pinecone 是收费服务,Milvus 和 Qdrant 虽然有开源版,但配置复杂度不低)。对于只是想快速验证 RAG 想法的开发者而言,门槛仍然偏高。
最后,RBR 尚未支持图片、表格等多模态内容检索,这在大模型上下文窗口越来越大的当下,是一个值得关注的进化方向。
Rule-based Retrieval 代表了 RAG 领域的一个细分流派:从"向量相似度至上"向"结构化可控检索"的范式转变。随着 LLM 的能力越来越强,检索层的精确度和可控性反而变得更加重要——你不想让 LLM"自由发挥"去猜答案,而是要确保它看到的上下文就是正确的。
这类结构化 RAG 的思路与 LangChain 的 LangGraph、LlamaIndex 的 Node Parser 等工具形成互补。整个 RAG 生态正在从"把文档塞进去、问问题出来"的粗暴模式,向更精细化的检索-理解-生成流水线演进。RBR 站在了这个演进路径的一个有意义的位置上。