最近在做一个内部知识库问答,用的LangChain+OpenAI,文档主要是PDF和Word,大概几百份。目前问题:用户问“报销流程”,召回的全是“差旅费标准”这种泛泛的内容,精准条款反而排很后面。我试过按固定字符(500字)分块,也试过按段落分,embedding用的bge-large,效果都不理想。是不是我分块粒度有问题?还是说应该先做文档结构解析(比如标题层级)再决定切哪里?另外,向量检索之外是不是还得加一层关键词匹配来兜底?求有经验的朋友指点一下,卡了好几天了,挺迷茫的。
最近在做一个内部知识库问答,用的LangChain+OpenAI,文档主要是PDF和Word,大概几百份。目前问题:用户问“报销流程”,召回的全是“差旅费标准”这种泛泛的内容,精准条款反而排很后面。我试过按固定字符(500字)分块,也试过按段落分,embedding用的bge-large,效果都不理想。是不是我分块粒度有问题?还是说应该先做文档结构解析(比如标题层级)再决定切哪里?另外,向量检索之外是不是还得加一层关键词匹配来兜底?求有经验的朋友指点一下,卡了好几天了,挺迷茫的。
我之前也踩过这坑,固定500字符切确实容易把条款切碎,检索时语义就散了。你可以试试按标题层级做父子分块,子块去召回,父块带上下文喂给模型,效果会好不少。另外光靠向量确实不够,报销流程这种关键词强的query,加个BM25混合检索再重排,精准条款基本能提上来。
试试按标题层级切,报销流程和差旅费标准混在一起肯定排不准,再加个关键词兜底更稳。
先按标题层级切再嵌,报销这种问法纯向量确实吃亏,加个BM25混着召回会好很多。