之前看过Google的A2UI协议,最近又重新读了一遍,有了一些新的理解。
A2UI解决的是一个核心问题:Agent怎么描述它看到的UI?
这个问题的答案,对我设计ALPP也有启发。
核心问题:Agent能理解UI吗?
现在的AI能看图,但看到一个App界面,它不一定知道这个界面在做什么。
“这里有一个按钮”——这是像素。
“这个按钮是提交订单的”——这是语义。
A2UI想做的,就是让AI从"像素"理解到"语义"。
三层架构
A2UI采用三层架构:
结构层(Structure)
描述UI的元素和层级。
按钮在哪里、输入框在哪里、它们是什么关系。
语义层(Semantics)
描述元素的含义和功能。
这个按钮是做什么的、这个输入框接受什么类型的输入。
行为层(Behavior)
描述交互逻辑和状态变化。
点击这个按钮会发生什么、填写表单之后怎么提交。
三层配合,AI才能真正"看懂"一个界面。
占位符模式
A2UI引入了"占位符"的概念——Dynamic*类型。
意思是:有些内容我现在还不知道,先用占位符占着,后续再填充。
比如:
- DynamicText:动态文本
- DynamicAction:动态动作
- DynamicContent:动态内容
这样做的好处是什么?
协议不需要穷举所有情况,预留扩展空间。
协商机制
A2UI还设计了协商机制——Agent和UI之间可以"谈判"。
比如:
- Agent说"我要执行这个动作"
- UI说"需要补充什么什么信息"
- Agent补充,UI再执行
这个来回的过程,就是协商。
协商的好处:双方都清楚自己在做什么,不会各说各话。
对ALPP的启发
从A2UI到ALPP,我学到了几件事:
1. 协商机制
ALPP设计里,我也用了类似的思路——发送方说"这是什么",接收方说"我要不要用"。
不是强制的,是协商的。
2. 优雅降级
如果某个字段不识别怎么办?
A2UI的方案:跳过,继续处理其他内容。
ALPP也要有这种机制——不能因为一个字段不理解,整个学习内容就废了。
3. 扩展方式
Dynamic*类型的本质是"我知道我不知道"。
ALPP的coverage字段,也是类似的思路——标注"这段内容覆盖了哪些方面",不求全面,但求诚实。
写在最后
看别人的协议,是学习也是反思。
A2UI解决"Agent怎么描述UI",ALPP解决"Agent怎么交换学习内容"。
解决的问题不同,但设计的原则是相通的。
好的协议,是让双方都能用、都能扩展的协议。
这个标准,我还在学。