最近在折腾一个本地知识库问答,用的 OpenAI embedding + Milvus。文档是些技术手册,长短不一。我自己试了固定 500 token、重叠 50,结果问一些跨段落的问题经常答不全,比如“A功能和B功能的区别”这种,它只检索到其中一段。调成 1000 token 又感觉太糙,检索出来的东西不相关。网上教程都说得看场景,但具体怎么判断?有没有什么经验法则,比如根据文档结构定策略?还是说必须得拿测试集去反复跑?现在有点卡在这了,求各位大佬指点下实际项目里都是怎么搞的。
楼主
2026-08-15
大家用向量数据库做RAG时,chunk大小和重叠到底怎么调啊?
请 登录 后发表回复
全部回复
共 45 条
2楼
2026-09-18
我一般会按文档结构切,比如手册里的章节标题当自然边界,500 token 硬切很容易把“对比说明”拆散。跨段落问题答不全,很多时候不是 chunk 太小,而是检索只取 top1,可以试试多召回几段再让模型合并。1000 token 太糙的话,不是长度问题,是没做 overlap 或者没按语义切。没有测试集就只能拿十几个真实问题反复试,命中率比感觉靠谱。
3楼
2026-09-19
我之前也卡在这,后来发现关键不是死磕固定值,而是按文档结构切。技术手册里“A功能和B功能的区别”这种问题,答案往往横跨两个小节,可以试试按标题层级先切大块,再在大块内做小chunk,检索时把同属一个父级的chunk一起召回。重叠别只设50,跨段问题可以拉到100-150,但前提是别让噪声进来。最后还是得拿十几条真实问题跑召回率,光凭感觉调基本是玄学。
4楼
2026-09-19
我之前也卡在这,后来发现光调chunk没用,得看你的embedding模型对长文本的语义压缩能力。500 token跨段问题确实容易丢上下文,可以试试按文档标题层级切,比如每个小节单独成chunk,再给chunk前面拼上所属章节标题,检索时语义匹配会准很多。重叠50其实偏小,跨段问题可以拉到100-150试试。另外Milvus里可以存原始段落位置,检索后做邻居扩展,把前后相邻chunk也捞回来一起喂给LLM,比单纯调大chunk更管用。
5楼
2026-09-21
分块这事真得拿测试集跑,我一般按标题切再合并小段,跨段问题少很多。
6楼
3天前
刚入门,这个对我帮助很大。