概要

实现RAG有多种手段。本文仅介绍使用Langchain+Ollama的方式,读取本地PDF进行知识问答实现RAG的一种最简单的实例。

整体架构流程

1.安装依赖包

conda install -c pytorch faiss-gpu
pip install PyMuPDF
pip install langchain

提示:faiss也可以使用cpu版本
此外,本地部署Ollama的模型请参考其他文章

2.准备PDF

放置pdf至
./rag_storage/1.pdf

3.调用问答chain

全部代码如下:

from flask import Flask, request, jsonify
from langchain_ollama import ChatOllama
import fitz  # PyMuPDF
from langchain.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA

app = Flask(__name__)
model_name = "qwen2.5:14b"
# 初始化模型
llm = ChatOllama(
    model=model_name,
)

# 加载 PDF 文档
pdf_file = "./rag_storage/1.pdf"  # 替换为你的 PDF 文件路径

# 定义加载 PDF 的函数
def load_pdf(file_path):
    loader = PyMuPDFLoader(file_path)
    documents = loader.load()
    return documents

documents = load_pdf(pdf_file)
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
text_chunks = text_splitter.split_documents(documents)
# 创建 Ollama 嵌入和向量存储
embeddings = OllamaEmbeddings(model=model_name) 
vector_store = FAISS.from_documents(text_chunks, embeddings)
# 创建检索问答链
retriever = vector_store.as_retriever()
# 创建检索问答链
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
# 进行问答
if __name__ == '__main__':
    while True:
        question = input("请输入问题(输入 'exit' 结束对话):")
        if question.lower() == 'exit':
            print("结束对话。")
            break
        answer = qa_chain.run(question)
        print("回答:", answer)

小结

本实例仅介绍了一种最简单的RAG实现方式,使用RAG技术的同时,大模型与直接调用的大模型会拥有不同的回答。

Logo

一站式 AI 云服务平台

更多推荐