如何快速搭建一个大模型?简单的UI实现

🔥博客主页:真的睡不醒

🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发

💘每日语录:相信自己,一路风景一路歌,人生之美,正在于此。

🎉感谢大家点赞👍收藏⭐指正✍️

前言:本文章纯属是自己无聊,调用了星火认知大模型的接口,并封装成一个脚本。但测试感觉星火认知大模型也不算太智能,但奈何人家提供了免费的token,当然,也可以根据自己的需要,去调用国内的一些大模型。

目录

一、申请免费的token

二、设置UI界面        

三、运行效果

四、封装成exe文件        


一、申请免费的token

        这里我使用的是星火认知大模型,前往官网:星火认知大模型

        网上有很多的教程,这里不再赘述。

        申请后,你需要保存的有三个

        ① appid

        ② api_secret        

        ③ api_key

二、设置UI界面        

        需要用到wxpython:GUI图形库,网上有很多安装wxpython的教程,这里不再赘述。

        wxpython依赖的whl文件(网上下载很慢,cp36对应python3.6):下载地址

        这里我直接把UI界面的代码附上。

        注意:需要将123.png更换为你想要的图片路径。

        同时需要更改① appid ② api_secret  ③ api_key

import tkinter as tk
from tkinter import scrolledtext, filedialog, messagebox
import SparkApiclass ChatApp:def __init__(self, master):self.master = mastermaster.title("是dream-星火大模型UI界面")self.dialog_text = scrolledtext.ScrolledText(self.master, wrap=tk.WORD, width=50, height=20, font=("Microsoft YaHei UI", 12))self.dialog_text.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")self.dialog_text.grid_propagate(False)  # 阻止自动调整大小self.label_input = tk.Label(self.master, text="请您在下方输入:", font=("Microsoft YaHei UI", 12))self.label_input.grid(row=1, column=0, padx=3, pady=3, sticky="w")input_frame = tk.Frame(master)input_frame.grid(row=2, column=0, pady=10, sticky="nsew")input_frame.grid_columnconfigure(0, weight=3)self.input_entry = tk.Entry(input_frame, bd=2, relief=tk.GROOVE, font=("Microsoft YaHei UI", 12),borderwidth=4, highlightthickness=1, width=20)self.input_entry.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")self.input_entry.grid_propagate(False)  # 阻止自动调整大小self.input_entry.bind("<Return>", self.send_on_enter)button_frame = tk.Frame(master)button_frame.grid(row=3, column=0, pady=10, sticky="nsew")self.send_button = tk.Button(button_frame, text="发送", command=self.send_message,font=("Microsoft YaHei UI", 12))self.send_button.grid(row=0, column=0, padx=5, sticky="nsew")self.file_button = tk.Button(button_frame, text="选择文本", command=self.load_file,font=("Microsoft YaHei UI", 12))self.file_button.grid(row=0, column=1, padx=5, sticky="nsew")self.save_button = tk.Button(button_frame, text="保存对话内容", command=self.save_to_text, font=("Microsoft YaHei UI", 12))self.save_button.grid(row=0, column=2, padx=5, sticky="nsew")button_frame.grid_columnconfigure(0, weight=1)button_frame.grid_columnconfigure(1, weight=1)button_frame.grid_columnconfigure(2, weight=1)master.grid_rowconfigure(0, weight=1)master.grid_rowconfigure(1, weight=0)master.grid_rowconfigure(3, weight=1)master.grid_columnconfigure(0, weight=1)initial_text = "提前告诉星火大模型的内容,让其更关注你问的方向。"# sparkAPI(initial_text)   # 如果要提前送内容给模型,请取消注释self.dialog_text.insert(tk.END,"你好!作者:“是dream”!CSDN主页:https://blog.csdn.net/qq_63159704?spm=1000.2115.3001.5343\n\n")def send_on_enter(self, event):self.send_message()def send_message(self):user_input = self.input_entry.get()if user_input.strip():assistant_response = sparkAPI(user_input)self.dialog_text.insert(tk.END, f"你: {user_input}\n")self.dialog_text.insert(tk.END, f"星火: {assistant_response}\n")self.input_entry.delete(0, tk.END)self.dialog_text.see(tk.END)else:messagebox.showinfo("提示", "请输入消息!")def load_file(self):file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt"), ("All files", "*.*")])if file_path:with open(file_path, 'r', encoding='utf-8') as file:content = file.read()self.input_entry.insert(tk.END, content)def save_to_text(self):content = self.dialog_text.get("1.0", tk.END)file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt"), ("All files", "*.*")])if file_path:with open(file_path, 'w', encoding='utf-8') as file:file.write(content)messagebox.showinfo("保存成功", "对话内容已保存为文本文件!")def sparkAPI(input_text):text.clear()questions = checklen(getText("user", input_text))SparkApi.answer = ""SparkApi.main(appid, api_key, api_secret, Spark_url, domain, questions)assistant_answer = SparkApi.answertext.append({"role": "assistant", "content": assistant_answer})return assistant_answerdef getText(role, content):jsoncon = {"role": role, "content": content}text.append(jsoncon)return textdef getlength(text):length = 0for content in text:temp = content["content"]leng = len(temp)length += lengreturn lengthdef checklen(text):while getlength(text) > 8000:del text[0]return textif __name__ == "__main__":appid = ""api_secret = ""api_key = ""domain = "generalv2"Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"text = []root = tk.Tk()root.geometry("800x750")chat_app = ChatApp(root)root.mainloop()

        还需要在相同目录下创建一个 SparkApi.py文件,并将下面的代码复制进去。

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_timeimport websocket  # 使用websocket_clientanswer = ""class Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, Spark_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(Spark_url).netlocself.path = urlparse(Spark_url).pathself.Spark_url = Spark_url# 生成urldef 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}# 拼接鉴权参数,生成urlurl = 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 answeranswer += 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 datadef 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 = appidws.question = questionws.domain = domainws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

