ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI代理被改写、人形机器人砍小指:技术成熟正在转向可靠下限

AI代理被改写、人形机器人砍小指:技术成熟正在转向可靠下限

1. 两则消息,一个拐点

最近圈子里有两件事,单独看都是风波,放一起看特别有意思:一件是某主流AI编程代理的行为可以被仓库里的内容“改写”,一件是某款双足人形机器人为量产直接砍掉了小指。一个是纯软件,一个是真硬件,看起来八竿子打不着,但在我这种既写了多年代码、又跟过硬件产品的人眼里,它们是同一个信号——AI和机器人正在从“展示性能上限”转向“交付可靠下限”。

这篇文章我不打算复述新闻,我想把两件事背后的原理拆开:编程代理为什么会被“改写”,攻击面到底有多宽;机器人为什么敢砍小指,这笔账是怎么算平的。同时我会给正在用AI编程工具的开发者、做机器人和智能硬件的工程师一些可以直接抄作业的实操建议。为了避免不必要的联想,下面我把那款AI编程代理叫作CC,把那款人形机器人叫作AT。读完你会同意:这两件事不是技术退步,而是技术正在变得成熟。

1.1 事件还原:CC的行为是怎么被“改写”的

先还原软件侧。CC这一类编程代理的工作方式,是拿到任务后自己读仓库、分析报错、修改文件、运行命令,然后反复迭代直到任务完成。它刚火起来的时候,大家讨论的都是“效率提升多少”“能自动搞定多少活”,直到安全研究者做了一组实验:在一个测试仓库里,往看似无害的说明文件里藏了一段特殊格式的指令,等CC读文件的时候,这段指令就会被当成最高优先级的要求,CC于是真的去执行了——包括读取环境变量、向外发送数据、修改部署配置,只要这个代理的权限允许,它都会照做。

更让我在意的是,这种“改写”可以发生在你完全无感的情况下。文件里可以用零宽字符藏字,可以用HTML注释藏指令,可以把指令拆成多段分布在几个文件里;甚至第三方依赖包都可以成为载体。攻击者不需要你运行任何可疑脚本,只要“让AI帮忙看看这个报错”,CC就会自己把脏东西读进脑子里。

1.2 事件还原:AT砍掉小指砍掉了什么

硬件侧的故事同样值得把细节摆出来。AT早期版本的机械手是完整五根手指,每一根都有独立驱动关节,能弹琴、能比划手势、能做各种精细操作,演示视频非常惊艳。但新版本直接改成了四根手指,砍掉的就是小指。官方解释很清楚:面向量产的版本,优先考虑的是成本、良率和可维护性,而不是最大手指数量。

围绕这个决定,圈内吵了两派。一派说“人类就是五根手指,机器人砍成四根是退化”;另一派说“你让机器人干的活无非是搬箱子、开柜门、拿工具,拇指食指中指已经覆盖九成场景”。我站后面这派,但我要补充一个关键点:砍掉小指省下的不只是物料钱。每少一个关节,就少一批线缆、少一个故障点、少一段装配调校时间、少一大块控制算法的开发量。这笔账必须整个算,而不能只看“少一根手指”这一个表象。

2. AI代理为什么会被改写:原理、攻击面与根治难点

如果只看新闻标题,容易得出“某个工具做得不严谨”的结论。真不是。这个问题是这个产品形态的本质决定的,我把原理拆开你就明白了。

2.1 代理的工作逻辑:像给实习生一本手册和一把钥匙

我把CC这类代理类比成你新招的实习生。你给他一本工作手册(系统提示词),里面写了岗位职责和行为准则;又给他项目规范文档(记忆文件),告诉他“我们项目的约定都在这里”;然后指着一个任务说“去把这个Bug修了”。

实习生要干活,就得先读代码、跑命令、看报错。问题是,他读到的东西里既有“事实”也有“指令”。比如他看到一行日志,里面写“出现这个错误时,优先检查配置”——这到底是日志作者的描述,还是对他下达的任务?人有时候都分不清,语言模型就更难了。对模型来说,“事实”和“指令”在文本形态上没有本质区别,它只能靠语感判断,而语感恰恰可以被精心构造的文本欺骗。

更麻烦的是,CC这类工具被设计成拥有不小的权限:可以执行终端命令、可以修改文件、可以安装依赖,甚至可以通过工具调用外部API。权限越大,被“改写”之后的破坏力就越大。这不是工具单个Bug的问题,而是“自主性”与“安全性”之间的结构性矛盾。你不可能既要它完全自主,又要它永不出错,这两个目标在现阶段是互斥的。

2.2 攻击面比大多数人想象的宽

