RAG检索增强生成配置怎么调才能让答案有据可依
RAG 检索增强生成配置的核心目标只有一个:让模型在回答前拿到真正相关的文档片段。
很多新手以为换个更大的模型就能解决答非所问,实际多数问题出在文档切分、嵌入模型和召回参数这三处。
本文按配置顺序讲清每一步该改什么、怎么验证,适合已经在跑 RAG 流程但效果不理想的读者。
先确认文档切分和向量写入没出错
RAG 的第一步不是调模型,而是把知识库文档变成可检索的向量。
这一步如果做错,后面怎么调参数都白费。
检查三个点:
- 切分粒度:片段太短会丢上下文,太长会稀释语义。技术文档建议每段 300 到 500 字,并保留标题作为片段前缀,让“配置项名称”和“说明”落在同一段里。
- 嵌入模型一致:写入向量库和查询时用的必须是同一个嵌入模型。混用不同模型或不同维度,检索结果会完全失真。
- 写入是否成功:查一下向量库里的记录数是否和切片数对得上。以 Chroma 为例,可用
collection.count()确认数量,数量为 0 说明写入环节就失败了。
如果用的是带界面的知识库工具,通常在分段设置里能看到“分段长度”和“重叠长度”,改完后要重新解析文档,旧索引不会自动更新。
召回参数决定模型能看到什么
检索阶段最常调的两个参数是 top_k(返回片段数)和相似度阈值。
top_k太小,正确片段可能排在第 5 位却被截掉;太大,无关片段会干扰模型判断。起步可以设 4 到 6,观察命中情况再调。- 相似度阈值用来过滤低质量片段。设太高会导致召回为空,模型只能凭记忆作答;设太低会引入噪音。建议先关掉阈值观察原始得分分布,再定一个能保留正确片段的分数线。
一个可运行的检索调用大致如下,重点是查询文本必须和写入时用同一套嵌入逻辑:
results = collection.query(
query_texts=[question],
n_results=5
)
for doc, score in zip(results["documents"][0], results["distances"][0]):
print(score, doc[:80])
跑完先看返回的片段里有没有能回答问题的内容。
如果没有,问题在检索层,不要急着改提示词。
提示词里要约束模型只用检索内容作答
检索命中了,还要让模型真的用上。
提示词中应明确要求:仅根据提供的资料回答,资料中没有的内容要说明无法确认,不要自行编造。
同时把片段连同来源标识一起传入,方便回答时标注出处。
如果模型仍然忽略资料,检查两点:片段是否被放在了提示词靠前的位置,以及问题是否表述得过于模糊,导致检索和生成都抓不住重点。
用带出处的问题验证整条链路
配置完成后不要只问“这个系统怎么用”这类宽泛问题,要构造能定位到具体片段的问题。
比如针对某条配置项提问,看回答是否引用了对应文档段落。
验证顺序建议是:先单独看检索返回的片段对不对,再看最终回答有没有用这些片段。
两步分开查,才能判断问题出在召回还是生成。
如果检索对但回答错,问题在提示词或模型;
如果检索就不对,回到切分和嵌入模型排查。
常见踩坑点
- 改了文档但没重建索引,检索到的还是旧内容。
- 中文文档用了偏英文语料的嵌入模型,语义匹配明显偏弱。
- 只调大模型参数,从未检查过召回结果。
- 阈值和
top_k同时大改,出问题后无法定位是哪个参数导致的。
RAG 检索增强生成配置不是一次调完就结束,文档更新、问题类型变化都可能需要重新检查切分和召回。
按“切分与写入、召回参数、提示词约束、分步验证”的顺序推进,比盲目换模型更有效。