1.概述

掌握如何借助 DeepSeek R1 与 Ollama 搭建检索增强生成(RAG)系统。本文将通过代码示例,为你提供详尽的分步指南、设置说明,分享打造智能 AI 应用的最佳实践。

2.内容

2.1 为什么选择DeepSeek R1?

在这篇文章中,我们将探究性能上可与 OpenAI 的 o1 相媲美、但成本却低 95% 的 DeepSeek R1,如何为你的检索增强生成(RAG)系统带来强大助力。我们来深入剖析为何开发者们纷纷热衷于这项技术,以及你怎样利用它构建自己的 RAG 流程。

DeepSeek R1 的 15 亿参数模型在这方面表现出色,原因如下:

  • 精准检索:每个答案仅关联 3 个文档片段
  • 严格提示:采用 “我不知道” 策略,避免模型产生幻觉
  • 本地执行:与云 API 相比,实现零延迟

环境:

组件 成本
DeepSeek R1 1.5B 免费
Ollama 免费
16GB 内存的个人电脑 0 元

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

1.Ollama

Ollama 允许你在本地运行诸如 DeepSeek R1 之类的模型。

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

2.DeepSeek R1 模型

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

ollama run deepseek-r1:1.5b 

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

2.3 构建 RAG 管道

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  

2.上传并处理 PDF

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

# Streamlit文件上传器
uploaded\_file = st.file\_uploader("Upload a PDF file", type="pdf")

if uploaded\_file:
    # 临时保存PDF文件
    with open("temp.pdf", "wb") as f:
        f.write(uploaded\_file.getvalue())

    # 加载PDF文本
    loader = PDFPlumberLoader("temp.pdf")
    docs \= loader.load()

3.策略性地整理文件

我们打算使用递归字符文本分割器(RecursiveCharacterTextSplitter),该代码会将原始的 PDF 文本拆分成更小的片段(块)。下面我们来解释一下合理分块与不合理分块的概念:

为什么要进行语义分块呢?
语义分块能够将相关的句子归为一组(例如,“Milvus 如何存储数据” 这样的内容会保持完整),还能避免拆分表格或图表。

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

# 将文本拆分为语义块  
text\_splitter = SemanticChunker(HuggingFaceEmbeddings())   
documents \= text\_splitter.split\_documents(docs)

这一步通过让各文本片段稍有重叠来保留上下文信息,这有助于语言模型更准确地回答问题。小而明确的文档片段还能让搜索变得更高效、更具相关性。

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  

这一过程将文本转换为一种数值表示形式,从而使查询变得更加容易。后续的查询操作将针对该索引展开,以找出上下文最为相关的文本片段。

5.配置 DeepSeek R1

在这里,你要使用 Deepseek R1 1.5B 参数模型作为本地大语言模型(LLM)来实例化一个检索问答(RetrievalQA)链。

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)  

这个模板会迫使模型依据你 PDF 文档的内容来给出答案。通过将语言模型与和 FAISS 索引绑定的检索器相结合,任何通过该链发起的查询都会从 PDF 内容中查找相关上下文,从而让答案有原始材料作为依据。

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  
)

这就是检索增强生成(RAG)设计的核心所在,它为大语言模型提供经过验证的上下文信息,而非让其单纯依赖自身的内部训练数据。

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)  

一旦用户输入查询内容,检索链就会找出最匹配的文本片段,将其输入到语言模型中,并显示答案。只要正确安装了langchain库,代码现在应该就能正常运行,不会再触发模块缺失的错误。
提出并提交问题,即可立即获得答案!

8.完整示例代码

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
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from langchain.chains.combine\_documents.stuff import StuffDocumentsChain
from langchain.chains import RetrievalQA

# color palette
primary\_color = "#1E90FF"
secondary\_color \= "#FF6347"
background\_color \= "#F5F5F5"
text\_color \= "#4561e9"

# Custom CSS
st.markdown(f"""
    <style>
    .stApp {{
        background-color: {background\_color};
        color: {text\_color};
    }}
    .stButton>button {{
        background-color: {primary\_color};
        color: white;
        border-radius: 5px;
        border: none;
        padding: 10px 20px;
        font-size: 16px;
    }}
    .stTextInput>div>div>input {{
        border: 2px solid {primary\_color};
        border-radius: 5px;
        padding: 10px;
        font-size: 16px;
    }}
    .stFileUploader>div>div>div>button {{
        background-color: {secondary\_color};
        color: white;
        border-radius: 5px;
        border: none;
        padding: 10px 20px;
        font-size: 16px;
    }}
    </style>
""", unsafe\_allow\_html=True)

# Streamlit app title
st.title("Build a RAG System with DeepSeek R1 & Ollama")

# Load the PDF
uploaded\_file = st.file\_uploader("Upload a PDF file", type="pdf")

if uploaded\_file is not None:
    # Save the uploaded file to a temporary location
    with open("temp.pdf", "wb") as f:
        f.write(uploaded\_file.getvalue())

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

    # Split into chunks
    text\_splitter = SemanticChunker(HuggingFaceEmbeddings())
    documents \= text\_splitter.split\_documents(docs)

    # Instantiate the embedding model
    embedder = HuggingFaceEmbeddings()

    # Create the vector store and fill it with embeddings
    vector = FAISS.from\_documents(documents, embedder)
    retriever \= vector.as\_retriever(search\_type="similarity", search\_kwargs={"k": 3})

    # Define llm
    llm = Ollama(model="deepseek-r1")

    # Define the prompt
    prompt = """
    1. Use the following pieces of context to answer the question at the end.
    2. If you don't know the answer, just say that "I don't know" but don't make up an answer on your own.\\n
    3. Keep the answer crisp and limited to 3,4 sentences.

    Context: {context}

    Question: {question}

    Helpful Answer:"""

    QA\_CHAIN\_PROMPT \= PromptTemplate.from\_template(prompt)

    llm\_chain \= LLMChain(
        llm\=llm,
        prompt\=QA\_CHAIN\_PROMPT,
        callbacks\=None,
        verbose\=True)

    document\_prompt \= PromptTemplate(
        input\_variables\=\["page\_content", "source"\],
        template\="Context:\\ncontent:{page\_content}\\nsource:{source}",
    )

    combine\_documents\_chain \= StuffDocumentsChain(
        llm\_chain\=llm\_chain,
        document\_variable\_name\="context",
        document\_prompt\=document\_prompt,
        callbacks\=None)

    qa \= RetrievalQA(
        combine\_documents\_chain\=combine\_documents\_chain,
        verbose\=True,
        retriever\=retriever,
        return\_source\_documents\=True)

    # User input
    user\_input = st.text\_input("Ask a question related to the PDF :")

    # Process user input
    if user\_input:
        with st.spinner("Processing..."):
            response \= qa(user\_input)\["result"\]
            st.write("Response:")
            st.write(response)
else:
    st.write("Please upload a PDF file to proceed.")

3.总结

本文详细介绍了利用 DeepSeek R1 和 Ollama 构建检索增强生成(RAG)系统的方法。首先说明了 DeepSeek R1 1.5B 模型的优势,如精准检索、避免幻觉、零延迟等。接着阐述了搭建流程,包括用 Ollama 本地运行模型、上传 PDF 文件、使用递归字符文本分割器进行语义分块、生成向量嵌入并存储于 FAISS 索引、实例化检索问答链,最后整合各步骤形成连贯流程。通过 Streamlit 实现用户输入问题并即时获取答案,且确保安装langchain库可避免错误。

4.结束语

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