前言
最近deepseek实在太火了,导致其官网上常常出现服务器繁忙,有时候得重新刷新好几次才能有所反应,使用十分受限,而很多其它第三方平台使用deepseek存在字数的限制和无法上传图片等局限。如何解决deepseek R1模型出现的“服务器繁忙问题”呢?通过调用其api使用便可以不受此限制。本文主要是介绍基于gradio构建一个聊天界面,可以通过调用API的方式不受限制的使用deepseek r1模型。并且介绍如何使用pyinstaller库将python打包成.exe可执行文件,支持电脑一键启动该聊天界面,十分方便。本文使用的全部代码已上传github仓库中,如有帮助,麻烦点个star。
主要的步骤如下:
获取免费的API
第一步 打开阿里云:
进入阿里云官方网站,登录账号。然后搜索阿里云白炼并进入,点击左边界面的模型广场,可以看到阿里云上支持deepseek系列的模型,如下图所展示的:
点击查看详情,发现阿里云上面送了100万的免费token额度,并且可以使用好几个月。
第二步 创建自己的API-KEY
在页面的右上角点击查看我的API-KEY,并在里面创建自己的API-KEY,复制该API-KEY。
构建代码
以下为阿里云里面调用api的代码。
import os
from openai import OpenAI
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"), # 如何获取API Key:https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
completion = client.chat.completions.create(
model="deepseek-r1", # 此处以 deepseek-r1 为例,可按需更换模型名称。
messages=[
{'role': 'user', 'content': '9.9和9.11谁大'}
]
)
# 通过reasoning_content字段打印思考过程
print("思考过程:")
print(completion.choices[0].message.reasoning_content)
# 通过content字段打印最终答案
print("最终答案:")
print(completion.choices[0].message.content)
为了更加方便的使用deepseek模型,本文使用gradio库来构建可视化界面。代码主要是在该GitHub的基础上增加了选择模型以及运行程序之后会自动打开可视化界面的功能。创建一个名为deepseek.py的文件,复制如下完整代码后,将自己的API-KEY添加变量api_key后,安装好对应的库,直接运行该代码就行了。关于本博客中的配置环境以及库可以参考xy-adams/DeepSeekAPI-Chat (github.com)
完整代码如下:
# -*- coding: utf-8 -*-
# 导入所需库
import gradio as gr
from openai import OpenAI
import webbrowser # 导入webbrowser模块用于自动打开链接
# -------------------- 客户端初始化 --------------------
# 初始化OpenAI客户端(适配阿里云平台)
client = OpenAI(
api_key="your_key", # 输入API密钥
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 阿里云兼容接口
)
# -------------------- # 模型配置 --------------------
AVAILABLE_MODELS = [
"deepseek-r1",
"deepseek-v3",
"qwen-omni-turbo-latest",
"llama3.3-70b-instruct"
]
HISTORY_ROUNDS = 10 # 默认保留10轮
# 初始化消息历史记录
messages_history = []
# -------------------- 核心聊天函数 --------------------
def chat_with_model(user_input, chat_output, selected_model):
"""
与DeepSeek模型进行交互的核心函数
参数:
user_input (str): 用户输入的文本
chat_output (str): 当前聊天输出内容
selected_model (str): 选择的模型名称
返回:
generator: 通过yield逐步返回生成的聊天内容
"""
# 将用户输入添加到消息历史记录
messages_history.append({'role': 'user', 'content': user_input})
recent_messages = messages_history[-HISTORY_ROUNDS*2:] # 每轮包含user和assistant两条
# 初始化思考过程和回答内容
reasoning_content = "" # 存储模型的推理过程
answer_content = "" # 存储最终回答
# 格式化输出内容
chat_output += f"\n\n"
chat_output += f" \n**输入:** {user_input}\n" # 显示用户输入
chat_output += f" \n<span style='color: gray;'>**思考过程:** </span> \n" # 灰色思考过程标题
# 调用阿里云API进行流式响应
completion = client.chat.completions.create(
model=selected_model, # 使用选择的模型
messages=recent_messages, # 传入最近对话上下文
stream=True # 启用流式传输
)
begin_answer = 0 # 回答部分开始标记
for chunk in completion:
delta = chunk.choices[0].delta
# 获取模型的推理过程内容(如果存在)
if hasattr(delta, "reasoning_content") and delta.reasoning_content:
reasoning_chunk = delta.reasoning_content
reasoning_content += reasoning_chunk
# 用灰色显示思考过程
chat_output += f"<span style='color: gray;'>{reasoning_chunk}</span>"
# 获取模型的回答内容
if hasattr(delta, "content") and delta.content:
if begin_answer == 0: # 首次出现回答时添加标题
chat_output += f" \n**回答:** \n"
begin_answer = 1
answer_chunk = delta.content
answer_content += answer_chunk
chat_output += answer_chunk # 直接显示回答内容
yield chat_output # 逐步返回生成内容
# 将助手的最终回答添加到消息历史记录
messages_history.append({'role': 'assistant', 'content': answer_content})
# -------------------- 清空对话函数 --------------------
def clear_conversation(chat_output):
"""
清空对话历史和聊天界面
参数:
chat_output (str): 当前聊天输出内容
返回:
str: 清空后的空字符串
"""
global messages_history
messages_history = [] # 重置消息历史
chat_output = "" # 清空聊天显示
return chat_output
# -------------------- Gradio界面构建 --------------------
with gr.Blocks() as demo: # 创建块状布局界面
gr.Markdown("""<h1 style="text-align: center; color: #2c3e50;">🌈 deepseek——AI助手</h1>""") # 更新标题
# 模型选择区域
with gr.Row():
model_selector = gr.Dropdown(
label="选择模型",
choices=AVAILABLE_MODELS,
value=AVAILABLE_MODELS[0],
interactive=True
)
# 聊天显示区域
with gr.Row():
with gr.Column():
chat_output = gr.Markdown(label="Chat", value="")
# 输入控制区域
with gr.Row():
with gr.Column():
user_input = gr.Textbox(
label="输入",
placeholder="Type your message here...",
lines=2
)
with gr.Row():
submit_button = gr.Button("Submit") # 提交按钮
clear_button = gr.Button("开始新对话") # 清空按钮
# 绑定按钮事件
submit_button.click(
fn=chat_with_model, # 触发聊天函数
inputs=[user_input, chat_output, model_selector], # 新增模型选择输入
outputs=chat_output # 输出目标
)
clear_button.click(
fn=clear_conversation, # 触发清空函数
inputs=[chat_output], # 输入参数
outputs=chat_output # 输出目标
)
# -------------------- 启动应用 --------------------
# 启动Gradio应用并自动打开链接
webbrowser.open("http://127.0.0.1:7860")
demo.launch(server_name="127.0.0.1", server_port=7860, show_api=False)
界面展示
但每次使用该界面时都需要运行该程序,比较繁琐,最好是能有一键启动的方法。因此想到将该脚本打包成一个exe文件,即可以在windows电脑上直接启动。
打包成可执行文件
这里使用到了pyinstaller 库,其支持将python脚本打包成windows上可执行的文件,使用起来就十分方便快捷了。
安装pyinstaller 库
pip install pyinstaller
然后运行命令
pyinstaller --onefile --name=deepseek_app deepseek.py
参数说明:
--onefile
:将所有内容打包成一个单独的.exe
文件。--name=deepseek_app
:指定生成的可执行文件的名称(不包括扩展名.exe
)。deepseek.py
:你要打包的 Python 脚本文件。
运行结束后,你会得到二个文件和一个配置文件,其介绍如下:
文件/文件夹 | 用途 | 是否需要保留 |
---|---|---|
build | 中间文件存放目录 | 不需要保留(除非调试) |
dist | 最终可执行文件输出目录 | 必须保留 |
.spec | 配置文件,定义打包参数 | 建议保留 |
得到的deepseek_app.exe文件就在dist目录下。
但当点击可执行文件deepseek_app.exe时,会发生以下报错:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\name\AppData\Local\Temp_\MEI204402\gradio_client\types.json'
[PYI-1692:ERROR] Failed to execute script 'deepseek' due to unhandled exception!
这是 PyInstaller 打包的应用程序运行时的错误提示,表明脚本 deepseek
在执行过程中遇到了未处理的异常(即上述文件找不到的问题)。因为有些库没有打包进去,特别是关于gradio库不会被自动找到并打包进行。
这时候需要修改生成的deepseek_app.spec文件,将内容修改为以下:
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files
# 添加路径
datas = []
datas += collect_data_files('gradio_client')
datas += collect_data_files('gradio')
datas += collect_data_files('safehttpx')
a = Analysis(
['deepseek.py'],
pathex=[],
binaries=[],
datas=datas,
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
module_collection_mode={ 'gradio': 'py',}
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='deepseek_app',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
然后使用命令:
pyinstaller deepseek_app.spec
待重新生成deepseek_app.exe文件后再进行点击,等待十几秒后,便可以成功运行
运行界面如下:
这就可以开始与deepseek r1模型开始对话了,并且可以选择其它模型使用,也可以自己在代码中添加阿里云上支持的其它模型。
进一步优化
但目前存在的问题是:DeepSeek R1模型是不支持图片的理解的,所以想实现对于图片的理解需要首先调用另外一个模型来将图片的理解转成文字,然后将图片的描述和自己的问题共同传给大模型实现对于图片的理解。关于这部分的代码,将上传到我的github仓库,假如对你有帮助的话,麻烦点个star。
最后优化后的效果图: