最近在搭一个本地知识库问答,用的bge-m3做embedding,向量库是Milvus。文档是那种技术手册,有标题、段落和代码块。我目前按固定512字符切块,重叠64——但查起来经常召回一些不相关的内容,比如问“如何配置超时时间”,返回的却是某个函数参数说明里带“timeout”的代码块。我怀疑是不是纯按长度切块把语义割裂了,但换语义切块又不知道怎么处理代码和表格混排的情况。有没有老哥指点下,RAG的分块策略一般怎么根据文档结构来定?或者有没有好用的库能自动识别标题层级来切?感谢!
楼主
2026-08-22
RAG检索老召回不相关片段,是不是我分块方式有问题?
请 登录 后发表回复
全部回复
共 43 条
2楼
23天前
纯按长度切确实容易把语义切碎,尤其是技术手册里一个参数说明可能横跨好几段。你问超时配置却召回带 timeout 的代码块,大概率是 chunk 里代码和解释混一起了,embedding 抓到的只是关键词。可以试试按标题层级切,再用小模型对每个 chunk 做摘要或加标题前缀,召回会准不少。代码块和表格最好单独成块,别和正文硬拼。LangChain 的 MarkdownHeaderTextSplitter 能识别标题层级,但混排文档还是得自己写点规则兜底。
3楼
21天前
按标题层级切确实更靠谱,代码块单独拎出来别混进正文,不然timeout老被误召回。
4楼
21天前
可以试试按标题层级切,代码块和表格单独拎出来别硬切,llama_index的HierarchicalNodeParser能自动识别结构。