通过WebSocket协议实现与讯飞大模型的高效交互(Python)

603 阅读9分钟

文章目录

前言

一、WebSocket是什么?

二、讯飞大模型

三、代码示例

四、注意事项

总结

前言

        在当今的人工智能领域,与大模型的高效交互变得越来越重要。讯飞大模型以其强大的自然语言处理能力和广泛的应用场景,受到了广泛关注。为了更好地利用讯飞大模型的能力,本文将详细介绍如何使用WebSocket协议与其进行高效交互。

        通过WebSocket协议,我们可以实现实时通信和数据交换,从而提升应用的响应速度和用户体验。本文将从以下几个方面展开讨论:

  1. WebSocket协议简介:介绍WebSocket的基本概念和工作原理。
  2. 讯飞大模型概述:简要说明讯飞大模型的特点和应用场景。
  3. 代码示例:提供完整的代码示例,并解释每个关键部分的功能。
  4. 注意事项:列举一些注意事项及其说明。

        希望通过本文的介绍,能够帮助读者快速掌握使用WebSocket协议与讯飞大模型进行高效交互的方法,进一步提升应用的智能化水平。让我们一起开始这段精彩的探索之旅吧!


提示:以下是本篇文章正文内容,下面案例可供参考

一、WebSocket是什么?

        WebSocket 是一种在单个TCP连接上进行全双工通信的协议,它允许客户端和服务端之间建立持久连接,并进行双向数据传输。这一协议最初是在2011年由IETF(Internet Engineering Task Force)标准化为RFC 6455,并在后续的RFC 7936中进行了补充规范。此外,WebSocket API也已经被W3C标准化。

主要特点
  • 全双工通信:WebSocket支持客户端和服务端同时发送和接收数据,实现了真正的双向通信。
  • 持久连接:一旦握手成功,客户端和服务端之间就可以维持一个长期的连接,不需要频繁地建立和断开连接。
  • 高效性:由于减少了建立连接的开销,WebSocket相比HTTP协议,在传输大量数据时更为高效。
  • 协议前缀:WebSocket使用ws://(非加密)或wss://(使用SSL/TLS加密)作为URL协议前缀,类似于HTTP和HTTPS的关系。
  • 扩展性:WebSocket协议支持扩展,允许用户实现部分自定义的子协议,如支持压缩、加密等功能。
工作流程
  1. 握手阶段:客户端首先通过HTTP请求发起一个WebSocket连接请求,这个请求中包含了Upgrade头,表明希望升级到WebSocket协议。
  2. 协议升级:服务器收到请求后,如果支持WebSocket,则会返回一个状态码为101的响应,表示协议升级成功,并包含必要的握手信息。
  3. 数据传输:握手完成后,客户端和服务端之间就可以开始发送和接收数据帧。数据可以被分割成多个帧进行传输,并在接收端重新组装。
  4. 关闭连接:任何一方都可以主动发送一个关闭帧来结束连接,另一方收到关闭帧后也会回应一个关闭帧,随后双方关闭TCP连接。
应用场景

        WebSocket因其高效的通信方式和持久连接特性,非常适合以下应用场景:

  • 实时消息推送:如聊天应用、实时通知系统。
  • 在线协作工具:如多人编辑文档、在线白板。
  • 实时游戏:多人在线游戏、实时对战平台。
  • 金融交易:实时股票报价、交易系统。

        通过WebSocket,开发者可以构建更加动态和响应迅速的应用程序,极大地提升了用户体验。

二、讯飞大模型

        科大讯飞是一家专注于智能语音及语言技术研究与应用的高科技企业,其推出的讯飞星火大模型是基于深度学习技术的最新成果,旨在提供强大的自然语言处理能力。下面是对讯飞大模型的一些基本介绍:

核心能力

        讯飞星火大模型具备多种核心能力,包括但不限于:

  • 文本生成:能够生成高质量的文本内容,如文章、故事、诗歌等。
  • 语言理解:深入理解人类语言的含义,支持复杂的语义分析。
  • 知识问答:针对特定领域或一般常识的问题,提供准确的答案。
  • 逻辑推理:基于给定的信息进行逻辑推演,解决复杂问题。
  • 数学能力:解决数学问题,包括计算、公式推导等。
  • 代码能力:理解和生成代码片段,辅助软件开发。
  • 多模交互:支持文本、语音等多种交互模式,增强用户体验。
技术优势
  • 跨领域知识:讯飞星火大模型拥有跨领域的知识和语言理解能力,能够在不同场景下提供服务。
  • 国产化算力平台:讯飞星火大模型是基于全国产化算力平台训练的,体现了自主可控的技术路线。
  • 广泛应用:除了基础的语言处理能力外,讯飞星火大模型还在教育、办公、汽车、数字员工等多个行业领域得到应用。
  • 高评价:讯飞星火大模型在中国信通院组织的评测中获得了高度评价,证明了其技术水平。
应用场景

        讯飞星火大模型适用于多种场景,包括但不限于:

  • 客户服务:提供自动化的客户支持,如聊天机器人。
  • 教育辅助:帮助学生学习语言、数学等科目。
  • 智能写作:辅助记者、作家等创作高质量的内容。
  • 语音助手:集成到智能家居设备中,实现语音控制。
  • 数据分析:用于大数据分析,提取有价值的信息。

        讯飞大模型的发展展示了人工智能技术在自然语言处理领域的巨大潜力,为企业和个人提供了更多的可能性。随着技术的不断进步,未来讯飞大模型将在更多领域发挥重要作用。

三、代码示例

1.代码运行结果

(1)​

(2)

2.代码


