搞了半年RAG,说点大实话。很多人觉得RAG就是把文档丢进向量库,然后问问题就完事了——Too young。真正上线才知道,检索环节才是性能瓶颈。
先说文档切分。别用固定长度切块,语义完整性比啥都重要。我试过RecursiveCharacterTextSplitter配2000 token+200重叠,效果吊打直接按字符切。但要注意,太小的chunk(比如256)会让检索碎片化,上下文全丢了。
再说嵌入模型选型。别迷信大模型自带的embedding,实测bge-large-zh-v1.5在中文场景下比text-embedding-ada-002还稳,尤其是专业术语。有条件就用SentenceTransformer微调一下领域数据,召回率能提15%。
最后是检索策略。别只靠向量相似度,BM25+向量检索的混合方案才是王道。我用ElasticSearch做关键词召回,再跟向量结果重排序,最终回答质量直接上了一个台阶。如果预算够,再加个Cross-encoder rerank,效果更狠。
顺便提一句,大模型温度设0.2以下,不然检索到的正确信息可能被“脑补”歪了。
大家在实际部署RAG时,遇到过哪些反直觉的坑?来聊聊。 |