ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MiroFish 多智能体通信机制完整拆解:一条命令从发起到收到回执的全流程

MiroFish 多智能体通信机制完整拆解:一条命令从发起到收到回执的全流程 MiroFish 多智能体通信机制完整拆解一条命令从发起到收到回执的全流程【免费下载链接】MiroFishA Simple and Universal Swarm Intelligence Engine, Predicting Anything. 简洁通用的群体智能引擎预测万物项目地址: https://gitcode.com/GitHub_Trending/mi/MiroFishMiroFish 是一款简洁通用的群体智能引擎它的多智能体通信机制要解决的核心问题是模拟在独立进程里长时间运行时后端服务如何可靠地把指令送进模拟、把智能体的回答带出来。最鲜明的差异点在于它不引入任何网络通信直接用本地文件系统充当消息通道。从一个场景说起模拟正在跑你想问智能体一个问题假设你已经用 MiroFish 跑起了一场社交平台模拟成百上千个智能体分属 Twitter、Reddit 两个平台各自发帖、评论、浏览整个模拟由backend/scripts/下的独立脚本驱动在自己的进程里一轮一轮地env.step()推进。此刻你打开前端页面想对其中某个智能体发起一次采访问它对某条信息的看法。这里横着几道现实的坎后端Flask 服务和模拟脚本是两个进程函数调用根本够不着必须走进程间通信模拟主循环很忙不能让它停下来等你外部干预必须能安全地插进它的执行节奏里模拟进程可能崩溃、可能被重启通信方式不能假设对方此刻一定在线且状态完好。为什么这样设计把消息写进磁盘而不是开一个网络端口面对上面的坎常见的选择是消息队列Redis、RabbitMQ或轻量网络 RPCZeroMQ、WebSocket。MiroFish 的取舍是把模拟数据目录下的两个文件夹当作通信管道——ipc_commands/放命令ipc_responses/放响应两边约定好 JSON 格式剩下的事都交给操作系统。为什么因为这类通信有几个很具体的诉求零额外依赖用户能跑起模拟就一定能跑通通信不需要再部署、配置任何中间件服务消息天然持久命令一旦写成文件就不会因为模拟进程正忙、甚至正在重启而丢失落盘即留痕双方彻底解耦两个进程不共享代码、不共享端口、不共享内存只共享目录结构和文件格式模拟脚本甚至可以是完全独立的脚本文件。设计取舍代价同样清楚。文件系统轮询的延迟由轮询间隔决定代码中默认 0.5 秒查一次无法做到毫秒级响应服务端一次只处理一条命令不适合高频事件流。对低频、高可靠、命令-响应式的交互来说这个交换非常划算。反过来问一句如果换成网络 RPC模拟进程每起一个端口就要管理地址、端口冲突、连接状态崩溃后还要处理半开连接——对一个跑完一场模拟就可以关掉的场景来说这些复杂度都是纯负担。✉️ 一条消息的旅程从命令文件到回执的完整链路下面按时间顺序走一遍采访一个智能体的完整路径涉及的组件会自然地出现在各自的位置上。1. 发起。前端把采访请求打到后端/interview接口后端先检查env_status.json确认模拟环境存活然后构造一条IPCCommand一个 UUID 作为command_idcommand_type取三种之一interview单个采访、batch_interview批量采访、close_env关闭环境args里装智能体 ID、提问内容等参数。2. 落盘。SimulationIPCClient把命令序列化成 JSON写成ipc_commands/{command_id}.json。从这一刻起命令已经脱离发起方的内存躺在磁盘上排队。3. 轮询。模拟脚本一侧的 IPC 处理器在主循环里周期性调用poll_command()列出命令目录里所有.json文件按文件修改时间排序取最早的一条解析出来。乱序写入也无妨先来先处理。4. 处理。拿到命令后按command_type分发。以采访为例脚本从agent_graph里取出目标智能体把问题包装成一个ManualActionINTERVIEW 类型随本轮动作一起交给env.step()执行再从本地 trace 数据库里把智能体的回答读出来。未知命令类型不会让进程崩掉而是回一条failed响应说明原因。5. 回执。处理端把结果写成ipc_responses/{command_id}.json——文件名和命令文件同名这是响应与命令配对的关键——随后删掉对应的命令文件。客户端这边每 0.5 秒检查一次同名响应文件是否存在读到后清理两个文件把IPCResponse状态 结果/错误 时间戳交还调用方。可靠性与状态管理命令状态机、超时与容错处理这条链路里出了问题怎么办是提前设计好的核心有四点机制具体行为解决什么问题四态状态机命令生命周期覆盖pending → processing → completed / failed响应里必带状态调用方永远能明确知道命令走到哪一步客户端超时采访默认等 60 秒、批量 120 秒、全局采访 180 秒、关闭环境 30 秒均为代码默认值超时后客户端自行清理命令文件并抛出TimeoutError模拟卡死时调用方不会被无限挂起目录不会积压环境存活检查模拟进程持续维护env_status.jsonalive / stopped发命令前先查避免向已退出的模拟发命令脏数据容错命令文件 JSON 损坏、字段缺失时轮询端记录告警并跳过该文件继续找下一条单个坏文件不会阻塞整条通信管道值得注意的一点由于命令和响应都是文件任何一端在任意时刻崩溃重启动作都很轻——磁盘上没被消费完的命令还在状态文件也能让对端立刻认清现状不需要额外的重连或恢复协议。 三步快速上手向智能体发出第一条采访命令如果你想在自己的模拟里接入这套通信核心调用只有三步启动模拟用python backend/scripts/run_reddit_simulation.py --config 配置文件或 twitter / parallel 对应脚本把模拟环境跑起来它会自动创建ipc_commands/、ipc_responses/两个目录建客户端指向模拟目录SimulationIPCClient只需要模拟数据目录这一个参数发命令、等回执调用高层封装好的send_interview/send_batch_interview/send_close_env。from backend.app.services.simulation_ipc import SimulationIPCClient client SimulationIPCClient(sim_dir) assert client.check_env_alive() # 先确认模拟环境存活 resp client.send_interview(agent_id7, prompt你如何看待这条消息) print(resp.status.value, resp.result) # completed / failed 采访结果对扩展开发来说记住两条约定就够了命令文件写到ipc_commands/响应文件按command_id写回ipc_responses/。具体实现可以对照核心模块 backend/app/services/simulation_ipc.py。适用边界与延伸方向这套文件通信能用在哪、用不了在哪适合的场景命令-响应式的低频交互跨进程的松耦合控制控制端和执行端甚至可以是两套技术栈对消息不能丢有要求、但对延迟只要求秒级的场景网络条件受限、不便开端口的部署环境。不适合的场景亚秒级高频消息流轮询间隔天然设了下限、需要毫秒级延迟的实时控制、大规模双向事件广播。这些需求下应回到消息队列或网络 RPCMiroFish 自己也没有把文件系统方案往这些方向硬推。可以延伸的方向把共享目录换成网络盘或对象存储同样的 JSON 约定就能变成跨机器的 IPC在现有命令目录上增加订阅语义支持一对多的广播甚至把这套落盘-轮询-回执模式原样搬到你自己的设备控制、批处理任务系统里——它本质上是一个不依赖任何中间件的微型消息协议。一句话总结MiroFish 用两个目录 一份 JSON 约定换掉了整套网络通信基础设施让进程间协作简单到只需要会写文件。想深入实现细节直接阅读核心模块 backend/app/services/simulation_ipc.py 即可前后端两端的对应逻辑都在同一文件里。【免费下载链接】MiroFishA Simple and Universal Swarm Intelligence Engine, Predicting Anything. 简洁通用的群体智能引擎预测万物项目地址: https://gitcode.com/GitHub_Trending/mi/MiroFish创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表