# coding: utf-8
'''
    @ File: sparkAPI.py
    @ Time: 2024/08/29 15:09:09
    @ author:main
'''
                              
import ssl
import hmac
import json
import base64
import hashlib
import websocket
from time import mktime
import _thread as thread 
from datetime import datetime
from urllib.parse import urlparse
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time

# domain="generalv3.5"    # Max版本
# domain = "generalv3"    # Pro版本
domain = "general"        # Lite版本

appid='**********'
api_secret='*****************************'
api_key='********************************'
# appid、api_secret、api_key三个服务认证信息请前往开放平台控制台查看(https://console.xfyun.cn/services/bm35)

# gpt_url="wss://spark-api.xf-yun.com/v3.5/chat"     # Max环境的地址   
# Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"  # Pro环境的地址
gpt_url = "ws://spark-api.xf-yun.com/v1.1/chat"      # Lite环境的地址

'''
    @ Function: 封装websocket请求
    @ Param: query: 用户的问题
    @ Return: 回答
'''
class Ws_Param(object):
    # 初始化
    def __init__(self):
        self.APPID = appid                          # appid 账号ID
        self.api_key = api_key                      # api_key
        self.query_back = ""                        # 回答
    
    # 请求
    def query(self, query):
        self.query = query                          # 用户的问题
        websocket.enableTrace(False)                # 开启debug
        wsUrl = self.create_url()                   # 拼接url
       
        ws = websocket.WebSocketApp(wsUrl, on_message=self.on_message, on_error=self.on_error, 
                                    on_close=self.on_close, on_open=self.on_open)     # 创建websocket连接
        ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})                           # 开启websocket连接

    # 生成url
    def create_url(self):
        self.host = urlparse(gpt_url).netloc
        self.path = urlparse(gpt_url).path
        now = datetime.now()                                                          # 生成RFC1123格式的时间戳
        date = format_date_time(mktime(now.timetuple()))                              # 获取rfc1123格式的时间戳

        # 拼接字符串
        signature_origin = "host: " + self.host + "\n"                                
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"

        signature_sha = hmac.new(api_secret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()                     # 获取签名

        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8') # 获取base64编码

        authorization_origin = f'api_key="{api_key}", 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 = gpt_url + '?' + urlencode(v)
        # 此处打印出建立连接时候的url,比对相同参数时生成的url与自己代码生成的url是否一致
        return url

    # 收到websocket错误的处理
    def on_error(self,ws,error):
        print("### error:", error)

    # 收到websocket关闭的处理
    def on_close(self,ws,arg1,arg2):
        ws.close()

    # 收到websocket连接建立的处理
    def on_open(self,ws):
        thread.start_new_thread(self.run, (ws,))      # 开启新线程          

    # 发送websocket消息的处理
    def run(self,ws, *args):
        data = json.dumps(self.gen_params(appid=appid, query=self.query, domain=domain))
        ws.send(data)
    
    # 返回回答    
    def return_ai_text(self):
        return self.query_back
    
    # 收到websocket消息的处理
    def on_message(self,ws, message):
        data = json.loads(message)                    # 解析json数据
        code = data['header']['code']                 # 获取code
        if code != 0:                                 # 判断code是否为0
            print(f'请求错误: {code}, {data}')      
            ws.close()
        else:
            choices = data["payload"]["choices"]   
            status = choices["status"]             
            content = choices["text"][0]["content"]
            self.query_back = self.query_back + content
            if status == 2:                           # 判断状态是否为2
                ws.close()
   
    # 生成请求参数
    def gen_params(self,appid, query, domain):        
        data = {
            "header": {
                "app_id": appid,
                "uid": "1234",           
                # "patch_id": []                      #接入微调模型,对应服务发布后的resourceid          
            },
            "parameter": {
                "chat": {
                    "domain": domain,
                    "temperature": 0.5,
                    "max_tokens": 4096,
                    "auditing": "default",
                }
            },
            "payload": {
                "message": {
                    "text": [{"role": "user", "content": query}]
                }
            }
        }
        return data

if __name__ == "__main__":
    wsParam = Ws_Param()                                     # 初始化
    while True:                                             
        age = input("请输入...:")                          # 获取用户输入 
        try:
            wsParam.query(age)                               # 发送提问
            ai_text = wsParam.return_ai_text()               # 获取回答
            print(ai_text)                                   # 打印回答
        except TypeError as e:                               # 捕获异常
            if "'str' object is not callable" in str(e):     # 判断异常
                wsParam = Ws_Param()                         # 重新初始化
                wsParam.query(age)                           # 发送提问
                ai_text = wsParam.return_ai_text()           # 获取回答
                print(ai_text)                               # 打印回答



四、注意事项

​ 1.我在写完运行代码时输出这一行提示,所以我给该方法多加了两个接收参数,没什么实际意义,之后再进行优化。         

2.这里的三个参数修改为自己的。

appid='**********'
api_secret='*****************************'
api_key='********************************'

3.本代码我是搭配在一个项目中与PyQt5写的界面协作使用的,读者在使用的时候根据自己的应用场景进行搭配即可。

4.有疑问或者问题评论区或私信都可,看到了第一时间回复。


总结

        在本篇博客中,通过具体的代码示例详细介绍了如何使用WebSocket协议与讯飞大模型进行高效交互。通过建立WebSocket连接、发送请求并接收响应,我们展示了整个过程的关键技术和实现细节。这一方法不仅提高了系统的响应速度,还为多种应用场景提供了强大的技术支持,帮助开发者更好地利用讯飞大模型的强大功能。希望这些内容能够为读者提供实用的指导,推动项目创新和发展