技术背景介绍
在现代的信息检索系统中,简单的基于向量的检索(Retriever)有时可能无法提供最优的结果排序。为了解决这个问题,我们可以使用Cross Encoder来对初步检索结果进行重新排序(Reranking),以提高检索结果的相关性。Cross Encoder利用语言模型的强大语义理解能力,能够更精确地比较查询与文档之间的相关性。
核心原理解析
Cross Encoder通过将查询与文档连接起来形成输入对,使用深度学习模型进行评分,从而为每个文档计算一个相关性分数。通过重新排序这些分数可以获得更符合用户意图的结果。
代码实现演示
以下示例展示了如何利用Langchain和Hugging Face的Cross Encoder模型来实现检索结果的重排序。
# 安装必要的Python包
!pip install faiss-cpu sentence_transformers
# 导入必要的库
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
# 加载并分割文档
documents = TextLoader("../../how_to/state_of_the_union.txt").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
# 使用 Hugging Face 的 sentence-transformers 进行嵌入操作
embeddingsModel = HuggingFaceEmbeddings(model_name="sentence-transformers/msmarco-distilbert-dot-v5")
retriever = FAISS.from_documents(texts, embeddingsModel).as_retriever(search_kwargs={"k": 20})
# 基本检索操作
query = "What is the plan for the economy?"
docs = retriever.invoke(query)
# 使用 Cross Encoder 进行结果重排序
model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-base")
compressor = CrossEncoderReranker(model=model, top_n=3)
compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)
compressed_docs = compression_retriever.invoke("What is the plan for the economy?")
# 输出结果
def pretty_print_docs(docs):
print(f"\n{'-' * 100}\n".join([f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]))
pretty_print_docs(compressed_docs)
应用场景分析
这种技术对于需要高精度检索的场景非常有效,比如:
- 法律文档的检索与分析
- 医疗信息系统中症状与诊断的匹配
- 客户服务中的FAQ自动响应系统
实践建议
- 在使用Cross Encoder进行重排序时,请选择与您的应用场景充分匹配的预训练模型。
- 可以通过自定义微调来提升模型在特定领域的表现。
- 注意计算资源的消耗,Cross Encoder的计算需求相对较高,应合理分配资源。
上传Hugging Face模型到SageMaker Endpoint
为了在生产环境中高效部署,我们可以将Hugging Face模型上传至AWS SageMaker Endpoint。这允许我们在云端以高效、可扩展的方式运行为重排序服务。
如果遇到问题欢迎在评论区交流。
—END—