目录
chroma 检索
faiss 检索
检索器
相似性
最大相关性mmr
相似数阈值
txt 有多行,我的这份数据有 67 行,样例如下:
字段1\t值1\n
字段2\t值2\n
...
chroma 检索
pip install langchain-chroma
在本地下载了 embedding 模型,使用去向量化,并检索 top3
指定向量化后的数据库保存到哪里 persist_directory
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chroma
filepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()
# 按行分割块
text_splitter = CharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separator="\n",
length_function=len,
is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# 创建向量数据库
db = Chroma.from_documents(documents, embedding, persist_directory=r"./chroma/")
db.persist() # 确保嵌入被写入磁盘
'''
如果已经创建好了,可以直接读取
db = Chroma(persist_directory=persist_directory, embedding_function=embedding)
'''
# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
docs = db.similarity_search(query, k=3)
# docs = db.similarity_search_with_score(query, k=3) # 带分数的
print(docs[0].page_content)
# 传入向量去搜索
embedding_vector = embedding.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector, k=3)
print(docs[0].page_content)
faiss 检索
pip install faiss-cpu
感觉 faiss 向量化要快一些
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chroma
filepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()
# 按行分割块
text_splitter = CharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separator="\n",
length_function=len,
is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# 创建向量数据库
db = FAISS.from_documents(documents, embedding)
# 保存
db.save_local("./faiss_index")
'''
如果已经创建好了,可以直接读取
db = FAISS.load_local("./faiss_index", embeddings)
'''
# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
docs = db.similarity_search(query, k=3)
# docs = db.similarity_search_with_score(query, k=3) # 带分数的
print(docs[0].page_content)
# 传入向量去搜索
embedding_vector = embedding.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector, k=3)
print(docs[0].page_content)
检索器
相似性
在上面默认情况下,向量存储检索器使用相似性搜索
我们在用上面的例子,使用 faiss 已经创建好了向量数据库,我们在最后面修改检索的代码
选取 top30
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.vectorstores import Chroma
filepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()
# 按行分割块
text_splitter = CharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separator="\n",
length_function=len,
is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)
# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')
# # 创建向量数据库
# db = FAISS.from_documents(documents, embedding)
# # 保存
# db.save_local("./faiss_index")
# 如果已经创建好了,可以直接读取
db = FAISS.load_local("./faiss_index", embedding, allow_dangerous_deserialization=True)
# 直接传入文本
query = "材料科学与工程是一门研究材料的组成、性质、制备、加工及应用的多学科交叉领域。它涵盖了金属、无机非金属"
retriever = db.as_retriever(search_kwargs={'k': 30}) # 构建检索器
docs = retriever.get_relevant_documents(query)
print(docs)
最大相关性mmr
retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 30}) # 构建检索器
会发现我指定 top30,只返回了 20 个
fetch_k 默认是 20,数据库提取的候选文档数量,理解为 mmr 算法使用时内部操作的参数就可以了
想取出 30 那,只需要设置大于 30 即可
retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 30, 'fetch_k': 50}) # 构建检索器
相似数阈值
相似度大于 0.5 的拿出来
retriever = db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5}) # 构建检索器