为了账号安全,请及时绑定邮箱和手机立即绑定

使用DeepSeek R1和Ollama构建本地检索增强生成系统(附完整代码)

你是否曾经希望可以直接向PDF或技术手册提问问题?本指南将教你如何用开源推理工具DeepSeek R1 和轻量框架Ollama 来构建检索增强生成(Retrieval-Augmented Generation)系统。

小技巧:使用Apidog来优化API的测试

想要简化你的API工作流程?Apidog 提供了一站式解决方案,用于创建、管理及运行测试和模拟服务器。使用Apidog,你可以:

  • 自动化关键工作流,无需在多个工具间切换或编写繁杂的脚本。
  • 保持 CI/CD 流水线顺畅。
  • 识别瓶颈以确保 API 的稳定性和可靠性。

省时省力,把精力集中在完善您的产品上。准备试试看吗?试试手气 Apidog

为什么是DeepSeek R1?

DeepSeek R1,一个与OpenAI的o1相当但价格仅为OpenAI的o1的5%的模型,正在改变RAG系统。开发人员喜欢它因为它的以下特点:

  • 聚焦检索:每次仅使用三个文档片段。
  • 严格提示:通过回答“不知道”来避免虚构。
  • 本地执行:消除云API的延迟。
构建本地RAG系统所需
1. 奥拉玛 (注:奥拉玛为原文专有名词,此处保留原文形式)

Ollama 让你可以在本地运行类似的模型,比如 DeepSeek R1。

  • 下载: Ollama
  • 安装并运行: 在终端中运行以下命令。
    ollama run deepseek-r1  # 运行7B模型(默认情况下)

Ollama homepage

2. 深索R1模型变种,

DeepSeek R1 的参数范围为 1.5B 到 671B;从使用 1.5B 模型 开始,适用于轻量级 RAG 应用场景。

    ollama run deepseek-r1:1.5b

请运行此命令来运行深度搜索版本1.5b的ollama命令。

小贴士: 比如70B这样的更大模型有更好的推理能力,但需要更多的内存(RAM)。

构建RAG管道的分步指南
第一步:导入库包

我们会用到:

  • LangChain 用于文档处理和检索功能。
  • Streamlit 提供用户友好的网络界面。
# 导入streamlit库
import streamlit as st    
# 导入PDF文档加载器
from langchain_community.document_loaders import PDFPlumberLoader    
# 导入语义分块器
from langchain_experimental.text_splitter import SemanticChunker    
# 导入HuggingFace嵌入
from langchain_community.embeddings import HuggingFaceEmbeddings    
# 导入FAISS向量存储库
from langchain_community.vectorstores import FAISS    
# 导入Ollama语言模型
from langchain_community.llms import Ollama

第 2 步:上传并处理 PDF

在 Streamlit 中使用文件上传功能选择一个本地的 PDF。使用 PDFPlumberLoader 提取文本,无需手动处理。

    # 文件上传器
    uploaded_file = st.file_uploader("请上传一个PDF文件", type="pdf")

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

        # 加载PDF文本
        loader = PDFPlumberLoader("temp.pdf")
        docs = loader.load()
步骤 3:战略性分块文档

使用 Streamlit 的文件上传功能选择一个本地的 PDF。可以利用 PDFPlumberLoader 高效提取文本,无需手动解析。

    # 将文本分割成语义块:
    text_splitter = SemanticChunker(HuggingFaceEmbeddings())
    documents = text_splitter.split_documents(docs)

步骤 4:接下来是创建一个可以搜索的知识库

生成每个片段的向量嵌入,并存入FAISS索引中。

  • 嵌入允许快速、相关的上下文搜索。
    # 生成嵌入向量
    embeddings = HuggingFaceEmbeddings()
    vector_store = FAISS.from_documents(documents, embeddings)

    # 连接检索器:
    retriever = vector_store.as_retriever(search_kwargs={"k": 3})  # 检索前3个片段

步骤 5:配置 DeepSeek R1 系统

搭建一个使用DeepSeek R1 1.5B模型检索问答链

这确保答案基于PDF中的内容,而不是基于模型的训练数据。

    llm = Ollama(model="deepseek-r1:1.5b")  # 我们的1.5B参数的模型

    # 构造提示模板
    prompt = """    

1. 仅使用以下内容。

2. 如果不确定,请回答“我不知道”。

3. 请保持答案在4句话以内。

    上下文:{context}

    问题:{question}

    回答:    
    """
    QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt)
第六步:搭建“RAG链”

将上传、分块和检索集成为一体,形成一个流畅的流程。

这种方法让模型有了验证过的背景,从而提高了准确性。

    # 链 1:生成答案 

    llm_chain = LLMChain(llm=llm, prompt=QA_CHAIN_PROMPT)

    # 链 2:合并文档片段

    document_prompt = PromptTemplate(
        template="上下文:\n{page_content}\n出处:{source}",
        input_variables=["page_content", "source"]
    )

    # 最终的 RAG 流水线

    qa = RetrievalQA(
        combine_documents_chain=StuffDocumentsChain(
            llm_chain=llm_chain,
            document_prompt=document_prompt
        ),
        retriever=retriever
    )
第七步:打开网页界面。
启动网页界面程序

Streamlit使用户能够打字提问并马上得到回复。

  • 查询会检索匹配的片段内容,然后将这些片段输入模型,并实时显示结果。这样就可以实时看到结果了。
    # Streamlit UI    
    user_input = st.text_input("在这里向你的PDF提问:")    

    if user_input:    
        with st.spinner("正在思考..."):    
            response = qa(user_input)["result"]    
            st.write(response)

你可以在这里找到源代码: https://gist.github.com/lisakim0/0204d7504d17cefceaf2d37261c1b7d5

RAG 与 DeepSeek 的未来

这只是个开始。随着新功能,如自我验证多跳推理,未来的RAG系统可以自主辩论并优化其逻辑。

今天就开始构建您自己的RAG系统,释放基于文档的AI的强大功能!

这篇文章的来源:如何在本地使用 Ollama 运行 Deepseek R1?

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消