生成式 UI
问题
什么是生成式 UI?如何用 LLM 的 Structured Output 驱动前端组件渲染?
答案
一、概念
生成式 UI(Generative UI)是指 LLM 不只输出文本,而是输出结构化数据来驱动 UI 组件的动态渲染:
二、实现方式
方式一:Structured Output → 组件映射
LLM 输出 JSON,前端根据 type 渲染对应组件:
// 定义输出 Schema
import { z } from "zod";
const UISchema = z.discriminatedUnion("type", [
z.object({
type: z.literal("weather"),
city: z.string(),
temperature: z.number(),
condition: z.string(),
}),
z.object({
type: z.literal("chart"),
title: z.string(),
data: z.array(z.object({ label: z.string(), value: z.number() })),
}),
z.object({
type: z.literal("text"),
content: z.string(),
}),
]);
后端:生成结构化输出
import { generateObject } from "ai";
import { openai } from "@ai-sdk/openai";
const { object } = await generateObject({
model: openai("gpt-4o"),
schema: UISchema,
prompt: "查看北京天气",
});
// → { type: "weather", city: "北京", temperature: 25, condition: "晴" }
前端:根据 type 渲染组件
function DynamicUI({ data }: { data: z.infer<typeof UISchema> }) {
switch (data.type) {
case "weather":
return <WeatherCard city={data.city} temp={data.temperature} />;
case "chart":
return <BarChart title={data.title} data={data.data} />;
case "text":
return <p>{data.content}</p>;
}
}
方式二:Vercel AI SDK streamUI
后端:streamUI
import { streamUI } from "ai/rsc";
import { openai } from "@ai-sdk/openai";
export async function submitMessage(input: string) {
"use server";
const result = await streamUI({
model: openai("gpt-4o"),
prompt: input,
tools: {
showWeather: {
description: "显示天气信息",
parameters: z.object({ city: z.string() }),
generate: async function* ({ city }) {
yield <div>加载 {city} 天气中...</div>;
const weather = await fetchWeather(city);
return <WeatherCard {...weather} />;
},
},
},
});
return result.value;
}
三、典型产品案例
| 产品 | 生成式 UI 场景 |
|---|---|
| v0.dev | 根据描述生成 React 组件代码 |
| ChatGPT | 数据分析结果生成图表 |
| Perplexity | 搜索结果生成引用卡片 |
| Claude Artifacts | 生成可交互的代码 / 图表 |
四、设计模式
常见面试问题
Q1: 生成式 UI 和纯文本输出相比有什么优势?
答案:
- 交互性:组件可点击、可折叠、可复制,纯文本只能阅读
- 信息密度:图表、卡片比文字更直观
- 可操作性:生成的表单可以直接填写提交
- 品牌一致性:使用团队的设计系统组件
Q2: Structured Output 如何保证 LLM 输出格式正确?
答案:
- OpenAI 的
response_format: { type: "json_schema" }可以强制 100% 格式匹配 - Vercel AI SDK 的
generateObject封装了 Schema 验证 - 如果模型不支持 JSON Schema 模式,需要在 prompt 中强调格式要求 + 后端做 zod 校验和容错