挑战:LLM 擅长写诗,但不擅长写结构严谨的 JSON。 方案:给它一本语法书 (Schema) 和一个翻译器 (Validator)。
本指南将向您展示如何将一个标准的“聊天机器人”转变为“UI 生成器”。
1. “系统提示词” (System Prompt) 策略
获得 A2UI 输出最可靠的方法是将指令直接注入到 System Prompt 中。
UI 提示词解剖
您需要告诉 LLM 三件事:
- 身份 (Identity): “你是一个乐于助人的助手…”
- 能力 (Capability): “你可以使用
a2ui工具渲染 UI 组件…” - 语法 (Grammar): “这是你必须遵循的 JSON 结构…“
SYSTEM_PROMPT = """
你是一个旅行助手。
如果用户查询航班,**不要**发送文本列表。
相反,请使用 'flight-list' schema 生成一个 JSON 对象:
{
"type": "flight-list",
"data": { "flights": [...] }
}
"""
2. 工具调用 (Tool Use) vs 直接生成 (Generation)
有两种生成 UI 的流派:
方案 A:工具调用 (推荐)
定义一个 render_ui 工具 (Function Calling)。LLM 调用该函数,然后由您的后端处理 JSON 构造。
- 优点:100% 有效的 JSON(由 SDK 保证格式)。
- 缺点:较慢(多一次网络往返)。
方案 B:直接流式传输 (最快)
要求 LLM 直接在文本流中输出原始 JSON。
- 优点:即时 “Streaming” 体验,对用户来说速度极快。
- 缺点:LLM 可能会犯语法错误(例如少写一个逗号)。
3. 验证是必须的
永远不要信任 AI。它迟早会“幻觉”出一个不存在的闭合括号。 在将数据发送到客户端之前,务必验证输出。
import jsonschema
def validate_and_send(ai_response):
try:
jsonschema.validate(instance=ai_response, schema=A2UI_SCHEMA)
client.send(ai_response)
except Exception:
client.send({ "type": "error", "message": "尝试绘制 UI 失败,请重试。" })
4. Google ADK 示例
使用 Google Agent Development Kit,您可以自动绑定 Schema。
from google.adk.agents import Agent
agent = Agent(
name="restaurant_booker",
instruction="Use the `show_restaurant` tool to display results.",
tools=[show_restaurant_tool]
)