基于星火和Gradio的聊天机器人

news/2025/3/15 10:26:04/

星火大模型官网:https://xinghuo.xfyun.cn/

1 创建虚拟环境(windows)

conda create -n Gradio python=3.8
pip install gradio

中间遇到os报错,解决方案:

pip install aiofiles==23.2.1

2 代码

SparkDesk.py:
下面代码是一个用于与基于WebSocket的聊天机器人API进行交互的Python实现。下面逐个解释代码的每个部分:

  1. 代码导入了几个模块,用于各种功能,例如线程处理(_thread),base64编码,哈希算法,JSON操作,与时间相关的操作,URL解析,SSL处理,CSV处理以及websocket库。
  2. 接下来,代码定义了一个名为Ws_Param的类,该类用于初始化建立WebSocket连接和生成URL所需的参数。
  3. Ws_Param类中有一个名为create_url()的方法,用于生成建立WebSocket连接的URL。它使用HMAC-SHA256加密构建必要的身份验证头。
  4. 代码定义了几个WebSocket事件处理函数:
    a. 5.on_error:处理WebSocket连接期间发生的错误。
    b. on_close:处理WebSocket连接关闭事件。
    c. on_open:处理WebSocket连接打开事件。
    d. on_message:处理WebSocket连接收到的传入消息。
  5. run函数设计为在单独的线程中运行,并向聊天机器人API发送初始请求载荷。
  6. gen_params函数是一个辅助函数,用于生成聊天机器人API请求的JSON载荷。
  7. main函数是启动WebSocket连接的入口点。它创建Ws_Param类的实例,生成WebSocket URL,并使用websocket库中的WebSocketApp类来初始化WebSocket连接。
  8. ask_question函数是对main函数的封装,提供了一个便捷的方法来向聊天机器人API提问问题。
  9. 最后,startSparkOne函数是ask_question的封装函数,可以通过将问题作为参数传递给它来启动与聊天机器人API的交互。
    要使用此代码,在调用startSparkOne函数时,您需要为appid,api_key,api_secret和gpt_url参数提供适当的值。
import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
import pickle
import time
from urllib.parse import urlparse
import ssl
import sys
import io
import csv
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
# websocket-client
import websocketclass Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, gpt_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(gpt_url).netlocself.path = urlparse(gpt_url).pathself.gpt_url = gpt_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.gpt_url + '?' + urlencode(v)# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致return url# 收到websocket错误的处理
def on_error(ws, error):print("### error:", error)# 收到websocket关闭的处理
def on_close(ws, status_code, reason):print("")# 收到websocket连接建立的处理
def on_open(ws):thread.start_new_thread(run, (ws,))def run(ws, *args):data = json.dumps(gen_params(appid=ws.appid, 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='')if status == 2:ws.close()def gen_params(appid, question):"""通过appid和用户的提问来生成请参数"""data = {"header": {"app_id": appid,"uid": "1234"},"parameter": {"chat": {"domain": "general","random_threshold": 0.5,"max_tokens": 2048,"auditing": "default"}},"payload": {"message": {"text": [{"role": "user", "content": question}]}}}return datadef main(appid, api_key, api_secret, gpt_url, question):wsParam = Ws_Param(appid, api_key, api_secret, gpt_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.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})def ask_question(question):main(appid="",api_secret="",api_key="",gpt_url="ws://spark-api.xf-yun.com/v1.1/chat",question=question)def startSparkOne(question):ask_question(question)

