跳至主要内容

如何在本地使用 Ollama 安装并运行 DeepSeek R1

了解如何使用 Ollama 在本地安装、设置并运行 DeepSeek-R1,并构建一个简单的 RAG 应用。
· 12分钟 阅读

使用 AI 探索

在本教程中,我将逐步讲解如何在本地运行 DeepSeek-R1,以及如何通过 Ollama 进行设置。我们还将使用 R1 模型、LangChain 和 Gradio,在您的笔记本电脑上构建一个简易的 RAG 应用。

如果您只想了解 R1 模型的概览,推荐阅读这篇DeepSeek-R1 文章。想学习如何微调 R1,推荐这篇关于微调 DeepSeek-R1的教程。如果您更喜欢视频学习,务必观看此视频:

为何在本地运行 DeepSeek-R1?

在本地运行 DeepSeek-R1,您可以完全自主地执行模型,而无需依赖外部服务器。在本地运行 DeepSeek-R1 有以下优势:

  • 隐私与安全:数据不离开您的系统。
  • 不间断访问:避免速率限制、停机或服务中断。
  • 性能:本地推理响应更快,避免 API 延迟。
  • 可定制性:修改参数、微调提示,并将模型集成到本地应用中。
  • 成本效益:在本地运行模型,消除 API 费用。
  • 离线可用:模型下载完成后,无需联网即可使用。

通过 Ollama 本地设置 DeepSeek-R1

Ollama 通过无缝处理模型下载、量化与执行,简化了在本地运行大语言模型的流程。

步骤 1:安装 Ollama

首先,从官方网站下载页面下载并安装 Ollama。

Downloading Ollama

下载完成后,像安装其他应用一样安装 Ollama。

步骤 2:下载并运行 DeepSeek-R1

我们来测试环境并下载模型。启动终端并输入以下命令。

ollama run deepseek-r1

Ollama 提供了一系列 DeepSeek R1 模型,参数规模从 1.5B 到完整的 671B。671B 模型是原始的 DeepSeek-R1,而更小的模型是基于 Qwen 和 Llama 架构的蒸馏版本。如果您的硬件无法支持 671B 模型,您可以通过以下命令轻松运行更小的版本,并将下面的 X 替换为您需要的参数规模(1.5b、7b、8b、14b、32b、70b、671b):

ollama run deepseek-r1:Xb

借助这种灵活性,即使没有超级计算机,您也能使用 DeepSeek-R1 的能力。

步骤 3:在后台运行 DeepSeek-R1

要持续运行 DeepSeek-R1 并通过 API 提供服务,请启动 Ollama 服务器:

ollama serve

这样便可将模型用于与其他应用进行集成。

在本地使用 DeepSeek-R1

步骤 1:通过 CLI 进行推理

模型下载完成后,您可以直接在终端与 DeepSeek-R1 交互。

DeepSeek-R1 running in terminal

步骤 2:通过 API 访问 DeepSeek-R1

要将 DeepSeek-R1 集成到应用中,可使用 curl 调用 Ollama API:

curl http://localhost:11434/api/chat -d '{
  "model": "deepseek-r1",
  "messages": [{ "role": "user", "content": "Solve: 25 * 25" }],
  "stream": false
}'

curl 是一个 Linux 原生命令行工具,也可在 macOS 使用。它允许用户直接在终端发起 HTTP 请求,非常适合与 API 交互。

Accessing DeepSeek-R1 via API on terminal

步骤 3:通过 Python 访问 DeepSeek-R1

我们可以在任意集成开发环境(IDE)中使用 Ollama。您可以通过以下代码安装 Ollama 的 Python 包:

!pip install ollama

安装完成后,使用以下脚本与模型交互:

import ollama
response = ollama.chat(
    model="deepseek-r1",
    messages=[
        {"role": "user", "content": "Explain Newton's second law of motion"},
    ],
)
print(response["message"]["content"])

ollama.chat() 函数接收模型名称和用户提示,将其作为对话进行处理。脚本随后提取并打印模型的回复。

Running DeepSeek R1 locally in VSCode

使用 DeepSeek-R1 运行本地 Gradio 的 RAG 应用

我们将用 Gradio 构建一个简单演示应用,以 DeepSeek-R1 对文档进行检索与分析。

步骤 1:准备条件

在开始实现之前,先确认已安装以下工具与库:

  • Python 3.8+
  • Langchain:用于构建由大语言模型(LLM)驱动的应用的框架,便于检索、推理与工具集成。
  • Chromadb:高性能向量数据库,用于高效相似度搜索与嵌入存储。
  • Gradio:用于创建友好的网页界面。

运行以下命令安装所需依赖:

!pip install langchain chromadb gradio 
!pip install -U langchain-community

安装完成后,运行以下导入命令:

import gradio as gr
from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
import ollama

步骤 2:处理上传的 PDF

导入库后,我们将处理上传的 PDF。

