基于DeepSeek R1的RAG实战

本指南将向你展示如何使用开源推理工具 DeepSeek R1 和用于运行本地 AI 模型的轻量级框架 Ollama 构建检索增强生成 (RAG) 系统。

基于DeepSeek R1的RAG实战

你是否曾希望直接向 PDF 或技术手册提问?本指南将向你展示如何使用开源推理工具 DeepSeek R1 和用于运行本地 AI 模型的轻量级框架 Ollama 构建检索增强生成 (RAG) 系统。

1、为什么选择 DeepSeek R1?

DeepSeek R1 是一种与 OpenAI 的 o1 相当但便宜 95% 的模型,它正在彻底改变 RAG 系统。开发人员喜欢它,因为它:

  • 重点检索:每个答案仅使用 3 个文档块。
  • 严格提示:避免用“我不知道”的回答产生幻觉。
  • 本地执行:消除云 API 延迟。

2、构建本地 RAG 系统所需的条件

2.1 Ollama

Ollama 可让你在本地运行 DeepSeek R1 等模型。

  • 下载:Ollama
  • 设置:通过终端安装并运行以下命令。
ollama run deepseek-r1  # For the 7B model (default)  

2.2 DeepSeek R1 模型变体

DeepSeek R1 参数范围从 1.5B 到 671B。对于轻量级 RAG 应用程序,请从 1.5B 模型开始。

ollama run deepseek-r1:1.5b

专业提示:较大的模型(例如 70B)提供更好的推理能力,但需要更多 RAM。

3、构建 RAG 管道的分步指南

3.1 导入库

我们将使用:

import streamlit as st  
from langchain_community.document_loaders import PDFPlumberLoader  
from langchain_experimental.text_splitter import SemanticChunker  
from langchain_community.embeddings import HuggingFaceEmbeddings  
from langchain_community.vectorstores import FAISS  
from langchain_community.llms import Ollama

3.2 上传和处理 PDF

利用 Streamlit 的文件上传器选择本地 PDF。使用 PDFPlumberLoader 高效提取文本,无需手动解析。

# Streamlit file uploader  
uploaded_file = st.file_uploader("Upload a PDF file", type="pdf")  

if uploaded_file:  
    # Save PDF temporarily  
    with open("temp.pdf", "wb") as f:  
        f.write(uploaded_file.getvalue())  

    # Load PDF text  
    loader = PDFPlumberLoader("temp.pdf")  
    docs = loader.load()

3.3 策略性地分块文档

利用 Streamlit 的文件上传器选择本地 PDF。使用 SemanticChunker 策略性地分块文本。

# Split text into semantic chunks  
text_splitter = SemanticChunker(HuggingFaceEmbeddings())  
documents = text_splitter.split_documents(docs)

3.4 创建可搜索的知识库

为块生成向量嵌入并将其存储在 FAISS 索引中。

嵌入允许快速、上下文相关的搜索。

# Generate embeddings  
embeddings = HuggingFaceEmbeddings()  
vector_store = FAISS.from_documents(documents, embeddings)  

# Connect retriever  
retriever = vector_store.as_retriever(search_kwargs={"k": 3})  # Fetch top 3 chunks

3.5 配置 DeepSeek R1

使用 DeepSeek R1 1.5B 模型设置 RetrievalQA 链。

这可确保答案以 PDF 的内容为基础,而不是依赖于模型的训练数据。

llm = Ollama(model="deepseek-r1:1.5b")  # Our 1.5B parameter model  

# Craft the prompt template  
prompt = """  
1. Use ONLY the context below.  
2. If unsure, say "I don’t know".  
3. Keep answers under 4 sentences.  

Context: {context}  

Question: {question}  

Answer:  
"""  
QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt)

3.6 组装 RAG 链

将上传、分块和检索集成到一个有凝聚力的管道中。

这种方法为模型提供了经过验证的上下文,从而提高了准确性。

# Chain 1: Generate answers  
llm_chain = LLMChain(llm=llm, prompt=QA_CHAIN_PROMPT)  

# Chain 2: Combine document chunks  
document_prompt = PromptTemplate(  
    template="Context:\ncontent:{page_content}\nsource:{source}",  
    input_variables=["page_content", "source"]  
)  

# Final RAG pipeline  
qa = RetrievalQA(  
    combine_documents_chain=StuffDocumentsChain(  
        llm_chain=llm_chain,  
        document_prompt=document_prompt  
    ),  
    retriever=retriever  
)

3.7 启动 Web 界面

Streamlit 使用户能够键入问题并立即获得答案。

查询检索匹配的块,将它们提供给模型,并实时显示结果。

# Streamlit UI  
user_input = st.text_input("Ask your PDF a question:")  

if user_input:  
    with st.spinner("Thinking..."):  
        response = qa(user_input)["result"]  
        st.write(response)

你可以在此处找到完整代码。

4、使用 DeepSeek 的 RAG 的未来

DeepSeek R1 只是一个开始。借助即将推出的自我验证和多跳推理等功能,未来的 RAG 系统可以自主辩论和完善其逻辑。

立即构建你自己的 RAG 系统并释放基于文档的 AI 的全部潜力!


原文链接:Developing RAG Systems with DeepSeek R1 & Ollama (Complete Code Included)

汇智网翻译整理,转载请标明出处