使用DeepSeek建立一个智能聊天机器人0.07

进一步完善获取API密钥和DeepSeek的API端点,我们可以添加更多的错误处理和默认值设置,确保程序在各种情况下都能正常运行。同时,我们还可以提供一个更友好的用户界面,以便用户可以轻松地设置和查看配置信息。

以下是进一步完善的代码:

完善后的代码

import tkinter as tk
from tkinter import scrolledtext, filedialog, messagebox
import requests
import os
import threading
import json

# 从环境变量中获取API密钥和DeepSeek的API端点
API_KEY = os.getenv('DEEPSEEK_API_KEY')
DEEPSEEK_API_URL = os.getenv('DEEPSEEK_API_URL', 'https://api.deepseek.com/v1/chat')

# 如果环境变量未设置,尝试从配置文件中读取
CONFIG_FILE = 'config.json'
if not API_KEY or not DEEPSEEK_API_URL:
    try:
        with open(CONFIG_FILE, 'r') as f:
            config = json.load(f)
            API_KEY = config.get('API_KEY', API_KEY)
            DEEPSEEK_API_URL = config.get('DEEPSEEK_API_URL', DEEPSEEK_API_URL)
    except (FileNotFoundError, json.JSONDecodeError) as e:
        messagebox.showwarning("警告", f"配置文件加载失败: {str(e)}")
        API_KEY = ''
        DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat'

# 存储对话历史
conversation_history = []

def get_response(prompt):
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    data = {
        'model': 'deepseek-7b',  # 使用的模型名称
        'messages': conversation_history + [{'role': 'user', 'content': prompt}],
        'max_tokens': 150  # 生成的最大token数
    }
    
    response = requests.post(DEEPSEEK_API_URL, json=data, headers=headers)
    if response.status_code == 200:
        model_response = response.json()['choices'][0]['message']['content']
        conversation_history.append({'role': 'user', 'content': prompt})
        conversation_history.append({'role': 'assistant', 'content': model_response})
        return model_response
    else:
        raise Exception(f"错误: {response.status_code}, {response.text}")

def send_message():
    user_input = entry.get()
    if user_input.strip():
        chat_log.config(state=tk.NORMAL)
        chat_log.insert(tk.END, f"你: {user_input}\n")
        chat_log.config(state=tk.DISABLED)
        
        # 在新线程中处理API请求
        threading.Thread(target=process_response, args=(user_input,)).start()
        
        entry.delete(0, tk.END)
        chat_log.yview(tk.END)

def process_response(user_input):
    try:
        response = get_response(user_input)
        chat_log.config(state=tk.NORMAL)
        chat_log.insert(tk.END, f"DeepSeek: {response}\n")
        chat_log.config(state=tk.DISABLED)
        chat_log.yview(tk.END)
    except Exception as e:
        chat_log.config(state=tk.NORMAL)
        chat_log.insert(tk.END, f"错误: {str(e)}\n")
        chat_log.config(state=tk.DISABLED)
        chat_log.yview(tk.END)

def on_closing():
    root.destroy()

def clear_conversation():
    global conversation_history
    conversation_history = []
    chat_log.config(state=tk.NORMAL)
    chat_log.delete(1.0, tk.END)
    chat_log.config(state=tk.DISABLED)

def load_config():
    file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
    if file_path:
        try:
            with open(file_path, 'r') as f:
                config = json.load(f)
                global API_KEY, DEEPSEEK_API_URL
                API_KEY = config.get('API_KEY', '')
                DEEPSEEK_API_URL = config.get('DEEPSEEK_API_URL', 'https://api.deepseek.com/v1/chat')
                chat_log.config(state=tk.NORMAL)
                chat_log.insert(tk.END, f"配置加载成功: API_KEY={API_KEY}, DEEPSEEK_API_URL={DEEPSEEK_API_URL}\n")
                chat_log.config(state=tk.DISABLED)
        except (FileNotFoundError, json.JSONDecodeError) as e:
            chat_log.config(state=tk.NORMAL)
            chat_log.insert(tk.END, f"错误: {str(e)}\n")
            chat_log.config(state=tk.DISABLED)

