Vercel AI SDK 6 完整教程系列 - 第二部分:核心功能篇
我们今天聊了三个核心功能用 System Prompt 和 Context 来控制 AI 的行为。这是让 AI 表现得像个专业助手的基础用和 Zod 把非结构化文本变成可靠的数据。这解决了 AI 输出不确定的问题用tools和maxSteps让 AI 能和外部世界交互。这让 AI 从一个只会说话的东西,变成了一个能解决实际问题的助手这些功能是构建现代 AI 应用的基石。
Vercel AI SDK 6 核心功能:结构化数据与工具调用
上次我们聊了怎么让 AI 模型生成文本和流式传输内容,说实话那只是个开始
真正要做一个能用的应用,光会生成文字是不够的。你得让 AI 按你的规矩来,输出程序能读懂的数据,甚至给它一些“手脚”,让它能真的干点事情
这篇文章我想和你聊聊 Vercel AI SDK 6 里那些真正有用的功能:怎么精细化控制 AI 的行为、怎么让它输出结构化数据、怎么给它装上工具。这些东西,才是把一个玩具 demo 变成能上线产品的关键
不只是发个 Prompt 那么简单
我刚开始做 AI 应用的时候,以为就是把用户输入的话扔给模型就完事了
后来发现根本不是这么回事。你得告诉模型它是谁,该怎么说话,还得管理好对话的上下文。不然用户聊着聊着,AI 就开始答非所问了
AI SDK Core 给了我们 system 和 messages 这两个参数。system 就像是给 AI 设定一个人设,告诉它“你是个技术顾问”还是“你是个客服”。这个设定的优先级很高,比用户说的话还管用
messages 就是对话历史了。做聊天机器人必须得有这个,不然 AI 根本记不住前面说了啥
看个例子你就明白了
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import dotenv from 'dotenv';
dotenv.config();
async function main() {
const { text } = await generateText({
model: openai('gpt-4o'),
// 给 AI 设定角色
system: '你是一位经验丰富的 TypeScript 技术顾问。请用简洁、专业的语气回答问题,并优先推荐现代的最佳实践。',
// 把之前的对话传进来
messages: [
{ role: 'user', content: '我应该在项目中使用 Any 类型吗?' },
{ role: 'assistant', content: '不建议使用 Any。它会绕过编译器的类型检查,丧失 TypeScript 的核心优势。你应该尽量使用 unknown 或具体的接口定义。' },
{ role: 'user', content: '那 unknown 和 any 有什么区别?' },
],
// 控制随机性:0.0 最保守,1.0 最随机
temperature: 0.2,
});
console.log('回答:', text);
}
main().catch(console.error);
这里我不光定义了 AI 的专家身份,还通过 messages 数组手动构建了上下文。AI SDK 会自动把这些信息格式化成模型需要的样子
注意到 temperature 这个参数了吗?它控制生成的随机性。技术问答这种场景,我一般会设得比较低,确保答案准确。如果是写创意文案,可以调高一点
让 AI 生成 JSON:从混乱到秩序
大语言模型本质上就是个文本生成器,它输出的东西天然是不确定的
以前我们想让它输出 JSON,只能在 Prompt 里各种强调“请只返回 JSON,不要废话”,写完还得用正则表达式去提取。那个过程真的很痛苦,经常出错
Vercel AI SDK 6 的 generateObject 函数彻底解决了这个问题。它利用了现代模型(像 GPT-4o、Claude 3.5 Sonnet)原生支持的 Function Calling 或 JSON Mode,能稳定地输出符合你定义的数据结构
配合 Zod 这个 Schema 库,你甚至能得到完全类型安全的 TypeScript 对象
我给你看个实际的例子。假设我们在做一个票务系统,需要从用户的自然语言里提取活动信息
import { generateObject } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import dotenv from 'dotenv';
dotenv.config();
async function main() {
const { object } = await generateObject({
model: openai('gpt-4o'),
// 定义数据结构
schema: z.object({
eventName: z.string().describe('活动的名称'),
date: z.string().describe('活动的日期,格式为 YYYY-MM-DD'),
location: z.string().describe('举办地点'),
participants: z.array(z.string()).describe('参与人员名单'),
budget: z.number().optional().describe('预算金额(如果有提到)'),
}),
prompt: '我们要在这个周五(2024年11月15日)下午在公司的大会议室举办"AI 技术分享会",由 Alice 和 Bob 主讲,还没定预算。',
});
// object 已经是类型安全的对象了
console.log('活动名称:', object.eventName);
console.log('日期:', object.date);
console.log('参与者:', object.participants);
console.log('完整对象:', JSON.stringify(object, null, 2));
}
main().catch(console.error);
generateObject 不光生成数据,还会自动根据 Zod Schema 做验证。如果模型生成的格式不对,SDK 会抛错或者尝试修复
这里有个小技巧:describe 方法特别重要。它相当于给模型的注释,帮助模型理解每个字段的含义。我发现写清楚 describe,生成的准确率会高很多
给 AI 装上“手脚”:工具调用
结构化输出让 AI 懂数据,工具调用让 AI 用数据
通过工具调用,AI 可以查天气、读数据库、发邮件,甚至控制智能家居。这才是真正让 AI 变得有用的地方
在 AI SDK 6 里,定义工具很简单。你需要提供一个描述、一个参数的 Schema、一个执行函数
我们来做一个汇率换算助手。这个助手有两个工具:一个查汇率,一个做计算
import { generateText, tool } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import dotenv from 'dotenv';
dotenv.config();
async function main() {
const { text, toolCalls, steps } = await generateText({
model: openai('gpt-4o'),
prompt: '如果不考虑手续费,我有 100 美元,换成欧元后,能买多少个单价 5 欧元的汉堡?',
// 允许模型最多进行 5 步推理
maxSteps: 5,
tools: {
// 工具 1: 获取汇率
getExchangeRate: tool({
description: '获取两种货币之间的当前汇率',
parameters: z.object({
from: z.string().describe('源货币代码,如 USD'),
to: z.string().describe('目标货币代码,如 EUR'),
}),
execute: async ({ from, to }) => {
console.log(`[工具调用] 查询汇率: ${from} -> ${to}`);
// 模拟 API 调用,假设 1 USD = 0.92 EUR
return { rate: 0.92 };
},
}),
// 工具 2: 计算器
calculate: tool({
description: '执行数学计算表达式',
parameters: z.object({
expression: z.string().describe('要计算的数学表达式'),
}),
execute: async ({ expression }) => {
console.log(`[工具调用] 计算: ${expression}`);
// 注意:生产环境别直接 eval,用安全的数学库
try {
const result = eval(expression);
return { result };
} catch (e) {
return { error: '计算错误' };
}
},
}),
},
});
console.log('
最终回答:', text);
console.log(`
共进行了 ${steps.length} 步推理。`);
}
main().catch(console.error);
这段代码有几个关键点我想说一下
我们用 tool() 函数定义了 getExchangeRate 和 calculate 两个工具。每个工具都有明确的 Zod Schema,这保证了 AI 传给 execute 函数的参数是类型安全的
maxSteps: 5 是个很关键的参数。它让 AI 可以进行多步推理
整个过程是这样的:模型先分析问题,决定调用 getExchangeRate 查汇率。SDK 自动执行这个工具,把结果反馈给模型。模型拿到汇率后,算出 100 美元等于 92 欧元,接着调用 calculate 算 92 除以 5。SDK 再次执行工具,返回结果。模型根据计算结果,生成最终的自然语言回答
这整个过程是自动的。你不需要写循环,不需要手动管理状态。SDK 都帮你处理好了
generateText 的返回值里有 steps 和 toolCalls,你可以用这些信息来调试模型的推理过程,或者在界面上显示“正在思考”的状态
写在最后
我们今天聊了三个核心功能
用 System Prompt 和 Context 来控制 AI 的行为。这是让 AI 表现得像个专业助手的基础
用 generateObject 和 Zod 把非结构化文本变成可靠的数据。这解决了 AI 输出不确定的问题
用 tools 和 maxSteps 让 AI 能和外部世界交互。这让 AI 从一个只会说话的东西,变成了一个能解决实际问题的助手
这些功能是构建现代 AI 应用的基石
下一篇我们会聊更高级的东西:怎么把这些工具组合成更复杂的 Agents(智能体),怎么用 DevTools 来可视化和调试这些复杂的交互过程
说实话,当你真正理解了工具调用和结构化输出,你会发现 AI 应用的可能性一下子就打开了。不再是简单的问答,而是真正能帮你干活的东西
更多推荐



所有评论(0)