注意:调用星火大模型用到的是 websocket == 0.57.0,如果websocket的错,请更改版本。

三、运行效果

 效果如下:

四、封装成exe文件        

        这里用到的是pyinstaller进行封装,运行以下代码进行安装:

pip install pyinstaller

        运行下代码进行封装:

pyinstaller -F -w GUI.py
在`GUI.py`相同目录下会新增`dist`文件夹,内部放有`GUI.exe`文件。 GUI.py就是UI界面的代码,封装前,请保证代码能够正常运行。

这样,你就可以将这个exe文件发送给你的好盆友,无需配置环境就可以对话。

 

 🚀🚀🚀感谢关注我的CSDN博客,更多小技巧,请持续关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

makefile编写练习

makefile编写练习 OVERVIEW makefile编写练习文件结构直接编译整个项目并运行将项目制作成为静态库将项目制作成为动态库 编写makefile文件来编译带头文件的程序&#xff0c; 文件结构 初始项目文件结构&#xff0c;如下所示&#xff1a; #ifndef ADD_HPP #define ADD_HPPint…

乘波前行的问题

1.问题&#xff1a; 考虑两个信号叠加在一起&#xff0c;比如&#xff0c;一个是工频信号50Hz&#xff0c;一个是叠加的高频信号比如有3KHz&#xff0c;简单起见&#xff0c;两个信号都是幅值固定的标准的正弦波&#xff0c;现在我们期望得到那个高频信号&#xff0c;相对工频…

Royal TSX v6.0.1

Royal TSX是一款基于插件的软件&#xff0c;适用于Windows系统&#xff0c;可以用于远程连接和管理服务器。它支持多种连接类型&#xff0c;如RDP、VNC、基于SSH连接的终端&#xff0c;SFTP/FTP/SCP或基于Web的连接管理。 在安装Royal TSX后&#xff0c;需要进行一些基础配置&…

2023人形机器人行业海外科技研究:从谷歌看机器人大模型进展

今天分享的是人形机器人系列深度研究报告&#xff1a;《2023人形机器人行业海外科技研究&#xff1a;从谷歌看机器人大模型进展》。 &#xff08;报告出品方&#xff1a;华鑫证券&#xff09; 报告共计&#xff1a;26页 大模型是人形机器人的必备要素 长期来看&#xff0c;人…

openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出&#xff1a; 通过遍历二叉树可得到结点的一个线性序列&#xff0c;在线性序列中&#xff0c;很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子&#xff0c;结点的前驱和后继只有在遍历过程中才能得到…

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好&#xff1f;Alfred是一款Mac电脑上的快速启动和工作流自动化工具&#xff0c;它可以帮助用户快速访问文件、应用程序、web搜索和系统工具&#xff0c;提高工作效率。以下是Alfred的特点&#xff1a; 快速启动&#xff1a;用户可以通过Alfred快速启动应用…

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识&#xff0c;这篇文章主要给大家分享Nod…

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…

(2023码蹄杯)省赛(初赛)第三场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0227堆煤球 码题集OJ-堆煤球 (matiji.net) 思路&#xff1a; 1.i从l枚举到r,i是8的倍数就跳过&#xff0c;i不是8的倍数就用等差数列求和公式i(1i)/2,最后累加到答案中即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {in…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多&#xff0c;整理起来繁琐而感到烦恼&#xff1f;是否曾经为了新建文件夹而手动一个一个进行创建&#xff0c;费时又费力&#xff1f;现在&#xff0c;我们的智能文件管理工具将为你解决这些问题&#xff01; 首先第一步&#xff0c;我们要进入文件…

【开源】基于Vue.js的网上药店系统

项目编号&#xff1a; S 062 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S062&#xff0c;文末获取源码。} 项目编号&#xff1a;S062&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药…

聊一聊索引覆盖的好处

问&#xff1a;索引覆盖啥意思&#xff1f; 答&#xff1a;若查询的字段在二级索引的叶子节点中&#xff0c;则可直接返回结果&#xff0c;无需回表。这种通过组合索引避免回表的优化技术也称为索引覆盖&#xff08;Covering Index&#xff09;。在叶子节点中的包括索引字段和主…

DataGrip 2023.2.3(IDE数据库开发)

DataGrip是一款数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于数据库管理和开发。 DataGrip提供了许多强大的功能&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。它支持多种数据库&#xff0c;如MySQL、PostgreSQL、Ora…

Unity技美35——再URP管线环境下,配置post后期效果插件(post processing)

前两年在我的unity文章第10篇写过&#xff0c;后效滤镜的使用&#xff0c;那时候大部分项目用的还是unity的基础管线&#xff0c;stander管线。 但是现在随着unity的发展&#xff0c;大部分项目都用了URO管线&#xff0c;甚至很多PC端用的都是高效果的HDRP管线&#xff0c;这就…

位图及有关海量数据处理

bitset 1.给40亿个不重复的无符号整数&#xff0c;没排过序&#xff0c;给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个中 ①.如果用排序加二分查找&#xff0c;40亿个数需要16g内存&#xff0c;内存开不出这么大连续空间 ②.每个值映射一个比特位&#xff0c;…

基于Haclon的图形镜像案例

项目要求&#xff1a; 图为HALCON的例图“green-dot”&#xff0c;请将其中的圆形图案按水平和垂直两个方向分别进行镜像。 项目知识&#xff1a; 首先要用BLOB分析的方法&#xff0c;得到圆形图案的目标区域&#xff0c;再对其进行镜像。 在HALCON中与镜像相关的算子为mirr…

基于Eclipse+Swing+MySQL开发的借贷平台

基于Swing的借贷平台 项目介绍&#x1f481;&#x1f3fb; 本项目是一个基于Java JDBC的银行管理系统。开发环境为MyEclipse2014&#xff0c;数据库使用MySQL V5.5&#xff0c;操作系统为Windows 7 64位。 主要功能包括用户开户、存款、取款、转账、查询余额、修改密码和销户等…

两巨头Facebook 和 GitHub 联手推出 Atom-IDE

9月13日&#xff0c;GitHub 宣布与 Facebook 合作推出了 Atom-IDE —— 它包括一系列将类 IDE 功能带到 Atom 的可选工具包。初次发布的版本包括更智能、感知上下文的自动完成&#xff1b;导航功能&#xff0c;如大纲视图和定义跳转(outline view and goto-definition)&#xf…

生态对对碰|华为OceanStor闪存存储与OceanBase完成兼容性互认证!

近日&#xff0c;北京奥星贝斯科技有限公司 OceanBase 数据库与华为技术有限公司 OceanStor Dorado 全闪存存储系统、OceanStor 混合闪存存储系统完成兼容性互认证。 OceanBase 数据库挂载 OceanStor 闪存存储做为数据盘和日志盘&#xff0c;在 OceanStor 闪存存储系统卓越性能…