我第一次用 AI 做项目时,遇到了一个头疼的问题:AI 返回的内容是自由文本,我想提取里面的邮箱、日期、金额,结果要写一堆正则表达式,还动不动就解析失败。后来我学会了 Zod + AI SDK 的结构化输出,就像给 AI 装上了一个"数据模板",它只返回我想要的数据格式,再也不用担心解析问题了。今天我就手把手教大家,从零开始实现这个功能。

什么是结构化输出?为什么重要?

普通 AI 输出是这样的:

根据您提供的信息,用户张三的邮箱是 [email protected],注册日期是 2024年1月15日。

结构化输出是这样的:

{
  "name": "张三",
  "email": "[email protected]",
  "registeredDate": "2024-01-15"
}

结构化输出的好处显而易见:可以直接用、不会解析错误、代码更简洁。对于需要从 AI 获取数据的应用来说,这简直是救星。

准备工作:注册 HolySheep AI 获取 API Key

首先你需要一个 API Key。我推荐使用 HolySheep AI,它有三个明显优势:

点击注册后,进入控制台 → API Keys → 创建新 Key,复制备用。

项目初始化

(图文提示:打开终端,执行以下命令)

mkdir ai-structured-output
cd ai-structured-output
npm init -y
npm install typescript @types/node ts-node ai @ai-sdk/zod zod

初始化 TypeScript 配置:

npx tsc --init

创建 .env 文件存放你的 API Key:

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

写代码:从 Zod schema 开始

我第一次看到 schema 这个词时完全懵了,其实你可以把它理解为"数据模板"。我定义了这个模板,AI 就按这个格式返回数据。

import { z } from 'zod';

// 定义一个用户信息模板
const UserSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(), // 必须是邮箱格式
  age: z.number().optional(), // 可选字段
  tags: z.array(z.string())
});

type User = z.infer;

现在用 AI SDK 生成符合这个模板的数据:

import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import 'dotenv/config';

const UserSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(),
  age: z.number().optional(),
  tags: z.array(z.string())
});

async function main() {
  const { object } = await generateText({
    model: openai('gpt-4o'),
    baseURL: 'https://api.holysheep.ai/v1',
    apiKey: process.env.HOLYSHEEP_API_KEY,
    prompt: '生成一个用户信息示例',
    schema: UserSchema,
  });

  console.log('用户数据:', object);
  console.log('姓名:', object.name);
  console.log('邮箱:', object.email);
}

main();

运行后,你会在控制台看到完美结构化的数据,可以直接使用 object.name、object.email,完全不用解析文本。

实战案例:提取简历关键信息

这是我工作中真实用到的场景:从简历文本中提取结构化数据。

import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import 'dotenv/config';

// 定义简历解析模板
const ResumeSchema = z.object({
  personalInfo: z.object({
    name: z.string(),
    phone: z.string(),
    email: z.string().email(),
  }),
  education: z.array(z.object({
    school: z.string(),
    degree: z.string(),
    graduationYear: z.number(),
  })),
  skills: z.array(z.string()),
  workExperience: z.array(z.object({
    company: z.string(),
    position: z.string(),
    duration: z.string(),
  })),
  expectedSalary: z.number().optional(),
});

async function extractResume(text: string) {
  const { object } = await generateText({
    model: openai('gpt-4o'),
    baseURL: 'https://api.holysheep.ai/v1',
    apiKey: process.env.HOLYSHEEP_API_KEY,
    prompt: 从以下简历文本中提取结构化信息:\n\n${text},
    schema: ResumeSchema,
  });

  return object;
}

// 使用示例
const resumeText = `
张三,男,28岁,电话13800138000,邮箱[email protected]
毕业于清华大学,计算机科学硕士,2020年毕业
技能:Python、TypeScript、机器学习、React
工作经历:
1. 字节跳动,后端工程师,2020-2023
2. 腾讯,高级工程师,2023至今
期望薪资:50000元/月
`;

extractResume(resumeText).then(result => {
  console.log('姓名:', result.personalInfo.name);
  console.log('邮箱:', result.personalInfo.email);
  console.log('技能列表:', result.skills);
  console.log('工作经历数:', result.workExperience.length);
});

常见报错排查

我刚开始用的时候踩过不少坑,分享给大家:

错误1:No API Key provided

错误信息:Error: No API Key provided. Set HOLYSHEEP_API_KEY in environment.

解决方法:确保 .env 文件存在且包含正确的 Key:

HOLYSHEEP_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx

然后在代码开头导入:

import 'dotenv/config';

错误2:Invalid API Key

错误信息:Error: Invalid API key provided

解决方法:这个 Key 不是 HolySheep 的,请确认你使用的是 HolySheep AI 控制台生成的 Key,而不是 OpenAI 或其他平台的。

错误3:Zod validation failed

错误信息:Error: Zod validation failed

解决方法:检查 schema 定义是否合理,特别是字段类型和必填/可选设置:

// 可能的问题:要求邮箱格式但 AI 返回了普通字符串
const UserSchema = z.object({
  email: z.string().email(), // 如果 AI 返回 "zhangsan#email.com" 就会报错
});

// 解决方案:改用宽松模式或让字段可选
const UserSchema = z.object({
  email: z.string(), // 先不要求格式
  age: z.number().optional(), // 可选字段
});

错误4:Request timeout

错误信息:Error: Request timeout

解决方法:网络问题导致,使用 HolySheep AI 国内节点可解决:

const { text } = await generateText({
  model: openai('gpt-4o'),
  baseURL: 'https://api.holysheep.ai/v1', // 国内直连,延迟 <50ms
  apiKey: process.env.HOLYSHEEP_API_KEY,
  prompt: '你的问题',
  maxRetries: 3, // 增加重试次数
  timeout: 60000, // 60秒超时
});

价格对比:为什么用 HolySheep

我做项目时特别关注成本,对比一下主流模型在 HolySheep AI 的 output 价格($/百万Token):

如果你用 DeepSeek V3.2 做结构化输出,成本只有 Claude 的 1/36。而且 HolySheep 的汇率 ¥1=$1,比官方 ¥7.3=$1 便宜 85%+。

我的实战经验总结

用了半年结构化输出,我的心得是:

下一步:流式输出 + 结构化

如果你想实现打字机效果的同时保持结构化,可以用 streamText:

import { streamText } from 'ai';

const result = streamText({
  model: openai('gpt-4o'),
  baseURL: 'https://api.holysheep.ai/v1',
  apiKey: process.env.HOLYSHEEP_API_KEY,
  prompt: '生成一个产品信息',
  schema: ProductSchema,
});

// 流式处理每个部分
for await (const part of result.fullStream) {
  console.log(part);
}

结束语

Zod + AI SDK 的结构化输出,是让 AI 应用走向生产级别的关键技术。它让 AI 返回的数据"所见即所得",再也不用担心解析问题。

建议大家从今天的简单例子开始练习,然后尝试提取简历、分析评论、分类商品等实际场景。

👉 免费注册 HolySheep AI,获取首月赠额度,国内直连低延迟,微信支付宝充值方便,非常适合快速验证你的 AI 想法。