deepseek现在大火,很多人都想本地部署,但是电脑配置又不够,怎么样才能用上稳定、满血的deepseek呢,我发现了一个好办法,今天分享给大家。

一、首先登录一个云平台叫 基石智算,地址:https://account.coreshub.cn

它提供了 671b 满血版 DeepSeek-R1 的部署,而且注册就送 50元优惠券,相当于上千万的token,足够用上好一阵子了。

1、注册并认证账户

首先登录网站后,注册好账户,点击下方的链接进行认证,认证方式可以选择支付宝认证,基本上几分钟之内就可以完成,然后就能看到官方赠送的优惠券。

路径:账号设置>认证信息 

网站:https://console.coreshub.cn/account/profile/advanced

图片


这里需要认证一下

图片


在左上方费用里面可以看到官方赠送的优惠券。

图片

2、登录大模型服务创建API密钥

点击左上角 产品服务>大模型服务,找到大模型服务平台,点击进入。

图片

进入 API 密钥管理,点击 创建 API 密钥,给密钥命名,点击“确定”即可创建 API 密钥。

图片

创建完成后,会看到我们已经创建好的API密钥,这个时候,点击红框所示的复制按钮,就可以复制API密钥出来了。

图片

3、获取对外服务的地址

网址:https://docs.coreshub.cn/console/big_model_server/

也可以从在线推理服务这个地方找到相关说明。

图片

这里可以看到它提供了671B的满血deepseek模型可用

基石智算提供的地址格式如下:

地址:https://openapi.coreshub.cn/v1 

模型名称:DeepSeek-R1

这个调用方式兼容 OpenAI 接口规范的使用方式,因此在主流的客户端软件,比如ChatBox、CherryStudio等都可以使用。具体使用方法我就不写了。

4、用python自己写个本地客户端

有些小伙伴可能需要有些定制化的内容,比如统计每次使用的tokens、多行输入等等,那也可以自己动手写个客户端,我这里用python写了一个,代码分享给你们:


import tkinter as tk
from tkinter import scrolledtext, ttk, messagebox
import threading
import requests
import json
import tiktoken  # 新增tiktoken库用于token计数

from tkinter import TOP


class ChatAPI:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "https://openapi.coreshub.cn/v1/chat/completions"
        self.headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {self.api_key}"
        }

    def send_request(self, model, messages, **kwargs):
        data = {
            "model": model,
            "messages": messages,
            "stream": True
        }
        # 省略可选参数处理部分,保持原样...
        response = requests.post(self.base_url, headers=self.headers, json=data, stream=True)
        return response