def save_config():
    config = {
        'API_KEY': API_KEY,
        'DEEPSEEK_API_URL': DEEPSEEK_API_URL
    }
    file_path = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
    if file_path:
        try:
            with open(file_path, 'w') as f:
                json.dump(config, f, indent=4)
            chat_log.config(state=tk.NORMAL)
            chat_log.insert(tk.END, f"配置保存成功: {file_path}\n")
            chat_log.config(state=tk.DISABLED)
        except IOError as e:
            chat_log.config(state=tk.NORMAL)
            chat_log.insert(tk.END, f"错误: {str(e)}\n")
            chat_log.config(state=tk.DISABLED)

root = tk.Tk()
root.title("DeepSeek 聊天机器人")

# 设置窗口大小
root.geometry("600x400")

# 创建聊天记录区域
chat_log = scrolledtext.ScrolledText(root, wrap=tk.WORD, state=tk.DISABLED)
chat_log.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)

# 创建输入框
entry = tk.Entry(root, width=80)
entry.pack(pady=10, padx=10, side=tk.LEFT, fill=tk.X, expand=True)

# 创建发送按钮
send_button = tk.Button(root, text="发送", command=send_message)
send_button.pack(pady=10, padx=10, side=tk.RIGHT)

# 创建清除对话按钮
clear_button = tk.Button(root, text="清除对话", command=clear_conversation)
clear_button.pack(pady=10, padx=10, side=tk.RIGHT)

# 创建加载配置按钮
load_config_button = tk.Button(root, text="加载配置", command=load_config)
load_config_button.pack(pady=10, padx=10, side=tk.RIGHT)

# 创建保存配置按钮
save_config_button = tk.Button(root, text="保存配置", command=save_config)
save_config_button.pack(pady=10, padx=10, side=tk.RIGHT)

# 绑定关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)

# 启动主循环
root.mainloop()

改进点说明:
环境变量和配置文件:

从环境变量中获取API密钥和API端点。
如果环境变量未设置,尝试从配置文件(config.json)中读取。
配置文件 config.json 的示例格式如下:

{
  "API_KEY": "your_api_key_here",
  "DEEPSEEK_API_URL": "https://api.deepseek.com/v1/chat"
}

如果配置文件不存在或格式错误,显示警告信息,并使用默认值。
错误处理:

添加了对配置文件读取错误的处理,确保程序在文件不存在或格式错误时能够继续运行。
在加载和保存配置文件时,捕获并显示可能的IO错误。
用户界面:

增加了一个“加载配置”按钮,方便用户在不修改代码的情况下更改API密钥和API端点。
增加了一个“保存配置”按钮,方便用户保存当前的配置信息。
使用 messagebox 显示警告信息,提高用户体验。
默认值设置:

如果环境变量和配置文件均未设置,使用默认的API端点。
希望这些改进能帮助你创建一个更完善、更灵活的聊天机器人应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GESP5级语法知识(十一):高精度算法(一)

高精度加法&#xff1a; #include<iostream> #include<string> #include<algorithm> using namespace std; const int N501;//高精度数的最长长度 //c[]a[]b[]:高精度加法方案一&#xff1a;对应位相加&#xff0c;同时处理进位 void h_add_1(int a[],int b…

【Git版本控制器】:第二弹——工作区,暂存区,版本库,

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/djd…

Transformer 模型介绍(一)——综述

Transformer 是一种完全基于注意力机制的神经网络模型&#xff0c;首次在2017年的论文《Attention Is All You Need》中提出。该模型最初用于机器翻译任务&#xff0c;并在特定任务中表现优于谷歌的其他神经网络机器翻译模型。Transformer 也是 Seq2Seq&#xff08;序列到序列&…

【Linux】多线程 -> 从线程概念到线程控制

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行&#xff0c;本质是在进程地址空间内运行。在Linux系统中&#xff0c;在CPU眼…

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…

cap1:TensorRT是什么?

