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

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
作者:帅得不敢出门


http://www.kler.cn/a/560073.html

相关文章:

  • 机器学习数学基础:36.φ相关系数分析
  • steam_api.dll丢失3分钟修复指南,解决Steam游戏无法运行
  • Idea2024中搭建JavaFX开发环境并创建运行项目
  • 4. MySQL 逻辑架构说明
  • 基于Flask的淘宝商品数据可视化分析系统的设计与实现
  • 【MySQL学习】数据库建表实操!!
  • Android NDK基本开发流程
  • AI智算-k8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略
  • 网关和过滤器学习
  • 企业数据集成:实现高效调拨出库自动化
  • jenkins docker容器中安装python3.9环境
  • 一周学会Flask3 Python Web开发-Jinja2模板基本使用
  • 【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)
  • Java集合框架设计模式面试题
  • 注意力机制深度优化
  • 【附源码】基于opencv+pyqt5搭建的人脸识别系统
  • 2025/2/17--2/23学习笔记(week1)_C语言
  • Vi 编辑器基本使用指南
  • 自动化部署工具Jenkins和Jpom的区别及优缺点,你选择用哪个?
  • C++对象模型之C++额外成本