Websocket、WebRTC在大模型中的应用
文章目录
- WebSocket
- 简介
- Websocket流程图
- 使用场景
- 代码示例
- WebRTC
- 简介
- WebRTC(Web Real-Time Communication)流程图
- 使用场景
- 代码示例
大模型应用,使得 WebSocket, WebRTC 的使用频率越来越高,WebSocket提供了文本输入与大模型交互的能力,比如讯飞星火大模型。
使用WebRTC实现了语音与大模型交互的能力,比如字节火山大模型。
WebSocket
简介
WebSocket:基于TCP,主要功能是在客户端和服务器之间建立持久的双向通信连接。它使得浏览器和服务器之间能够进行实时的数据传输,允许服务器主动向客户端推送数据,而无需客户端频繁地发送请求来获取更新,大大提高了数据传输的效率和实时性。
Websocket流程图
首先客户端发起连接请求,服务器响应后连接建立,接着进行数据的发送和接收,最后客户端请求关闭连接,服务器确认后连接关闭。
使用场景
- 实时聊天应用:如在线客服、即时通讯工具等,服务器可以实时将新消息推送给客户端。
- 实时数据监控:用于实时显示股票行情、传感器数据等,服务器可以随时将最新数据发送给客户端。
- 多人在线游戏:可以实现游戏状态的实时更新,如玩家的位置移动、游戏事件等。
代码示例
以下是一个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 通过信令服务器进行信令交互以协商连接和媒体参数。然后,两个客户端分别采集、编码自己的音视频数据,并将其发送给对方,对方接收、解码并播放这些数据。最后,当需要关闭连接时,再次通过信令服务器进行信令交互来关闭连接。
使用场景
- 视频会议:支持多人视频通话,广泛应用于在线办公、远程教育等领域。
- 在线直播:主播可以将音视频流实时传输给观众,实现低延迟的直播效果。
- P2P 文件传输:可以在浏览器之间直接传输文件,无需通过服务器中转,提高传输效率。
代码示例
可查看字节火山引擎RTC的demo
作者:帅得不敢出门