用Jina Reranker进行文档压缩与检索

老铁们,今天我们来聊聊如何使用Jina Reranker进行文档压缩和检索。这波操作可以说是相当丝滑,特别适合需要在大量文本数据中获取精准信息的场景。

技术背景介绍

在信息检索系统中,我们经常面临数据量大且不容易找到相关信息的问题。Jina Reranker就是个好帮手,可以帮助我们在初步检索的结果中重新排序,提升检索的准确性和效率。

原理深度解析

说白了,Jina Reranker利用先进的语义理解能力对初步检索结果进行重新排序。通过结合上下文信息,它能更智能地判断哪些文档与查询更相关。配合向量存储和文本分割技术,能显著提升检索效果。

实战代码演示

我们先来安装必要的库:

%pip install -qU langchain langchain-openai langchain-community langchain-text-splitters langchainhub
%pip install --upgrade --quiet faiss
# OR
%pip install --upgrade --quiet faiss_cpu

接下来,设置基础的向量存储检索器,并存储2023年的国情咨文:

import getpass
import os
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import JinaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 输入OpenAI的API密钥
os.environ["JINA_API_KEY"] = getpass.getpass()  # 输入Jina的API密钥

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)

embedding = JinaEmbeddings(model_name="jina-embeddings-v2-base-en")
retriever = FAISS.from_documents(texts, embedding).as_retriever(search_kwargs={"k": 20})

query = "What did the president say about Ketanji Brown Jackson"
docs = retriever.get_relevant_documents(query)

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(docs)

此处我们利用了JinaEmbeddingsFAISS库进行向量存储。这波操作后,我们就能从国情咨文中检索我们需要的部分,比如关于Ketanji Brown Jackson的发言。

优化建议分享

在基础检索器之上,我们可以用Jina Rerank进行文档重排,以更精确地找到相关内容。如下是详细代码实现:

from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.document_compressors import JinaRerank

compressor = JinaRerank()
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

compressed_docs = compression_retriever.get_relevant_documents(
    "What did the president say about Ketanji Jackson Brown"
)

pretty_print_docs(compressed_docs)

这样做可以进一步提高检索精度。

补充说明和总结

最后,为了实现基于QA的重排序,我们可以结合langchain的工具:

from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_openai import ChatOpenAI

retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
chain = create_retrieval_chain(compression_retriever, combine_docs_chain)

chain.invoke({"input": query})

这套结构让我们不仅能检索内容,还能够自动回答与内容相关的问题,我个人一直在用它进行信息的高效管理。

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值