本地 RAG 的两个月:检索质量比模型选择更重要
切片、embedding、重排各调了一轮之后,结论有点反直觉。
两个月前在一台小主机上搭了一套本地 RAG:给一堆技术文档做问答。回头看,效果提升最大的环节不是换更大的模型,而是检索侧的三次调整。这篇把过程和数据记下来。
基线:默认配置直接上
固定 512 token 切块、朴素 embedding、top-5 召回。问答可用率大约六成,症状很典型:答案半对半错,引用的段落看着相关但缺关键句。
第一次调整:按结构切块
技术文档有天然边界(标题、代码块、列表)。改成按 markdown 结构切、超长再二次切分,并把所属标题拼进块首。可用率升到七成出头——检索质量的头号杀手经常是"句子被拦腰切断"。
第二次调整:混合检索
纯向量检索对专有名词和代码符号很弱(embedding 对 nvcc 这种词的区分度有限)。加一路 BM25 关键词检索,RRF 融合两路结果。术语类问题的命中率肉眼可见地涨。
第三次调整:重排
召回 top-20 后用 cross-encoder 重排取 top-4。这一步成本最高(每条查询多几百毫秒),但对最终上下文的信噪比提升也最大。可用率到八成五左右,剩下的错误大多是文档本身没写清楚。
结论
在这套小系统里,模型从 7B 换到 14B 带来的提升,不如上面任何一次检索侧改动。RAG 的质量上限由"送进上下文的那几段话"决定,生成模型只是在它的理解范围内组织语言。先修检索,再谈换模型。
不要问"哪个模型答得最好",先问"正确答案有没有出现在上下文里"。前者是调参,后者才是工程。