如何在本地部署 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 左右。
當然,這里我們不需要直接在網站上下載,后面可以直接在代碼中加載模型。
準備工作
- 安裝 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.png
調用接口http://172.16.10.157:5000/generate
傳入相關參數即可,這里我們只傳入一個提問 prompt 參數,其他參數都用默認值。
測試接口
我們需要使用 postman 或者其他工具來測試接口,這里我使用的是 apifox。調用接口并傳入prompt
問題,等待一會就會返回一個生成的文本。
當然這里因為我們電腦配置有限,只能使用 deepseek 提供的最簡單的 1.5b 的模型作為演示。參數量越大,生成的文本質量肯定就越好,同時需要的電腦配置就越高。
后續調用
接口部署完成之后,后續我們可以根據需要在工程項目中調用接口,來實現一些 AI 對話應用。同時可以根據每個用戶的 id 來保存用戶的歷史對話,以便后續根據用戶的歷史對話來生成更好的回答。下篇文章將介紹如何使用 nodejs 來調用這個接口,并實現一個 AI 對話應用,歡迎點贊收藏加關注
標注