链载Ai

标题: BM25算法基本使用以及在RAG中的应用 [打印本页]

作者: 链载Ai    时间: 6 小时前
标题: BM25算法基本使用以及在RAG中的应用
概述

BM25算法被多种RAG开源框架和向量库的向量查询中提到或使用到。本文介绍BM25算法的基本原理,并通过一个可运行的例子来说明如何使用BM25算法。

BM25(Best Match 25)是一种用于信息检索的概率模型,常用于搜索引擎和问答系统中。在RAG(Retrieval-Augmented Generation)框架中,BM25用于从大规模文档库中检索与查询最相关的文档。

BM25基于词频(TF)和逆文档频率(IDF)计算文档与查询的相关性,结合了文档长度归一化,能够有效处理不同长度的文档。

BM25的基本使用

下面是一个使用Python实现BM25算法的完整示例。我们将使用rank_bm25库,这是一个常用的BM25实现库,可以方便地计算文档与查询的相关性。

安装依赖库

pipinstallrank-bm25

编写测试代码

代码的基本逻辑如下:

(1)分别对每个文档和问题进行分词处理

(2)通过分词后的文档列表来初始化BM25算法

(3)计算问题(query)与分词列表进行相似度比较

(4)从文档列表中找到相关性分数最大的文档,该文档即是我们要找的文档。

代码的实现如下:

fromrank_bm25importBM25Okapi
importjieba# 用于中文分词

# 示例文档库
documents=[
"猫是一种可爱的动物,喜欢抓老鼠。",
"狗是人类的好朋友,喜欢追猫。",
"老鼠是一种小型啮齿动物,猫喜欢抓它们。"
]
print(documents)

# 用户查询
query="猫喜欢抓什么动物?"
print("问题: "+query)

# 对文档和查询进行分词
deftokenize(text):
returnlist(jieba.cut(text))

# 分词后的文档库
tokenized_documents=[tokenize(doc)fordocindocuments]
# 分词后的查询
tokenized_query=tokenize(query)

# 初始化BM25模型
bm25=BM25Okapi(tokenized_documents)
# 计算查询与文档的相关性得分
doc_scores=bm25.get_scores(tokenized_query)
# 打印每个文档的得分
fori,scoreinenumerate(doc_scores):
print(f"文档{i+1}的 BM25 得分:{score}")

# 找到最相关的文档
most_relevant_doc_index=doc_scores.argmax()
print(f"\n最相关的文档是文档{most_relevant_doc_index+1}:{documents[most_relevant_doc_index]}")


代码说明

  1. 分词






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5