什么是结构化输出?
智能体不是返回自由格式的文本响应,而是使用工具调用返回符合预定义 schema 的结构化对象。这给你带来:- 类型安全的数据:将响应解析为已知的 TypeScript 类型
- 精确的渲染控制:使用各自的 UI 处理方式渲染每个字段
- 一致的格式:无论底层模型如何,每个响应都遵循相同的结构
使用场景
- 产品比较:功能表、优缺点列表、评分
- 数据分析:包含指标、分解和亮点的摘要
- 分步指南:带描述和代码片段的有序说明
- 食谱:原料、步骤、时间和营养信息
- 数学和科学:使用 LaTeX 渲染的公式、逐步推导
- 旅行规划:包含日期、地点和费用估算的行程
定义 Schema
为智能体返回的结构化数据定义 TypeScript 类型。此 schema 的形状决定了你如何渲染 UI。 以下是食谱助手的示例:
你的 schema 可以是任何形状。无论形状如何,该模式的工作方式都相同。
从消息中提取结构化输出
结构化输出位于最后一个AIMessage 的 tool_calls 数组中。通过查找 AI 消息并访问第一个工具调用的参数来提取:
结构化输出工具调用的
args 可能在智能体完成流式输出之前不会被填充。在流式输出期间,args 可能只部分填充或未定义。在渲染之前始终检查完整性。设置 useStream
导入你的智能体并将 typeof myAgent 作为类型参数传递给 useStream,以获得类型安全的状态值访问:
渲染结构化数据
一旦你有了类型化的对象,构建一个将每个字段映射到适当 UI 元素的组件。这是该模式的核心:将结构化数据转化为专门构建的界面。处理部分流式数据
在流式输出期间,工具调用参数可能是不完整的 JSON。在你的提取逻辑中对此进行防护:requiredFields 参数等待关键字段填充后再渲染:
流式输出期间渐进式渲染
不要等待完整的结构化输出,而是在字段到达时渲染它们。这在智能体仍在生成时给用户即时反馈:重置和重新提交
要让用户在查看结果后提交新查询,添加一个启动新线程的按钮:最佳实践
- 渲染前验证:始终在渲染前检查必需字段是否存在,因为流式输出可能传递部分数据
- 使用通用提取函数:用类型和必需字段参数化你的提取逻辑,使其跨不同 schema 工作
- 渐进式渲染:在字段到达时显示而不是等待完整对象,让用户看到即时反馈
- 提供回退表示:如果字段支持富渲染(LaTeX、Markdown、图表),也在 schema 中包含纯文本等价物作为回退
- 尽可能保持 schema 扁平:深层嵌套的 schema 更难渐进式渲染,更可能在部分流式输出期间出错
- 匹配 UI 与数据:选择最能代表每种字段类型的渲染策略(数组用表格,嵌套对象用卡片,状态字段用徽章)
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

