了解BM25:
BM25是信息检索系统中使用的排名算法,用于估计文档与给定搜索查询的相关性。
BM25的关键元素:
score(d, q) = ∑(tf(i, d) * idf(i) * (k1 + 1)) / (tf(i, d) + k1 * (1 - b + b * (dl / avgdl)))
BM25/关键词搜索何时理想?
实际应用:构建混合搜索系统
想象你正在为一个大型数字图书馆打造搜索系统。你不仅希望它能找到带有特定关键字的文档,也希望它能把握每个查询背后的上下文和语义。方法如下:
什么是混合搜索?
混合搜索可以被想象成一个放大镜,它不仅仅看表面,而且会深入探究。它是一种两管齐下的方法:
我们来看看代码片段。在这里,我们将使用带有LanceDB向量存储的langchain。
# example of using bm25 & lancedb -hybrid serch
from langchain.vectorstores import LanceDB
import lancedb
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.schema import Document
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader
# Initialize embeddings
embedding = OpenAIEmbeddings()
并加载一个单独的PDF文件。
# load single pdf
loader = PyPDFLoader("/content/Food_and_Nutrition.pdf")
pages = loader.load_and_split()
创建BM25稀疏关键词匹配检索器
# Initialize the BM25 retriever
bm25_retriever = BM25Retriever.from_documents(pages)
bm25_retriever.k = 2 # Retrieve top 2 results
创建lancedb向量存储以进行密集型语义搜索/检索。
db = lancedb.connect('/tmp/lancedb')
table = db.create_table("pandas_docs", data=[
{"vector": embedding.embed_query("Hello World"), "text": "Hello World", "id": "1"}
], mode="overwrite")
# Initialize LanceDB retriever
docsearch = LanceDB.from_documents(pages, embedding, connection=table)
retriever_lancedb = docsearch.as_retriever(search_kwargs={"k": 2})
现在将两个检索器组装起来,在这里你可以为它分配权重。
# Initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, retriever_lancedb],
weights=[0.4, 0.6])
# Example customer query
query = "which food needed for building strong bones and teeth ?
which Vitamin & minerals importat for this?"
# Retrieve relevant documents/products
docs = ensemble_retriever.get_relevant_documents(query)
利用集成检索器,它尝试在文档中搜索每个词语,例如“强健的骨骼和牙齿”,同时它还通过使用lancedb进行搜索,这将基于相似性找到最相似的文档。
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(openai_api_key="sk-yourapikey")
#if you want to use opensource models such as lama,mistral check this
# https://github.com/lancedb/vectordb-recipes/blob/main/tutorials/chatbot_using_Llama2_&_lanceDB
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=ensemble_retriever)
query = "what nutrition needed for pregnant women "
qa.run(query)
在数据库中使用BM25算法搜索关键词——“孕妇营养”,并返回最佳匹配结果。同时,我们也在使用LanceDB来进行这项工作。这展示了它在提取文本时更强大的能力。
以下是回答。