最近在搭一个简单的RAG系统,用LangChain+FAISS,文档是几篇技术博客。
问题是,检索出来的chunk经常是零散的段落,甚至句子被截断,大模型回答时感觉像是东拼西凑,逻辑有点跳跃。
我试过调chunk_size和overlap,但要么太长超限,要么信息还是碎。
有没有大佬分享下你们是怎么切分文本的?或者有没有什么策略让模型在多个片段里“抓主线”?
目前用的是GPT-3.5-turbo,检索模型是BGE-small。先谢过!
RAG检索到的都是片段,怎么让大模型回答得更连贯?
全部回复
共 166 条我一般会加一步重排序,再让模型自己整理下顺序,效果会好不少。
可以试试在prompt里让模型先梳理检索片段的逻辑关系再作答,比调chunk_size管用。
可以试试用句子窗口检索,召回后把前后相邻的chunk也带上,连贯性能好不少。
这个问题我也踩过坑,后来发现光调chunk_size确实解决不了根本问题,因为语义边界和固定长度切分本身就是矛盾的。我现在的做法是先用语义分割(比如按标题、段落或者用embedding相似度突变点来切),保证每个chunk尽量是完整的意思单元,然后再加一层小的overlap做缓冲。另外你可以试试在检索后加一个rerank步骤,把最相关的几个片段重新排序,有时候碎片化是因为召回了太多不相关的chunk,模型被迫在噪声里拼凑。还有个挺有用的技巧是给每个chunk加上它所属的文档标题和前后文摘要,让模型知道这段话的语境,回答时就不容易跳。如果预算允许,把top_k降下来但提高相关性阈值,宁可少给几个精准片段,也别塞一堆半相关的进去。最后prompt里可以明确要求模型先梳理各片段之间的逻辑关系再作答,亲测对连贯性有帮助。
我最近也在折腾这个,感觉光调chunk参数确实治标不治本。可以试试在检索后加一步rerank,把最相关的片段重新排个序,再喂给模型。另外prompt里明确让它先梳理各片段之间的逻辑关系,再组织答案,效果会好一些。你用的BGE-small本身对长文本就有点吃力,换大一点的embedding模型或者做点query改写可能也有帮助。
我之前也踩过这个坑,后来发现光调chunk参数治标不治本。可以试试在检索后加一步rerank,把最相关的片段按逻辑顺序重排再塞给模型。另外prompt里明确让它“基于以上片段整合回答,不要逐段复述”也挺管用。还有个思路是用sentence-window retrieval,检索到某个句子后把前后文一起带出来,连贯性会好很多。