发布时间:2026/9/3 11:23:06
RAG 检索不再答非所问:混合检索 + 智能重排序的四站流水线 RAG 检索不再答非所问混合检索 智能重排序的四站流水线【免费下载链接】RAG_TechniquesThis repository showcases various advanced techniques for Retrieval-Augmented Generation (RAG) systems. Each technique has a detailed notebook tutorial.项目地址: https://gitcode.com/GitHub_Trending/ra/RAG_Techniques给内部支持机器人提了个单“出差打车能报多少”机器人回了一段产品功能介绍。语料库里明明躺着完整的报销政策向量相似度却把产品手册的“打车”段落顶到了第一位——词对上了意思全跑偏。这类翻车不是生成模型的错是检索阶段就没把对的段落递过去召回错了后面再强的 LLM 也只能在错误的前提上编。RAG 高级检索要补的就是这一环用混合检索把该找的找全用智能重排序把顺序掰正再配上过滤与分层索引控制成本。下面按一条真实查询走过的流水线拆四站召回 → 精排 → 清洗 → 导航每站给最小可跑的代码参数怎么拧、坑在哪里一并说清。第一讲 · 混合检索BM25 和向量各管一段alpha 该给多少单独用向量检索报销标准这种精确词容易召回一堆报销流程简介单独用关键词检索出差住宿能报几块这种换词表达又抓不到。两个通道一个认词一个认意谁也不能替谁干活加权混排是最划算的修法。仓库里的all_rag_techniques/fusion_retrieval.ipynb就是这条路线的实现。最小实现约 24 行import numpy as np from rank_bm25 import BM25Okapi def minmax(arr): lo, hi arr.min(), arr.max() return (arr - lo) / (hi - lo 1e-9) def blended_hits(vs, bm25, q, k5, alpha0.5): alpha 越大越偏向量两路分数先归一再加权 pool vs.similarity_search(q, k60) # 全库取出一次方便按 BM25 下标对齐 corpus vs.similarity_search(, kvs.index.ntotal) kw minmax(bm25.get_scores(q.split())) vec 1 - minmax(np.array([s for _, s in vs.similarity_search_with_score(q, klen(corpus))])) merged alpha * vec (1 - alpha) * kw idx np.argsort(merged)[::-1][:k] return [corpus[i] for i in idx]注意一个细节FAISS 的分数是距离越小越近所以向量那路做了反向归一化。两路量纲不同归一化必须在当前候选池上做跨池子拿历史 min/max 会串味。分块端建议相邻块留 10%~20% 重叠防止跨边界的句子被拦腰截断。️ alpha 怎么拧你的查询长什么样起手 alpha拧法精确词多编号、型号、法条0.3BM25 压阵别让它被语义漂走概念多、同义改写多0.6~0.7语义通道挑大梁判不准0.5先跑 20 条真实 query 看命中再微调alpha 别指望调到最优解就收工——线上查询分布会漂留个按查询类型分档的开关。候选进来了顺序还是乱的——评委上场。第二讲 · 智能重排序LLM 当评委候选池留多大混合检索捞回来的 20 个分块前两名未必是真答案。让 LLM 逐对读查询 × 分块比双塔向量多一层交互看得更细。两阶段架构的思路很直接向量通道负责便宜地找得广LLM 负责贵一点地排得准。评分提示词是重排序里最容易被低估的零件。要点三条temperature 设 0 保证同一对内容打分稳定用结构化输出接分数别做正则解析让模型同时给一句判断理由调试时能直接看出它为什么打高分。仓库参考all_rag_techniques/reranking.ipynb。from pydantic import BaseModel, Field from langchain_openai import ChatOpenAI class Verdict(BaseModel): 评委的打分单 score: float Field(ge1, le10, description与查询的贴合度) reason: str Field(description一句话说明给分依据) JUDGE ( 你是文档检索的评审。只依据内容判断不要常识脑补。\n 档位参考9-10 直接回答问题5-8 提供部分支撑1-4 跑题。\n 查询{q}\n分块{text}\n 给出评分和一句理由。 ) judge ChatOpenAI(modelgpt-4o-mini, temperature0) def llm_rerank(q, pool, top5): 逐对送审只留分数过线的 chain judge.with_structured_output(Verdict) scored [(d, chain.invoke(JUDGE.format(qq, textd.page_content)).score) for d in pool] scored.sort(keylambda t: t[1], reverseTrue) return [d for d, s in scored[:top] if s 5]20 个候选逐个打分是串行的 20 次调用延迟会很难看。分批并发是标准解法from concurrent.futures import ThreadPoolExecutor def parallel_judge(q, pool, top5, batch4): def _one(doc): v judge.with_structured_output(Verdict).invoke(JUDGE.format(qq, textdoc.page_content)) return doc, v.score with ThreadPoolExecutor(max_workers4) as ex: pairs list(ex.map(_one, pool)) pairs.sort(keylambda t: t[1], reverseTrue) return [d for d, s in pairs[:top] if s 5] 候选池Top-K留多大池子延迟风险10低真答案没被召回进来时精排也救不回来20中常规知识库的稳妥默认40高约 200 次 LLM 调用只有长尾查询或超大语料才值得原则是池子宁大勿小但别贪心精排只能救排序问题救不了召回问题。评委排完还有一批沾边的——过闸。第三讲 · 多维过滤阈值取 0.6 还是 0.8重排之后常见的残留同一页的三个近义分块、来源不对的文档、相似度 0.61 的边缘结果。三道闸解决这三类顺序不能乱先元数据、再阈值、后打散——元数据最便宜放在前面能省掉后面两道闸要算的分数。 元数据闸进任何打分之前先把不属于这个查询的文档剔掉——按来源、日期、权限。这一步是纯字段比对零模型调用省下的都是实打实的 embedding 和 LLM 开销。 相似度闸0.6 还是 0.8 别拍脑袋跟查询类型和库大小走。import math def similarity_floor(qtype, n_docs): base 0.72 if qtype fact else 0.62 bump 0.04 * math.log10(n_docs 1) return round(min(base bump, 0.9), 2) 打散闸MMR 把和已入选分块有多像算进得分同一段话的三个版本只留一个。import numpy as np def scatter(docs, embs, k5, lam0.75): 相关性 lam、多样性 1-lam避免近义分块挤占窗口 embs np.array(embs, dtypefloat) embs embs / (np.linalg.norm(embs, axis1, keepdimsTrue) 1e-9) picked [int(np.argmax([d.score for d in docs]))] rest list(range(len(docs))) while len(picked) k and rest: best, best_v None, -1e9 for i in rest: red max(embs[i] embs[j] for j in picked) v lam * docs[i].score (1 - lam) * (1 - red) if v best_v: best, best_v i, v picked.append(best) rest.remove(best) return [docs[i] for i in picked]第四讲 · 分层索引摘要层、概览层、明细层怎么逐级下钻语料库上千个文件时扁平检索有两个毛病贵全量分块都要打分和吵摘要级的意图被细节分块淹没。分层索引的思路是把文档切成三层摘要层管这份文档讲什么概览层管哪个章节相关明细层管原文怎么说的。检索时从上往下钻每层只放行过线的文档把打分范围越压越小。仓库里all_rag_techniques/hierarchical_indices.ipynb给的是两层版先查摘要、再按页码回捞明细原理完全一致。def drill_down(summary_vs, detail_vs, q, k5): 摘要层先筛再回捞对应文档的明细分块 top_sum summary_vs.similarity_search(q, k10) keep {s.metadata[doc_id] for s in top_sum if s.metadata[score] 0.25} # 分数是距离越小越近 hits [] for did in list(keep)[:3]: # 只下钻前 3 份文档 hits detail_vs.similarity_search(q, kk, filter{doc_id: did}) return hits下钻策略跟查询类型走事实型问题直接查明细层省掉一层往返需要跨章节综合的问题才从摘要层一路钻下去。动态下钻不是每次都走满三层而是按问题的粒度选入口层。落地速查参数一次看全 参数速查旋钮起手值管什么拧的方向alpha0.5混合检索里向量通道的权重精确词多降、概念多升候选池20LLM 评委要看多少个分块精度吃紧加、成本吃紧减相似度下限0.62~0.72相似度闸的放行线按查询类型动态算lambda_mmr0.75打散时相关性与多样性的配比结果重复多就调大权重给多样性分块大小800~1000 字符明细层的颗粒度配合 10%~20% 重叠三个最常踩的坑️ 分数不归一直接相加BM25 分是 0 到几十余弦是 0 到 1不加归一化时 alpha 形同虚设BM25 一路把结果焊死。️ 评委看全库跳过过滤直接把全部分块送 LLM 打分成本翻一个数量级。正确顺序永远是元数据 → 阈值 → 打散 → 精排。️ 阈值一刀切事实型问题用 0.8 的线探索型问题用 0.6 的线混着用两边都不讨好。四站都是可插拔的插件不是焊死的整体。先把混合检索的 alpha 拧到 20 条真实查询不再翻车再一站一站往上叠——顺序错了后面的精排和分层都是在给前面的错误买单。【免费下载链接】RAG_TechniquesThis repository showcases various advanced techniques for Retrieval-Augmented Generation (RAG) systems. Each technique has a detailed notebook tutorial.项目地址: https://gitcode.com/GitHub_Trending/ra/RAG_Techniques创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/3 11:23:06

