🐑 |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 🐑
文章目录
♈前言♈
经过上周老学长的提点,这周进度飞速,感觉按照我原来的进度这周的成果需要多耗好多个星期,首先感谢一下学长@浩浩的科研笔记,其次这周的博客就准备简单记录一下,如何把一个AI以api的形式嵌入到自己的ui界面中,引入AI后确实增加了很多交互的体验,就拿我自己做的这个根据心电信号实时识别并预测情绪的系统来看,我完全可以在引入AI后通过AI调取我识别后的情绪模型结果来给用户相关建议或者下一步的想法,人机交互显得更加自然一点。本篇就以引入Deepseek的模型为例来记录一下如何将AI引入到自己的ui界面中。
♈调取Deepseek大模型♈
在打造ui界面的AI助手之前首先来介绍一下如何在python
上调取Deepseek
大模型并实现一个多轮对话,这里先推荐一下学长@浩浩的科研笔记的一篇博文调用阿里通义千问大语言模型API-小白新手教程-python,这里已经以阿里的通义千问为例将调取大模型API
以及实现多轮对话的功能介绍的很详细了,我这里就以调取Deepseek
为例全程记录一下自己调取的步骤。
♒准备工作♒
首先我们需要申请一份Deepseek
的API
用于使用python
访问Deepseek
的模型。进入deepseek
的官网:https://www.deepseek.com/,进入右上角的API开放平台。
进入后在开放平台左侧可以看到充值入口,充值后,进入API KEYs
点击创建API key
即可创建一个自己的API 密钥
,可以保存到电脑上,或者复制下来
(因为只有创建的时候才能看到自己的密钥,后面关闭创建的弹窗后就看不到了)
然后开始安装requests
库,这个库的作用就是HTTP请求到Deepseek API内,安装命令符:
pip install requests
。至此准备工作结束。
♒调用API♒
然后一点点来记录下调用刚刚保存的API
的代码。
import requests
# 配置参数
API_KEY = "" # 替换为你的API密钥
API_URL = "https://api.deepseek.com/v1/chat/completions"
其中API_KEY
为刚刚保存的密钥复制上即可,下面的API_URL
为官方文档的断点地址。
def ask_deepseek(prompt):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 1024
}
在ask_deepseek
的函数中分别定义请求头headers
以及构造请求数据data
。messages
中分别包含角色和对话的内容temperature
则是控制模型回复的随机性,越靠近1回复就会越天马行空;max_tokens
则是限制回复的最大长度(大约1024tokens≈700汉字),并且在data
中我们可以改变调用的模型,除了代码中的deepseek-chat
外还可以调用deepseek-coder
相对而言代码能力更强。
try:
response = requests.post(API_URL, headers=headers, json=data)
response.raise_for_status() # 检查错误
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"错误: {str(e)}"
然后就是发送请求与错误处理,当消息头和请求数据发送成功时,response.json
会成功解析API返回的JSON数据,并且通过response.json()["choices"][0]["message"]["content"]
提取出AI回复的文本内容,如果请求失败则会返回错误提示。
if __name__ == "__main__":
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
break
answer = ask_deepseek(user_input)
print("DeepSeek:", answer)
最后就是连续对话的一个交互逻辑,当用户输入exit
时候退出对话。
完整代码:
import requests
# 配置参数
API_KEY = "" # 替换为你的实际API密钥
API_URL = "https://api.deepseek.com/v1/chat/completions"
def ask_deepseek(prompt):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 1024
}
try:
response = requests.post(API_URL, headers=headers, json=data)
response.raise_for_status() # 检查错误
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"错误: {str(e)}"
if __name__ == "__main__":
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
break
answer = ask_deepseek(user_input)
print("DeepSeek:", answer)
运行后我们可以简单看下效果:
可以看到我们可以直接在pycharm的控制台中实现实时的对话功能,但是不好的一点就是pycharm
的控制台不支持markdown
的渲染,所以里面会难以识别出markdown
的语法。
♈将模型嵌入到ui界面中♈
既然已经实现了简单使用requests
在pycharm
中调用deepseek
的模型,后面就简单记录一下怎样在ui界面中调用。
这里还是以QTdesigner
来制作ui界面为例,这里我是创建了一个名为aitest2.ui
的文件,包含了一个QTexeBrowser
、一个QtextEdit
、一个Qpushbutton
以及一个label
首先label
就是简单给自己的AI助手设置一个名字,我这里也是随便起的一个,下面分别就是用户的输入栏发送按钮以及回复框,其中三个控件的名字分别为aitext
,aibutton
,以及textbrowser
。创建好后我们只需要将他load
并结合我们上面的代码,给各个控件加一个交互的指令即可。
import sys
import requests
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtUiTools import QUiLoader
# API 配置(与原始代码保持一致)
API_KEY = "" # 替换为你的实际API密钥
API_URL = "https://api.deepseek.com/v1/chat/completions"
def ask_deepseek(prompt):
"""与您提供的函数完全一致的API调用方法"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 1024
}
try:
response = requests.post(API_URL, headers=headers, json=data)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"错误: {str(e)}"
class DeepSeekApp:
def __init__(self):
# 加载UI文件
self.ui = QUiLoader().load("aitest2.ui")
# 绑定按钮事件
self.ui.aibutton.clicked.connect(self.on_button_click)
def on_button_click(self):
"""按钮点击事件处理"""
user_input = self.ui.aitext.toPlainText().strip()
if not user_input:
return
# 调用与原始代码一致的API方法
answer = ask_deepseek(user_input)
# 显示结果
self.ui.textbrowser.append(f"You: {user_input}")
self.ui.textbrowser.append(f"AI: {answer}\n")
self.ui.aitext.clear()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DeepSeekApp()
window.ui.show()
sys.exit(app.exec_())
第一个函数基本没什么变化,主要第二个调用的类里面记得在初始化中将按钮给初始化了。然后下面的on_button_click
的方法也是很简单的交互指令,只是最后记得加上一句 self.ui.aitext.clear()
目的是当我们把输入的文本发送后,将上次已发送的文本进行清空掉。
简单看下效果:
♈总结♈
简单记录一下这周学到的一些比较重要的地方,如果有不合适的地方也欢迎提出。