【保姆级本地大模型部署教程】从0到1本地部署 DeepSeek R1 大模型并开发聊天接口

730 阅读5分钟

Snipaste_2025-02-14_22-23-31.png 最近由于 DeepSeek 的爆火出圈,如何在本地部署大模型这个话题的热度也一直居高不下。网络上也充斥着各种层出不穷的视频教程,但是大多数的视频都很冗长,且不能直击核心。我通过看了几分钟的视频了解了一些基本概念后,并通过自己的摸索成功的完成了自己的本地大模型部署,特此记录分享一波。希望能帮助所有感兴趣的人(甚至包括从未接触过编程的小白)完成自己本地大模型的部署😁😁。

  1. 安装 LM Studio

    LM Studio 是一款支持在本地离线运行大型语言模型(LLM)的桌面应用,适用于 Windows、Linux 和 macOS 系统。其核心优势在于无需联网即可部署和管理模型,支持从 HuggingFace 下载兼容的 ggml 格式模型(如 Llama、MPT 等),并提供图形化界面简化模型配置、性能优化(如剪枝、量化)及多版本管理。用户可通过内置聊天界面直接交互,或启动兼容 OpenAI 的本地 API 服务器对接开发项目,保障数据隐私。

    我们可以在 lmstudio.ai/download 下载适合自己系统的 LM Studio

  2. 配置 Hugging Face 镜像

    Hugging Face 是一个专注于自然语言处理(NLP)的开源社区和平台。它提供了一系列强大的工具、库和预训练模型,帮助开发者快速构建和部署NLP应用。

    作为前端来说,可以将 Hugging Face 当做 NPM 来理解,那么配置 Hugging Face 镜像就像配置淘宝镜像一样简单。不过 LM Studio 作为一个桌面软件,暂时没有提供配置 Hugging Face 镜像的入口,所以可以参考我这篇文章【保姆级本地大模型部署教程】LM Studio 中搜索模型时报:Model details error: fetch failed 解决 完成配置。

  3. 下载 DeepSeek R1 大模型
    打开 LM Studio 后按下图所示操作,即可搜索到 DeepSeek 相关的一系列模型

    image.png 我的电脑配置如下:

    CPU: i9-14900hx
    GPU: NVIDIA GeForce RTX 4060 Laptop GPU
    RAM: 32GB
    

    我下载的模型是 DeepSeek-R1-Distill-Qwen-7B-GGUF,基于我的电脑配置推理速度还是非常快的。后面的同学想尝试的话,配置相同的话我觉得可以直接拉到 DeepSeek-R1-Distill-Qwen-32B-GGUF 试一试,问题不大。

    image.png 好了,现在点击 Download 按钮进行下载模型吧。

  4. 选择加载的模型
    经过漫长的等待…… 我们终于进行到了第4步~
    但是没关系,从时间上来讲,我们已经完成了这篇教程的 95%~

    image.png 可以按自己需要调整相关参数

    image.png

  5. 测试聊天功能
    加载模型很快,10s以内就好了。现在在输入框输入一段文字跟你亲手部署的大模型聊天吧。

    image.png

  6. 开启对外服务
    LM Studio 提供了外部应用调用大模型能力的入口,只需要开启对外服务即可。

    image.png

    现在在浏览器中键入 http://127.0.0.1:1234/v1/models 测试一下服务是否正常,一般会打印如下内容:

    {
      "data": [
        {
          "id": "deepseek-r1-distill-qwen-7b",
          "object": "model",
          "owned_by": "organization_owner"
        },
        {
          "id": "text-embedding-nomic-embed-text-v1.5",
          "object": "model",
          "owned_by": "organization_owner"
        }
      ],
      "object": "list"
    }
    
  7. 编写聊天接口
    我这边采用 Python 技术栈相关的 FastAPI 编写对外接口,它可以让我们很简单、很快速去构建 API功能。

    from fastapi import FastAPI, HTTPException, Query, status
    from chat_service import chat_with_llm, ChatResponse
    import asyncio
    
    app = FastAPI()
    
    
    @app.post("/chat/", response_model=ChatResponse)
    async def chat(
            prompt: str = Query(..., min_length=1, max_length=1000, description="用户输入的问题")
    ):
        try:
            # 假设 chat_with_llm 是同步函数
            response = await asyncio.to_thread(chat_with_llm, prompt)
            return ChatResponse(code=200, msg='请求成功', data={'content': response})
        except ValueError as e:  # 特定业务异常
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="无效的请求参数"
            )
        except Exception as e:
            # 记录原始错误日志(实际项目需添加日志记录)
            print(f"Internal error: {str(e)}")
            raise HTTPException(
                status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                detail="服务器内部错误"
            )
    

    chat_service.py

    from pydantic import BaseModel
    import requests
    import re
    
    # 预编译正则表达式
    CLEAN_PATTERN = re.compile(r'<think>.*?</think>', flags=re.DOTALL)
    
    # 常量配置
    API_ENDPOINT = "http://127.0.0.1:1234/v1/chat/completions"
    DEFAULT_TIMEOUT = 10.0
    MODEL_NAME = "DeepSeek-R1-Distill-Qwen-7B"
    
    
    class ChatRequest(BaseModel):
        prompt: str
    
    
    class ChatResponse(BaseModel):
        code: int
        msg: str
        data: dict
    
    
    # 创建可复用的Session对象
    _session = requests.Session()
    
    
    def chat_with_llm(prompt: str) -> str:
        """
        与LLM进行对话的封装函数
    
        Args:
            prompt: 用户输入的提示文本
    
        Returns:
            清理后的响应文本,已移除<think>标签内容
    
        Raises:
            requests.exceptions.RequestException: 网络请求相关异常
            ValueError: JSON解析失败时抛出
        """
        headers = {"Content-Type": "application/json"}
        payload = {
            "model": MODEL_NAME,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": 0.7
        }
    
        try:
            response = _session.post(
                API_ENDPOINT,
                headers=headers,
                json=payload,
                timeout=DEFAULT_TIMEOUT
            )
            response.raise_for_status()
    
            # 安全解析响应内容
            response_data = response.json()
    
            choices = response_data.get('choices', [])
            if choices:
                message = choices[0].get('message', {})
                raw_content = message.get('content', '')
            else:
                raw_content = ''
    
            # 清理文本内容
            cleaned_content = CLEAN_PATTERN.sub('', raw_content).strip()
            return cleaned_content
    
        except requests.exceptions.JSONDecodeError as e:
            raise ValueError(f"Failed to parse response JSON: {str(e)}")
    

    也可以点击 github.com/dizuncainia… 拉取最新的代码进行测试。

  8. 测试接口
    如何有 PyCharm 的话,可以在拉取代码后直接使用项目目录中的 test.http 进行测试

    image.png

写在最后

本篇《从0到1本地部署 DeepSeek R1 大模型并开发聊天接口》教程乃是作者奶妈级整理分享,相信按照教程可以全程无雷丝滑顺畅完成部署,彻底揭开本地部署 DeepSeek 大模型以及开发功能接口的神秘面纱!但如若仍有不确定之处,欢迎评论区大家一起讨论~