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

