【免费下载链接】rlmGeneral plug-and-play inference library for Recursive Language Models (RLMs), supporting various sandboxes.项目地址https://gitcode.com/GitHub_Trending/rlm/rlm点击查看免费下载RLM 通信协议是 Recursive Language ModelsRLM推理框架内部的数据交换机制其核心是一套简洁的4字节大端长度前缀 UTF-8 JSON 报文帧设计。本文基于开源项目 rlm完整拆解这套 socket 协议的工作原理为什么递归语言模型需要一个本地 TCP 协议、长度前缀如何避免 TCP 粘包问题、请求与响应报文如何组织以及它如何支撑 Docker、Modal 等隔离沙箱环境下的子 LM 调用。为什么 RLM 需要一个 socket 通信协议RLMRecursive Language Model的运行由三个协作部分组成主循环RLM、代码执行环境REPL以及一个名为LMHandler的本地 TCP 服务。模型生成的代码在 REPL 里通过llm_query()等函数调用大模型而这些调用并不直接 import 模型客户端全部经由 LMHandler 转发。这是协议存在的根本原因环境类型代码运行位置LM 调用方式本地环境local / ipython与 RLM 同进程仍走本地 TCP保持协议一致隔离环境docker / modal / prime / daytona / e2b独立进程或远程机器必须走 TCP跨进程/跨机器通信隔离环境如 Docker 容器、Modal 云沙箱与宿主机完全隔离容器内的 REPL 无法直接访问宿主机里的模型客户端对象。LMHandler 相当于一个本地代理把容器里的 LM 调用请求转回宿主机执行。为了让所有环境使用同一套代码路径rlm 让连本地环境也走这套 socket 协议——环境侧只需知道一个(host, port)地址其余一概相同。RLM 的递归调用全景图中llm_query子调用背后正是本文拆解的通信协议在工作。报文帧结构长度前缀 JSON 负载整条报文只有两段简单到令人舒适┌──────────┬─────────────────────────┐ │ 4 bytes │ N bytes │ │ len (BE) │ JSON payload (UTF-8) │ └──────────┴─────────────────────────┘发送端只需两行核心逻辑见 rlm/core/comms_utils.pyjson.dumps(data).encode(utf-8)字典序列化为 UTF-8 JSON 字节struct.pack(I, len(payload)) payload4 字节大端无符号整数长度 负载sendall一次发完接收端socket_recv先recv(4)读出长度再循环recv直到收满 N 字节最后json.loads(payload.decode(utf-8))还原字典。关键设计一为什么是4 字节大端长度前缀TCP 是字节流没有消息边界。如果只把一段 JSON 直接send出去接收端无法知道一条消息在哪里结束——两条消息可能粘在一起粘包也可能被拆成碎片拆包。长度前缀是经典解法先告诉对方这条消息有多长接收方照长度精确取字节即可。为什么选 4 字节I是无符号 32 位整数最大表示约 4 GB 的报文对 LM 请求响应绰绰有余又比 8 字节前缀更省流量。为什么是大端Big-Endian大端即网络字节序高位在前跨平台行为完全一致且不依赖任何机器的小端/大端差异——这是网络协议最稳妥的默认选择。为什么不干脆用换行符分隔 JSONJSON 字符串本身可能包含换行符用\n切分不可靠而长度前缀对任意内容字节都安全。关键设计二接收端的拆包重组与断连保护TCP 单次recv不保证返回完整数据所以socket_recv用一个循环累积字节收满才解析while len(payload) length持续接收直到攒够声明的长度从根上解决拆包问题优雅识别对端关闭如果读长度前缀时连接已关闭返回空直接返回空字典{}表示没有消息了中途断连快速失败消息收到一半连接断开抛出ConnectionError而不是卡死或拿到残缺 JSON这个正常关闭 vs 异常中断的二分处理是并行子调用场景多个子任务同时发请求、各自完成后关闭连接能稳定工作的基础。报文正文LMRequest 与 LMResponse 的消息设计帧格式之上rlm 定义了两类结构化消息体comms_utils.py字段精简、语义清晰LMRequest请求环境 → LMHandler字段类型说明promptstr / dict单个提示词与prompts二选一promptslist批量提示词触发并发批处理modelstr | None显式指定模型名覆盖默认路由depthint当前递归深度用于模型路由LMResponse响应LMHandler → 环境字段类型说明chat_completion对象 | None单个完成结果chat_completionslist | None批量完成结果与请求顺序一一对齐errorstr | None错误信息非空即代表失败两个细节值得注意单/批量共用一套结构用字段是否为空区分单条还是批量接收端用is_batched属性判断协议无需引入消息类型头depth字段驱动模型路由LMHandler 可持有多个模型客户端depth1时若配置了other_backend_client就路由到它——这让 RLM 的子调用自动走更便宜/更快的模型全部通过报文里的一个整数字段实现一次性请求模式socket_request 与类型化封装环境侧最常用的入口是 socket_request每次调用新建一条 TCP 连接发一个请求、收一个响应、随即关闭。一连接一请求的无状态设计省去了连接池、心跳、会话管理等一切复杂度对短生命周期的 LM 调用再合适不过默认超时 300 秒。在此之上send_lm_request 和 send_lm_request_batched 把字典 网络封装成类型化的请求/响应对象任何异常网络失败、超时都转成LMResponse.error_response(...)返回不向调用方抛异常——REPL 里的模型代码拿到的只是一个带错误信息的字符串批量响应逐条隔离失败某一条 prompt 失败只影响对应槽位其余照常返回列表长度始终与输入对齐RLM 官方可视化器图中每次 SUB-LM 子调用的往返数据都经由上述 4 字节长度前缀协议传输最终落盘为可审计的 JSONL 轨迹。服务端全景LMHandler 多线程 TCP 服务协议的另一端是 LMHandler一个基于ThreadingTCPServer的多线程 socket 服务rlm/core/lm_handler.py自动端口分配绑定127.0.0.1端口0由操作系统分配空闲端口天然避免端口冲突每个completion()调用拥有独立的 handler 与端口守护线程 每连接一线程daemon_threads True不阻塞进程退出并行批处理的多个子调用可同时被服务请求处理LMRequestHandler.handlesocket_recv收帧 →LMRequest.from_dict反序列化 → 按model/depth路由到模型客户端 →socket_send回帧批量并发用asyncio.Semaphore限流默认 16 并发asyncio.gather(..., return_exceptionsTrue)并发执行多个 prompt单个失败以带error字段的 completion 形式返回容错客户端断开BrokenPipeError等静默吞掉其他异常尽量回一条错误响应帧隔离环境中的落地以 Docker 为例在 Docker 等隔离环境中这套协议的地址概念变得动态容器内的 REPL 通过宿主机代理把请求转给宿主机上的 LMHandler。DockerREPL 实现了_resolve_address()动态解析 LMHandler 地址并在持久化多轮会话中通过update_handler_address更新——因为每次completion()都会在新端口上启动新 handler。对比 LocalREPL 直接持有lm_handler_address两者的llm_query调用代码几乎完全相同。这正是统一协议的价值环境差异被压缩成一个地址参数协议逻辑零分叉。设计要点总结设计点选择收益帧格式4 字节大端长度前缀 JSON 负载解决 TCP 粘包/拆包报文可人工读、可调试载荷格式UTF-8 JSON跨语言、易序列化天然适配 LLM 的文本数据连接模型一连接一请求用完即关无状态、无需连接管理错误处理错误也是报文error字段网络异常与业务异常统一处理消息结构单条/批量字段复用协议极简扩展只需加字段这套协议没有引入任何第三方序列化库或 RPC 框架仅靠 Python 标准库socketstructjson就支撑起递归语言模型的多进程、跨机器推理架构——对于想在自己的 Agent 框架里加一条环境 → 宿主内部通道的开发者rlm/core/comms_utils.py 约 270 行代码就是一份可以直接参考的完整实现。更多架构背景可查阅 docs/architecture.md。赞分享【免费下载链接】rlmGeneral plug-and-play inference library for Recursive Language Models (RLMs), supporting various sandboxes.项目地址https://gitcode.com/GitHub_Trending/rlm/rlm点击查看免费下载相关推荐Easy-Vibe 实战指南前后端通信协议与 RESTful API 设计全解析Easy Vibe 实战指南前后端通信协议与 RESTful API 设计全解析 导读 本文是 Datawhale Easy Vibe 项目附录中服务端与教程文档easy-vibe 全栈实战RESTful API 设计原理与前后端通信协议详解easy vibe 全栈实战RESTful API 设计原理与前后端通信协议详解 本文源自 Datawhale easy vibe 项目《API 设计原理前教程文档NTP协议是什么深度剖析ntp4cj背后的48字节报文与123端口通信原理NTP协议是什么深度剖析ntp4cj背后的48字节报文与123端口通信原理 NTP协议是什么它是互联网上最基础的时间同步协议。开源项目 ntp4cj 是一个网络通信OpenHarmony创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考