app.py:
这段代码实现了一个简单的聊天界面,用户可以输入消息与SparkDesk Chatbot进行交互。下面对每部分代码进行详细解释:

  1. 导入了random模块,用于随机生成响应消息,gradio模块用于创建交互界面,startSparkOne来自SparkDesk模块,用于与聊天机器人进行交互。另外还导入了sys和io模块,用于处理标准输出和字符串流对象。
  2. random_response函数是一个用于生成随机响应的函数。它接收两个参数,message表示用户输入的消息,history表示之前的对话历史。在函数内部,它创建了一个字符串流对象,并将标准输出重定向到该流对象。然后调用startSparkOne函数与聊天机器人交互,并将机器人的回复输出到标准输出流。最后,它将标准输出重定向回原来的标准输出,并获取标准输出流的内容,即机器人的回复。
  3. demo是一个gr.ChatInterface对象,用于创建聊天界面。它接受两个参数,第一个参数是一个函数,用于处理用户输入和生成响应,这里使用了random_response函数。第二个参数是界面的标题和描述。
  4. 最后,调用demo.launch()启动聊天界面。
    通过这段代码,可以在一个简单的界面中输入消息与SparkDesk Chatbot进行交互,并获得机器人的随机响应。
import random
import gradio as gr
from SparkDesk import startSparkOne
import sys, iodef random_response(message, history):# 创建一个字符串流对象,并将其设置为标准输出old_stdout = sys.stdoutnew_stdout = io.StringIO()sys.stdout = new_stdoutstartSparkOne(message)# 将标准输出重新设置为原来的标准输出sys.stdout = old_stdout# 获取标准输出的内容response = new_stdout.getvalue()return responsedemo = gr.ChatInterface(random_response,title="SparkDesk Chatbot",description="输入消息来与 SparkDesk Chatbot 进行交互。",
)demo.launch()

3 效果

在这里插入图片描述

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

相关文章

Spring整合web环境

目录 1.添加pom 2.配置web.xml spring.xml 4.配置在创建一个类实现ServletContextListener 5.配置servlet 1.添加pom <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.…

界面控件DevExpress WPF Chart组件——拥有超快的数据可视化库!

DevExpress WPF Chart组件拥有超大的可视化数据集&#xff0c;并提供交互式仪表板与高性能WPF图表库。DevExpress Charts提供了全面的2D / 3D图形集合&#xff0c;包括数十个UI定制和数据分析/数据挖掘选项。 PS&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助…

一种水文水利行业满管非满管双声道流量计安装调试

供电电源 用户应该特别注意&#xff1a;若是交流&#xff08;AC220V&#xff09;供电的主机插入直流电源&#xff0c;或者直流&#xff08;DC24V&#xff09;供电的主机接入AC220V电源&#xff0c;就会把流量计烧毁。 普通主机&#xff08;包括固定式主机、盘装式主机&#x…

【剑指 Offer 40】最小的k个数

题目&#xff1a; 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入 4、5、1、6、2、7、3、8 这 8 个数字&#xff0c;则最小的 4 个数字是 1、2、3、4。 示例&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1] …

【Django】招聘面试管理01 创建项目运行项目

文章目录 前言一、创建项目二、运行项目三、访问后台管理页面四、配置项总结 前言 跟着视频学一学&#xff0c;记录一下。 一、创建项目 照着步骤创建虚拟环境&#xff0c;安装Django等依赖包&#xff0c;创建项目&#xff1a;【Django学习】01 项目创建、结构及命令 > d…

String 类的运用

目录 1.字符串构造 2.String对象的比较 2.1比较是否引用同一个对象 2. 2boolean equals(Object anObject) 2.3int compareTo(String s) 方法: 按照字典序进行比较 2.4int compareToIgnoreCase(String str) 3.字符串查找 4.2大小写转换 4.3字符串转数组 4.4 格式化 5.字…

TCP滑动窗口和拥塞控制

目录 滑动窗口什么是滑动窗口为什么要使用滑动窗口滑动窗口的工作原理滑动窗口会出现的几种问题数据包丢失怎么解决&#xff1f;ACK丢失怎么解决&#xff1f; 拥塞控制拥塞控制是什么&#xff1f;拥塞控制的实现理解拓展&#xff1a;拥塞控制是如何判断网络拥塞情况的&#xff…

Linux在终端显示Git分支等信息

环境&#xff1a;RHEL7.5 在环境变量文件中添加以下内容&#xff1a; function git-branch-name { git symbolic-ref --short -q HEAD 2>/dev/null } function git-branch-prompt {local branchgit-branch-nameif [ $branch ]; then printf "(%s)" $branch; fi }…