A2UI:让AI从“对话框“走向“动态界面“

A2UI解决的核心问题是:如何让AI代理安全地跨信任边界渲染UI

这话听着有点绕,举项目中的一个示例就清楚了。你问AI助手“帮我订个餐厅”,传统的方式是一轮轮文字对话:

用户: "订个两人桌"AI: "什么时间?"用户: "明天晚上7点"AI: "7点没位置了,5点、6点、8点、9点有,选哪个?"用户: "那8点吧"

这种交互效率低,更好的方式是AI直接生成一个包含日期选择器、时间选择器和提交按钮的表单界面。

这里存在一个问题,如果AI生成的是可执行代码,会存在安全风险,可能被注入恶意代码。A2UI的做法是:AI只生成声明式的JSON数据,由客户端负责渲染成UI

传统方式: AI → 生成代码 → 执行代码 → UI (有安全危险)A2UI方式: AI → 生成JSON → 客户端渲染 → UI (安全)

为什么需要A2UI

随着智能体的应用越来越普及,我们也希望智能体在与我们交互时形态能够更丰富。纯文字对话能用,但不够高效,纯静态UI展示又缺乏一定的灵活性。我们需要的是能根据上下文动态生成的UI,它既能承载复杂的交互,又能随对话实时变化。

但这里有个问题,如果AI代理运行在我们的应用内部还好说,它可以直接操作UI控件树来生成界面。但实际的工作场景中,AI代理往往在远程,它没法接触到我们的UI,只能通过信息传递。

我了解到在前端场景,有一种解决方案是,把远程UI渲染在iframe里做沙箱隔离。但这种方式比较重,视觉上也很难和宿主应用保持一致。

A2UI的思路不同:AI生成的不是UI代码,而是UI的结构化描述。应用收到描述后,再用自己的原生组件来渲染。这样既保证了安全性,又保证了视觉一致性。

一图胜千言:

这个思路听起来简单,但要真正落地,需要在UI结构化描述的格式设计上下功夫。

设计原则

首先是安全。前面说过,直接执行LLM生成的代码有安全风险,所以A2UI选择了声明式数据格式。客户端维护一个组件白名单,里面是预先确认过的可信组件(比如Card、Button、TextField这些),AI只能请求渲染白名单里的组件。

{ "component": { "Button": { "child": {"id": "btn_text"}, "action": { "name": "submit_order", "context": [{"key": "orderId", "value": {"path": "/order/id"}}] } } }}

即使AI试图生成一个Script组件来执行任意代码,也被会客户端直接拒绝。

其次是对LLM友好。UI用扁平的组件列表展示,通过id互相引用。为啥不用嵌套结构呢?因为LLM是顺序生成token的,深层嵌套意味着它要了整棵结构树才能保证括号匹配、层级正确。扁平列表就简单多了,一个组件生成完,接着生成下一个,想引用别的组件直接写id。这就让增量更新变得容易,用户发起请求后,AI代理只需要输出变化的那几个组件,不用重新生成整个界面。

{ "surfaceUpdate": { "surfaceId": "contact-card", "components": [ { "id": "root", "component": { "Column": { "children": { "explicitList": [ {"id": "avatar"}, {"id": "name"}, {"id": "email"}, {"id": "btn"} ] } } } }, { "id": "avatar", "component": { "Image": { "url": {"path": "/user/avatar"}, "usageHint": "avatar" } } }, { "id": "name", "component": { "Text": { "text": {"path": "/user/name"}, "usageHint": "h2" } } }, { "id": "email", "component": { "Text": { "text": {"path": "/user/email"} } } }, { "id": "btn", "component": { "Button": { "child": {"id": "btn_text"}, "action": { "name": "follow_contact", "context": [{"key": "contactName", "value": {"path": "/user/name"}}] } } } }, { "id": "btn_text", "component": { "Text": { "text": {"literalString": "关注"} } } } ] }}

最后是跨平台。A2UI把UI的结构和实现分开:AI代理发送组件树的描述,客户端负责用自己的原生组件渲染。同一份JSON描述,Lit、Angular、Flutter等不同的UI框架都能用。

接着,再深入A2UI内部看下具体的技术原理。

技术原理

A2UI的组件库分四层:组件库、系统指令、LLM、后处理层。下面我们从核心概念开始,逐层拆解。

Surface

Surface是A2UI最核心的概念,可以理解为一个独立的容器。一个应用可以有多个容器,比如一个联系人列表Surface加一个详情卡片的Surface。

