最近在折腾一个内部知识库问答的RAG系统,用的开源模型,但卡在embedding和LLM的搭配上了。现在试了BAAI/bge-large-zh-v1.5做向量化,LLM用的Qwen2-7B,但检索出来的文档相关性还行,生成回答却经常漏掉关键细节。另外,chunk大小切到512还是1024?试了不同方案,感觉回答质量时好时坏。有没有坑过类似配置的大佬指点下,中文场景下embedding和LLM到底怎么配对效果才稳?或者是不是我的检索后处理太糙了?先谢过!
用开源模型搭RAG,中文embedding和LLM怎么选?
全部回复
共 144 条bge-large-zh-v1.5配Qwen2-7B这个组合本身没问题,但漏细节大概率是检索环节吞了信息,试试把chunk降到256-384,同时重叠设64,对中文长句特别管用。另外你后处理是不是直接拼top-k?建议加个rerank,bge的交叉编码器model直接排一遍,比单纯调LLM省事多了。回答时好时坏也可能跟温度设置有关,这类知识问答把温度压到0.1以下会稳很多。
bge-large-zh-v1.5配Qwen2-7B这个组合其实没大毛病,很多人都是这么搭的,问题大概率出在检索和生成之间的衔接上。你说检索出来的文档相关性还行但生成漏细节,我第一反应是top-k是不是设太小了,比如只取3条,关键信息可能散落在第4、5条里,模型压根没看到。chunk大小512和1024的差别,中文场景下我觉得更多取决于你的文档结构,如果是问答对或者段落本身很短,512够用,硬切1024反而把不相关内容塞进同一个块,噪声大了模型自然抓不住重点。还有个容易忽略的点是bge模型对query和passage的指令前缀要不要加,bge-large-zh-v1.5其实建议query前面加一句“为这个句子生成表示以用于检索相关文章”,不加的话召回质量会掉一截。生成端漏细节也可能是prompt太宽松了,你试试明确要求“只根据提供的上下文回答,逐条列出依据”,Qwen2-7B的指令跟随还行,约束一下会好很多。另外重排真的值得加,拿bge-reranker-base过一遍top-20再取前5,比单纯调embedding管用多了。
你这个配置其实挺常见,bge-large-zh配Qwen2-7B本身没大毛病。漏细节多半出在检索后直接拼上下文这一步,试试加个rerank模型比如bge-reranker-v2-m3,召回top20再精排到top5,效果会稳不少。chunk我建议别死磕512还是1024,按语义切分加个overlap更靠谱,知识库文档结构杂的话1024容易混进无关内容。另外Qwen2-7B的上下文窗口够用,但prompt里最好明确让它基于给定片段回答,不然它爱自己发挥。
bge-large-zh配Qwen2-7B这个组合本身没大毛病,漏细节大概率出在检索后处理上。你试试把chunk重叠调大一点,512配80-100的overlap,再把top-k从默认的3提到5-8,然后加个rerank模型过一遍,bge-reranker-base就够用。还有个容易忽略的点,Qwen2的prompt模板里context拼接方式会影响它对长文本的注意力,把关键段落放前面试试。