当前位置: 首页 > news >正文

Websocket、WebRTC在大模型中的应用

文章目录

  • WebSocket
    • 简介
    • Websocket流程图
    • 使用场景
    • 代码示例
  • WebRTC
    • 简介
    • WebRTC(Web Real-Time Communication)流程图
    • 使用场景
    • 代码示例

大模型应用,使得 WebSocket, WebRTC 的使用频率越来越高,WebSocket提供了文本输入与大模型交互的能力,比如讯飞星火大模型。
使用WebRTC实现了语音与大模型交互的能力,比如字节火山大模型。

WebSocket

简介

WebSocket:基于TCP,主要功能是在客户端和服务器之间建立持久的双向通信连接。它使得浏览器和服务器之间能够进行实时的数据传输,允许服务器主动向客户端推送数据,而无需客户端频繁地发送请求来获取更新,大大提高了数据传输的效率和实时性。

Websocket流程图

客户端 服务器 发送包含 Upgrade: websocket 的 HTTP 请求 返回 101 Switching Protocols 的 HTTP 响应 WebSocket 连接建立成功 发送数据(这里是双向的,双方都可以发送) 处理数据并返回响应 发送关闭帧(包含状态码和原因) 发送确认关闭帧 WebSocket 连接关闭 客户端 服务器

首先客户端发起连接请求,服务器响应后连接建立,接着进行数据的发送和接收,最后客户端请求关闭连接,服务器确认后连接关闭。

使用场景

  1. 实时聊天应用:如在线客服、即时通讯工具等,服务器可以实时将新消息推送给客户端。
  2. 实时数据监控:用于实时显示股票行情、传感器数据等,服务器可以随时将最新数据发送给客户端。
  3. 多人在线游戏:可以实现游戏状态的实时更新,如玩家的位置移动、游戏事件等。

代码示例

以下是一个Python类,用于构建和发送WebSocket请求到讯飞星火大模型:

import websocket
import json
import base64
import hashlib
import hmac
import ssl
from urllib.parse import urlparse, urlencode
from datetime import datetime
from time import mktime

class SparkAPI:
    def __init__(self, appid, api_key, api_secret, spark_url):
        self.appid = appid
        self.api_key = api_key
        self.api_secret = api_secret
        self.spark_url = spark_url
        self.host = urlparse(spark_url).netloc
        self.path = urlparse(spark_url).path

    def create_signature(self, method, path, date):
        signature_origin = f"host: {self.host}