创建Surface的消息长这样:

{ "beginRendering": { "surfaceId": "contact-card", "root": "main_column", "styles": { "primaryColor": "#007BFF", "font": "Roboto" } }}

Surface内部维护三个关键数据结构

  • rootComponentId:根组件ID,用于描述Surface的层级关系
  • components:Surface下的组件集合
  • dataModel:数据模型,存储UI需要的动态数据
Component

A2UI定义了18种标准组件,分为三大类:

类别组件说明
展示类Text, Image, Icon, Video, AudioPlayer, Divider只显示内容,不接收输入
布局类Row, Column, List, Card, Tabs, Modal用于排列其他组件
交互类Button, TextField, CheckBox, DateTimeInput, MultipleChoice, Slider接收用户输入

如果这18个组件不够用,我们还可以自己扩展。客户端通过ComponentRegistry注册自定义组件:

// 定义一个组织架构图组件@customElement("org-chart")class OrgChart extends LitElement { @property() data: any; render() { return html`<div class="org-chart">${this.renderTree(this.data)}</div>`; }}// 注册到A2UIcomponentRegistry.register("OrgChart", OrgChart, "org-chart");

注册后,LLM就可以生成引用这个组件的JSON,客户端会用你定义的组件来渲染。当然,也可以用同样的方式覆盖标准组件,比如给TextField加上自定义的校验样式。

Data Model

数据模型是UI的数据源,组件通过路径绑定从数据模型获取值。而具体数据的获取,是通过绑定到LLM Agent的一系列工具调用来实现的。

"dataModelUpdate": { "surfaceId": "contact-card", "path": "/", "contents": [ {"key": "user", "valueMap": [ {"key": "name", "valueString": "Alice"}, {"key": "email", "valueString": "alice@example.com"}, {"key": "avatar", "valueString": "https://example.com/avatar.jpg"}, {"key": "id", "valueString": "12345"} ]} ] }

前面设计原则章节,组件结构中的的{"path": "/user/name"}就是在引用数据模型中的值。当数据更新时,引用它的组件自动更新。

路径的格式遵循了RFC 6901 JSON Pointer标准:

  • /user/name→ dataModel.user.name
  • /cart/items/0→ dataModel.cart.items[0]
  • /cart/items/0/price→ dataModel.cart.items[0].price
Action

Action定义了用户交互时触发的操作。当用户点击按钮时,客户端会解析context中的路径引用,从dataModel获取实际值,然后构造userAction消息,发送给Agent。

{ "userAction": { "name": "follow_contact", "surfaceId": "contact-card", "sourceComponentId": "btn", "timestamp": "2024-01-15T10:30:00.000Z", "context": { "contactId": "12345", "contactName": "Alice" } }}

Agent收到后处理业务逻辑,然后返回新的dataModelUpdate更新UI状态。

消息流协议

A2UI使用JSONL(JSON Lines)格式,每行一条消息,支持流式传输。完整的交互流程我用AI画了一幅图来呈现,应该比较直观。

渲染器

客户端的核心是A2uiMessageProcessor,负责处理所有消息并维护Surface状态。以Lit为例渲染器为例,每个组件都是一个Web Component:

@customElement("a2ui-button")export class Button extends Root { @property() accessor action: Action | null = null; render() { return html` <button @click=${() => { if (!this.action) return; // 创建状态事件,冒泡到应用层处理 const evt = new StateEvent({ eventType: "a2ui.action", action: this.action, sourceComponentId: this.id, }); this.dispatchEvent(evt); }}> <slot></slot> </button> `; }}

目前已有Lit和Angular的渲染器实现,Flutter的正在开发中。

如何学习AI大模型?

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!


第一阶段:从大模型系统设计入手,讲解大模型的主要方法;

第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

大模型全套视频教程

200本大模型PDF书籍

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

大模型产品经理资源合集

大模型项目实战合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【路径规划】基于matlab模糊神经网络机器人路径规划【含Matlab源码 14859期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

基于SpringBoot的爱心捐助平台系统源码设计与文档

前言基于 SpringBoot 的爱心捐助平台系统&#xff0c;聚焦公益捐助 “流程透明化、捐赠可追溯、需求精准匹配” 的核心需求&#xff0c;针对传统爱心捐助 “信息不对称、资金去向不明、捐助效果难量化” 的痛点&#xff0c;构建覆盖捐赠人、受助方&#xff08;个人 / 公益组织&…

