当前位置: 首页 > news >正文

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

为了增强智能聊天机器人的功能,我增加以下几个方面的改进:

1.智能框架和算法:引入更复杂的对话管理逻辑,例如情感分析、上下文理解等。
2.链接能力:增强对多个API节点的管理和切换逻辑,确保高可用性。
3.配置管理:增加更多配置选项,如模型选择、最大token数、请求超时等。
以下是完善后的代码和 config.json 文件内容:
完善后的代码

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

# 加载环境变量
load_dotenv()

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

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

# 从配置文件中读取多个API节点和其他配置
try:
    with open(CONFIG_FILE, 'r') as f:
        config = json.load(f)
        API_NODES = config.get('API_NODES', [DEFAULT_API_URL])
        MAX_TOKENS = config.get('MAX_TOKENS', 150)
        TIMEOUT = config.get('TIMEOUT', 10)
        MODEL = config.get('MODEL', 'deepseek-7b')
except (FileNotFoundError, json.JSONDecodeError) as e:
    messagebox.showwarning("警告", f"配置文件加载失败: {str(e)}")
    API_NODES = [DEFAULT_API_URL]
    MAX_TOKENS = 150
    TIMEOUT = 10
    MODEL = 'deepseek-7b'

# 当前使用的API节点
CURRENT_API_URL = API_NODES[0]

# 存储对话历史
conversation_history = []

def get_response(prompt):
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    data = {
        'model': MODEL,  # 使用的模型名称
        'messages': conversation_history + [{'role': 'user', 'content': prompt}],
        'max_tokens': MAX_TOKENS  # 生成的最大token数
    }
    
    for api_url in API_NODES:
        try:
            response = requests.post(api_url, json=data, headers=headers, timeout=TIMEOUT)
            response.raise_for_status()
            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
        except requests.RequestException as e:
            chat_log.config(state=tk.NORMAL)
            chat_log.insert(tk.END, f"请求错误: {str(e)}\n")
            chat_log.config(state=tk.DISABLED)
            continue
    raise Exception("所有API节点均无法连接")

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, DEFAULT_API_URL, API_NODES, CURRENT_API_URL, MAX_TOKENS, TIMEOUT, MODEL
                API_KEY = config.get('API_KEY', '')
                DEFAULT_API_URL = config.get('DEFAULT_API_URL', 'https://api.deepseek.com/v1/chat')
                API_NODES = config.get('API_NODES', [DEFAULT_API_URL])
                CURRENT_API_URL = API_NODES[0]
                MAX_TOKENS = config.get('MAX_TOKENS', 150)
                TIMEOUT = config.get('TIMEOUT', 10)
                MODEL = config.get('MODEL', 'deepseek-7b')
                chat_log.config(state=tk.NORMAL)
                chat_log.insert(tk.END, f"配置加载成功: API_KEY={API_KEY}, API_NODES={API_NODES}, MAX_TOKENS={MAX_TOKENS}, TIMEOUT={TIMEOUT}, MODEL={MODEL}\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,
        'DEFAULT_API_URL': DEFAULT_API_URL,
        'API_NODES': API_NODES,
        'MAX_TOKENS': MAX_TOKENS,
        'TIMEOUT': TIMEOUT,
        'MODEL': MODEL
    }
    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)

def switch_node():
    global CURRENT_API_URL
    current_index = API_NODES.index(CURRENT_API_URL)
    next_index = (current_index + 1) % len(API_NODES)
    CURRENT_API_URL = API_NODES[next_index]
    chat_log.config(state=tk.NORMAL)
    chat_log.insert(tk.END, f"切换到API节点: {CURRENT_API_URL}\n")
    chat_log.config(state=tk.DISABLED)

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

# 设置窗口大小
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)

# 创建切换节点按钮
switch_node_button = tk.Button(root, text="切换节点", command=switch_node)
switch_node_button.pack(pady=10, padx=10, side=tk.RIGHT)

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

# 启动主循环
root.mainloop()

