ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

知识编译:如何用“图纸”约束大模型,让机器人不再“现编”

2026/9/5 22:24:53 拓冰建站 浏览量
知识编译:如何用“图纸”约束大模型,让机器人不再“现编” 我是在一次机械臂抓取调试现场意识到这个问题的。当时我让机器人按照自然语言指令“把左边那个零件挪到托盘里”它用大模型接口生成了抓取点结果连续三次都抓在同一个错误位置上——它不是没有“知识”而是把知识放在了会带偏它的地方。后来我做了一个叫“箱熵”的小方案核心思路很简单把机器人依赖的知识从“随叫随到的文本”变成“编译期就锁定的一张图纸”。这篇文章就把这个思路拆开讲清楚包括为什么用编译的思路处理机器人知识图纸到底是什么结构以及在真实机器人上落地时踩过哪些坑。箱熵这个名字是我把“熵”这个概念反过来用了。机器人运行过程中最大的问题就是不确定性太高模型输出不确定、传感器读值不确定、场景变化不确定所有的“不确定”叠加起来机器人就会显得像一个在做即兴表演的演员。箱熵想做的事情是把这些不确定的知识内容放进一个个有边界的“箱子”里让机器人在箱子里可以自由发挥但不能越过箱壁。传统的软件工程里面有一个几乎一样的动作叫编译——把源代码从人类可读的语言变成机器可执行并且边界明确的产物。所以我把它叫“编译成图纸”一份去掉多余解释、只剩关键结构和约束的工程蓝图。这套东西不是用来解决“机器人的所有问题”的它专门解决一类问题当机器人需要依赖大模型或AI Agent去理解任务时怎么保证它不会“现编”。文档、页面、物体位置、技能参数、安全边界这些知识如果散落在自然语言提示词里每次执行都会有一次“自由发挥”的机会。把它们变成一张图纸意味着机器人在运行前就知道哪些动作是允许的、哪些参数是可用的、哪些区域是禁区自然语言只负责在图纸允许的范围内做选择和填空。1. 机器人的“口才”和“动手能力”为什么总在打架1.1 大模型让机器人会说话却没让它敢动手我见过不少团队的第一反应是给机器人接一个对话大模型然后让模型直接输出控制指令。这个方案在Demo里效果很好一问一答行云流水但在真实环境里会迅速崩溃。原因是自然语言生成的指令天然带有歧义和幻觉“把零件挪到托盘”这句话到底基于哪个坐标系、“零件”具体指哪个实例、“托盘”的边界在哪这些信息模型不掌握细节它只能靠上下文猜测。猜测的结果就是动作不规范、抓取位姿有偏差、偶尔还会凭空产生一个不存在的操作。大模型适合做的是“意图理解”就是判断操作者想要什么它不适合做“执行参数生成”因为执行依赖的是当前环境下的事实而不是模型里学习过的统计规律。统计规律回答的是“一般情况是什么样”但机器人需要的是“这台设备、这个零件、现在的坐标”两回事。所以如果你把大模型当成机器人的全部“大脑”机器人确实有了口才但动手能力会被幻觉拖累。箱熵提出的路径是让大模型只负责它擅长的一小段也就是把自然语言转成结构化请求剩下的事实查询和动作规划都走图纸。图纸里写明的知识不需要模型“回忆”只需要模型“查找”。任何知识只要被编译进图纸就是最高优先级的事实来源不允许模型凭印象输出。这一下子就断掉了“现编”的根基。1.2 “知识打包”这件事传统工业机器人其实早就在做提到知识编译很多人会觉得这是一个特别新的AI概念但其实工业机器人早就用类似思路解决了大部分问题。传统机器人编程的时候工程师会把一个任务拆成固定的点位序列、逻辑分支和异常处理最后编译成机器人控制器能运行的代码。整个流程里根本不存在“模型现场发挥”的空间每一步做什么都是提前定义好的。这套体系最大的优点是稳定可靠缺点是太死板稍微换一个工件型号、调一下工位布局就得重新改程序。到了智能机器人时代我们希望机器人能有一点“应变能力”于是开始加入视觉识别、路径规划、大模型推理。但这一步步子迈大了很多方案直接把确定性知识也交给AI生成结果就是把本来稳定可靠的系统变得不可预测。其实正确的做法不是非黑即白而是分层底层的技能、运动学、安全逻辑保持传统编译式的确定性顶层加入AI做任务理解和场景适配。箱熵要做的知识编译正好就是中间这一层——把AI要用到的知识做成确定性的、可检查的“格式”让AI的灵活性踩在确定性的地基上。1.3 箱熵到底想解决哪一层问题概括成一句话箱熵解决的是“知识表示与其边界校验”的问题。它不是一个电机控制算法也不是一个新的视觉模型它处于机器人技术栈的中间层位于AI推理和底层控制之间。具体执行的时候它会接收这几类输入任务描述、场景先验、可用技能列表、物料与坐标信息、安全约束。然后它把它们统一编译成一份“知识图纸”包含符号表、状态机、技能接口和约束规则。运行的时候机器人拿到一条自然语言指令先做意图识别再把意图对应到图纸里的节点和参数上最后只执行那些通过了边界检查的动作。这个过程最大的特点是——大模型的角色被限制成“意图翻译”和“参数填空题”的答题者而不是一个胡诌八扯的自由作者。图纸上有就做图纸上没有就明确拒绝这是整个方案能够落地到真实设备上的最核心原因。2. 把“知识”当“源代码”箱熵的设计思路2.1 编译器前端的四个阶段怎么映射到机器人知识接触过编译原理的同学都知道传统编译器要经过词法分析、语法分析、语义分析、中间代码生成这几个阶段。我设计箱熵的时候直接把这套思路平移到了机器人知识处理上效果出奇地一致。你不需要把整个编译原理重学一遍但理解这个映射关系对后续使用非常有帮助。先看词法分析对应的是从原始文本中提取知识单元。比如维修手册里写着“当气压低于0.4兆帕时禁止启动夹爪”这句文本就要被拆成“条件类知识单元”“动作类知识单元”“阈值类知识单元”。语法分析则是检查知识单元的组合是否正确比如“夹爪”这个动作对象必须匹配“打开/关闭”这类动作不能出现“夹爪启动电机”这种语义上别扭的描述。语义分析更近一步要检查变量和约束是否冲突比如两条规则里一条说“温度高于60度可以继续运行”另一条说“温度高于50度必须停机”它们之间就存在矛盾必须在编译阶段直接报错。最后生成的中间代码就是那张图纸本身。这样做有一个立竿见影的好处知识问题在编译时暴露而不是在机器人运行时才暴露。运行时的故障排查成本远高于编译时。很多时候我们调试AI机器人感到痛苦就是因为问题总是到现场才发生而且每次发生的还不一样。把知识变成源代码再编译等于把大量错误拦截在上线之前。2.2 为什么是“图纸”而不是知识库或者向量数据库有人问过我为什么不直接把知识放到向量数据库里做检索增强让模型在回答问题时查资料向量数据库确实是处理非结构化知识的好工具但它本质上是一种“模糊检索”它返回的是相似内容不是确定内容。对文档问答场景来说足够好用但对机器人控制场景来说是致命的——你没办法保证检索回来的内容就是正确的哪怕相似度99.9%也可能因为某一条更相似但错误的记录导致动作偏差。图纸这个形态强调的是“编译后的确定性”。它像一张建筑施工图一样标注了每一个连接关系、尺寸、材料施工人员不需要再去翻几千页的规范文档只需要照图施工。箱熵的图纸也是这样它把知识提炼成一份经过校验的、可供运行时直接读取的结构化文件。图纸和代码还有一个共同点它是一份可以审查、可以diff、可以版本管理的资产。你可以在代码评审里看到某次修改删除了一个安全阈值也可以追溯到是谁在什么时间加的这条规则。而向量数据库里的内容往往是批量导入的修改一次要重新embedding审查起来非常困难。在这个意义上图纸不只是给机器人看的也是给人看的——这是团队协作中的关键要素。2.3 编译期的主要产出符号表、依赖图和接口契约一份完整的箱熵图纸在编译成功后至少会产出三样东西符号表、依赖图、接口契约。符号表就是一个命名空间的索引记录所有可用实体比如“传送带1”“料箱A”“六轴机械臂”每个实体带有一组属性和可调用的方法。依赖图则是在描述实体之间的逻辑关系比如“机械臂要移动到料箱A必须先确认传送带1处于停止状态”这个关系画出来就是一张有向图。接口契约是运行时最重要的东西它明确定义了每个能力需要哪些输入参数、参数范围是多少、返回什么数据。把它类比成一个餐厅的设计图会非常直观符号表是菜单上所有菜品的名称清单依赖图是后厨各工位之间的配合流程接口契约则是每道菜的详细配方和操作标准。厨师AI可以在菜单范围内自由推荐和搭配但配方规定了盐最多放多少克、烹饪时间不能超过多少分钟。箱熵运行时机器人每决定执行一个动作系统都会按契约校验参数超范围直接拒绝并把原因反馈给决策层。这样AI的不确定性就被限制在一个可控范围内。3. 一张“图纸”的可落地形态数据结构与运行时接口3.1 图纸长什么样从领域语言到结构化配置在具体实现上箱熵的图纸并不复杂它通常是一份YAML描述的知识源文件加一份编译后生成的Json或Protobuf。我先给你看一段概念性的知识源文件用类YAML格式写出来它描述的是一个抓取任务的基础知识entities: - name: left_fixture_on_conveyor type: fixture position: { frame: conveyor_1, x: 0.35, y: -0.12, z: 0.2 } allowed_grasp_approaches: [from_top, from_side] - name: tray_a type: tray position: { frame: table_work, x: 0.72, y: 0.45, z: 0.05 } capacity: 8 occupied_slots: 2 skills: - id: pick_and_place name: 从指定料位抓取并放到托盘空位 params: - source_entity: entity_ref validate: in_entities - target_entity: entity_ref validate: in_entities preconditions: - source_entity.position ! target_entity.position - robot_state idle forbidden_when: - tray_a.occupied_slots tray_a.capacity prompts: task_understanding: system: | 你是一个任务调度员。 只能执行图纸中声明的 skill。 当目标超出图纸范围时回复 NOT_SUPPORTED。 user_template: | 用户请求: {user_request} 可用实体: {entities} 请输出 JSON: {skill_id: ..., params: {...}}这段文件还不是图纸本身它是图纸的“源代码”。箱熵编译工具会读取它做冲突检测检查实体引用是否存在、坐标是否越界、预条件表达式是否可计算最后生成一份只包含运行时所需内容的Json图纸。编译后的图纸里不再有prompt模板因为运行时不允许大模型直接接触原始prompt。prompt已经变成一个固定的、编译时校验过的调度器模版模型的自由度被进一步压缩。3.2 运行时拿着图纸AI还能做什么插一句很多人会担心把AI限制得这么死那机器人是不是又退回传统编程的老路上了其实不会。图纸留了充分的自由空间只是这个空间是“参数空间”而不是“规则空间”。比如图纸声明了一个抓取技能允许的抓取方式有“从上方”和“从侧面”两种AI在执行时可以根据视觉识别的结果选择实际的抓取位姿。再比如图纸声明了任务完成的判定条件是“目标实体位置变更”但不规定必须用哪条路径到达目标点路径规划算法就可以继续自行发挥。所以箱熵的边界设计是有意的它剥夺了AI“发明规则”的权力但保留了AI“选择策略”的空间。这两者的区别是本质性的。发明规则意味着AI可能凭空创造一个不存在的操作这在物理世界中可能造成碰撞或伤害选择策略则是在已经被验证安全的选项里做选优风险是可控的。运行时的守护进程会持续校验每一个输出如果模型输出的JSON里出现了一个不存在的skill_id系统会直接丢弃并在日志中标记一次“越界请求”。3.3 知识编译和程序编译的本质差异虽然我在前面说了很多“把知识当代码”的话但知识编译和程序编译之间有一个非常重要的差异程序的执行逻辑是完全确定的代码分支最终都会按指令执行知识的执行则引入了一个非确定性的消费方——大模型。模型在推理时无法保证每一步都跟上次一样所以箱熵不能只做一次编译然后彻底撒手它还需要在运行期做一遍轻量级的“动态校验”。这个动态校验可以比作机场安检编译保证了所有旅客都买了票但上了飞机之后依然要在登机口核验身份证件。图纸在编译期保证了知识的逻辑一致性到了运行期每一条要执行的意图还要跟图纸上的接口契约做实时比对。也正因为这样箱熵的图纸通常体积很小几十到几百KB就足够覆盖一个工站的全部知识模型推理时不需要携带大量背景资料系统的Token消耗和延迟都会下降对于资源受限的机器人平台来说这一条尤其友好。4. 实操复盘从需求到“图纸”的一次完整构建流程4.1 第一步盘点知识边界不要把什么都塞进图纸我先说一个真实经验第一次用箱熵的时候最容易犯的错误是想把所有可能的问答知识全部塞进图纸。我当时对着项目文档写了厚厚几十页结果编译阶段报警一大堆主要原因就是很多内容根本不属于执行层的知识。比如“这台机器人的保修期是多久”这种问题它是文档知识不是任务执行知识机器人运行时根本不应该回答它直接转给售后知识库即可。正确做法是先做一次“边界划分”列出机器人需要自主执行的N个任务分别标注每个任务需要的实体、技能、参数和安全约束。不在任务执行链路上的知识一律不进图纸。图纸不是越大越好而是越精确越好。还有一类知识也容易被误收进去那就是“过时的经验”。工艺参数半年改一次图纸里写的还是旧数值运行时排在旧参数上后果可想而知。所以知识边界不仅指的是范围还要考虑时效性。4.2 第二步定义实体和技能用“接口思维”而不是“文本思维”这一阶段是重头戏。我建议用接口思维来定义实体和技能把每个实体想象成一个类它有属性、有状态、有允许被外部调用的方法。比如“托盘A”这类实体属性里除了位置还可以有“容量”“已占用槽位”“温度传感器读数”等状态包括“空闲”“已满”“锁定中”方法包括“获取空槽位坐标”“查询剩余容量”。定义的时候先在纸上画出依赖关系再转成配置。技能定义相对更关键因为它直接决定AI能做什么。技能不是自然语言描述而是一组接口约束。你需要在技能定义中明确输入参数列表、参数类型和取值来源、执行前需要满足的前提条件preconditions、哪些情况下禁止执行forbidden_when。定义得越严格后面AI越不容易犯错。我最初写技能时习惯用大段自然语言描述步骤后来发现副作用很大模型会把“先抓取再移动”理解成“移动再抓取”。把它们改成显式的状态机步骤并加上条件判断后执行准确率才真正提上来。4.3 第三步编译检查与配置生成写完领域文件后运行箱熵编译工具做检查。我用一个简化命令来演示一下xentropy compile --source ./knowledge/site_yaml \ --output ./build/knowledge_graph.json \ --check-level strict \ --with-rule-config ./rules/safety.json编译过程的终端输出通常会有几个阶段的提示信息。词法检查阶段如果出现“unknown entity reference”说明你在技能参数里引用了一个不存在的实体99%的情况是名字拼写不一致造成的。语义检查阶段最常见的报警是“conflict preconditions”和“unreachable skill”前者说明两条规则之间互相矛盾后者说明某个技能在现有状态机下永远无法满足前提条件。我在项目中把编译检查接入CI流程每次有人修改知识文件自动构建出一份新的图纸并跑一遍静态检查。这样知识变更对现有技能的影响能第一时间暴露出来比让机器人上线再试错高效太多。编译通过后还要人工抽查一遍生成的图纸。重点检查几处一是所有坐标是否是基于正确的坐标系写的有没有把基坐标系和工具坐标系混为一谈二是禁止条件有没有被编译器优化掉三是路径规划需要的地图边界标识是否正确。人工核查不是不信任编译器而是因为图纸最终驱动的是物理运动再多的自动检查也比不上一次场景推演。4.4 第四步真机联调时跑通“一条正常链路、三条异常链路”图纸上写知识是一回事在真机上跑通是另一回事。我在联调阶段一般会先跑一条完全的正常链路指令“把左边夹具放到托盘A空位”走完识别、查图纸、执行、确认的完整闭环。这条链路能通过只能说明系统打通了还没法暴露大部分风险。真正有价值的是异常链路的验证我建议优先测试几个场景——请求一个图纸之外的技能、请求图纸内技能但参数越界、以及请求时机不对比如托盘已满还要继续放。这三条异常链路基本覆盖了“AI现编”的常见形式。第一条模型意图识别跑偏了把客户随口说的话当成任务指令第二条模型虽然在技能集合内但生成的参数超出了合理的尺寸或坐标范围第三条是忽略了状态条件把一定时序下不可能执行的动作也输出出来。箱熵运行时会对这三类情况分别返回错误码调试工具能快速定位是模型意图错还是约束定义错。我实测下来的经验是最初阶段大部分异常都发生在约束定义不全而不是模型本身别太早怀疑你的模型先怀疑自己的图纸。5. 我踩过的坑箱熵落地常见的5类问题5.1 “图纸编译通过但机器人就是不动”这个问题基本都出在预条件表达式上。编译通过只说明表达式语法正确、引用存在不代表表达式在机器人当前状态下能够判定为真。比如某条预条件写成“抓取目标必须位于工作台高度以上”如果图纸里的目标高度是通过另一次视觉识别后才能更新的变量而运行逻辑没有更新它系统就会认为条件永远不满足机器人自然原地不动。排查的方法是在调试窗口观察条件判定日志查看某一个具体预条件被判定为False时它所引用的变量实时值是多少。大多数情况下会看到变量是空值或默认值这就说明上游数据获取环节视觉识别或传感器采集没有成功更新图纸中的实体属性。所以每次联调前先检查一遍实体的属性是否被正确绑定到了感知系统输出。5.2 “AI还是会在参数边缘试探”即使有了接口契约模型的参数生成仍然可能在数值边缘上做文章。比如图纸允许夹爪开度0到80毫米模型可能生成了一个79.9毫米的值虽然合法但可能导致抓取不稳定因为0到80是理论允许值而实际稳定抓取范围可能是30到70毫米。这里我学到的教训是不要用一个笼统的合法范围要分开“允许暴露给模型的执行窗口”和“设备硬极限”。模型参数校验看着执行窗口硬极限留给底层控制器。这很像开车时的道路边界和导流线的关系导流线以内才是真正安全的行车区域道路边界只是不能碰的护栏。有了这两层AI基本不能靠边界上的抖动来挑战整个系统。如果发现某些参数模型频繁“压线”可直接在图纸里把暴露给模型的范围进一步缩小再在运行时告警。这种做法比单纯调模型参数要稳妥得多。5.3 “一张图纸装不下所有边缘情况”图纸做得太严容易丧失灵活性做得太松又会留下“现编”空间。这是整个设计过程中最大的张力。我的经验是不要把边缘情况都写进图纸而是设计“回退策略”。图纸中声明一个默认的安全行为——当机器人无法理解意图或找不到匹配技能时就停在原地并请求人工介入或者移动到安全位等待下一步指令。处理不了的边缘情况与其给AI一个模糊的动作建议不如让它停下来。“停下来本身就是一种合理的机器人行为”我觉得做机器人行业的人应该反复在心里默念这句话。很多时候用户抱怨机器人不聪明其实是它该停的时候没停反而做出了危险的试探动作。箱熵里我特意加了一个规则没有明确说“可以做”的事情默认就是“禁止做”这与很多互联网产品的默认策略正好相反但物理世界里的安全策略必须如此。5.4 知识更新之后机器人拿到的还是旧“图纸”知识文件改过了、编译也生成了新的图纸但部署环节如果出了问题机器人加载的还是机器人控制器缓存里的旧版本。有一次我排查了半天发现逻辑改动没有生效最后才在日志里看到当前加载的图纸版本号还是前一天编译的。加了版本号机制之后这一类问题几乎绝迹。现在我要求每份图纸文件都带版本号和内容哈希编译工具在文件头强制写入这些信息。运行时启动时与控制系统的部署清单做比对一旦发现版本不匹配直接阻止启动并打印链路上所有仓库的版本状态。另外知识与代码是分开演进的如果图纸里改了实体坐标而对应的底层控制模块没有同步更新两边的版本会对不上。版本号是这套体系里最不起眼却最能救命的设计。5.5 “到底谁来维护图纸”是团队管理里最难的问题最后聊一个技术之外的问题。图纸的维护角色比很多人想象中更难定因为既需要懂机器人操作底层的细节坐标系、状态机、运动指令又需要会做抽象建模甚至还要了解大模型的接口边界。有的团队让算法工程师维护容易忽略模块间的业务条件让数字孪生工程师维护又容易把图纸当仿真界面来写让现场工程师维护则常常缺少系统思维。我比较建议的做法是选出一个人担任“知识架构师”类似传统软件团队的架构师职责负责图纸的全局结构、版本评审和对外接口。他对编译产生的最终运行风险负全责。其余一线的变更以“变更请求”方式提交每次变更走完整编译与评审流程而不是直接改共享的文件。这个机制在两个人以上的机器人团队里几乎是必备的能显著降低知识混乱造成的机器人误动作概率。6. 箱熵后续可以怎么扩展或者说它到底适合谁来用6.1 把数字孪生和仿真环境接进来把真机风险前移图纸编译检查只能发现逻辑矛盾发现不了底层几何层面的碰撞。后续我计划把图纸和底层仿真环境绑定也就是将图纸里的实体位形、技能接口和约束规则同步到数字孪生环境中让每一次图纸的变动都先跑一遍大量采样场景的仿真回归。尤其是在产线变更频繁的场景下用仿真环境快速验证可执行性再做真机切换能省下大量现场停工调试的时间。这一步本质上和软件行业的CI/CD是同一个思路知识图纸是源码仿真验证是编译期发布到真机控制器是上线部署。箱熵的价值不是替代其中任何一环而是让这一整套流程里流动的产物变成结构化的、可校验的图纸而不是非结构化、存在幻觉风险的文本。在有数字孪生条件的项目上这套链路几乎可以无缝衔接。6.2 箱熵不会取代大模型它只是给AI当好降落伞先给个明确的结论箱熵这类“知识编译”方案不是大模型的对立面反而是大模型在物理世界落地时最需要的护栏。大模型仍然负责它擅长的那部分工作理解人类意图、生成初步方案、做多模态感知的推理。箱熵只负责在它输出之后做一次硬性的边界过滤和事实对齐相当于一个认真负责的助手拿着图纸在旁边看着一旦发现清单之外的施工方案立即喊停。物理世界和数字世界最大的区别在于一个失败的动作可能造成上千元的物料损失甚至安全事故。互联网产品的AI胡说两句大家可以容忍机器人领域的AI胡说两句就可能是撞车或者是夹爪压碎工件。箱熵给AI划定“你可以自由选择但不可以离开这张图”的范围不是限制智能而是把智能放到安全边界内去发挥。6.3 我建议哪些团队认真考虑这个思路团队在规划机器人AI能力时可以用下面三类特征做一个简单对照。如果至少命中两条我认为你确实需要一个类似箱熵的知识编译层你的机器人系统需要对接大模型且要求从自然语言到控制动作的链路尽可能端到端。先不要急着把所有环节都交给提示词把任务分解后加上一个编译校验中间层会大幅提升稳定性。你的项目包含多套可复用技能比如抓取、装配、导航、上下料不同任务的参数和安全条件不一样你需要一套统一的结构来描述和管理它们。你的知识和技术文档需要反复维护且维护错了会直接影响现场运行可靠性仅靠人工检查或向量检索已经不够你需要一套带冲突检测和版本管理的知识沉淀机制。最后再分享一次我自己的体会。从在车间里被AI错觉折腾到写第一版配置文件再到编译工具能自动帮我发现规则冲突的那一刻我对“知识”这件事的理解发生了根本变化。机器人领域的知识不应该是一堆让人左猜右猜的文案它应该像软件代码一样需要经过版本管理、静态检查、架构评审和回归测试。箱熵只是一个把常识固化下来的例子真正有意思的是借它看清这一体感“图纸”比“话术”可靠编译比解释可靠边界比自律可靠。未来如果大家想在自己的项目里尝试这套思路不妨先拿一个三天之内的简单分拣或导航任务做起边做边体会——到时候你可能会发现最难的不是让机器人“懂得更多”而是让它对不知道的东西保持沉默。