Bootstrap

使用Jina Reranker实现文档压缩与检索

# 使用Jina Reranker实现文档压缩与检索

老铁们,今天咱们来聊聊如何使用Jina Reranker来进行文档压缩和检索。这项技术其实不难,关键在于如何高效地集成到我们的处理流程中。下面我将通过实例代码一步步带大家实现这一过程。

## 环境准备

首先,我们需要安装一些必要的库:

```bash
%pip install -qU langchain langchain-openai langchain-community langchain-text-splitters langchainhub
%pip install --upgrade --quiet  faiss

对于不同的Python版本,可能需要安装faiss_cpu

%pip install --upgrade --quiet  faiss_cpu

另外,我通常会写一个文档打印的辅助函数,方便调试和查看结果:

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)]
        )
    )

初始化向量存储检索器

说白了,我们需要从文本加载器开始,将文档切割成合理大小的块,然后用FAISS库创建一个向量检索器。

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()
os.environ["JINA_API_KEY"] = getpass.getpass()

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

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

使用JinaRerank进行重排序

接下来,我们要用Jina Reranker来对检索到的文档进行重排序。这个操作可以说是相当丝滑。

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的重排序

最后,我们结合OpenAI模型进行QA的重排序,这波操作让整个流程的智能化程度进一步提升。

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

retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
retrieval_qa_chat_prompt.pretty_print()

from langchain_openai import ChatOpenAI

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---
;