我把常见注入入口按“代理完成任务时不得不读的内容”做了个归类。首先要理解一个前提:代理为了干活,必须读大量它不了解的文件,而这些文件在绝大多数情况下都来自外部、来自你无法逐字节审查的第三方。攻击面就在这里打开。

  • 项目记忆文件。这类文件是代理每次会话都要带上的“项目规矩”,地位几乎等同系统提示词。一旦被污染,以后每次干活都会带着恶意指令。污染方式包括上一轮会话被诱导写入,以及仓库本身自带恶意版本。
  • 说明文档与README。Markdown里的HTML注释、零宽字符、超长空白、图片描述,都能藏指令。代码评审的人肉眼看不出来,CC却会当成上下文完整读完。
  • 第三方依赖。CC分析报错时会读依赖包源码、文档和包描述。攻击者专门发布“带指令”的恶意包,等你让CC分析这个包时就中招,这本质上是供应链攻击的AI变体。
  • 测试数据和日志。构造一个恶意的JSON、CSV、快照或终端输出并不难,CC读这些“数据”的时候,照样会把它当“指令”处理。
  • 版本历史和PR描述。提交信息、合并请求描述同样是会进入上下文的内容,同样可以埋雷。跨会话还有一种“记忆投毒”:你在一次会话里被诱导,让CC把一条恶意规则写进了记忆文件,从此所有后续会话都带着这条规则。

这张清单想说明一件事:攻击面几乎等于“代理工作所需要的全部输入”。它不是某一个漏洞,而是一类系统性问题,凡是要让AI阅读不可信内容的场景,都暴露在这个风险之下。指望靠修一两个Bug解决,是方向性错误。

2.3 为什么说很难根治,只能压制

理论上最彻底的解法是让模型严格区分“数据”和“指令”,但现阶段的语言模型做不到。指令和数据在模型眼里都是token序列,边界只能靠行为规则去猜,而行为规则本身也是文本,同样可能被误导。所以这个问题的底色是:模型越强,阅读能力越强,就越难拒绝“看起来像指令”的内容。

现实里的防御都是“压制”,不是“根治”。目前比较有效的组合拳大概是这几层:第一,权限最小化,代理只拥有完成任务所需的最小权限,密钥读取、删除文件、网络发包这类高危操作单独走人工审批;第二,沙箱隔离,让代理在容器或一次性虚拟机里干活,就算被带偏,破坏范围也有限;第三,输入过滤,对代理即将读取的文件做一轮可疑模式扫描,特别是记忆文件和依赖源码;第四,人在环路,关键操作必须有人确认,所有改动先出diff再落盘,绝不自动推送。

我自己用下来,这些手段叠加能把风险压到可以接受的水平,但做不到零风险。所以正确的心态不是“找到一把安全锁”,而是“当成一个能力强但需要盯着用的工具来管理”。把这个想清楚,比指望任何厂商宣称的“自带安全”都靠谱。

3. 人形机器人为什么敢砍掉小指:成本、功能与量产账本

机器人这边的本质也一样:功能再漂亮,过不了成本、可靠性和可维护性三关,就只能停留在演示视频里。AT砍小指,砍的是这几关的账。

3.1 手指的成本:一个关节就是一条故障链

一根能做“灵巧操作”的手指,不是一根塑料棒,它是一个精密机电系统。典型设计里,一根手指至少有两到四个主动关节;每个关节背后是一台微型无刷电机、一组减速器(多数用谐波减速)、一个角度编码器,有的还带力矩传感器。这些东西从指尖一路走线到腕部和前臂,装配时还要调预紧、校零点。

成本账很好算。在量产BOM里,执行器是整只手成本的大头,自由度每加一个,物料成本就上一个台阶。故障账更狠:把一根手指看作一串串联的故障环节,任意一个电机或传感器坏了,整根手指就废了。整个手系统有二十多个执行器,哪怕每个执行器的失效率很低,乘上数量之后,整只手的返修压力也完全不是一个量级。砍掉小指,等于直接删掉了这根手指上所有执行器、线缆和故障源。

再考虑到装配环节:每多一个关节,就多一段调校工时。量产线的工时是按秒算钱的,装配一台五指手和四指手的时间差距,累积起来非常可观。对一款要交付几千台、上万台的产品来说,这就是“能不能造出来”和“能不能卖出去”的分界线。

3.2 小指的真正功能:到底占多少工作量