date: {date}
{method} {path} HTTP/1.1"
        signature_sha = hmac.new(
            self.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')
        return signature_sha_base64

    def create_url(self):
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))
        signature = self.create_signature('GET', self.path, date)
        authorization_origin = f'api_key="{self.api_key}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature}"'
        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
        params = {
            'authorization': authorization,
            'date': date,
            'host': self.host
        }
        url = self.spark_url + '?' + urlencode(params)
        return url

    def on_message(self, ws, 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:
                print("#### 关闭会话")
                ws.close()

    def send_query(self, domain, query):
        ws = websocket.WebSocketApp(
            self.create_url(),
            on_message=self.on_message,
            on_error=lambda ws, error: print(f"Error: {error}"),
            on_close=lambda ws: print("Connection closed"),
            on_open=lambda ws: ws.send(json.dumps(self.gen_params(self.appid, domain, query)))
        )
        ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

    def gen_params(self, appid, domain, query):
        data = {
            "header": {
                "app_id": appid,
                "uid": "1234"
            },
            "parameter": {
                "chat": {
                    "domain": domain,
                    "temperature": 0.5,
                    "max_tokens": 4096,
                    "auditing": "default"
                }
            },
            "payload": {
                "message": {
                    "text": [{"role": "user", "content": query}]
                }
            }
        }
        return data

使用上述类,你可以通过以下方式发送请求并接收响应:

if __name__ == "__main__":
    appid = "你的APPID"
    api_key = "你的APIKey"
    api_secret = "你的APISecret"
    spark_url = "wss://spark-api.xf-yun.com/v3.5/chat"  # 根据你使用的模型版本选择URL
    domain = "generalv3.5"  # 选择相应的domain
    query = "你好,请问今天天气怎么样?"

    api = SparkAPI(appid, api_key, api_secret, spark_url)
    api.send_query(domain, query)

在上面的代码中,on_message方法用于处理从星火大模型接收到的消息。该方法会解析JSON响应,并打印出AI的回复。如果会话结束(status为2),则会关闭WebSocket连接。

WebRTC

简介

WebRTC:主要用于在 Web 浏览器之间建立实时的音视频通信和数据传输。它提供了一系列的 API,使得开发者可以方便地实现浏览器之间的视频通话、语音通话、文件传输等实时通信功能,无需依赖任何插件。WebRTC 支持浏览器之间的直接 P2P 连接,无需通过服务器中转音视频数据,这样可以大大减轻服务器的负担,提高数据传输效率,降低延迟。在多人通信场景中,还可以结合服务器进行信令交互和媒体协商,实现高效的多人 P2P 通信,如多人视频会议、多人在线游戏等应用。

WebRTC(Web Real-Time Communication)流程图

它展示了 WebRTC 通信中从信令交互到媒体流传输的基本过程

客户端 A 信令服务器 客户端 B 发起连接请求(信令) 转发连接请求(信令) 回复连接请求(信令) 转发回复(信令) 双方进行信令交互,协商媒体格式等 采集音视频数据(摄像头、麦克风) 编码音视频数据 发送音视频数据(RTP 流) 接收音视频数据(RTP 流) 解码音视频数据 播放音视频数据(显示器、扬声器) 采集音视频数据(摄像头、麦克风) 编码音视频数据 发送音视频数据(RTP 流) 接收音视频数据(RTP 流) 解码音视频数据 播放音视频数据(显示器、扬声器) 发送关闭连接请求(信令) 转发关闭连接请求(信令) 回复关闭连接(信令) 转发回复(信令) WebRTC 连接关闭 客户端 A 信令服务器 客户端 B

在这个流程图中,首先展示了客户端 A 和客户端 B 通过信令服务器进行信令交互以协商连接和媒体参数。然后,两个客户端分别采集、编码自己的音视频数据,并将其发送给对方,对方接收、解码并播放这些数据。最后,当需要关闭连接时,再次通过信令服务器进行信令交互来关闭连接。

使用场景

  1. 视频会议:支持多人视频通话,广泛应用于在线办公、远程教育等领域。
  2. 在线直播:主播可以将音视频流实时传输给观众,实现低延迟的直播效果。
  3. P2P 文件传输:可以在浏览器之间直接传输文件,无需通过服务器中转,提高传输效率。

代码示例

可查看字节火山引擎RTC的demo
作者:帅得不敢出门

相关文章:

  • Linux主机用户登陆安全配置
  • LeetCode-69. x 的平方根
  • 第三章:工作线程池
  • 【蓝桥杯】1.k倍区间
  • VoIP之音频3A技术
  • Lecture 2 - Python
  • 【前端】【功能函数】eachTree,封装一个通用的遍历树结构的模板
  • Java 大视界 -- 深入剖析 Java 大数据实时 ETL 中的数据质量保障策略(97)
  • GMII(Gigabit Media Independent Interface)详解
  • 登录-10.Filter-登录校验过滤器
  • Docker 2025/2/24
  • 互联网上门洗衣洗鞋小程序
  • Python+Flutter前后端分离开发跨平台待办事项APP实战
  • 微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果
  • R 语言科研绘图 --- 柱状图-汇总
  • CSS编程基础学习
  • 每日一题——顺时针旋转矩阵
  • 基于 GEE 计算并下载研究区年均叶面积指数 LAI 和光合有效辐射分量 FPAR
  • 量子计算在金融风险评估中的应用:革新与突破
  • dify本地部署
  • 昆山做网站找文博/济南做网站建设的公司
  • 中国建设银行网站保定五四路/网站结构优化
  • 合肥快速建站模板/网页制作成品模板网站
  • 网站建设实验报告/html底部友情链接代码
  • 免费做app网站/seo优化软件有哪些
  • b建设银行网站首页/产品策划方案怎么做