如何在本地部署 DeepSeek 并提供接口用于开发AI对话应用?

最近,DeepSeek 异常火爆,堪称国产 AI 之光,并且它还是免费开源的。 只需打开 DeepSeek 对话界面,就能免费与其对话,让它解决你的问题,关键是它的回答质量非常高。 当然,本篇文章并不是介绍如何使用 DeepSeek 进行对话的,因为这太简单了,连我 5 岁的儿子都会用。

如何在本地部署 DeepSeek 并提供接口用于开发AI对话应用?

最近,DeepSeek 异常火爆,堪称国产 AI 之光,并且它还是免费开源的。只需打开 DeepSeek 对话界面,就能免费与其对话,让它解决你的问题,关键是它的回答质量非常高。当然,本篇文章并不是介绍如何使用 DeepSeek 进行对话的,因为这太简单了,连我 5 岁的儿子都会用。本篇文章将介绍如何在你本地的电脑上部署一个 DeepSeek 模型,并提供接口供你调用,以便后续基于它开发一些 AI 对话应用。

了解 huggingface

  • 什么是 huggingface?

Hugging Face 是一个专注于自然语言处理(NLP)的开源社区,它提供了一个强大的平台,用于研究和开发各种 NLP 模型和工具。也就是说,我们需要的 DeepSeek 模型可以从 Hugging Face 下载。它的官网是 huggingface.co/[1]。国内用户使用它可能需要一些“魔法”,但不用担心,它在国内有一些镜像地址,你可以通过这些镜像地址来下载模型。比如 hf-mirror.com/[2],点进去之后直接搜索我们需要的模型即可。根据你的电脑配置,可以选择不同的模型。这里我选用 DeepSeek 提供的最简单的 1.5B(15 亿个参数)的模型 DeepSeek-R1-Distill-Qwen-1.5B,大约 3GB 左右。

image.png当然,这里我们不需要直接在网站上下载,后面可以直接在代码中加载模型。

准备工作

  • 安装 python 环境

这里我使用的是 python 3.10,你可以根据自己的电脑配置来选择合适的版本。官网是 www.python.org/downloads/[3]根据提示安装即可

  • 安装依赖
复制
pip install torch transformers flask

其中 torch 是 PyTorch 的核心库,PyTorch 是一个开源的机器学习库,用于构建和训练神经网络。transformers 是一个用于自然语言处理(NLP)任务的库,它提供了许多预训练的模型和工具。flask 是一个轻量级的 Web 应用框架,用于构建 Web 应用。

编写代码

复制
from flask import Flask, request, jsonify
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

app = Flask(__name__)

# 加载模型和分词器
MODEL_NAME = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)

# 设置 pad_token_id
if tokenizer.pad_token isNone:
    tokenizer.pad_token = tokenizer.eos_token
model.config.pad_token_id = tokenizer.pad_token_id

# 设置设备
device = torch.device("cuda"if torch.cuda.is_available() else"cpu")
model.to(device)

def generate_text(prompt, max_length=100, top_p=0.95, temperature=0.7):
    """
    根据输入的提示(prompt)生成文本。

    参数:
        prompt (str): 输入的文本提示,用于引导模型生成后续内容。
        max_length (int): 生成文本的最大长度(包括输入提示)。
        top_p (float): 核采样(Nucleus Sampling)的概率阈值,控制生成文本的多样性。
        temperature (float): 温度参数,控制生成文本的随机性。

    返回:
        str: 生成的文本。
    """
    # 使用分词器将输入文本(prompt)转换为模型所需的输入格式。
    # return_tensors="pt" 表示返回 PyTorch 张量格式。
    # padding=True 和 truncatinotallow=True 确保输入长度一致且不超过模型的最大长度。
    inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncatinotallow=True).to(device)

    # 调用模型的 generate 方法生成文本。
    # inputs.input_ids 是输入文本的编码,attention_mask 是注意力掩码,用于指示哪些位置是有效的输入。
    outputs = model.generate(
        inputs.input_ids,  # 输入文本的编码
        attention_mask=inputs.attention_mask,  # 注意力掩码
        max_length=max_length,  # 生成文本的最大长度
        num_return_sequences=1,  # 返回的序列数量(这里只生成一个序列)
        no_repeat_ngram_size=2,  # 避免重复的 n-gram 大小(防止重复生成相同的短语)
        do_sample=True,  # 是否使用采样(而不是贪婪解码)
        top_p=top_p,  # 核采样概率阈值
        temperature=temperature,  # 温度参数,控制随机性
        pad_token_id=tokenizer.pad_token_id,  # 填充标记的 ID
    )

    # 将生成的编码(outputs)解码为可读的文本。
    # skip_special_tokens=True 表示跳过特殊标记(如 [CLS]、[SEP] 等)。
    generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # 返回生成的文本。
    return generated_text