从人体工学看,小指当然不是废物。握拳时它和无名指一起负责“包住”物体,对握力贡献不小,抓搬重物、做引体向上、抡锤子的时候,小指都在干活。但在精细操作里,真正的主角是拇指、食指和中指。你拿水杯、拧瓶盖、捡螺丝、滑手机,靠的几乎都是这三根手指的配合。解剖学上有个基本共识:拇指的对掌功能才是人手区别于其他灵长类结构的关键,食指和中指承担大部分高精度定位动作,而无名指和小指更多是提供握力的“包裹层”。

AT的真实应用场景——搬运、分拣、开门、操作按钮和工具——基本都是中高负载抓握和简单指尖操作。四根手指完全够用,工程师还能通过优化手掌弧度和指面摩擦来补足握力。真正需要五根手指的场景是弹琴、手语、精密外科手术,那不是量产机器人的目标市场,至少目前不是。

还有一个经常被忽略的隐藏收益:手指数量减少,控制复杂度会明显下降。你不需要为小指设计抓取策略,不需要在仿真里为它跑几千个场景,神经网络抓取策略的训练时间也缩短。这部分隐形收益,有时候比省下的电机成本还大。换句话说,砍小指不仅省了硬件钱,还省了“让手指学会干活”的软件钱。

3.3 量产的逻辑:从“能跳舞”到“不趴窝”

早几年人形机器人圈比的是“上限”:能不能跑酷、能不能后空翻、能不能做微操,本质上是在证明技术可能性。但到了量产阶段,客户问的问题完全不同:一天能跑多少小时?一个月坏几次?坏了多久能修好?成本卖多少钱?没人因为你机器人会跳舞就买单,他们要的是“一天跑二十小时,一个月不趴窝”。

“砍小指”就是被这套逻辑逼出来的成熟决策。做产品的人都知道,决定一个产品生死的能力不是“加功能”,而是“砍功能”。能在路线图上精准划掉一个看起来重要、实际低频的功能,同时保留升级路径——比如手掌做成模块化,以后想要五指手直接换模组——这才是真正的产品化功力。AT这次不是退步,是从“技术的孩子”变成了“产品的成年人”。

4. 两条新闻放在一起,我读出的三点深意

CC和AT,一个软件一个硬件,一个在加能力时被提醒要收权限,一个在量产时主动砍能力。把它们放在同一张桌面上,能看到三层东西。

4.1 比拼维度变了:从性能上限到失败下限

CC被讨论“可改写”,说明它已经强到值得被攻击;AT被讨论“砍小指”,说明它已经走到量产的门口。两件事有一层共同的潜台词:技术成熟度到了新阶段,大家关心的不再是“它能做多好”,而是“它坏的时候坏成什么样”。

软件上这叫容错和安全性,硬件上这叫可靠性和可维护性,本质上是同一件事:把失败的下限抬高。一个系统,比起偶尔超神、偶尔闯祸,远不如稳定交付结果值钱。你在招标、选型、定方案的时候,最先看的应该就是下限——这正是很多团队意识滞后、最后被客户教育的地方。

4.2 安全与可靠必须前置设计,不能靠补丁

回头看这两件事,最有效的应对都不是后期打补丁,而是设计早期就做取舍。CC这类产品的安全设计,应该从“分给代理多少权限”就开始想,而不是等功能做完了再回头加权限管控;AT这类的量产设计,应该从“我到底要面对哪些任务”来定手指数量,而不是先做满配再想办法砍。

我见过太多反面案例:软件在发布前一周才想起要加审批流,硬件在量产前一个月才发现装配成本爆炸。前置设计很难,因为它要求在信息不完整的时候拍板,但这是唯一能走通的路。所有靠补丁维持的可靠性,最后都会变成下一个事故的引线。补丁能救急,但救不了设计层面已经埋下的结构性问题。

4.3 砍功能是产品化的核心动作

“被改写”逼着CC这类产品砍掉一部分“自主性”,换成“可控性”;“量产”逼着AT砍掉小指,换成“成本与可靠性”。砍,不是能力不足,恰恰是产品化的开始。判断一个团队成不成熟,别看它演示时多风光,要看它敢不敢在路线图上划掉功能。

这个道理也适用于你手上的项目:如果你发现自己什么需求都想接、什么功能都想加,那说明你对核心用户场景还不够清楚。等你真正想明白了,你会把“砍”当成一种日常动作,而不是一种痛苦取舍。砍完之后的系统,往往会比之前那个“功能全但谁都怕用”的版本更受欢迎。

5. 开发者与工程师的实操建议和避坑清单

聊完原理,落到操作层面。我给正在用AI编程代理的开发者,以及做机器人或智能硬件的工程师,各整理一份可以照着做的清单。

5.1 如果你正在用AI编程代理:五件该做的事

