Vercel AI SDK 工具调用功能深度解析:在React服务端组件中实现温度转换
前言
在现代AI应用开发中,让语言模型具备调用外部工具的能力是一项重要功能。Vercel AI SDK为我们提供了简洁高效的实现方式。本文将深入探讨如何利用该SDK在React服务端组件(RSC)环境中实现工具调用功能,特别是温度单位转换这一实用案例。
工具调用功能概述
工具调用(Tool Calling)允许语言模型在生成文本的过程中,根据需要调用开发者预定义的外部函数。这种机制极大地扩展了模型的能力边界,使其不仅能处理纯文本任务,还能执行计算、数据查询等复杂操作。
核心优势
- 功能扩展:突破纯文本处理的限制
- 精确计算:避免模型自行计算可能产生的误差
- 系统集成:可连接外部API和数据库
- 响应速度:减少模型推理负担,提高响应效率
实现步骤详解
1. 客户端组件实现
首先我们需要创建一个基本的聊天界面,包含消息显示区域和用户输入区域:
'use client';
import { useState } from 'react';
import { Message, continueConversation } from './actions';
export const maxDuration = 30; // 允许流式响应最长30秒
export default function Home() {
const [conversation, setConversation] = useState<Message[]>([]);
const [input, setInput] = useState<string>('');
return (
<div className="chat-container">
<div className="message-area">
{conversation.map((message, index) => (
<div key={index} className={`message ${message.role}`}>
<span className="role">{message.role}:</span>
<span className="content">{message.content}</span>
</div>
))}
</div>
<div className="input-area">
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="输入您的问题..."
/>
<button
onClick={async () => {
const { messages } = await continueConversation([
...conversation,
{ role: 'user', content: input },
]);
setConversation(messages);
setInput('');
}}
>
发送
</button>
</div>
</div>
);
}
关键点说明:
- 使用React状态管理对话历史和当前输入
continueConversation是服务端动作,负责处理AI响应- 设置了30秒的最大响应时间以适应流式响应
2. 服务端动作实现
服务端代码是工具调用的核心部分,我们使用generateText函数并配置工具参数:
'use server';
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
export interface Message {
role: 'user' | 'assistant';
content: string;
}
export async function continueConversation(history: Message[]) {
const { text, toolResults } = await generateText({
model: openai('gpt-3.5-turbo'),
system: '你是一个友好的助手!',
messages: history,
tools: {
celsiusToFahrenheit: {
description: '将摄氏温度转换为华氏温度',
parameters: z.object({
value: z.string().describe('摄氏温度值'),
}),
execute: async ({ value }) => {
const celsius = parseFloat(value);
const fahrenheit = celsius * (9 / 5) + 32;
return `${celsius}°C等于${fahrenheit.toFixed(2)}°F`;
},
},
},
});
return {
messages: [
...history,
{
role: 'assistant',
content: text || toolResults.map(t => t.result).join('\n'),
},
],
};
}
关键组件解析:
-
工具定义结构:
description: 工具的功能描述,帮助模型理解何时调用parameters: 使用zod定义输入参数结构execute: 实际执行逻辑的函数
-
温度转换逻辑:
- 公式:℉ = ℃ × (9/5) + 32
- 结果保留两位小数提高可读性
-
响应处理:
- 既处理普通文本响应(
text) - 也处理工具调用结果(
toolResults)
- 既处理普通文本响应(
实际应用场景
这种工具调用模式可应用于多种场景:
- 单位转换:长度、重量、货币等
- 实时数据查询:天气、股票价格
- 专业计算:工程计算、统计分析
- 系统集成:操作数据库、调用API
最佳实践建议
- 工具描述清晰:确保description准确描述功能,帮助模型正确判断调用时机
- 参数验证严格:使用zod进行严格的输入验证
- 错误处理完善:在execute函数中添加错误处理逻辑
- 性能优化:对于耗时操作考虑添加缓存机制
- 结果格式化:返回结果应易于用户理解
常见问题解答
Q: 模型如何决定何时调用工具? A: 模型会根据工具描述和用户问题的语义自动判断。例如当用户询问温度转换时,会自动调用我们定义的转换工具。
Q: 可以同时定义多个工具吗? A: 是的,可以在tools对象中定义多个工具,模型会根据上下文选择最合适的工具。
Q: 工具调用会影响响应速度吗? A: 工具调用本身会增加少量延迟,但对于精确计算或外部数据获取,这通常是值得的。
总结
通过Vercel AI SDK的工具调用功能,我们能够轻松扩展语言模型的能力边界。本文展示的温度转换示例虽然简单,但揭示了这一强大功能的基本原理和实现方式。开发者可以基于此模式,构建更加复杂和实用的AI应用,将语言模型与现实世界的数据和系统无缝连接。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



