<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>向量检索 on lategege 的技术博客</title><link>https://lategege.com/tags/%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2/</link><description>Recent content in 向量检索 on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 22 Mar 2026 01:30:00 +0800</lastBuildDate><atom:link href="https://lategege.com/tags/%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>RAG 落地清单：从检索到评测的一套可复用实践</title><link>https://lategege.com/p/rag-best-practices-checklist/</link><pubDate>Sun, 22 Mar 2026 01:30:00 +0800</pubDate><guid>https://lategege.com/p/rag-best-practices-checklist/</guid><description>&lt;img src="https://lategege.com/" alt="Featured image of post RAG 落地清单：从检索到评测的一套可复用实践" /&gt;&lt;p&gt;RAG 这东西，demo 很容易做得像模像样：把文档塞进向量库，检索几段，拼进 prompt。
真正上线后麻烦才开始：命中率飘、答案掺幻觉、延迟变长、成本拉满，还很难复盘到底哪里坏了。&lt;/p&gt;
&lt;p&gt;我习惯把 RAG 拆成一条链路：&lt;strong&gt;数据 → 索引 → 检索 → 生成 → 评测/监控&lt;/strong&gt;。下面是我做项目时会用的一份清单（偏工程，不追求“讲概念讲漂亮”）。&lt;/p&gt;
&lt;h2 id="0-先把目标写死你希望它宁可不答还是宁可猜"&gt;0. 先把目标写死：你希望它“宁可不答”，还是“宁可猜”？
&lt;/h2&gt;&lt;p&gt;别急着调 embedding、调 TopK。
先把三句话定下来（写在项目 README 里都行）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;答案必须来自哪里：只允许来自知识库？还是允许模型补常识？&lt;/li&gt;
&lt;li&gt;失败策略：证据不足时是直接说“不知道”，还是给一个不保证正确的建议？&lt;/li&gt;
&lt;li&gt;成功怎么衡量：命中率/用户点赞/转人工率，哪个是主指标？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三句不定，后面所有优化都容易变成“谁声音大听谁的”。&lt;/p&gt;
&lt;h2 id="1-数据与切分rag-的大头在这里"&gt;1. 数据与切分：RAG 的大头在这里
&lt;/h2&gt;&lt;h3 id="11-清洗先把垃圾去掉"&gt;1.1 清洗：先把垃圾去掉
&lt;/h3&gt;&lt;p&gt;常见噪声：页眉页脚、导航栏、重复版权、目录页、广告块。
这些东西会被 embedding 认真地向量化，最后把检索结果污染得一塌糊涂。&lt;/p&gt;
&lt;p&gt;我一般会做一件很土但有效的事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;随机抽 20 个 chunk，&lt;strong&gt;人肉读一遍&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;读完你就知道数据有没有救。&lt;/p&gt;
&lt;h3 id="12-切分别只按字数切"&gt;1.2 切分：别只按字数切
&lt;/h3&gt;&lt;p&gt;纯按字数切最容易把“标题”和“结论”拆开。
更稳的做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先按文档结构切（H1/H2/H3）&lt;/li&gt;
&lt;li&gt;再给每个 chunk 设一个上限（比如 300~800 tokens）&lt;/li&gt;
&lt;li&gt;把“父标题路径”写进元数据：&lt;code&gt;产品A &amp;gt; 安装 &amp;gt; 常见问题&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样检索出来的段落通常是可读的，不像碎纸片。&lt;/p&gt;
&lt;h3 id="13-元数据别省"&gt;1.3 元数据：别省
&lt;/h3&gt;&lt;p&gt;至少保留：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source&lt;/code&gt;（URL/文档 ID）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; / &lt;code&gt;section_path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated_at&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;doc_type&lt;/code&gt;（FAQ/手册/公告/工单）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多“检索不准”的问题，其实是缺过滤：你想要最新版，结果把三年前的公告也召回了。&lt;/p&gt;
&lt;h2 id="2-索引向量不是唯一答案"&gt;2. 索引：向量不是唯一答案
&lt;/h2&gt;&lt;h3 id="21-先做-bm25再做向量混合检索更稳"&gt;2.1 先做 BM25，再做向量（混合检索更稳）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;BM25 对报错码、函数名、专有名词很强&lt;/li&gt;
&lt;li&gt;向量对“换个说法”很强&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真正在业务里，我更偏向：&lt;strong&gt;BM25 + 向量 + 融合/重排&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="22-embedding-模型别靠信仰"&gt;2.2 embedding 模型别靠信仰
&lt;/h3&gt;&lt;p&gt;选模型最靠谱的办法只有一个：用你自己的问题集跑一轮离线评测。
不要看营销文案。&lt;/p&gt;
&lt;h2 id="3-检索topk-只是起点"&gt;3. 检索：TopK 只是起点
&lt;/h2&gt;&lt;h3 id="31-多路召回"&gt;3.1 多路召回
&lt;/h3&gt;&lt;p&gt;建议至少两路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;向量 TopK&lt;/li&gt;
&lt;li&gt;BM25 TopK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;合并去重后再排一次序。&lt;/p&gt;
&lt;h3 id="32-rerank-往往是最便宜的效果提升"&gt;3.2 rerank 往往是“最便宜的效果提升”
&lt;/h3&gt;&lt;p&gt;很多时候不是召不回来，而是排序把好段落排到后面了。
加一个 reranker，Top-1/Top-3 命中率通常能肉眼可见地改善。&lt;/p&gt;
&lt;h3 id="33-控制上下文预算别把-token-当不要钱"&gt;3.3 控制上下文预算：别把 token 当不要钱
&lt;/h3&gt;&lt;p&gt;RAG 项目很容易因为“塞太多资料”把延迟和成本拖爆。&lt;/p&gt;
&lt;p&gt;我的经验是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TopK 别盲堆，先靠 rerank 提纯&lt;/li&gt;
&lt;li&gt;召回后做段内抽取/去重&lt;/li&gt;
&lt;li&gt;设硬上限：超过预算就截断&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-生成让答案可追溯"&gt;4. 生成：让答案可追溯
&lt;/h2&gt;&lt;h3 id="41-强制引用来源"&gt;4.1 强制引用来源
&lt;/h3&gt;&lt;p&gt;最实用的格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先给结论（两三句话）&lt;/li&gt;
&lt;li&gt;再给步骤/细节&lt;/li&gt;
&lt;li&gt;最后列出引用条目（文档名/链接）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户能追溯，你自己也能复盘。&lt;/p&gt;
&lt;h3 id="42-证据不足就别硬编"&gt;4.2 证据不足就别硬编
&lt;/h3&gt;&lt;p&gt;检索不到足够证据时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接说“当前资料里没找到”&lt;/li&gt;
&lt;li&gt;告诉用户需要补什么信息&lt;/li&gt;
&lt;li&gt;返回 2~3 个可能相关的文档当引导&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这比胡猜强太多。&lt;/p&gt;
&lt;h2 id="5-评测与监控没有评测就没有-rag"&gt;5. 评测与监控：没有评测就没有 RAG
&lt;/h2&gt;&lt;h3 id="51-离线问题集先做起来"&gt;5.1 离线问题集先做起来
&lt;/h3&gt;&lt;p&gt;50~200 条就够用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;来自真实用户/客服/工单&lt;/li&gt;
&lt;li&gt;每条至少标注：应该命中的 doc id 或答案要点&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-两类指标必须分开"&gt;5.2 两类指标必须分开
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;检索指标：Top-K recall / MRR&lt;/li&gt;
&lt;li&gt;生成指标：是否有证据支撑、是否乱编&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;别把“检索差”和“生成差”混在一起，不然你永远不知道该调哪一段。&lt;/p&gt;
&lt;h3 id="53-线上要能回放"&gt;5.3 线上要能回放
&lt;/h3&gt;&lt;p&gt;至少记录：query、召回文档、最终引用文档、延迟、用户反馈。&lt;/p&gt;
&lt;p&gt;出了问题能复现，才有修的可能。&lt;/p&gt;
&lt;h2 id="结尾"&gt;结尾
&lt;/h2&gt;&lt;p&gt;RAG 的关键不是提示词写得多花哨，而是把它做成一个可控系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据能检索&lt;/li&gt;
&lt;li&gt;检索能评测&lt;/li&gt;
&lt;li&gt;答案能追溯&lt;/li&gt;
&lt;li&gt;线上能回放&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要是你愿意给你们的知识库类型（网页/飞书/Confluence/工单）和访问约束，我可以把这份清单改成更具体的“字段设计 + 评测表 + 监控项”。&lt;/p&gt;</description></item></channel></rss>