最近在用LangChain搭一个简单的RAG问答机器人,处理公司内部的运维文档。embedding用的bge-large,向量库用的Milvus,top_k设了5。现在遇到一个很头疼的问题:检索出来的chunk经常是东一句西一句,比如问“数据库连接池爆了怎么排查”,召回的内容有讲配置参数的、有讲报错日志的、还有讲重启步骤的,但每个chunk都只有一小段,LLM(用的Qwen)生成答案时就像在拼拼图,经常逻辑不连贯,甚至自相矛盾。
最近在用LangChain搭一个简单的RAG问答机器人,处理公司内部的运维文档。embedding用的bge-large,向量库用的Milvus,top_k设了5。现在遇到一个很头疼的问题:检索出来的chunk经常是东一句西一句,比如问“数据库连接池爆了怎么排查”,召回的内容有讲配置参数的、有讲报错日志的、还有讲重启步骤的,但每个chunk都只有一小段,LLM(用的Qwen)生成答案时就像在拼拼图,经常逻辑不连贯,甚至自相矛盾。
我之前也踩过这个坑,top_k设5其实不一定合适,关键得看chunk怎么切的。你试试把chunk size调大一点,再加个overlap,让每个片段自带上下文,别切得太碎。另外可以上rerank模型,比如bge-reranker,先粗召回再精排,把真正相关的整段捞出来。还有个偏方是让LLM先做一轮query改写,把“排查步骤”这种意图拆清楚再检索,效果会好不少。