技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营
Python技术
AI技术

赞助商

分类目录

赞助商

最新文章

搜索

用Ollama本地搭建DeepSeek-R1,并构建一个简单的RAG应用

作者:admin    时间:2026-5-13 17:5:33    浏览:

在这个教程中,我将一步步讲解如何在本地运行 DeepSeek-R1,以及如何使用 Ollama 来设置它。我们还将探索如何基于R1型号、LangChain和Gradio构建一个在笔记本上运行的简单RAG应用程序。

用Ollama本地搭建DeepSeek-R1

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

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

  • 隐私与安全:系统内无数据流失。
  • 不间断访问:避免速率限制、停机或服务中断。
  • 性能:通过本地推理获得更快的响应,避免 API 延迟。
  • 自定义:修改参数,微调提示,并将模型集成到本地应用中。
  • 成本效益:通过本地运行模型,消除API费用。
  • 离线可用性:模型下载后无需网络连接即可工作。

用 Ollama 本地搭建 DeepSeek-R1

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

步骤1:安装Ollama

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

从官方网站下载并安装 Ollama

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

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

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

ollama run deepseek-r1

Ollama 提供一系列 DeepSeek R1 模型,参数从 1.5 亿参数到完整的 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交互
在终端中与DeepSeek-R1交互

步骤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 交互的极佳工具。

步骤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()函数接收模型名称和用户提示符,将其作为对话交换进行处理。脚本随后提取并打印模型的回应。

运行带有DeepSeek-R1的本地RAGgradio应用

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

第一步:先决条件

在开始实施之前,先确认我们已安装以下工具和库:

  • 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生成向量嵌入。
  • 将嵌入存储在色度向量存储中,以便高效检索。

步骤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,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()启动应用程序,通过网页浏览器实现无缝、互动的文档问答。

结论

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

相关文章

标签: DeepSeek  Ollama  
本站声明:本站为非经营性网站,文章内容来源或整理于网络,本站不提供软件下载服务,侵删联系:webkaka#foxmail.com
x