来源:互联网 更新时间:2026-08-21 14:33
ThinkRAG大模型RAG实战系列文章,带你深入探索使用LlamaIndex框架,构建本地大模型知识库问答系统。本系列涵盖知识库管理、检索优化、模型本地部署等主题,通过代码与实例,讲解如何打造生产级系统,实现本地知识库的快速检索与智能问答。

此前,一篇文章详细介绍了使用Elasticsearch实现混合检索。而今天要说的是另一种效果更好的方案——在实际问答场景中,它比向量数据库自带的混合检索功能更胜一筹。
目前,大模型RAG系统中普遍采用混合检索来提升检索准确性。
核心思路很简单:针对待回答的问题,同时跑两路检索——一路是
这就是混合检索的基本原理。
借助向量数据库(比如Chroma、LanceDB,或者之前提到的Elasticsearch),实现向量检索非常容易。所以实现混合检索的关键问题就落在了:如何做好全文检索?
好在LlamaIndex提供了
BM25是一种文本相关度检索方法,核心是判断一个文档和查询语句的匹配程度——搜索引擎里对搜索结果排序,用的就是类似的思路。
这种相关度判断,主要基于词语权重和文档权重的融合。
TF和IDF结合起来就形成了经典的
不过,该检索器默认使用的tokenizer不支持中文,所以需要引入
代码如下:
import jieba
from typing import List
def chinese_tokenizer(text: str) -> List[str]:
return list(jieba.cut(text))
class SimpleBM25Retriever(BM25Retriever):
@classmethod
def from_defaults(cls, index, similarity_top_k, **kwargs) -> "BM25Retriever":
docstore = index.docstore
return BM25Retriever.from_defaults(
docstore=docstore, similarity_top_k=similarity_top_k, verbose=True,
tokenizer=chinese_tokenizer, **kwargs
)
用向量检索时,我们通常基于index构建检索器。同样,定制的BM25检索器也把index作为参数传入,构建时传递index.docstore。BM25检索的内容基于LlamaIndex框架中的文档存储(docstore)。
之前的文章中提到过,可以采用MongoDB作为文档存储和索引存储。但如果改用
接下来要把向量检索和BM25检索到的结果融合起来。LlamaIndex提供了一个很优雅的方法:
基于此,可以定制一个新的类
代码如下:
class SimpleFusionRetriever(QueryFusionRetriever):
def __init__(self, vector_index, top_k=2, mode=FUSION_MODES.DIST_BASED_SCORE):
self.top_k = top_k
self.mode = mode
# Build vector retriever from vector index
self.vector_retriever = VectorIndexRetriever(
index=vector_index, similarity_top_k=top_k, verbose=True,
)
# Build BM25 retriever from document storage
self.bm25_retriever = SimpleBM25Retriever.from_defaults(
index=vector_index, similarity_top_k=top_k,
)
super().__init__(
[self.vector_retriever, self.bm25_retriever],
retriever_weights=[0.6, 0.4],
similarity_top_k=top_k,
num_queries=1, # set this to 1 to disable query generation
mode=mode,
use_async=True,
verbose=True,
)
融合处理的模式设置为
class FUSION_MODES(str, Enum):
RECIPROCAL_RANK = "reciprocal_rerank" # 应用倒数排序融合
RELATIVE_SCORE = "relative_score" # 应用相对得分融合
DIST_BASED_SCORE = "dist_based_score" # 应用基于距离的得分融合
SIMPLE = "simple" # 基于原始得分简单重排序
先说说
而我们采用的
QueryFusionRetriever还有一个很有趣的特性:它可以将原始查询通过LLM改写生成最多4个新查询,然后对每个检索器都逐一检索。如果有2个检索器,一共就是4×2=8次检索。最终对这些结果用上述算法进行融合,去重并重新排序。
我们这次只是实验混合检索,不希望因为过多的LLM调用而增加延迟,所以将参数num_queries设为1,禁用查询生成。
本文介绍了使用LlamaIndex实现“稠密向量检索 + BM25全文检索”的混合检索方法,属于典型的2路召回。
值得关注的是,IBM最近的研究文章对比了各种检索方式的组合,提出采用
后续将继续探索使用LlamaIndex实现3路召回混合检索,届时会与大家分享结果。
本文中的代码,都可以在
https://github.com/wzda vid/ThinkRAG
ThinkRAG是基于LlamaIndex框架、前端使用Streamlit开发的大模型知识库RAG系统,可本地部署和离线运行。
腾讯ima怎么把微信内容一键导入知识库?
黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元
腾讯ima怎么创建共享知识库?
CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
WorkBuddy微信版怎么获得积分?
5000元起的鼠标哪个最值得入手?
蚂蚁庄园今日答案7月21日(今日已更新) 蚂蚁庄园今天正确答案是什么呢
车载冰箱重置到出厂设置几步?
短剧《史上最强洪荒修为》剧情介绍
kimi提示词专家使用方法新手指南
结婚家电首选:Leader懒人三筒Ultra热泵洗烘一体
腾讯ima知识库怎么分类管理?
短剧《仙人跳获透视,古玩玉器我全拿捏》剧情介绍
Windy卫星云图怎么看?云层变化识别技巧
一加手机如何设置三指长按屏幕局部截图
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc