春联乐园:PyQt5与智能大模型相伴的春联生成器

前言

随着科技的发展,人工智能已经渗透到我们生活的方方面面。各大模型满天飞,笔者试用了很多模型,科大讯飞感觉还不错,且现在有免费额度,借此机会一款基于Python、PyQt5和科大讯飞AI技术的春联生成器应运而生,让我们在传承传统文化的同时,也能感受到科技带来的便捷与魅力。

实现

其实思路很简单,PyQt5实现界面功能,生成春联集成科大讯飞,一个简单的工具

步骤一:请求星火大模型API,核心代码如下

python 复制代码
import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
​
import websocket
answer = ""
​
class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, Spark_url):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.host = urlparse(Spark_url).netloc
        self.path = urlparse(Spark_url).path
        self.Spark_url = Spark_url
​
    # 生成url
    def create_url(self):
        # 生成RFC1123格式的时间戳
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))
​
        # 拼接字符串
        signature_origin = "host: " + self.host + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"
​
        # 进行hmac-sha256进行加密
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()
​
        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
​
        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
​
        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
​
        # 将请求的鉴权参数组合为字典
        v = {
            "authorization": authorization,
            "date": date,
            "host": self.host
        }
        # 拼接鉴权参数,生成url
        url = self.Spark_url + '?' + urlencode(v)
        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
        return url
​
​
# 收到websocket错误的处理
def on_error(ws, error):
    print("### error:", error)
​
​
# 收到websocket关闭的处理
def on_close(ws,one,two):
    print(" ")
​
​
# 收到websocket连接建立的处理
def on_open(ws):
    thread.start_new_thread(run, (ws,))
​
​
def run(ws, *args):
    data = json.dumps(gen_params(appid=ws.appid, domain= ws.domain,question=ws.question))
    ws.send(data)
​
​
# 收到websocket消息的处理
def on_message(ws, message):
    # print(message)
    data = json.loads(message)
    code = data['header']['code']
    if code != 0:
        print(f'请求错误: {code}, {data}')
        ws.close()
    else:
        choices = data["payload"]["choices"]
        status = choices["status"]
        content = choices["text"][0]["content"]
        print(content,end ="")
        global answer
        answer += content
        # print(1)
        if status == 2:
            ws.close()
​
​
def gen_params(appid, domain,question):
    """
    通过appid和用户的提问来生成请参数
    """
    data = {
        "header": {
            "app_id": appid,
            "uid": "1234"
        },
        "parameter": {
            "chat": {
                "domain": domain,
                "temperature": 0.5,
                "max_tokens": 2048
            }
        },
        "payload": {
            "message": {
                "text": question
            }
        }
    }
    return data
​
​
def main(appid, api_key, api_secret, Spark_url,domain, question):
    # print("星火:")
    wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
    websocket.enableTrace(False)
    wsUrl = wsParam.create_url()
    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
    ws.appid = appid
    ws.question = question
    ws.domain = domain
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
​

这段代码实现了使用websocket与OpenAI的语义模型进行交互,以获得对用户提出的问题的回答。具体来说,它实现了以下功能:

  1. 生成包含鉴权参数的WebSocket URL,并与OpenAI语义模型建立连接;
  2. 构造请求参数,包含用户提问和应用ID等信息,向OpenAI发送请求;
  3. 处理OpenAI的响应,从中提取出回答并输出。

其中,在生成WebSocket URL时,代码使用了HMAC-SHA256算法进行鉴权加密,以确保请求的安全性。在处理OpenAI响应时,代码根据响应中的状态码进行判断,若状态码为0则表示请求成功,从响应中提取出回答并输出。可以参照官方文档

步骤二:春联生成器,代码如下

ini 复制代码
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QTextEdit, QPushButton
import sys
import SparkApi
​
appid = ""
api_secret = ""
api_key =""
domain = "generalv3"
Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"
text = []
​
def getText(role, content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text
​
def getlength(text):
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length
​
def checklen(text):
    while (getlength(text) > 8000):
        del text[0]
    return text
​
​
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("智能春联生成器")
        self.setGeometry(100, 100, 400, 300)
​
        self.label = QLabel("输入上联:", self)
        self.label.move(50, 50)
​
        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(50, 80, 300, 120)
​
        self.generate_button = QPushButton("生成", self)
        self.generate_button.setGeometry(150, 220, 100, 40)
        self.generate_button.clicked.connect(self.generate_couplet)
​
    def generate_couplet(self):
        prompt = self.text_edit.toPlainText()
        question = checklen(getText("user", f'{prompt} 帮对下联'))
        SparkApi.answer = ""
        SparkApi.main(appid, api_key, api_secret, Spark_url, domain, question)
        getText("assistant", SparkApi.answer)
​
        # 获取生成的下联
        completion = [content["content"] for content in text if content["role"] == "assistant"]
​
        # 显示生成的下联
        self.text_edit.append("\n" + completion[0])
​
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
​

这段代码实现了一个基于PyQt5的GUI界面,用户可以在此界面上输入上联,点击"生成"按钮后,程序会调用SparkApi模块中的函数与OpenAI语义模型进行交互,得到下联并将其显示在界面上。具体来说,它实现了以下功能:

  1. 创建了一个PyQt5应用程序,并设置了主窗口的标题、大小和位置;
  2. 在主窗口中添加了标签、文本编辑框和按钮等控件;
  3. 定义了一个槽函数generate_couplet,该函数会获取文本编辑框中用户输入的上联,调用SparkApi模块中的函数与OpenAI语义模型进行交互,获取下联并将其显示在文本编辑框中;
  4. 启动PyQt5应用程序。

该程序通过PyQt5提供的GUI界面实现了用户友好的交互方式,使得用户能够更加方便地使用智能春联生成器。当然appid、api_secret、api_key需要替换成自己的,可以在官网查看。

实现效果

最后

总之,春联生成器是一款集传统文化与现代科技于一体的应用,它让我们在传承传统文化的同时,也能感受到科技的魅力。让我们一起用春联生成器,为新年增添一份喜庆氛围,让传统文化在我们的生活中焕发出新的活力。

相关推荐
初晴~36 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱5813641 分钟前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳1 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾1 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭2 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding3 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者3 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
从善若水3 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
机器之心4 小时前
终于等来能塞进手机的文生图模型!十分之一体量,SnapGen实现百分百的效果
人工智能·后端
机器之心4 小时前
首次!大模型自动搜索人工生命,做出AI科学家的Sakana AI又放大招
人工智能·后端