构建或调优 RAG 检索管道时使用——涵盖文档分块策略与参数、稠密嵌入(BGE-M3、余弦相似度、ANNOY/HNSW 选型)、稀疏嵌入(TF-IDF 到 BM25)、混合检索三阶段(并行召回、RRF 融合、跨编码器重排序)与 recall@k/MRR/nDCG 指标,含稀疏 vs 稠密的胜负判断。
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-rag-pipeline-dec222c5610e ,按照其中的说明把「rag-pipeline」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
RAG 核心流程只有三步:检索相关片段 → 注入上下文 → LLM 基于上下文生成。检索器决定答案上限,生成器决定兑现程度;答不好先在检索层定位,别急着调 prompt。
RAG 的存在理由:模型训练数据有截止日期,知识库可随时更新——用外部知识库的广度和时效性补模型之短。
系统构成就两块:检索器(从知识库找相关片段)+ 生成器(通常是 LLM,拿片段作上下文生成答案)。调优对象主要是检索器。
分块必不可少,原因有二:嵌入模型有输入长度限制,整篇文档压成一个向量会多主题混杂、语义被稀释;检索的目标是只注入相关部分,块太大会连带引入无关内容、浪费窗口稀释注意力。
稠密懂语义、稀疏懂字面,各有盲区:搜"HTTP-403",稀疏精确命中而稠密可能返回泛泛的"服务器错误";搜"kitty",稠密能找到只写"cat"的文档而稀疏不能。没有单一策略在所有场景可靠——生产级默认混合检索。
分块有固有缺陷:任何切分策略都会切断块与原始上下文的联系("该公司收入增长了 3%"——哪家公司?哪个季度?)。要么在索引期为每块生成上下文前缀再索引(book/chapter3.md「RAG 技巧:上下文感知检索」),要么靠重排序补救。
混合检索三阶段各司其职、层层递进:并行检索(双路各自召回)→ 结果融合(统一候选池)→ 神经重排序(候选池精排)。融合不替代重排,重排也不替代融合。
两路得分不可直接比较:余弦相似度(0-1)与 BM25(0 到几十)量纲分布迥异,融合必须抛开原始得分。
稀疏 vs 稠密的胜负判断(按查询类型选路或混路):
| 查询类型 | 稠密 | 稀疏 | 结论 |
|---|---|---|---|
| 同义/换说法(kitty vs cat) | 胜 | 负 | 靠稠密 |
| 精确代码/编号(HTTP-403) | 易泛化 | 胜 | 靠稀疏 |
| 技术术语、人名 | 一般 | 胜 | 靠稀疏 |
| 多语言/跨语言查询 | 胜 | 负 | 靠稠密 |
| 概念性、描述性问题 | 胜 | 一般 | 靠稠密 |
混合检索 + 重排序是覆盖全部类型的生产默认。
chapter3/retrieval-pipeline/ — 稠密 + 稀疏 + RRF 融合 + BGE-Reranker 重排的完整流水线;test_client.py 按查询挑战类型(语义相似如 kitty/feline、精确名称、多语言、技术代码)分类对比两路胜负,可观察重排后的排名变化。chapter3/dense-embedding/ — BGE-M3 稠密检索服务,ANNOY/HNSW 可切换;离线 CLI 计算 recall@k/precision@k/MRR,并对比 ANN 与暴力精确检索的 recall、构建时间、查询时延。chapter3/sparse-embedding/ — 从零实现 BM25 + 倒排索引,分词覆盖数字、代码、技术术语、混合大小写;日志逐步展示分词、倒排命中、TF/IDF 计算与最终排序。book/chapter3.md「RAG 基础:构建 Agent 的知识获取管道」