老铁们,今天我们来聊聊如何使用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)
此处我们利用了JinaEmbeddings
和FAISS
库进行向量存储。这波操作后,我们就能从国情咨文中检索我们需要的部分,比如关于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—