稀疏向量
稀疏向量 :稀疏向量也叫"词法向量"。是基于词频统计的检索方法,简单理解就是统计某一个词在一篇文章中出现的次数。缺点是无法理解语义。常用的算法有:BM25。
在LangChain中使用BM25Retriever进行搜索
python
from langchain_community.retrievers import BM25Retriever
# BM25检索器
bm25_retriever = BM25Retriever.from_documents(
chunks,
k=5
)
# 使用bm25_retriever进行向量搜索
bm25_docs = bm25_retriever.invoke("这里是搜索的关键字")
如果多次执行上面这段代码,你可能会发现一个问题。即使换了搜索关键字,搜索出来的内容还是一样的。这是因为BM25Retriever默认的分词器不支持对中文进行分词。
向量化
使用BM25Retriever进行搜索时,不需要提前将待搜索的内容向量化。因为BM25Retriever 是一个基于关键词的检索器 。核心是统计和匹配 ,而不是"理解"语义。完全基于词项的精确匹配和统计 。只有文档中精确出现目标词汇时,这个词才会被匹配。
当要搜索的内容(chunks)非常多时,可以使用Elasticsearch / OpenSearch 等专业软件。Elasticsearch内置了成熟的 BM25 实现。或者使用bm25s等第三方库。
安装jieba这个库
安装jieba这个中文分词器库。
python
uv add jieba
from langchain_community.retrievers import BM25Retriever
from langchain_core.documents import Document
import jieba
# 给BM25Retriever指定中文分词器jieba.cut(x)
bm25_retriever = BM25Retriever.from_documents(
self.chunks,
k=5,
preprocess_func= lambda x: list(jieba.cut(x)),
)
# 使用bm25_retriever进行向量搜索
bm25_docs = bm25_retriever.invoke("这里是搜索的关键字")
jieba是干什么的?
python
import jieba
print(jieba.lcut("南京市长江大桥"))
print(jieba.lcut("what are you doing?"))
for item in jieba.cut("南京市长江大桥"):
print(item)
