前面课程给大家介绍了文档分割,也讲了问答的流程。接下来,就是把这两块结合起来,做一个完整的文档检索问答功能。

代码示例

1、创建文件

# langchian_12_retrieval.py
from langchain.chat_models import ChatOpenAI
from dotenv import load_dotenv

load_dotenv()

llm = ChatOpenAI(model='gpt-3.5-turbo-1106')

2、加载并分割文档

# 加载文档并分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyMuPDFLoader

loader = PyMuPDFLoader('./data/about.pdf')
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=50,
    chunk_overlap=10
)
documents = loader.load_and_split(text_splitter)
# print(len(documents))

3、召回相似片段

# 召回相似片段
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores.faiss import FAISS

embedding = OpenAIEmbeddings(model='text-embedding-ada-002')

documents_db = FAISS.from_documents(documents, embedding)

question = '陈华编程是什么?'
retrieval_ducuments = documents_db.similarity_search(question, k=3)

4、基于召回片段回答问题

# 基于召回片段问答
from langchain.chains.question_answering import load_qa_chain

chain = load_qa_chain(llm=llm, chain_type='stuff', verbose=True)
result = chain.run(input_documents=retrieval_ducuments, question=question)
print(result)

好的,基于文档检索问答的功能,就讲完了,但是还存在一个小问题,就是每次提交问题,都需要重新加载文档,然后向量化,这个流程是不太合理的。所以,下节课我们讲,把向量化之后的文档缓存下来,这样就不用每次都重新加载了。

本文链接:http://www.ichenhua.cn/edu/note/700

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!