跳到主内容

RAG落地指南:检索增强生成的分块、嵌入与重排工程实践 ​

不少团队的第一个 RAG 系统是这样上线的:文档切块塞进向量库,用户提问后取 Top 5 拼进提示词,然后发现模型回答要么答非所问,要么干脆编造。排查半天模型侧毫无收获——问题出在检索侧。RAG 的效果上限由检索质量决定,模型只负责组织语言;而检索质量又由分块、嵌入、重排三个环节层层决定,任何一环偷懒,端到端效果都会塌方。本文按数据流顺序拆解这三个环节的工程实践。

分块:粒度、策略与元数据 ​

分块是 RAG 的地基,核心矛盾是粒度:块太大,一篇文档切成 3 块,单块内容芜杂,向量语义被稀释,检索命中率低;块太小,语义不完整,答案需要的关键上下文被切断,召回回来也答不对。

实践中推荐两级策略:以语义边界(标题、章节、段落)优先切分,再对超长段落按 300~500 字符(中文)做二次切分,块间保留 10%~15% 的重叠防止关键句被切断:

python
# 伪代码:按标题层级切分 + 滑动窗口二次切分
def split_document(doc: str) -> list[Chunk]:
    sections = split_by_heading(doc)          # 先按 ## / ### 切出语义段
    chunks = []
    for sec in sections:
        if len(sec.text) <= MAX_CHARS:
            chunks.append(Chunk(sec.text, meta=sec.meta))
        else:
            # 超长段落做 10% 重叠的滑动窗口切分
            for win in sliding_window(sec.text, MAX_CHARS, OVERLAP):
                chunks.append(Chunk(win, meta=sec.meta))
    return chunks

比切法更重要的是给块挂元数据:来源文档、章节路径、更新时间、适用产品线。这些信息在检索时做过滤(只搜「2026 版协议」),在生成时做引用标注(回答末尾附来源),都是纯靠向量相似度给不了的能力。

RAG 检索增强生成流水线原始文档PDF / 网页 / 知识库文档分块粒度与重叠窗口嵌入向量化语义模型编码向量库检索相似度 + 关键词重排序精排 Top-K上下文组装元数据过滤与引用LLM 生成带来源答案块元数据来源 / 章节时间 / 产品线

嵌入与召回:模型选型与混合检索 ​

嵌入模型决定了「语义相近的文本在向量空间是否真的相邻」。选型时看三点:语言匹配度(中文场景优先选中文优化的模型)、维度与存储成本、以及榜单之外的自测集表现——拿 30 条真实用户问题和标准答案段落,测召回 Top 5 命中率,比看任何榜单都直接。

纯向量检索有一个众所周知的短板:对精确关键词(产品型号、错误码、人名)不敏感,因为嵌入捕捉的是语义而非字面。生产级 RAG 几乎都会采用混合检索:向量检索与 BM25 关键词检索并行,各自取 Top 20 后用 RRF(倒数排名融合)合并:

python
def hybrid_search(query: str, k: int = 5) -> list[Chunk]:
    vec_hits = vector_store.search(embed(query), top_n=20)   # 语义通道
    kw_hits  = bm25_index.search(query, top_n=20)            # 关键词通道
    return rrf_fuse([vec_hits, kw_hits], k=k)                # 融合取前 k

这一行融合逻辑通常能把命中率拉高 10~20 个百分点,是性价比最高的单点优化。

重排:用精排模型做最后一道筛选 ​

召回阶段的模型为了性能必须「粗」,Top 5 里混进两三条弱相关片段是常态,而弱相关片段会直接污染生成答案。重排(rerank)用交叉编码器对「查询-候选」逐对精算相关度,精度远高于双塔式嵌入,代价是算力消耗大,所以只对召回的少量候选做。

工程上的标准组合是「召回 50 → 重排取 5」,重排模型可用开源的 bge-reranker 系列或商用 API。评估重排收益时盯一个指标:答案所在片段出现在最终 Top 5 的比例(命中率)以及答案片段在 Top 5 中的平均排名,两者提升都意味着给模型喂的上下文更干净。

环节典型问题优化手段
分块语义被切断、块内芜杂按标题切分 + 滑动窗口 + 元数据
召回精确词漏召回、语义漂移混合检索(向量 + BM25)+ RRF 融合
重排弱相关片段污染答案交叉编码器精排,召回 50 精排取 5

实践清单 ​

  1. 先建一个 30~50 条的自测集(问题 + 标准答案段落),所有优化用它回归。
  2. 分块按语义边界优先,300~500 字符兜底,块间留重叠、挂元数据。
  3. 上线混合检索,向量与 BM25 双通道再 RRF 融合。
  4. 召回 50 精排取 5,重排模型按自测集选型。
  5. 回答附来源引用,方便用户核验,也方便你定位坏例出在检索哪一环。

RAG 不是「接个向量库」这么简单,它是一个由分块、嵌入、重排串起来的检索系统工程。把每个环节的指标单独量出来、逐环优化,效果才能从「能用」走向「可信」。

免责声明

本工具与文章内容仅用于学习测试场景,优化建议仅供参考,请勿直接用于生产环境,由此产生的风险自行承担。