文章目录 1、什么是 TensorRT&#xff1f;2、TensorRT 的优势3、TensorRT 加速 PyTorch 模型的基本流程3.1 训练模型和保存模型3.2 导出模型3.3 转换为 TensorRT 引擎3.4 加载与推理 4、基础环境配置4.1 安装nvidia驱动4.2 安装CUDA4.3 安装cuDNN 在软件工程领域&#xff0c;部…

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展&#xff0c;相关领域人才需求激增&#xff0c;许多本科及职业院校纷纷开设云计算及相关专业方向。 然而&#xff0c;大多数院校在专业建设过程中面临以下困难&…

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…

深度学习框架探秘|PyTorch:AI 开发的灵动画笔

前一篇文章我们学习了深度学习框架——TensorFlow&#xff08;深度学习框架探秘&#xff5c;TensorFlow&#xff1a;AI 世界的万能钥匙&#xff09;。在人工智能领域&#xff0c;还有一个深度学习框架——PyTorch&#xff0c;以其独特的魅力吸引着众多开发者和研究者。它就像一…

springcloud集成gateway

本篇文章只介绍gateway模块的搭建步骤&#xff0c;并无gateway详细介绍 gateway详解请查看&#xff1a;SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇&#xff1a; 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…

计算机网络(1)基础篇

目录 1.TCP/IP 网络模型 2.键入网址--->网页显示 2.1 生成HTTP数据包 2.2 DNS服务器进行域名与IP转换 2.3 建立TCP连接 2.4 生成IP头部和MAC头部 2.5 网卡、交换机、路由器 3 Linux系统收发网络包 1.TCP/IP 网络模型 首先&#xff0c;为什么要有 TCP/IP 网络模型&a…

PyInstaller在Linux环境下的打包艺术

PyInstaller是一款强大的工具&#xff0c;能够将Python应用程序及其所有依赖项打包成独立的可执行文件&#xff0c;支持Windows、macOS和Linux等多个平台。在Linux环境下&#xff0c;PyInstaller打包的可执行文件具有独特的特点和优势。本文将详细介绍PyInstaller在Linux环境下…

寒假2.12

题解 web&#xff1a;XYCTF2024-牢牢记住&#xff0c;逝者为大 打开环境&#xff0c;是源代码 看到了熟悉的preg_match函数 代码解析&#xff1a; 输入的cmd长度不能超过13&#xff0c;可以使用GET[‘cmd’]躲避长度限制 使用正则表达式过滤的一系列关键字 遍历get数组&…

如何构建有效的人工智能代理

目录 什么是 AI 代理? 何时应使用 AI 代理? 人工智能代理的构建模块 构建 AI 代理的常用方法 1. 提示链接(分步说明) 2.路由(将任务发送到正确的地方) 3.并行处理(同时做多件事) 4. 协调者和工作者 AI(团队合作) 5. 评估器和优化器(修复错误) 如何让人工…

华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 硅基流动 1.1 注册登录 1.2 实名认证 1.3 创建API密钥 1.4 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载&#xff1a; AI聊天本地客户端 接入Chatbox客户端 点击设置 选择SiliconFloW API 粘贴1.3创…

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…

吊舱响应波段详解!

一、响应波段技术 可见光波段&#xff1a;通过高分辨率相机捕捉地面或空中目标的清晰图像&#xff0c;适用于白天或光照条件良好的环境下进行观测。 红外波段&#xff1a;利用红外辐射探测目标的温度分布&#xff0c;实现夜间或恶劣天气条件下的隐蔽目标发现。红外波段通常分…

AI驱动的直播带货电商APP开发:个性化推荐、智能剪辑与互动玩法

时下&#xff0c;个性化推荐、智能剪辑、互动玩法等AI技术的应用&#xff0c;使得直播电商平台能够精准触达用户、提升观看体验、提高转化率。对于希望在直播电商领域占据一席之地的企业来说&#xff0c;开发一款AI驱动的直播带货APP&#xff0c;已经成为提升竞争力的关键。 一…

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…