# API 路由
@app.route("/generate", methods=["POST"])
def generate():
    data = request.json
    prompt = data.get("prompt", "")
    max_length = data.get("max_length", 100)
    top_p = data.get("top_p", 0.95)
    temperature = data.get("temperature", 0.7)

    ifnot prompt:
        return jsonify({"error": "Prompt is required"}), 400

    try:
        generated_text = generate_text(prompt, max_length, top_p, temperature)
        return jsonify({"generated_text": generated_text})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

# 启动应用
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

如果你不会 python,直接复制这段代码到文本文件中,然后将文件修改保存为app.py即可。

运行应用

打开app.py所在终端,输入以下命令可以直接运行应用:

复制
python app.py

如果你无法访问 huggingface,可以修改下环境变量使用镜像地址:

  • windows 修改方法

cmd

复制
set HF_ENDPOINT=https://hf-mirror.com

powershell

复制
set HF_ENDPOINT=https://hf-mirror.com
  • linux 修改方法
复制
export HF_ENDPOINT=https://hf-mirror.com
  • mac 修改方法
复制
export HF_ENDPOINT="https://hf-mirror.com"

修改完成之后再次运行app.py,等待模型下载完毕之后就可以使用了。

image.pngimage.png

调用接口http://172.16.10.157:5000/generate传入相关参数即可,这里我们只传入一个提问 prompt 参数,其他参数都用默认值。

测试接口

我们需要使用 postman 或者其他工具来测试接口,这里我使用的是 apifox。调用接口并传入prompt问题,等待一会就会返回一个生成的文本。 image.png

当然这里因为我们电脑配置有限,只能使用 deepseek 提供的最简单的 1.5b 的模型作为演示。参数量越大,生成的文本质量肯定就越好,同时需要的电脑配置就越高。

后续调用

接口部署完成之后,后续我们可以根据需要在工程项目中调用接口,来实现一些 AI 对话应用。同时可以根据每个用户的 id 来保存用户的历史对话,以便后续根据用户的历史对话来生成更好的回答。下篇文章将介绍如何使用 nodejs 来调用这个接口,并实现一个 AI 对话应用,欢迎点赞收藏加关注

标注

[1] https://huggingface.co

[2] https://hf-mirror.com/

[3] https://www.python.org/downloads

相关资讯

DeepSeek-R1详细解读!

DeepSeek-R1爆火,今天来详细看下。 论文地址::::现有LLMs在推理任务上的改进主要依赖监督微调(SFT)和后训练(Post-Training)方法,但这些方法需要大量人工标注数据且成本高昂。 OpenAI的o1系列模型虽通过扩展推理链(Chain-of-Thought, CoT)提升了性能,但其测试时扩展仍存在挑战。

服务器总是繁忙?DeepSeek-R1本地部署图文版教程来啦

最近一段时间,国产大模型DeepSeek-R1在市场上迅速崛起,成为了众多用户的新宠。 然而,伴随其热度与用户量的急剧攀升,由此导致服务器繁忙的状况频繁出现。 为了摆脱服务器繁忙的困扰,本地部署DeepSeek-R1成为了一个绝佳的解决方案,这不仅减少了对网络连接的依赖,还能增强数据安全性。

OpenAI首席研究官:DeepSeek独立发现了o1的一些核心思路,奥特曼、LeCun纷纷置评

成本打下来了,需求更多才对? 春节这几天,国内外 AI 圈都被 DeepSeek 刷了屏。 英伟达的股市震荡更是让全世界看得目瞪口呆(参见《英伟达市值蒸发近 6000 亿美元,而 DeepSeek 刚刚又开源新模型》)。