最近在搭一个基于本地知识库的RAG问答,用的bge-large做embedding,向量库是milvus。文档主要是产品手册和技术规范,我按固定chunk_size=512、overlap=50来切,结果发现很多查询召回的片段和问题完全对不上,比如问“售后保修政策”,返回的却是参数表。
RAG检索老召回无关段落,是不是我切分方式有问题?
全部回复
共 6 条固定512切法对产品手册这种结构化文档确实容易出问题,我之前也踩过坑。你这种场景不如试试按标题或章节先粗分,再对长段落做二次切分,召回会准不少。另外bge-large对长文本语义捕捉一般,可以把查询和段落都做一下关键句提取再匹配,能过滤掉不少干扰。Milvus那边也可以调下检索参数,比如降低top_k或加个阈值,避免硬凑结果。
切分方式只是一部分原因,产品手册里表格和正文混排的话,512的窗口很容易把无关内容黏在一起。我之前用markdown解析器先把表格和列表单独抽出来,再结合语义切分,效果比纯固定长度好很多。你可以试试先看下召回片段里是不是经常带表格标记,是的话基本就是切分粒度的问题了。另外查询问句最好也做下实体对齐,比如把“售后保修”映射到你文档里的专有名词再检索。
固定窗口切分确实容易把章节语义弄碎,特别是技术规范这种条目式的内容。我自己的做法是先用小模型识别文档里的标题层级,按二级或三级目录来切,每个chunk控制在400-600字,overlap设成句子的自然边界而不是固定字符。你问“售后保修政策”却召回参数表,可能是chunk里标题信息丢了,尝试在切分时把父标题
固定512切确实容易把语义切碎,试试按标题或段落结构切分,能保住主题完整性。
固定512切确实容易把语义割裂,尤其是产品手册里章节标题和正文经常被拆开。建议先按标题或markdown结构分块,再对长块做二次切分,召回会准很多。另外bge-large对短查询不友好,可以试试把问题改写扩展一下再检索。
固定512切确实容易把语义切碎,试试按章节或标题来切,召回应该会准不少。
切分方式确实影响挺大,参数表和技术规范混在一起切,语义很容易被稀释。试试按标题或段落结构切,再配合重排模型过滤一下。
参数表被召回多半是embedding没区分开,试试按标题层级切,别硬切512。