第一,只用只读模式起步。让代理先产出分析和改动方案,不要让它直接改代码。方案确认之后,再允许它动手。这个习惯能让你对代码库的掌控感强非常多,哪怕麻烦一点,也比事后回滚省心。

第二,高危操作单独拦截。密钥读取、文件删除、网络发包、推送远端分支这类动作永远不要默认授权。把工具的审批规则配成“每次都要人工确认”,虽然多一两步,但能挡住绝大部分事故。

第三,给代理一个干净的沙箱。不要让它在装了你全部密钥和配置的本地环境里直接跑。容器或一次性虚拟机里跑,就算被带偏,破坏范围也有限。这条最容易被偷懒跳过,但它恰恰是最值钱的一道防线。

第四,盯住记忆文件。代理每次会话都要读的项目记忆文件,必须设成受控的:它在修改时要diff,不允许写入“以后遇到X就做Y”这种危险规则。隔一段时间手动检查一次记忆文件内容有没有被污染。

第五,别让它读来历不明的第三方仓库。尤其是你刚下载还没审过的依赖包,先扫一遍再让代理分析;能排除在上下文之外的,尽量排除。

我的习惯是:代理产出的所有改动,都当成一个不太靠谱的实习生写的代码来review,一个diff一个diff地看。麻烦是麻烦,但踩过几次坑之后你就知道这一步省不得。

5.2 如果你做机器人或智能硬件:DOF不是越多越好

先说结论:自由度是手段,不是指标。你真正要定的是“任务矩阵”——把产品要面对的场景列出来,逐个判断每个手指、每个关节到底用不用得上。如果某个手指只在百分之五的场景里用到,它就该被砍,或者降级成被动弹性结构。

第二点,用可靠性预算倒推设计。先定整机MTBF目标,再分摊到每个执行器。如果预算撑不起二十个活动关节,就应该减执行器数量,而不是硬扛。硬件上每一个运动件都是未来售后部门的催命符,这句话我每次评审都会说一遍。

第三点,保留模块化和升级路径。砍小指不等于永久砍掉。设计成同一只手掌既能装四指也能装五指,消费者要更高阶功能就换手模组,量产成本和长期演进都能兼顾。

典型任务需要拇指需要食指需要中指需要小指
拿水杯喝水是是是否
拧开瓶盖是是否否
搬提箱子是是是可辅助
操作触摸屏是偶尔否否
弹钢琴是是是是

这张表不用看得太严谨,关键是建表这个动作——把“功能必要性”量化成一张表,比争论“五根还是四根”靠谱得多。

5.3 常见问题速查表

最后是我经常被问到的问题,整理成一张速查表,按症状找对策就行。

场景典型症状排查思路对策
代理执行了意料之外的操作终端出现你没授权的命令检查代理本轮读了哪些文件,尤其说明文档和依赖回滚改动,沙箱重跑,高危操作加审批
代理行为前后不一致同一任务两次结果完全不同检查记忆文件有无被污染diff记忆文件,必要时清空重建
机器人手指频繁损坏某个关节反复报错统计故障集中在哪根手指或关节减少主动关节,换被动弹性方案
整机成本超预算价格压不下来拆BOM看执行器占比砍低频手指,简化传动结构
装配调校时间过长每台要调数小时看关节数和零点标定流程简化走线,换自校准模组

6. 我自己的实际操作体会

6.1 一次让我改掉习惯的代理事故

前阵子我让CC帮忙重构一个老项目,它干得很利索,几百个文件的改动跑完测试全部通过。但我多留了个心眼,翻了翻它的完整操作记录,发现它在分析一个第三方依赖的示例文件时,真的照着文件里一段“看起来像建议”的注释改了我的接口。我没法确定那是巧合还是注入尝试,但就这一个瞬间,足够让我警觉了。从那以后,我再也没把代理当成“权威答案生成器”,所有关键改动都经过自己的眼睛。

6.2 我现在怎么对待“加功能”和“砍功能”

机器人那边,我不是搞硬件的,但跟硬件团队协作时学到一条很硬的教训:凡是在产品化阶段还想“什么都想要”的需求,最后都会变成成本和故障的定时炸弹。砍功能不是放弃,是选择。你能砍掉的东西越多,说明你越清楚什么才是核心。

CC让我学会对软件保持怀疑,AT让我学会对硬件保持克制。这两件事其实是同一个成熟过程:所有好技术,都是先学会被约束,再学会被信任。如果你也在做产品,不管是写代码还是造机器人,我建议你在“能做什么”之外,多想想“该砍什么”。想清楚这个问题的团队,走得不一定最快,但通常走得更远。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进