🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑
文章目錄
- 🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑
- ?前言?
- ?調取Deepseek大模型?
- ?準備工作?
- ?調用API?
- ?將模型嵌入到ui界面中?
- ?總結?
?前言?
經過上周老學長的提點,這周進度飛速,感覺按照我原來的進度這周的成果需要多耗好多個星期,首先感謝一下學長@浩浩的科研筆記,其次這周的博客就準備簡單記錄一下,如何把一個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':breakanswer = 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':breakanswer = 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()
目的是當我們把輸入的文本發送后,將上次已發送的文本進行清空掉。
簡單看下效果:
?總結?
簡單記錄一下這周學到的一些比較重要的地方,如果有不合適的地方也歡迎提出。