从Siri AI看Server与分布式推理:本地大模型Agent的架构实践

上周苹果 WWDC 的“AI 转型”里,Siri 的新能力让不少人眼前一亮:它终于能从“天气怎么样”进化到“帮我把邮件里关于项目排期的信息整理出来,并设置明天的提醒”。但如果只把目光盯在发布会演示上,很容易错过一个更重要的信号&…

2026/9/3 11:18:06

Claude Code本地沙箱配置与实战:从安装到接入第三方模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 11:48:10

基于YOLOv7-POSE、Bytetrack与STGCN的实时智能监控系统实战

简介:本资源是一套面向安防监控与智慧养老场景的端到端智能行为分析系统实现方案,适用于计算机视觉方向的研究者、AI工程开发者及智能安防系统集成人员,解决实时人体姿态感知、多目标连续追踪与跌倒等异常行为精准识别三大核心问题。压缩包共…

2026/9/3 11:48:10

软考挣值管理核心:PV/EV/AC三参数与绩效指标实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 11:48:10

AB柱不是越硬越好:拆解碰撞能量管理与车身结构设计逻辑

汽车碰撞安全是一个没有标准答案的复杂工程,每一根梁、每一块板都是对成本、重量、视野和乘员保护之间做出的妥协。前几天和朋友聊新款车型的碰撞成绩时,他突然问了一句:“AB柱是不是越硬越好?我看那些宣传都强调用了多少兆帕的热…

2026/9/3 11:48:10

AI驱鸟洒水系统实战:从目标检测到树莓派继电器控制

春天种果树的朋友大概都有同感:果子上色越快,心里越紧张。不是怕病虫害,而是怕鸟。麻雀、八哥、白头鹎经常成群结队地来“试吃”,一棵樱桃树一晚上能被糟蹋掉大半。传统稻草人只能管几天,套网成本高又遮挡光照&#xf…

2026/9/3 11:48:10

快递包裹纸箱检测数据集构建与YOLOv8实战指南

简介:本资源是一个面向计算机视觉初学者与工业检测项目开发者的快递包裹纸箱目标检测专用数据集,适用于YOLO系列、Faster R-CNN等主流检测模型的训练与验证。数据集包含395张真实场景下的快递袋(kuaididai)与纸箱(zhix…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…