def process_pdf(pdf_bytes):
    if pdf_bytes is None:
        return None, None, None

    loader = PyMuPDFLoader(pdf_bytes)
    data = loader.load()

    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500, chunk_overlap=100
    )
    chunks = text_splitter.split_documents(data)

    embeddings = OllamaEmbeddings(model="deepseek-r1")
    vectorstore = Chroma.from_documents(
        documents=chunks, embedding=embeddings, persist_directory="./chroma_db"
    )
    retriever = vectorstore.as_retriever()

    return text_splitter, vectorstore, retriever

process_pdf 函数:

  • 加载并准备 PDF 内容,以便基于检索进行回答。
  • 检查是否上传了 PDF。
  • 使用 PyMuPDFLoader 提取文本。
  • 使用 RecursiveCharacterTextSplitter 将文本切分为片段。
  • 使用 OllamaEmbeddings 生成向量嵌入。
  • 将嵌入存储在 Chroma 向量库中,以便高效检索。

步骤 3:合并检索到的文档片段

检索到嵌入后,我们需要将其拼接。combine_docs() 函数会将多个检索到的文档片段合并为一个字符串。

def combine_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

由于基于检索的模型会提取相关片段而非整篇文档,该函数可确保在传递给 DeepSeek-R1 之前,提取内容保持可读且格式恰当。

步骤 4:通过 Ollama 查询 DeepSeek-R1

现在,输入已准备就绪。让我们通过 Ollama 设置 DeepSeek R1。

import re

def ollama_llm(question, context):
    formatted_prompt = f"Question: {question}\n\nContext: {context}"

    response = ollama.chat(
        model="deepseek-r1",
        messages=[{"role": "user", "content": formatted_prompt}],
    )

    response_content = response["message"]["content"]

    # Remove content between <think> and </think> tags to remove thinking output
    final_answer = re.sub(r"<think>.*?</think>", "", response_content, flags=re.DOTALL).strip()

    return final_answer

ollama_llm() 函数将用户问题与检索到的文档上下文格式化为结构化提示。该格式化输入随后通过 ollama.chat() 发送给 DeepSeek-R1,模型会在给定上下文中处理问题并返回相关答案。如果您需要去除模型的“思考”内容,可使用 strip() 返回最终答案。

步骤 5:RAG 流程

现在我们已经具备所有必要组件,来为示例搭建 RAG 流程。

def rag_chain(question, text_splitter, vectorstore, retriever):
    retrieved_docs = retriever.invoke(question)
    formatted_content = combine_docs(retrieved_docs)
    return ollama_llm(question, formatted_content)

上述函数首先使用 retriever.invoke(question) 在向量库中搜索并返回最相关的文档片段。随后使用 combine_docs 函数将这些片段格式化为结构化输入,并传递给 ollama_llm,以确保 DeepSeek-R1 基于检索内容生成信息充分的答案。

步骤 6:创建 Gradio 界面

RAG 流程已就绪。现在我们在本地构建 Gradio 界面,并结合 DeepSeek-R1 处理 PDF 输入并针对其内容提问。

def ask_question(pdf_bytes, question):
    text_splitter, vectorstore, retriever = process_pdf(pdf_bytes)

    if text_splitter is None:
        return None  # No PDF uploaded

    result = rag_chain(question, text_splitter, vectorstore, retriever)
    return {result}


interface = gr.Interface(
    fn=ask_question,
    inputs=[
        gr.File(label="Upload PDF (optional)"),
        gr.Textbox(label="Ask a question"),
    ],
    outputs="text",
    title="Ask questions about your PDF",
    description="Use DeepSeek-R1 to answer your questions about the uploaded PDF document.",
)

interface.launch()

我们按以下步骤进行:

  • 检查是否上传 PDF。
  • 使用 process_pdf 函数处理 PDF,抽取文本并生成文档嵌入。
  • 将用户查询与文档嵌入传给 rag_chain() 函数,检索相关信息并生成有上下文的回答。
  • 搭建基于 Gradio 的网页界面,允许用户上传 PDF 并就其内容提问。
  • 使用 gr.Interface() 定义界面布局,接受 PDF 文件与文本查询作为输入。
  • 通过 interface.launch() 启动应用,在浏览器中实现便捷的交互式文档问答。

Running a Local Gradio Application for RAG with DeepSeek-R1

结语

通过 Ollama 在本地运行 DeepSeek-R1,能够实现更快、更私密且更具成本效益的模型推理。借助简单的安装流程、CLI 交互、API 支持和 Python 集成,您可以将 DeepSeek-R1 应用于多种 AI 场景,从一般问答到复杂的基于检索任务。

想持续了解 AI 最新进展,推荐阅读以下博客:

Aashi Dutt

作者

Aashi Dutt

我是一名 Google Developers 机器学习(生成式 AI)领域的专家、Kaggle 三项专家,以及 Women Techmakers 大使,拥有 3 年以上的技术从业经验。2020 年我共同创办了一家健康科技初创公司,目前在佐治亚理工学院攻读计算机科学硕士,专攻机器学习。

主题