ollama deepseek r1本地部署教学

AI教程 2025-03-17

在本教程中,我将逐步介绍如何在本地运行 DeepSeek-R1 以及如何使用 Ollama 进行设置。我们还将探索使用 R1 模型、LangChain 和 Gradio 构建一个简单的 RAG 应用程序,该应用程序可在您的笔记本电脑上运行。

如果您只想了解 R1 模型的概述,我推荐您阅读这篇 DeepSeek-R1 文章。要了解如何微调 R1,我推荐阅读有关微调 DeepSeek-R1 的教程。如果您更喜欢通过视频学习,请务必观看以下内容:

为什么要在本地运行 DeepSeek-R1?

在本地运行 DeepSeek-R1 可以让您完全控制模型执行,而无需依赖外部服务器。以下是在本地运行 DeepSeek-R1 的一些优势:

  • 隐私和安全:没有数据离开您的系统。

  • 不间断访问:避免速率限制、停机或服务中断。

  • 性能:通过本地推理获得更快的响应,避免 API 延迟。

  • 自定义:修改参数、微调提示并将模型集成到本地应用程序中。

  • 成本效益:通过在本地运行模型来消除 API 费用。

  • 离线可用性:下载模型后,在没有 Internet 连接的情况下工作。

使用 Ollama 在本地设置 DeepSeek-R1

Ollama 通过无缝处理模型下载、量化和执行,简化了本地 LLM 的运行。

第 1 步:安装 Ollama

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

image.png

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

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

让我们测试设置并下载我们的模型。启动终端并键入以下命令。

ollama run deepseek-r1

Ollama 提供一系列 DeepSeek R1 模型,从 1.5B 参数到完整的 671B 参数模型。671B 模型是原始的 DeepSeek-R1,而较小的模型是基于 Qwen 和 Llama 架构的提炼版本。如果您的硬件不支持 671B 型号,您可以通过使用以下命令并将以下内容替换为您想要的参数大小(1.5b、7b、8b、14b、32b、70b、671b)来轻松运行较小的版本:X

ollama run deepseek-r1:Xb

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

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

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

ollama serve

这将使模型可用于与其他应用程序集成。

在本地使用 DeepSeek-R1

第 1 步:通过 CLI 运行推理

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


image.png

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

要将 DeepSeek-R1 集成到应用程序中,请使用 Ollama API:curl

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

curl是 Linux 原生的命令行工具,但也适用于 macOS。它允许用户直接从终端发出 HTTP 请求,使其成为与 API 交互的绝佳工具。


image.png

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

我们可以在选择的任何集成开发环境 (IDE) 中运行 Ollama。您可以使用以下代码安装 Ollama Python 包:

!pip install ollama

安装 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()


image.png

使用 DeepSeek-R1 为 RAG 运行本地 Gradio 应用程序

让我们使用 Gradio 构建一个简单的演示应用程序,以使用 DeepSeek-R1 查询和分析文档。

第 1 步:先决条件

在深入研究实现之前,我们确保已安装以下工具和库:

  • Python 3.8+ 版

  • Langchain:用于构建由大型语言模型 (LLM) 提供支持的应用程序的框架,支持轻松检索、推理和工具集成。

  • Chromadb:一个高性能的向量数据库,专为高效的相似性搜索和嵌入存储而设计。

  • Gradio:创建用户友好的 Web 界面。

运行以下命令以安装必要的依赖项:

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

安装上述依赖项后,运行以下 import 命令:

import gradio as grfrom langchain_community.document_loaders import PyMuPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain_community.embeddings import OllamaEmbeddingsimport ollama

第 2 步:处理上传的 PDF

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

defprocess_pdf(pdf_bytes):if pdf_bytes isNone:returnNone,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 "

".join(doc.page_content for doc in docs)

由于基于检索的模型提取相关摘录而不是整个文档,因此此功能可确保提取的内容在传递到 DeepSeek-R1 之前保持可读性和正确格式。

第 4 步:使用 Ollama 查询 DeepSeek-R1

现在,我们对模型的输入已准备就绪。让我们使用 Ollama 设置 DeepSeek R1。

import redefollama_llm(question, context):
    formatted_prompt =f"Question: {question}

Context: {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()函数将用户的问题和检索到的文档上下文格式化为结构化提示。然后,此格式化输入将通过以下方式发送到 DeepSeek-R1ollama.chat(),它会在给定的上下文中处理问题并返回相关答案。如果您需要没有模型思维脚本的答案,请使用该函数返回最终答案。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),返回最相关的文档摘录。这些摘录使用 function 格式化为结构化输入并发送到 ,确保 DeepSeek-R1 根据检索到的内容生成明智的答案。combine_docsollama_llm

第 6 步:创建 Gradio 接口

我们已经建立了 RAG 管道。现在,我们可以在本地构建 Gradio 接口以及 DeepSeek-R1 模型,以处理 PDF 输入并提出与之相关的问题。

defask_question(pdf_bytes, question):
    text_splitter, vectorstore, retriever = process_pdf(pdf_bytes)if text_splitter isNone:returnNone# 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。

  • 使用该功能处理 PDF,以提取文本并生成文档嵌入。process_pdf

  • 将用户的查询和文档嵌入传递给函数,以检索相关信息并生成上下文准确的响应。rag_chain()

  • 设置基于 Gradio 的 Web 界面,以允许用户上传 PDF 并询问有关其内容的问题。

  • 使用函数定义布局,接受 PDF 文件和文本查询作为输入。gr.Interface()

  • 启动应用程序 通过 Web 浏览器启用无缝的、交互式的基于文档的 Q&A。interface.launch()

image.png

©️版权声明:若无特殊声明,本站所有文章版权均归AI工具集原创和所有,未经许可,任何个人、媒体、网站、团体不得转载、抄袭或以其他方式复制发表本站内容,或在非我站所属的服务器上建立镜像。否则,我站将依法保留追究相关法律责任的权利。

相关文章