一、前言
千帆大模型是百度提供的可以使用API接口调用GPT模型,使用Python调用其实是很简单的:去千帆大模型申请账号->使用python调用API即可,具体可以参考这位大佬的博客,这里就不赘述了。
【教程】如何用Python调用百度的千帆大模型?-CSDN博客
本文章主要分享一个作为初学者的我,使用QT画的一个界面用于交互,和简单的调教,让它可以根据我自定义的函数来帮我生成脚本用于我的小助手。
代码全部开源详细请移步《板级调试小助手(1)系统结构和原理》文章最后查看。
二、界面设计
设计好的界面如下图所示,由于千帆大模型返回的数据是遵循MarkDown所以使用QT解析MarkDown显示即可
三、 代码
我设计的代码分为两个模块,第一个模块是使用QT显示界面,并对模型做简单的调教。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QPushButton
from PyQt5.QtCore import pyqtSignal,QThread
import markdown
from markdown.extensions.extra import ExtraExtension
import json
import yiyan_dialog as yiyan
#导入自己的库
#一个线程的类-用于HTTP
class WorkerThread(QThread):
# 定义一个信号,用于通知主线程任务已完成
finished = pyqtSignal()
def run(self):
global reply_data
payload = json.dumps({
"messages": [
{
"role": "user",
"content": "现在我定义三个功能脚本函数,在之后的回答中请使用这四个函数进行回答,并写出完整的脚本\
1、DO_OUT(A,B) :它是数字量输出函数,A表示通道数取值范围1~8,B表示输出取值为0~1\
2、AO_OUT(A,B) :它是模拟量输出函数,A表示通道数,B表示值范围为0~4096\
3、Delay(A):它是延迟函数,A表示延迟时间,单位是毫秒\
4、SIN_OUT(A,B,C):它是正弦波输出函数,A表示通道数,B表示频率值,C表示相位值\
举个例子:我现在需要让1通道的数字量输出1保持1秒然后让2通道的模拟量输出2000保持1.5秒,生成脚本如下\
DO_OUT(1, 1) // 1通道数字量输出1\
Delay(1000) // 延迟1秒\
AO_OUT(2, 2000) // 2通道模拟量输出2000\
Delay(1500) // 延迟1.5秒"\
},
{
"role": "assistant",
"content": "明白了,这三个函数已经被定义好了。现在我可以为你提供使用这些函数的回答。请问有什么我可以帮助你的问题吗?"
},
{
"role": "user",
"content": text_str
},
]
})
#发起一次对话
yiyan_reply = yiyan.request(Messages=payload,\
API_KEY = "JF61iEf1A0scyoIGxctTkbP8",SECRET_KEY = "e4CJ2EI8AqRuCzrNFRMrXYUDNMGeG0Fx");
reply_data = json.loads(yiyan_reply.text);#解析json
self.finished.emit() # 发射信号表示任务完成
#显示的类
class MarkdownViewer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
global TextContent;
self.setWindowTitle('GPT Viewer')
self.setGeometry(300, 300, 500, 400)
# 初始Markdown文本
self.markdown_text = "# Hello, GPT!\n\nThis is a *simple* markdown **example**."
# 创建一个QTextEdit用于显示HTML
self.text_edit = QTextEdit(self)
self.text_edit.setReadOnly(True)
self.text_edit.setAcceptRichText(True)
#创建一个文本输入框
self.line_edit = QTextEdit(self)
TextContent = self.line_edit;
# 创建一个按钮用于更改Markdown内容
self.button = QPushButton('SEND', self)
self.button.clicked.connect(self.change_markdown)
# 使用QVBoxLayout布局
layout = QVBoxLayout()
layout.addWidget(self.text_edit) #MARKDOWN
layout.addWidget(self.line_edit) #输入框
layout.addWidget(self.button) #按钮
self.setLayout(layout)
# 初始化时显示Markdown内容
self.show_markdown()
def show_markdown(self):
# 将Markdown转换为HTML
html = markdown.markdown(self.markdown_text, extensions=[ExtraExtension()])
# 设置QTextEdit的内容为HTML
self.text_edit.setHtml(html)
#按钮回调
def change_markdown(self):
global text_str;
text_str = self.line_edit.toPlainText(); #获取文本框的值
self.markdown_text = "#生成中....\n\n 请稍等\n"
# 重新显示Markdown内容
self.show_markdown()
# 创建并启动工作线程-让其访问文心一言
self.thread = WorkerThread()
self.thread.finished.connect(self.on_thread_finished) # 连接信号到槽函数
self.thread.start() # 启动线程
#线程结束回调
def on_thread_finished(self):
# 当线程任务完成时调用此槽函数
self.markdown_text = reply_data['result']; # 改变Markdown内容
print(reply_data['result']);
self.show_markdown(); #重新显示Markdown内容
#修改显示内容
def ChangeContent(content="#栗子内容\n\n 这是内容"):
global DisplayContent #显示内容
DisplayContent = content;
#获取窗口输入
def GetText():
return TextContent.toPlainText();
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MarkdownViewer()
ex.show()
sys.exit(app.exec_())
第二部分则是访问千帆大模型的逻辑
import requests
import json
#需要注意的事messages必须是奇数个
payload = json.dumps({
"messages": [
{
"role": "user",
"content": "你好"
}
#,
#{
# "role": "assistant",
# "content": "帮我使用python写一个计算fft的代码"
#}
]
})
#测试用主函数
def main():
token = get_access_token();
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + str(token)
print(token)
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
#print(response.text)
#发起一次对话请求
def request(Messages=payload,API_KEY = "你的Key",SECRET_KEY = "你的Key"):
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-4.0-8k-latest?access_token=" + \
get_access_token(API_KEY,SECRET_KEY);
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=Messages)
return response;
def get_access_token(API_KEY = "你的Key",SECRET_KEY = "你的Key"):
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return requests.post(url, params=params).json().get("access_token")
# def analysis_json(text):
if __name__ == '__main__':
main()
三、总结
该文章旨在分享笔者的制作过程,作为初学者目前只能做到这个地步,如各位大神有宝贵的建议和想法欢迎提出。