【Python pip换源教程:国内镜像源配置方法(清华/阿里云/中科大源)】

作为一名Python开发者&#xff0c;你一定遇到过这样的场景&#xff1a;深夜加班时&#xff0c;一个简单的pip install命令却卡在"Downloading…"界面&#xff0c;进度条慢如蜗牛。这不是你的网络问题&#xff0c;而是默认的PyPI服务器位于海外&#xff0c;网络延迟导…

基于SpringBoot的安心动物领养系统源码设计与文档

前言基于 SpringBoot 的安心动物领养系统&#xff0c;聚焦流浪动物领养 “流程规范化、信息透明化、匹配精准化” 的核心需求&#xff0c;针对传统动物领养 “信息零散、审核不严谨、领养后追踪缺失” 的痛点&#xff0c;构建覆盖领养人、救助机构 / 志愿者、平台管理员的全流程…

基于 ANFIS 的非线性回归附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

基于SpringBoot的毕业生离校管理系统源码设计与文档

前言 基于 SpringBoot 的毕业生离校管理系统&#xff0c;聚焦高校毕业生离校 “流程线上化、审批高效化、数据一体化” 的核心需求&#xff0c;针对传统离校办理 “线下跑腿多、审批进度不透明、数据统计繁琐” 的痛点&#xff0c;构建覆盖毕业生、辅导员、各职能部门&#xff…

【三维路径规划】基于matlab多种算法多无人机三维路径规划【含Matlab源码 14863期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【动态路径规划】基于粒子群算法与动态窗口混合的无人机三维动态避障路径规划研究,MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

航天原子钟的电源管理与控制单元抗辐照可靠性评估

摘要航天原子钟作为导航、通信与科学探测任务的核心时频基准&#xff0c;其电源管理与控制单元的抗辐照可靠性直接决定了全系统在空间辐射环境下的长期稳定运行能力。本文系统综述了面向宇航应用的电源管理集成电路抗辐照设计技术、评估方法及在轨验证现状&#xff0c;重点分析…

计算机深度学习毕设实战-深度学习基于pytorch训练蔬菜识别基于机器学习训练蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

脑机接口时代,提示工程架构师的技术咨询服务

脑机接口时代&#xff0c;提示工程架构师的技术咨询服务&#xff1a;开启人机交互新维度 摘要/引言 开门见山 在科技飞速发展的当下&#xff0c;脑机接口&#xff08;BCI&#xff09;技术正逐渐从科幻走向现实&#xff0c;它被视为改变人类生活和工作方式的下一个重大突破。想象…

考虑储能电池参与一次调频技术经济模型的容量配置方法Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

Vibe Kanban:Rust构建的AI编程代理编排平台

在AI编程助手日益普及的今天&#xff0c;开发者正面临着一个前所未有的挑战&#xff1a;如何高效地管理多个AI编码代理&#xff0c;实现它们的协同工作。当Claude Code、Gemini CLI、Codex等AI工具开始承担大量代码产出时&#xff0c;人类工程师的核心工作正逐步转向规划、协调…

环境振动估算阻尼比 (SDOF)研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【路径规划】遗传算法港口集装箱卡车调度【含Matlab源码 14860期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

【栅格地图路径规划】蚁群算法结合遗传算法栅格地图路径规划【含Matlab源码 14865期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

Flask基于人脸识别的智慧医疗预约挂号平台-计算机毕业设计源码+LW文档

摘要 如今&#xff0c;在科学技术飞速发展的情况下&#xff0c;信息化的时代也已因为计算机的出现而来临&#xff0c;信息化也已经影响到了社会上的各个方面。它可以为人们提供许多便利之处&#xff0c;可以大大提高人们的工作效率。随着计算机技术的发展的普及&#xff0c;各个…

【路径规划】模糊神经网络机器人路径规划【含Matlab源码 14859期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

【langchain——对话链+记忆模块】通过代码构造可多轮会话,自动调整记忆长度的基于知识库检索的购物推荐智能体搭建

1、前言 解决langchain搭建的智能体多轮会话中的记忆连接不连贯的问题 2、记忆模块的种类&#xff08;常见3种&#xff09; 调用的包名&#xff1a;from langchain_classic.memory import xxx 名称优缺点使用函数ConversationBufferMemory保留完整的对话上下文&#xff0c;…

【路径规划】基于matlab智能仓库AGV路径规划研究与仿真【含Matlab源码 14861期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…