文章介绍了RAG工程化中的规则检索实现从V1到V2的演进过程。规则检索具有可解释、可控、上线快等优势适合企业内部知识库。通过代码示例展示了如何构建可运行、可解释、可迭代的规则检索系统包括查询降噪、多层规则筛选、打分排序和命中规则记录等。这种实现为后续引入向量库和混合检索奠定了工程基础使AI应用开发走向可控的系统工程。前言上篇文章我们学习到了基本的Rag原理用本地的ollama实现了一个非常简易版本的rag流程。这一篇我们主要来学习下工程化的优化用来给大模型更加准确的上下文我们要知道模型再强如果某些知识不在模型训练的范围之内甚至在网络上搜索不到很准确的信息特别是在企业内部有很多文档和信息是网络上没有的那么直接问大模型输入上下文不可靠输出就很难稳定。这就是 RAGRetrieval-Augmented Generation检索增强生成在 AI 应用开发里最工程化的价值把我该给模型什么上下文这件事从玄学变成可控的检索系统。这一篇我们用一个完全可运行的小例子专注讲清楚RAG里面这个R检索的部分如何在没有向量库、没有 embedding 的情况下先实现一个可解释、可控、可迭代的“规则检索器”并展示从 V1 到 V2 的演进思路。虽然没有用到哪些高级组件但是手写的代码一步步迭代其实我们更加能明白工程化为什么要做这些事情为后面引入向量库做混合检索做了铺垫。本文代码对应 examples/rag/chapter02/ 下三个文件ex04ragretrieverulev1.py规则检索 V1基础可用ex05retrieveresult.pyV2 的结果结构可解释性ex05ragretrieverulev2.py规则检索 V2打分 命中规则规则检索它是什么适合什么时候用在 RAG 里“检索”并不只有向量检索。我们完全可以先从规则检索起步。1.1 规则检索 vs 向量检索我们现在更需要哪个规则检索优点可解释、可控、上线快、无依赖不需要向量库 / embedding缺点覆盖面有限规则维护成本会上升适合内部知识库早期、文档结构清晰、关键词/项目代号明显、需要强可控的场景向量检索优点语义召回强对同义改写更友好缺点解释性弱需要 embedding、向量库调参chunk、topk、阈值更“工程化”适合知识面大、表达多样、需要更强召回的场景一个很实用的路线先用规则检索把系统跑起来保证可控 可解释再逐步引入向量检索补召回最终形成混合检索。RAG里面的R就是在用各种方式来提高检索的质量一个是找到更多可能的信息第二个是在可能的信息里面找到最相关的一些信息。下面的多个规则来检索就是为了找到更多的信息保证不会漏掉有用的信息然后里面的给信息打分就是为了找到最相关最匹配的文段。1.2 规则检索 vs 搜索引擎技术思路很相似我们在举一个例子和我们平常用到非常多的浏览器搜索一样如果你熟悉搜索引擎的工作原理会发现规则检索的思路其实很相似查询预处理搜索引擎会分词、去停用词、拼写纠错我们的 normalize_query 也是去噪声词、提取关键词关键词匹配搜索引擎用倒排索引关键词 → 文档列表我们直接在 page_content 中匹配关键词评分排序搜索引擎用 TF-IDF、BM25 等综合评分我们的 V2 用 score 机制内容命中3、项目名2 等过滤机制搜索引擎按时间、类型、站点过滤我们按 metadata项目、类型、权限过滤可解释性搜索引擎会高亮匹配词我们的 V2 用 hit_rules 记录命中原因核心区别搜索引擎面向全网亿级数据目标是找到相关网页用户自己阅读RAG 规则检索面向企业内部知识库千到万级目标是找到精确文档给 LLM 做上下文所以 RAG 检索对精确性要求更高宁可少召回也不能误导 LLM而搜索引擎更注重召回率宁可多召回让用户自己筛选。这三个文件在做什么先建立整体视角它们合起来的目标很简单 给定用户 query从一组 Document 里挑出最相关的 top_k 条。我们可以把它理解成一个最小 RAG 检索模块在代码里我们用 langchain的core.documents.Document 来承载文档内容与元数据pagecontent metadata而不是自己在造一个对象是为了以后无缝接入 LangChain 的后续链路。V1能跑起来的规则检索ex04ragretrieverulev1.pyV1 的关键词简单、直观、可运行。它做了两件关键事把 query 做降噪变成高信息密度关键词normalize_query注这一步其实非常重要如果我们把这个步骤去掉在我们使用纯规则去匹配的情况下比如只用了关键词然后问题是“什么是蓝精灵协议”这个就匹配不出来。或者用户的问题有很多的没用信息“今天我吃了三个冰淇淋两个水果告诉我什么是蓝精灵协议” 这也很令人头痛用户带了很多没用的信息甚至比要检索的东西还多这个在真实场景里面是极有可能发生的。所以需要做降噪去掉无用的信息就是噪声我们这里主要是为了方便演示所以只做了简单的规则去掉什么是“请介绍”等简单的词语你只要明白要有个处理的过程就行具体真正的生产场景比这个复杂太多。按一组规则筛选 Document并返回 top_kretrieve3.1 Query 降噪把自然语言变成关键词V1 的 normalize_query 用非常朴素但有效的方法去掉“什么是/请介绍/吗/”等口水词按空格和标点切分去掉过短的 token核心片段与源码一致做了缩短便于阅读def normalize_query(query: str)-List[str]: q query.lower().strip() noise_patterns [r什么是, r请介绍, r介绍一下, r是什么, r如何, r怎么, r吗, r\?, r] for p in noise_patterns: q re.sub(p,, q) tokens re.split(r\s||,|。||;, q) tokens [t.strip()for t in tokens if len(t.strip())2] return tokens我们会发现这一步不智能但它是工程上最划算的第一步。因为它把后续规则命中率显著提高同时可解释、可调。3.2 V1 的五层规则从强到弱V1 的 retrieve 里规则是分层的非常重要强规则短路项目名直命中如 aurora-42就直接返回保证我问项目就一定拿到项目文档关键词命中任何关键词出现在正文就收集为候选metadata 过滤例如问协议,就只保留 doc_type protocol去重TopK 截断我们可以把它当成一条可控管道每一步都能解释。3.3 运行 V1在项目根目录执行python examples/rag/chapter02/ex04_rag_retrieve_rule_v1.py我们会看到每个 query 返回的 Document 列表。这就是最小可用的规则检索器不花哨但能把检索这件事落地。V2加入打分与可解释性ex05retrieveresult.py ex05ragretrieverulev2.pyV1 的问题是 命中了就是命中但“谁更相关”缺少排序依据也很难解释“为什么命中”。虽然反复执行得到的结果是一样的但是你没法解释哪一条应该是放到最前面最可能是用户想问的。那么咱们就升级到V2版本。V2 的升级目标很明确每个候选文档都有一个score每个候选文档记录命中规则 hit_rules解释性最后按 score 排序取 top_k4.1 用数据类承载“可解释结果”ex05retrieveresult.py 定义了一个非常干净的结构from dataclasses import dataclass from langchain_core.documents importDocument from typing importList dataclass classRetrieveResult: document:Document score: int hit_rules:List[str]这个结构特别关键它把检索结果从 Document 本体里拆开避免把评分与解释塞进 metadata变得混乱。4.2 V2 的打分规则工程上最常用的套路V2 做了三类规则并给不同权重R1内容关键词命中3R2项目名命中2R3协议类过滤命中2同时把每次命中的规则写进 hit_rules例如content_hit:蓝精灵协议project_hit:aurora-42protocol_match核心逻辑def retrieve(query: str, top_k: int 3)-List[Document]: keywords normalize_query(query) results:List[RetrieveResult][] for doc in DOCUMENTS: score 0 hit_rules [] content_lower doc.page_content.lower() # ---------- R1内容关键词命中 ---------- for kw in keywords: if kw in content_lower: score 3 hit_rules.append(fcontent_hit:{kw}) # ---------- R2项目名命中 ---------- project doc.metadata.get(project,).lower() for kw in keywords: if kw in project: score 2 hit_rules.append(fproject_hit:{kw}) # ---------- R3协议类文档 ---------- if(协议in query orprotocolin query.lower()) \ and doc.metadata.get(doc_type)protocol: score 2 hit_rules.append(protocol_match) if score 0: results.append( RetrieveResult( documentdoc, scorescore, hit_ruleshit_rules ) ) # ---------- 排序 ---------- results.sort(keylambda x: x.score, reverseTrue) # ---------- DEBUG强烈建议我们保留 ---------- for r in results: print(f[score{r.score}] rules{r.hit_rules}) print(r.document.page_content) print(----) return[r.document for r in results[:top_k]]4.3 为什么 V2 更“能上线”因为它解决了 RAG 检索工程化的两大痛点排序可控我们可以通过权重调节更相关的定义解释可追踪线上出现 badcase可以快速定位规则与权重此外V2 还保留了非常建议我们保留的 DEBUG 输出for r in results: print(f[score{r.score}] rules{r.hit_rules})4.4 运行 V2在项目根目录执行python examples/rag/chapter02/ex05_rag_retrieve_rule_v2.py我们会看到每条候选文档的 score 与 hit_rules从而直观看到为什么它排在前面。展示建议生产场景一般怎么定义规则下面给一套更贴近生产的规则定义方式不讲概念直接给方法。核心原则从强到弱、可解释、可开关、可回滚。5.1 先定义强规则必须命中、允许短路强规则通常来自业务里的“唯一标识”命中就直接返回或强加分ID/编号类项目代号aurora-42、工单号、合同号、设备编号、产品型号专有名词类协议名、系统名、模块名、内部缩写固定问法类例如“某某项目启动时间”“某某协议定义是什么”落地建议先做抽取用正则/词典把这些标识从 query 里抽出来类似 V1 的 normalize_query但更“业务化”做索引把文档按 project/doc_type/version/owner 等 metadata 建索引强规则命中直接从索引取候选5.2 再定义加分规则决定排序把“相关性”拆成多条可加权的信号并记录到 hit_rules类似 V2 的做法内容命中关键词出现在 page_content可按词频、位置、标题加权字段命中关键词命中 metadata例如 project、doc_type、tags意图匹配query 含“协议/流程/报错/部署”等意图词 → 只给对应类型文档加分落地建议所有加分都要可追踪像 contenthit:xxx、projecthit:xxx、protocol_match 这样记录命中原因权重用配置管理把 3/2 做成可调参数便于线上快速调优5.3 最后定义过滤规则做安全与边界过滤规则一般用于把“不该给模型看的”或“明显不相关的”剔掉权限过滤按部门/角色/租户过滤最常见版本过滤只保留最新版本或指定版本避免旧文档污染类型过滤问协议只保留 doc_type protocol落地建议过滤优先级高于加分先过滤再排序避免无权限文档进入候选集每条规则可独立开关出问题可以快速回滚线上非常关键总结这篇我们用 chapter02 的三个文件实现了一个可运行,可解释,可迭代 的规则检索器并展示了 V1 → V2 的演进V1规则管道 简单可用V2引入结果结构 打分排序 命中规则解释后续我们可以继续往前走两步就是我后面要写的教程用向量检索补召回embedding vector store做混合检索规则检索做强约束向量检索做召回补充到这里我们会真正把AI 应用开发从调用模型走向可控的系统工程。最后我在一线科技企业深耕十二载见证过太多因技术更迭而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念通过动态追踪大模型开发、数据标注伦理等前沿技术趋势构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能 突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**