一、大模型生成前端代码
1.GPT4自动生成前端网页
GPT4展示了一个功能,画一张草图,并把它拍照发给GPT-4,GPT-4可以从图片中提取文字信息并输出HTML,自动生成网站的原型图。
输入草图:
输出页面代码:
2.微调的必要性
一些开源项目基于GPT4做出比较惊艳的效果,例如:
这个工程可以将屏幕截图转换为代码(HTML/Tailwind CSS,或者 React 或 Bootstrap 或 Vue)。它使用 GPT-4 Vision(或 Claude 3)来生成代码,并使用 DALL-E 3 来生成类似外观的图像。
我们看下该工程实际调用gpt4的提示:
You are an expert Tailwind developerYou take screenshots of a reference web page from the user, and then build single page appsusing Tailwind, HTML and JS.You might also be given a screenshot(The second image) of a web page that you have already built, and asked toupdate it to look more like the reference image(The first image).- Make sure the app looks exactly like the screenshot.- Pay close attention to background color, text color, font size, font family,padding, margin, border, etc. Match the colors and sizes exactly.- Use the exact text from the screenshot.- Do not add comments in the code such as "" and "" in place of writing the full code. WRITE THE FULL CODE.- Repeat elements as needed to match the screenshot. For example, if there are 15 items, the code should have 15 items. DO NOT LEAVE comments like "" or bad things will happen.- For images, use placeholder images fromand include a detailed description of the image in the alt text so that an image generation AI can generate the image later.In terms of libraries,- Use this script to include Tailwind: <script src="https://cdn.tailwindcss.com"></script>- You can use Google Fonts- Font Awesome for icons: <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"></link>Return only the full code in <html></html> tags.Do not include markdown "```" or "```html" at the start or end.
从提示内容看:
效果比较亮眼,但实际使用还存在一些问题,现有的大模型如GPT4、Gemini等支持的图片生成前端代码,大多输出的是html代码,但实际开发中,前端一般会将UI界面不同粒度的物料组件化,例如搜索框、按钮这种基础组件,或者计时器、券、视频、轮播等这种带有业务属性的组件,又或者更大颗粒度的 UI 区块。html代码可能对前端开发的用处不大。
二、大模型出现之前的前端代码生成
其实在大模型出现之前,就有很多页面生成的工作,比如pix2code、Sketch2Code,他们使用深度学习技术实现从一张 UI 截图识别生成 UI 结构描述,然后将 UI 结构描述转成 HTML代码;
也有一些实际生产任务的工作,比如阿里的imgcook可以通过识别设计稿(Sketch/PSD/图片)智能生成 React、Vue、Flutter、小程序等不同种类的代码,并在同年双 11 大促中自动生成了 79.34% 的前端代码,智能生成代码不再只是一个线下实验产品,而是真正产生了价值。
imgcook本质是通过设计工具插件从设计稿中提取 JSON 描述信息,通过规则系统、计算机视觉和机器学习等智能还原技术对 JSON 进行处理和转换,最终得到一个符合代码结构和代码语义的 JSON,再用一个DSL转换器,转换为前端代码。DSL 转换器就是一个 JS 函数,输入是一个JSON,输出就是我们需要的代码。例如 React DSL 的输出就是符合 React 开发规范的 React 代码。
imgcook中包含多个机器学习、图像识别、自然语言的AI模型;我们看其中一个组件识别的例子;
如果希望能生成组件粒度的代码, 需要能识别视觉稿中的组件,并且转化成对应的组件化代码。例如以下视觉稿中电饭煲位置处是一个视频,但从视觉稿中只能提取到图片信息,并生成如右侧的代码。
如何识别组件类别,有两种方法,一个是目标检测、,另外一个是图像分类;
训练目标检测模型需要输入大量样本,样本是视觉稿的整张图片,并且需要给图片标记你想要模型识别的组件,训练出可以识别组件的目标检测模型,当有的新的需要识别的设计稿时,将设计稿图像输入给模型识别,最终得到模型识别的结果。
使用目标检测的方案会存在一些问题:
样本完全需要人工打标,需要收集 UI 图片,对图片中的组件进行标记。如果要新增一个分类,需要给每张图片重新打标,打标成本很大;
既需要识别出正确的位置,还需要识别出正确的类别。视觉稿图像中背景是很复杂的,容易被误识别;
就算识别出的类型是准确的,也会有位置偏差。
imgcook是基于设计稿的,因此可以从设计稿中获取图像的 JSON 描述信息,图像中每个文本节点和图像节点都已经具备位置信息,并且经过 imgcook 智能还原后能生成较为合理的布局树。所以我们可以基于这个布局树,以容器节点为粒度将可能的组件节点裁剪出来。
例如我们可以把这里的 div/view 节点都裁剪出来,就可以得到一个小的图片的集合,然后将这些图片送给一个图片分类模型预测,这样我们把一个目标检测问题转换成了一个图片分类问题。
模型会给每张图片在每一个分类中分配一个概率值,某个分类的概率值越大表示模型预测该图片是这个分类的概率越大。我们可以设置一个置信度为 0.7,当概率值大于置信度 0.7 时则认为是最终分类的结果,例如上图中,最终只有两张图片是可信的识别结果。如果对分类的准确度要求很高,就可以将置信度设置高一点。
相比目标检测,使用图片分类方案,样本可以用程序自动生成,无需人工打标;只需要识别类别,类别准确则位置信息绝对准确。所以我们改用基于布局识别结果的图片分类方案,识别准确度大大提升。
三、大模型实现前端代码生成的近期工作
介绍一篇最近的大模型在前端代码生成上的工作
Design2Code: How Far Are We From Automating Front-End Engineering
整体贡献:
数据集构建:
自动评估方案:
提示改进:
各个模型的表现:
四、结合低代码平台
低代码平台通过提供直观的图形界面和拖放式组件,使非技术用户或开发者能够轻松地构建和部署应用程序的前端界面,从而显著降低了前端开发的技术门槛和时间成本。
让大模型生成低代码平台内部的json DSL语法,输入可以是文本描述,或者网页截图,从而减少拖拉拽的人工操作,应该是比较好的结合点,相比直接生成html文件来说,大模型和低代码平台的结合可能根据实际应用价值。
数据样例:
text:生成一个 amis 表单,包含用户名、密码输入框
{"type": "form","title": "表单","body": [{"type": "input-text", "name": "username", "label": "用户名"},{"type": "input-password", "name": "password", "label": "密码"}]}
如何获取数据,参考百度低代码平台爱速搭和大模型结合的案例:
有了数据,可以基于多模态大模型微调,实现页面截图到DSL代码的生成,并且嵌入到低代码平台中,做为辅助编程助手。