ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从MCP到MHS:Anthropic为物理AI定义的硬件控制新标准

从MCP到MHS:Anthropic为物理AI定义的硬件控制新标准 如果你最近在研究怎么让Anthropic的大模型帮你操作实验设备或者正站在一台机械臂面前试图给它的控制系统接上AI那你应该已经感受到了物理AI这波浪潮的来势。物理AI想做的事是让AI不再只待在对话框里写代码、出主意而是能直接驱动显微镜、机械臂、激光器这类真实存在的硬件。Anthropic之前靠MCP解决了“模型连接软件工具”的问题最近又把这套思路往外推了一大步开始推动面向硬件的模型标准MHS相当于把MCP搬进了物理世界。这篇文章我想从一个做过不少设备接入和自动化工作的人的角度拆一下MHS到底在解决什么模型控制硬件时的指令是怎么流通的以及当一台显微镜、一只机械臂甚至一台量子激光器出现在模型面前时这套系统的底层逻辑到底该怎么理解。不管你做的是实验室自动化、机器人搬运还是精密光学设备的上层控制这篇内容应该都能给你一个比较清晰的入手框架。1. 物理AI的转折点从软件工具到真实设备1.1 大模型不只会聊天还要会“动手”过去两年大模型的核心能力基本都集中在语言、代码和软件工具调用上。AI能帮你总结文档、写函数、调接口本质上还是在“信息世界”里打转。但物理AI不一样它要求AI进入真实世界去观察样本、移动滑台、吸取液体、调整激光功率。这意味着模型不能只输出一句“应该怎么做”而是必须生成一系列能够被设备执行、并且能根据设备反馈动态修正的指令。这里有一个常被忽视的关键点物理世界的信息是连续且不完美的。软件里的函数调用成功就成功了参数错了会抛异常但设备动作不是抛异常就完事的步进电机可能堵转位移台可能撞限位激光功率可能因为温度漂移而偏离设定值。所以物理AI不能照搬软件AI那套“一次调用、等待返回”的模式它需要一套专门描述硬件能力、执行状态、安全边界和反馈回路的协议。MHS要补的正是这个位置。我个人的判断是Anthropic从这里切入是很聪明的。它没有去做某个具体的机器人算法也没有去绑定某家硬件厂商而是想在模型和硬件之间定义一个共同的“通用语言”。谁先把这个语言定义好谁就能在物理AI的生态位上占据一个类似“操作系统的标准接口”的优势位置。1.2 硬件接口的战国时代每家设备各说各话做设备接入的人应该都有体会实验室和工厂里的设备接口用“战国时代”来形容一点不过分。同样是一台显微镜不同厂商的SDK风格千差万别有的是C动态库有的是Python库有的干脆只给你一个串口协议文档。机械臂更乱有些支持ROS有些只用Modbus TCP有些要通过专用的上位机软件中转。至于功率计、光谱仪、锁相放大器这类光学仪器几乎每个品牌都有一套自己的指令集。假设你想让一个大模型去控制这些设备模型需要先理解几十种不同的SDK和协议这几乎不可能。就算你为每个设备都写了一套调用代码大模型也不知道什么时候该调哪套代码。更麻烦的是设备的能力描述方式完全不同有的把“移动载物台”叫move_stage有的叫set_position还有的叫goto(x,y)。模型面对这种差异很容易在调度层就崩掉。MHS的核心思路其实是把“设备能力”变成一种可以被模型动态发现的资源。设备接进来以后先通过结构化描述告诉模型“我是什么、我能干什么、每个动作的参数范围和安全限制是什么”模型再根据这个描述生成调用参数。这解决了两个核心问题第一模型不需要预先掌握每种设备的私有SDK第二设备加入或更换时不需要重新训练模型只需要更新描述和适配层。对做系统集成的人来说这一点能省下大量重复劳动。1.3 MCP、computer use、MHS三个容易混淆的概念标题里同时出现了MCP和MHS很多朋友容易把它们搞混这里我先用一个直白的分类把它们区分开。MCP也就是Model Context Protocol解决的是模型如何调用软件工具的问题。它定义了客户端、服务器、工具Tools和资源Resources之间的关系。模型通过MCP可以调用一个天气API、查一下数据库、提交一个GitHub issue这些动作发生在软件系统内部。computer use则是另一种交互思路模型不直接调API而是像人一样看屏幕、移动鼠标、点击按钮通过图形界面操作软件。它的优点是几乎不用改现有系统缺点也很明显界面一改就失效操作速度慢而且模型必须依赖截图理解当前界面状态。MHS要解决的是前两者没有覆盖的场景——模型如何控制真实硬件。它的思路和MCP一脉相承也是“标准化接口动态能力发现”但目标对象从“软件函数”换成了“物理设备”。MCP、computer use和MHS的差别可以简单理解成MCP是给模型开API通道computer use是让模型去点图形按钮MHS则是给模型一发标准化的“设备操作动词表”。对比维度MCPcomputer useMHS作用对象软件工具与数据软件图形界面真实物理硬件模型交互方式结构化JSON调用截图鼠标键盘动作设备描述控制指令状态反馈主要优势稳定、高效、可复用无需改造旧系统统一硬件接入支持动态能力发现核心难点工具规范与权限设计UI变化、延迟高安全边界、实时反馈、硬件差异理解了这个区别后面看MHS的架构就会顺畅很多。2. MHS核心架构拆解模型如何识别并操作一台陌生设备2.1 描述层给设备写一本机器能读的“行为说明书”MHS架构里最底层、也最基础的部分是设备描述层。每个接入MHS的硬件都必须提供一份结构化描述文件内容大致包括设备类型、制造商、支持的动作列表、每个动作的输入参数、参数的单位和量程、安全约束、状态读取接口等。你可以把它理解成给每个设备写一本“机器能读的行为说明书”。如果说大模型是一个新来的实验员那他走进实验室看到一台显微镜最需要的不是有人给他丢一本几百页的SDK文档而是一张卡片上面写着“这台设备向左向右能移动多少毫米最快速度多少支持拍照曝光时间能从多少调到多少”。MHS的描述文件就是这张卡片只不过它是用JSON或YAML这类结构化格式写的。举个例子一台自动显微镜的描述文件可能长这样我简化一下核心字段{ device_type: automated_microscope, vendor: demo_lab, actions: { move_stage: { parameters: { x_mm: {type: number, min: -50, max: 50, unit: mm}, y_mm: {type: number, min: -50, max: 50, unit: mm} }, safety: { max_speed_mm_s: 10, requires_confirmation: false } }, snap_image: { parameters: { exposure_ms: {type: number, min: 1, max: 1000} }, returns: image } }, state: { current_position: {x_mm: number, y_mm: number} } }这份描述最大的价值是让模型在运行期动态知道设备的能力边界。它不需要在预训练阶段“背熟”所有设备的SDK也不需要在每次设备更换后重新微调模型。只要描述文件存在模型就能知道move_stage可以调用、参数范围是多少。用我们做后端的经验类比这就像给每个设备自动生成了OpenAPI文档模型就是那个自动读取文档并调用接口的客户端。2.2 适配层把厂商SDK翻译成模型能理解的动作描述层解决的是“模型知道能做什么”适配层解决的是“设备到底怎么被驱动”。每台硬件的原生控制方式都不一样有的通过串口发ASCII指令有的通过厂商SDK调用有的走EtherCAT总线。MHS不可能让所有设备厂商改掉自己的底层接口所以它需要在描述层和真实驱动之间增加一个适配层。这个适配层通常以驱动服务的方式存在。它做的事情是把设备私有API映射成MHS定义的统一动作。比如一台奥林巴斯显微镜的原生SDK里负责移动载物台的函数叫StageController.MoveToPosition(x, y)返回的是个布尔值到了适配层这个调用会被包装成一个MHS标准的动作move_stage(x_mm10.5, y_mm-3.2)并且统一返回结构化的执行结果和当前位置。用Python风格描述一个简单的适配器大概是下面这种感觉class MicroscopeMhsAdapter: def __init__(self, vendor_sdk): self._sdk vendor_sdk def move_stage(self, x_mm: float, y_mm: float) - dict: position_um self._guard_within_range(x_mm, y_mm) self._sdk.StageController.MoveToPosition( position_um[0], position_um[1] ) current self._sdk.StageController.GetPosition() return { ok: True, position_mm: { x: current[0] / 1000.0, y: current[1] / 1000.0 } }我在这里专门把单位换算写出来了因为这正是适配层最容易翻车的地方。显微镜厂商的SDK往往用微米作单位运动控制卡有时用脉冲数而模型能理解的最直观单位是毫米。如果适配层不做标准化模型就会经常出现“把10毫米当成10微米”这种离谱的低级错误。从我的经验看在适配层第一件事就是统一单位然后把原生范围检查放到调用真实SDK之前执行这两条做好了百分之六七十的设备接入问题都能提前拦住。2.3 控制层从一次调用到连续反馈闭环软件工具调用通常是一次性的模型请求工具执行返回结果整个过程结束。但物理设备不一样设备和环境的动态性决定了模型不能只发一次指令就撒手不管。机械臂执行抓取时物体位置可能有毫米级偏差激光器锁频时频率会随温度漂移。这些都需要在动作执行过程中持续观察、持续修正。MHS的控制层因此不会采用单一的一次性调用模式而是把动作分成两种模式命令模式和订阅模式。命令模式适合“设定位置”“触发拍照”这类一次性动作执行完返回状态即可订阅模式适合“监测激光功率”“追踪载物台位置”这类需要持续获取状态的场景模型或本地控制程序可以订阅状态流每来一个状态帧就判断一次是否需要调整。我见过很多团队第一次做AI控制硬件时都想走一条“快路径”把设备的实时状态全部塞到对话上下文里模型看完后直接输出下一步动作。这个方案看似直接实际走不通因为对话往返带来的延迟是秒级的而物理设备的状态变化经常在毫秒级。真正可靠的做法是把订阅式状态流和模型决策拆开低延迟的校正闭环由本地程序负责模型只负责在事件级做出判断比如“检测到激光失锁进入重新锁定的流程”。MHS的控制层设计本质上是在为这种混合控制模式提供结构支持而不只是给模型开几个工具函数。2.4 安全层能“看”和能“动”必须分开授权物理AI的安全问题比软件工具要严重得多。软件调用出错最多跑一个错误分支硬件调用出错轻则撞坏设备重则伤到人。所以MHS在架构设计中会把设备权限分得非常清楚一般会区分只读状态、参数调整、运动控制、紧急停止等几个级别。一个刚接入的实验员账号可以被允许读取设备状态但不一定有权限执行高速运动一个自动化流程可以自动调节曝光时间但涉及大范围移动载物台时必须经过人工二次确认。这可以类比成实验室的门禁系统能刷卡进入实验室不等于能打开高压电源的柜子能操作仪器不等于能移除设备的物理防护罩。每个设备动作都应该有一个权限标签MHS要求描述文件里显式标注这个动作属于哪个权限级别。从架构上看安全约束最好放在靠近真实设备的那一端而不是放在模型侧。模型生成的动作参数再完美也要在适配层里经过范围检查和软限位校验。安全不能依赖模型的“自觉”必须由协议和设备端的强制逻辑来兜底。这个思路我会在后面实战部分再展开讲。3. 三类典型设备的落地形态显微镜、机械臂与量子激光3.1 显微镜AI帮你找焦、曝光、拼大图显微镜应该是最容易感受到MHS价值的设备之一因为它的操作路径非常标准移动载物台、调整焦距、设置曝光、采集图像。这些年做病理切片全景扫描或者活细胞长时间追踪的实验人员每天都要在这些动作上耗费大量时间很多操作重复性极高。接上MHS之后模型可以做这样的事你先在自然语言里告诉它“把样本中心移到视野里找一个清晰的对焦面然后按2×2拼图方式扫描并保存”系统就会把这句请求拆解成一系列设备动作。移动载物台用move_stage寻找焦面用adjust_focus预览曝光饱和度用snap_preview正式采集用snap_image。每次动作执行完系统读取当前状态判定是否达到预期目标再决定下一步动作。这里我要特别指出一点MHS本身并不会替你解决图像模糊判断这类算法问题它提供的是“让模型能操作设备来采集判断所需的数据”的能力。如果你想让AI自动判断图像是否清晰还是需要另外接一个对焦评价函数但有了MHS这个评价函数的结果可以直接反馈给模型再由模型决定是继续调焦还是进入下一个视野。设备操作和视觉理解的分工在这里变得非常清晰。3.2 机械臂把“移液、搬板、孵育”写成一组动作蓝图机械臂是物理AI另一个典型场景尤其在做实验室自动化时大量工作是移液、抓取、转移培养板、开盖关盖这类动作。传统做法是用脚本把每一步写死换一个样本布局或者换一台设备脚本就要改一遍。MHS的做法是用统一动作原语来描述任务让调度层灵活组合。比如“把96孔板从A区搬到孵育箱37度孵育30分钟”这句话在MHS模式下会被分解成几步先调用check_slot_state确认目标位置是否有空位再调用pick_plate拾取培养板接着调用transport_to_incubator移动到指定位置之后调用place_plate放入设备最后设置孵育箱温度并启动计时。这种设计思路和现在常说的“流程蓝图/Blueprint”概念是相通的。规划层只负责制定动作的编排顺序MHS负责为每个动作提供标准化的“动词”和参数规范。模型不关心机械臂用的是哪家控制器、底层走没走ROS它只知道自己调用了pick_plate然后收到一个“成功拾取”的状态反馈或者一个“未检测到抓取力重试一次”的异常返回。这种抽象的代价是需要写适配器但收益是任务逻辑可以在不同设备之间灵活移植。我在实际项目里体会很深的一点是机械臂场景里千万不要让MHS去承担运动规划的工作。到底走哪条轨迹、如何避障这些都是成熟运动库或ROS的强项。MHS管的是“做什么”和“做得怎么样”低层的“怎么动”交给专门的规划器就好。越界只会让系统变慢变脆。3.3 量子激光毫秒级的闭环大模型只做“参数设定者”把量子激光拉进物理AI的讨论看起来跨度很大其实它和显微镜、机械臂遵循的是同一套逻辑只是对反馈时延的要求更极端。在原子物理和量子精密测量实验里经常需要把激光频率锁定在原子跃迁线上并用另一路激光控制原子内部状态。这其中的频率锁定、功率稳定通常是由FPGA或PID控制器以微秒级、毫秒级周期完成的高频闭环。大模型不可能也不应该介入到这种高频回路里它只能作为更上层的“参数设定者”和“异常监控者”。MHS在这里的形态会变成这样把整套激光系统抽象成一个有状态的设备对象它的状态包括当前频率、锁定状态、输出功率、温度等它支持的动作包括set_target_frequency、relock、set_power_setpoint、subscribe_status。模型可以设置目标频率然后订阅锁定状态一旦发现“失锁”事件就开始执行故障排查流程——比如调用read_status看是温度问题还是光路偏移再决定是否重新锁频。这个场景最能体现MHS的价值也最能警告开发者不要过度设计。你不需要让模型一毫秒调一次功率那既不可能也没必要。MHS真正解决的是让模型理解设备状态、设定控制目标、接收异常事件。高频反馈留在原有控制环里模型做好高层决策就够了这也是物理AI正确的分层方式。设备类型典型动作反馈粒度MHS关键价值显微镜移动载物台、调焦、曝光百毫秒级统一扫描流程减少人工重复操作机械臂抓取、搬运、放置、流程编排百毫秒到秒级动作原语标准化流程可迁移量子激光系统设频率、锁频、状态订阅微秒到毫秒级底层回路模型负责高层监控不干扰实时控制4. 开发者实战从MCP到MHS的上手指南4.1 先吃透MCP工具调用的最小闭环长什么样MHS并不是一个完全另起炉灶的协议它身上处处有MCP的影子。所以要上手MHS先理解MCP是几乎绕不开的一步。MCP的基本模型很简单模型或者通用客户端是MCP Client工具提供方是MCP Server二者通过JSON-RPC进行通信。一次最基本的MCP工具调用在网络上只发生了三件事客户端先发初始化请求确认双方协议版本然后调用tools/list拉取当前可用的工具列表最后调用tools/call执行某个具体工具传入参数并等待结果。我用最简化的JSON消息示意一下{jsonrpc: 2.0, id: 1, method: initialize, params: {}}{jsonrpc: 2.0, id: 2, method: tools/list, params: {}}{ jsonrpc: 2.0, id: 3, method: tools/call, params: { name: move_stage, arguments: {x_mm: 10.0, y_mm: 0.0} } }其中tools/list返回的工具描述会包含每个工具的名称、说明、输入参数格式。这个描述和前面MHS设备描述文件的定位非常像都是让模型在动态中了解它可用的能力。MCP做软件工具标准化MHS在这个基础上进一步补齐了设备状态、物理单位、安全约束、连续性反馈这些硬件场景特有的信息。4.2 写一个最小MHS适配器我用Python跑通的流程下面我用Python写一个最小可跑的MHS适配器示例做的是“虚拟位移台”。它没有接真实硬件但把MHS适配层的核心结构体现出来了设备描述、动作定义、安全校验、状态反馈。我建议你直接按这个框架去套自己的设备先跑通逻辑再替换成真机驱动。import json class VirtualStage: 虚拟位移台负责维护位置、单位、速度和范围 def __init__(self, max_x_mm50.0, max_speed_mm_s10.0): self._x_mm 0.0 self._max_x_mm max_x_mm self._max_speed_mm_s max_speed_mm_s def current_state(self): return {x_mm: self._x_mm} def move_to(self, target_x_mm: float) - dict: if abs(target_x_mm) self._max_x_mm: return {ok: False, error: target_exceeds_soft_limit} # 计算移动时间模拟物理执行过程 distance_mm abs(target_x_mm - self._x_mm) estimated_s distance_mm / self._max_speed_mm_s self._x_mm target_x_mm return { ok: True, position_mm: self._x_mm, estimated_execution_s: round(estimated_s, 3) } class StageMhsAdapter: 把虚拟位移台包装成MHS风格的设备动作 所有参数在入口做统一校验。 def __init__(self, stage: VirtualStage): self._stage stage self.device_profile { device_type: linear_stage, actions: { move_stage: { parameters: { x_mm: {type: number, min: -50, max: 50} } } } } def execute_action(self, action: str, arguments: dict) - dict: if action move_stage: target_x float(arguments[x_mm]) if not (-50.0 target_x 50.0): raise ValueError(x_mm out of range) result self._stage.move_to(target_x) return {action: action, result: result} raise ValueError(funsupported action: {action}) if __name__ __main__: stage VirtualStage() adapter StageMhsAdapter(stage) print(json.dumps(adapter.device_profile, indent2)) print(adapter.execute_action(move_stage, {x_mm: 20.0})) print(adapter.execute_action(move_stage, {x_mm: -80.0}))这段代码里藏着三个我在实操中反复强调的要点。第一个要点是入口校验不能省。即使模型已经在描述文件里看到了范围限制它在生成参数时依然可能越界。适配器必须在执行动作前再校验一遍不能让一个非法参数穿到真实设备驱动里去。第二个要点是参数和返回值统一单位。如果虚拟设备内部使用微米或脉冲数适配器对外暴露时也统一好不要一会儿毫米一会儿微米。模型没有物理直觉你给它什么单位它就会按什么单位推理单位混乱是控制类bug的重灾区。第三个要点是动作执行后必须返回结构化状态。返回结果里除了ok字段最好带上执行后的位置、耗时、误差等信息。这些信息将成为模型决定下一步动作的依据如果返回得太干瘪模型就成了“盲人摸象”。4.3 常见配置与权限问题速查表从MCP过渡到MHS最常见的坑大多集中在设备接入、权限校验和参数格式上。我整理了一份速查表基本覆盖了我自己接设备时遇到的高频问题。现象大概率原因排查和处理思路设备没有出现在模型的工具列表里MHS Server没有正常启动或者设备描述文件解析失败先检查Server进程日志再检查描述JSON的字段是否完整重点看actions和parameters是否有缺失调用工具后返回403设备令牌或者API Key权限不足请求路由不对确认密钥对应的权限范围是否包含该设备看看环境变量是否指向正确的接入地址不要在生产代码里硬编码密钥设备的动作结果和预期严重不符单位换算错误例如微米、毫米、脉冲数混用核查适配层单位换算在暴露给模型的动作描述中显式标注单位增加位置回读校验指令发出后经常超时设备真实执行时间远大于模型期望的单次调用超时限制这类动作改用异步执行执行后在状态流里上报完成事件不要阻塞等待模型只读状态正常但无法执行运动动作权限分级设置过严当前会话缺少运动控制授权在MHS Server端检查权限配置给高风险动作单独配置授权令牌或人工确认策略我自己见过的绝大多数接不上的案例都不是协议本身的问题而是描述文件写错、单位没统一、权限没放对这三类。先按这张表排查基本能解决大半问题。5. 我踩过的坑和现在坚持的几条原则5.1 没加软限位的那次堵转模型没错安全校验不能省有一段时间我做设备接入时心存侥幸觉得大模型已经读过设备描述文件里的量程范围了生成的参数应该不会太离谱。直到有次在真机测试时模型生成的Z轴目标位置超出了运动范围上限虽然伺服驱动有自己的硬限位但设备还是在接近末端时发生了堵转电机温度迅速上升差点烧掉驱动器。从那次以后我给自己定了一条铁律安全校验永远放在离设备最近的那一层而不是放在模型侧。模型是对是错不重要重要的是适配层必须对每个参数做二次范围检查对每个动作做软限位判断。对于具有动能的设备还需要在动作执行前估算速度、加速度是否在允许范围之内。模型完全可以生成一个“理论合法但物理危险”的参数只有设备端校验才能拦住它。MHS本身也强调安全约束要进入设备描述但我建议你把它当成“最后的保险”而不是“唯一的保险”。描述文件只是告诉模型边界在哪真正的强制执行必须落地到适配器的代码里。5.2 延迟教育的低频决策交给模型高频闭环留在本地另一个我早期常犯的错误是想让模型参与到每一个控制细节里。比如做激光功率稳定我一度把所有功率采样丢给模型希望它能实时调整PID参数。结果可想而知对话延迟导致功率波动比没接AI之前还大。后来我把架构改成“本地闭环负责执行模型负责目标管理”。本地控制器依然每一百毫秒调整一次功率输出维持稳定模型只负责设定目标功率并且每过几秒读一次状态判断是否需要切换工作模式。这样改动之后系统稳定性明显提升模型虽然不参与高频调节但它对整体任务的把控反而更精准。这一点放到MHS的设计里也很好理解订阅模式存在的意义不是让模型高频处理每个状态帧而是让模型和本地控制程序在合适的频率上各干各的。如果你设计的系统里模型参与毫秒级控制那就要停下来重新想想架构是不是出了问题。5.3 我的收尾建议先模拟再真机永远给人留一档手动权限最后分享一个我在所有设备接入项目里都会坚持的收尾习惯先用模拟设备完整跑通逻辑再上真机上真机时第一个阶段永远保留人工确认。所谓模拟设备可以是我上面演示的那种纯Python虚拟对象也可以是在仿真环境里套上设备驱动接口的虚拟硬件。MHS有个天然优势是统一了设备接口所以你的调度逻辑如果写得干净从模拟器切换到真机时只需要把适配器的底层驱动替换掉上层动作编排基本不用改。我先虚拟设备把任务流程跑200遍确认不会出现越界、卡死、状态丢失再切到真机小范围验证这样能大幅降低设备损坏风险。同时要默认给人留一档手动权限。任何一个设备接入系统都必须在关键动作上保留人工确认的按钮或API尤其是大范围运动、高功率输出、带激光或高压的动作。AI可以提高效率但在设备安全这件事上人不能被完全踢出回路。MHS的设备描述里可以显式标记requires_confirmation我建议你最初接入设备时把这个标记设得保守一点逐步积累运行数据后再放宽权限。从MCP到MHS物理AI的落地路径正在变得越来越清晰。我的一个真实感受是这波技术真正的瓶颈其实不在模型参数而在设备控制权能不能安全、标准、高效地交到AI手里。MHS解决的是一个早期但关键的问题让模型和真实硬件之间有一门共同的、可信的语言。如果你也正在做类似方向希望这篇内容能帮你少踩几个坑。
返回列表