class ChatGUI:
    def __init__(self, master, api_key):
        self.master = master
        self.api_key = api_key
        self.chat_api = ChatAPI(api_key)
        self.messages = [{"role": "system", "content": "You are a helpful assistant."}]
        self.total_tokens = 0  # 新增token计数器
        self.current_response = ""
        self.is_waiting_response = False

        # 配置界面样式
        self.style = ttk.Style()
        self.style.theme_use('clam')
        self._setup_style()

        master.title("智能聊天助手")
        master.geometry("900x680")
        self.setup_ui()

    def _setup_style(self):
        """自定义界面样式"""
        self.style.configure('TFrame', background='#f5f5f5')
        self.style.configure('TLabel', background='#f5f5f5', foreground='#333')
        self.style.configure('TButton', font=('Microsoft YaHei', 9), padding=5,
                            background='#4CAF50', foreground='white')
        self.style.map('TButton',
                      background=[('active', '#45a049'), ('disabled', '#cccccc')])
        self.style.configure('status.TLabel', background='#e0e0e0', padding=(5,2))

    def setup_ui(self):
        # 创建主框架
        main_frame = ttk.Frame(self.master, padding=10)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 对话历史显示区域
        self.history_area = scrolledtext.ScrolledText(
            main_frame,
            wrap=tk.WORD,
            state=tk.DISABLED,
            font=('Microsoft YaHei', 11),
            bg='white',
            padx=10,
            pady=10
        )
        self.history_area.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
        self.history_area.tag_config('user', foreground='#1e88e5')
        self.history_area.tag_config('assistant', foreground='#43a047')

        # 输入区域
        input_frame = ttk.Frame(main_frame)
        input_frame.pack(fill=tk.BOTH, pady=5)

        # 多行输入框
        self.input_entry = scrolledtext.ScrolledText(
            input_frame,
            wrap=tk.WORD,
            height=4,
            font=('Microsoft YaHei', 10),
            padx=5,
            pady=5
        )
        self.input_entry.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        self.input_entry.bind("<Control-Return>", lambda e: self.send_message())
        self.input_entry.bind("<Return>", self._insert_newline)

        # 按钮容器
        btn_frame = ttk.Frame(input_frame)
        btn_frame.pack(side=tk.LEFT, padx=5)

        self.send_button = ttk.Button(
            btn_frame,
            text="发送 (Ctrl+Enter)",
            command=self.send_message
        )
        self.send_button.pack(side=tk.TOP, fill=tk.X, pady=2)

        self.clear_button = ttk.Button(
            btn_frame,
            text="清空历史",
            command=self.clear_history
        )
        self.clear_button.pack(side=TOP, fill=tk.X, pady=2)

        # 状态栏
        status_frame = ttk.Frame(main_frame)
        status_frame.pack(fill=tk.X)

        self.status_var = tk.StringVar(value="就绪")
        ttk.Label(
            status_frame,
            textvariable=self.status_var,
            style='status.TLabel'
        ).pack(side=tk.LEFT, fill=tk.X, expand=True)

        self.tokens_var = tk.StringVar(value="累计Tokens: 0")
        ttk.Label(
            status_frame,
            textvariable=self.tokens_var,
            style='status.TLabel'
        ).pack(side=tk.RIGHT)

    def _insert_newline(self, event):
        """处理回车键插入换行"""
        self.input_entry.insert(tk.INSERT, "\n")
        return "break"

    def send_message(self):
        if self.is_waiting_response:
            messagebox.showwarning("提示", "请等待当前回复完成!")
            return

        user_input = self.input_entry.get("1.0", tk.END).strip()
        if not user_input:
            return

        # 计算并更新token计数
        user_tokens = self._count_tokens(user_input)
        self.total_tokens += user_tokens
        self.tokens_var.set(f"累计Tokens: {self.total_tokens}")

        self.input_entry.delete("1.0", tk.END)
        self._add_message("user", user_input)
        self.messages.append({"role": "user", "content": user_input})

        threading.Thread(
            target=self._handle_api_request,
            daemon=True
        ).start()

    def _handle_api_request(self):
        self.is_waiting_response = True
        self.current_response = ""
        self.status_var.set("正在生成回复...")

        try:
            response = self.chat_api.send_request(
                model="DeepSeek-R1",
                messages=self.messages,
                temperature=0.7,
                max_tokens=10240
            )

            if response.status_code == 200:
                self._add_message("assistant", "")
                for line in response.iter_lines():
                    if line:
                        decoded_line = line.decode("utf-8")
                        if decoded_line.startswith("data: "):
                            content = decoded_line[len("data: "):]
                            try:
                                data = json.loads(content)
                                if "choices" in data and data["choices"]:
                                    delta = data["choices"][0].get("delta", {})
                                    if "content" in delta:
                                        self._append_response(delta["content"])
                            except json.JSONDecodeError:
                                pass

                # 更新助手消息和token计数
                self.messages.append({"role": "assistant", "content": self.current_response})
                assistant_tokens = self._count_tokens(self.current_response)
                self.total_tokens += assistant_tokens
                self.tokens_var.set(f"累计Tokens: {self.total_tokens}")
            else:
                self._show_error(f"API请求失败: {response.status_code}\n{response.text}")
        except Exception as e:
            self._show_error(f"发生错误: {str(e)}")
        finally:
            self.is_waiting_response = False
            self.status_var.set("就绪")

    def _count_tokens(self, text):
        """使用tiktoken计算token数量"""
        try:
            encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
        except KeyError:
            encoding = tiktoken.get_encoding("cl100k_base")
        return len(encoding.encode(text))

    def _append_response(self, content):
        self.current_response += content
        self.history_area.configure(state=tk.NORMAL)
        self.history_area.insert(tk.END, content, 'assistant')
        self.history_area.configure(state=tk.DISABLED)
        self.history_area.see(tk.END)
        self.master.update_idletasks()

    def _add_message(self, role, content):
        self.history_area.configure(state=tk.NORMAL)
        prefix = "\n你: " if role == "user" else "\n助手: "
        tag = 'user' if role == "user" else 'assistant'
        self.history_area.insert(tk.END, prefix, tag)
        self.history_area.insert(tk.END, f"{content}\n")
        self.history_area.configure(state=tk.DISABLED)
        self.history_area.see(tk.END)

    def clear_history(self):
        self.history_area.configure(state=tk.NORMAL)
        self.history_area.delete(1.0, tk.END)
        self.history_area.configure(state=tk.DISABLED)
        self.messages = [{"role": "system", "content": "You are a helpful assistant."}]
        self.total_tokens = 0
        self.tokens_var.set("累计Tokens: 0")

    def _show_error(self, message):
        self.master.after(0, lambda: messagebox.showerror("错误", message))

if __name__ == "__main__":
    api_key = "sk-*************"  # 替换为你的 API 密钥
    root = tk.Tk()
    try:
        app = ChatGUI(root, api_key)
        root.mainloop()
    except Exception as e:
        messagebox.showerror("启动错误", f"程序启动失败: {str(e)}")

运行后效果如下:
 

图片

最近AI应用越来越火,我新开了个公众号 AI智脉,欢迎小伙伴们前来围观,大家一起学习!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