大语言模型插件功能在携程的Python实践( 二 )


它具有如下优点:

  • 支持双向通信,实时性更强
  • 更好的二进制支持
  • 较少的控制开销 。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小 。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码 。而HTTP协议每次通信都需要携带完整的头部
  • 支持扩展 。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议(比如支持自定义压缩算法等)
除了WebSocket , 我们还可以选择使用socketIO 。Socket.IO也可以实现客户端和服务段之间双向通信 。但与WebSocket不同的是,socketIO是一个第三方库,他具有WebSocket的基本功能,同时也增强了一些的功能 。比如:
  • 兼容性:WebSocket是HTML5标准中的一部分,需要浏览器支持HTML5才能使用,而Socket.IO是基于WebSocket协议的封装,可以在不支持WebSocket的浏览器上使用
  • API:WebSocket只提供了底层的API,需要开发者自己实现消息的编解码、心跳等功能,而Socket.IO提供了更高层次的API,封装了消息的编解码、心跳等功能 , 使用更加方便
  • 处理异常:WebSocket在连接异常时会直接断开连接 , 而Socket.IO的心跳机制会尝试重新连接,提高了连接的稳定性
  • 支持的协议:WebSocket只支持单一的协议,而Socket.IO支持多种协议,包括WebSocket、Flash Socket、AJAX长轮询等
  • HTTP 长轮询回退:如果无法建立 WebSocket 连接,连接将回退到 HTTP 长轮询
但需要强调的是:Socket.IO与WebSocket并不能兼容,尽管 Socket.IO 确实在可能的情况下使用 WebSocket 进行传输,但它为每个数据包添加了额外的元数据 。因此WebSocket客户端将无法成功连接到Socket.IO服务器,而Socket.IO客户端也将无法连接到普通WebSocket服务器 。
socketIO服务连接时,可以在f12中看到连接的过程:
大语言模型插件功能在携程的Python实践

文章插图
总共分为5步:
  • 客户端发起握手请求(GET) , 服务端返回本次连接的前置基础信息
{"sid": "FSDjX-WRwSA4zTZMALqx",// 会话的ID,它必须包含在后续所有HTTP请求的查询参数中"upgrades": ["websocket"],// 数组包含服务器支持的所有“更好”传输的列表"pingInterval": 25000,// 心跳检测时间 , 25秒"pingTimeout": 20000// # 心跳超时时间,20秒}
  • 客户端带上sid(POST),长轮询,发送连接请求
  • 客户端带上sid(GET),长轮询 , 获取连接确认
  • 升级建立WebSocket连接 , 响应码为101,且一直处于连接状态
  • 客户端接收数据 (GET),长轮询,WebSocket连接建立成功后关闭
三、 基本实现以下实现案例基于国内开源大语言模型ChatGLM3,ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型 。
3.1 定义各种插件
根据ChatGLM3模型的插件规范,定义插件的相关信息,这里举2个例子 , Google搜索(同步插件)、Ping(异步插件) 。
all_plugins = {"google": {"name_cn": "谷歌搜索",# 中文名称"sync": True,# 是否同步执行"message": "{result}",# 返回给用户的消息# info内容为符合ChatGLM3 function call规范的函数定义"info": {"name": "google",# 函数名"description": "当问题需要进行实时搜索(如今天的日期或者今天的天气等)时, 或者无法回答时, 使用 google 搜索",# 函数描述"parameters": {"type": "object","properties": {"keyword": {# 传参参数名"type": "string",# 参数数据类型"description": "搜索的关键词"# 参数描述}},"required": ["keyword"]# 必填参数}}},"ping": {"name_cn": "ping","sync": False,"message": "使用ping插件,由于该任务执行时间比较长,完成后我会主动将结果发送给您 。请耐心等待 。如果您有其他问题,可以继续提问 。","info": {"name": "ping","description": "使用ping工具对IP地址进行ping测试","parameters": {"type": "object","properties": {"addr": {"type": "string","description": "被ping的ip或者域名"}},"required": ["addr"]}}}}


推荐阅读