config.json文件内容

{
  "API_KEY": "your_api_key_here",
  "DEFAULT_API_URL": "https://api.deepseek.com/v1/chat",
  "API_NODES": [
    "https://api.deepseek.com/v1/chat",
    "https://api.deepseek2.com/v1/chat",
    "https://api.deepseek3.com/v1/chat"
  ],
  "MAX_TOKENS": 150,
  "TIMEOUT": 10,
  "MODEL": "deepseek-7b"
}

解释
1.API_KEY: 你的DeepSeek API密钥。
2.DEFAULT_API_URL: 默认的API节点URL。
3.API_NODES: 一个包含多个API节点URL的列表,用于在请求失败时进行切换。
4.MAX_TOKENS: 每次请求生成的最大token数。
5.TIMEOUT: 请求的超时时间(秒)。
6.MODEL: 使用的模型名称。
如何使用
1.将上述 config.json 内容复制到一个名为 config.json 的文件中。
2.将 config.json 文件放在与你的Python脚本相同的目录下。
3.确保 API_KEY 和 API_NODES 中的URL是有效的。
读取配置文件的代码片段

# 从配置文件中读取多个API节点和其他配置
try:
    with open(CONFIG_FILE, 'r') as f:
        config = json.load(f)
        API_KEY = config.get('API_KEY', '')
        DEFAULT_API_URL = config.get('DEFAULT_API_URL', 'https://api.deepseek.com/v1/chat')
        API_NODES = config.get('API_NODES', [DEFAULT_API_URL])
        MAX_TOKENS = config.get('MAX_TOKENS', 150)
        TIMEOUT = config.get('TIMEOUT', 10)
        MODEL = config.get('MODEL', 'deepseek-7b')
except (FileNotFoundError, json.JSONDecodeError) as e:
    messagebox.showwarning("警告", f"配置文件加载失败: {str(e)}")
    API_NODES = [DEFAULT_API_URL]
    MAX_TOKENS = 150
    TIMEOUT = 10
    MODEL = 'deepseek-7b'

通过这些改进,你的智能聊天机器人将更加健壮,能够更好地管理和切换多个API节点,同时提供更多的配置选项,增强其智能框架和算法能力。

相关文章:

  • 执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案
  • leetcode - hot100 - python - 专题一:哈希
  • 基于STM32、HAL库、MB85RC16PNF(I2C接口)驱动程序设计
  • python实现jaccard系数得出两个集合的相似度
  • deepseek-r1不同参数量的模型本地私有化部署,需要的硬件资源最低配置
  • [vs2017][qt]MSB4019 未找到导入的项目QtMsBuild\Qt.prop
  • Linux:Makefile和缓冲区的基本概念
  • pnpm vs npm
  • 【C/C++】后缀表达式 蓝桥杯/ACM备赛
  • elabradio入门第二讲——BPSK数字调制与解调(插值、升余弦滤波、速率匹配、符号同步)
  • 计网week5
  • 开发提示词整理
  • Spring Cloud微服务生产级容量评估实战
  • 2025华为OD机试真题-猜数字(C++/Java/Python)-E卷-100分
  • DeepSeek教unity------State Machine
  • 网络优化工作流程
  • 文件IO、目录IO
  • C/C++字符串格式化全解析:从printf到std::format的安全演进与实战指南
  • uv 简易安装与更换国内镜像源
  • Function.prototype.__proto__==Object.prototype
  • 国内生产、境外“游一圈”再进保税仓,这些“全球购”保健品竟是假进口
  • 新任浙江省委常委、组织部长杨荫凯到嘉兴南湖瞻仰红船
  • 魔都眼·上海车展⑥|周六客流超13.5万人次,创开展新高
  • 新城市志|中国消费第一城,迎来“补贴力度最大”购物节
  • 白酒瓶“神似”北京第一高楼被判侵权,法院一审判赔45万并停售
  • 云南鲁甸县一河滩突然涨水致4死,有人在救人过程中遇难