用Vercel AI SDK构建聊天机器人
想象一下构建一个能够实时响应、获取实时数据(如天气更新)并且轻松扩展的聊天机器人,同时保持低成本。
在这篇指南中,我们将使用 Vercel AI SDK、用于工具的 Agentic 适配器 和用于无服务器执行的 Supabase Edge Functions 来创建这样一个聊天机器人。由于 Supabase 的按调用计费模式和全球边缘部署,这种设置既强大又高效且经济实惠。
1、为什么选择这个技术栈?
以下是为什么这个组合是构建 AI 驱动应用程序的理想选择的原因:
- Vercel AI SDK:一个 TypeScript 工具包,简化了 AI 集成,具有文本生成、工具调用和流式响应等功能。它在各种框架和运行时中都非常通用。
- Agentic 适配器:通过实用工具(如 WeatherClient)扩展了 Vercel AI SDK,使您的聊天机器人能够根据用户查询获取实时世界数据。
- Supabase Edge Functions:运行在 Deno 上的无服务器函数,全球部署以实现低延迟。它们按调用次数计费(每月有 500,000 次免费调用),而不是闲置时间,因此非常经济实惠。
- 后台处理:使用 EdgeRuntime.waitUntil 处理任务(如异步保存聊天历史记录),保持聊天机器人响应迅速。
2、你需要什么
开始之前,请准备好以下先决条件:
- Vercel AI SDK —— 用于 AI 功能 (文档)。
- Agentic 适配器 —— 添加工具(如天气查询)(@agentic/ai-sdk)。
- Supabase Edge Functions —— 用于在 Deno 上的无服务器执行。
- Supabase 数据库 —— 用于存储聊天历史记录。
- OpenAI API 密钥 —— 提供语言模型 (openai.com)。
- 天气 API 密钥 —— 用于天气查询 (weatherapi.com)。
- 前端(可选) —— 一个 Next.js 界面与机器人交互。
3、设置你的 Supabase 项目
初始化一个 Supabase 项目并在其中创建一个聊天历史记录表。
运行以下命令:
supabase init
supabase login
supabase link --project-ref <your-project-ref>
在你的 Supabase 数据库中创建一个 chat_history 表:
create table chat_history (
id uuid default uuid_generate_v4() primary key,
user_id text,
message text,
response text,
created_at timestamp default now()
);
该表将存储每次聊天互动。
4、创建一个 Supabase Edge 函数
生成一个新的 Edge 函数名为“chatbot”:
supabase functions new chatbot
这会创建 supabase/functions/chatbot/index.ts,我们将在其中添加逻辑。
5、编写聊天机器人逻辑
Supabase Edge 函数在 Deno 上运行,因此我们将使用 Deno 兼容的导入方式。打开 supabase/functions/chatbot/index.ts 并添加以下内容:
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
import { streamText } from "https://esm.sh/ai@3.4.18";
import { openai } from "https://esm.sh/@ai-sdk/openai@0.0.68";
import { createAISDKTools } from "https://esm.sh/@agentic/ai-sdk@0.0.54";
import { WeatherClient } from "https://esm.sh/@agentic/weather@0.0.23";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2.45.6";
const supabase = createClient(
Deno.env.get("SUPABASE_URL")!,
Deno.env.get("SUPABASE_ANON_KEY")!
);
const weather = new WeatherClient({
apiKey: Deno.env.get("WEATHER_API_KEY")!,
});
serve(async (req) => {
if (req.method !== "POST") {
return new Response("Method not allowed", { status: 405 });
}
const { message, userId } = await req.json();
const { textStream } = await streamText({
model: openai("gpt-4o-mini"),
prompt: message,
tools: createAISDKTools(weather),
toolChoice: "auto",
temperature: 0,
system: "You are a helpful assistant. Be concise.",
});
// 在后台保存聊天历史
EdgeRuntime.waitUntil(
(async () => {
let fullResponse = "";
for await (const chunk of textStream) {
fullResponse += chunk;
}
await supabase.from("chat_history").insert({
user_id: userId,
message,
response: fullResponse,
});
})()
);
return new Response(textStream, {
headers: { "Content-Type": "text/plain" },
});
});
关键功能:
- Deno 导入:使用基于 URL 的导入以确保 Deno 兼容性。
- 流式传输:streamText 提供实时响应。
- 工具:WeatherClient 在需要时获取天气数据。
- 后台任务:EdgeRuntime.waitUntil 在不阻塞用户的情况下保存历史记录。
6、设置环境变量
在 supabase/functions/chatbot 中创建一个 .env.local 文件:
SUPABASE_URL=<your-supabase-url>
SUPABASE_ANON_KEY=<your-supabase-anon-key>
OPENAI_API_KEY=<your-openai-api-key>
WEATHER_API_KEY=<your-weatherapi.com-key>
部署这些密钥:
supabase secrets set --env-file ./supabase/functions/chatbot/.env.local
7、部署 Edge 函数
本地测试:
supabase functions serve chatbot --env-file ./supabase/functions/chatbot/.env.local
部署到 Supabase:
supabase functions deploy chatbot
现在你的聊天机器人已经在全球范围内上线!
8、添加前端(可选)
为了一个简单的界面,可以使用 Next.js。在 pages/index.tsx 中:
import { useState } from "react";
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!);
export default function Chatbot() {
const [message, setMessage] = useState("");
const [response, setResponse] = useState("");
const handleSubmit = async (e) => {
e.preventDefault();
const { data: { user } } = await supabase.auth.getUser();
const res = await fetch("https://<your-project-ref>.supabase.co/functions/v1/chatbot", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message, userId: user?.id }),
});
const reader = res.body?.getReader();
const decoder = new TextDecoder();
setResponse("");
while (true) {
const { done, value } = await reader.read();
if (done) break;
setResponse((prev) => prev + decoder.decode(value));
}
};
return (
<form onSubmit={handleSubmit}>
<input value={message} onChange={(e) => setMessage(e.target.value)} />
<button type="submit">发送</button>
<p>{response}</p>
</form>
);
}
这提供了一个基本的界面来发送消息并查看响应。
9、进行测试
使用天气查询进行测试:
curl -X POST https://<your-project-ref>.supabase.co/functions/v1/chatbot -H "Content-Type: application/json" -d '{"message": "What is the weather in San Francisco?", "userId": "test-user"}'
期望的响应类似于:“San Francisco 的天气是 62°F 和晴朗。”
为什么这种方法有效
- 成本效益高:Supabase 每月提供 500,000 次免费调用。
- 实时:通过 streamText 实现流式响应。
- 高效:后台任务不会阻塞用户。
- 可扩展:全球边缘部署确保低延迟。
10、结束语
你已经使用 Vercel AI SDK、Agentic 工具和 Supabase Edge Functions 构建了一个现代的 AI 驱动的聊天机器人。它功能强大、价格实惠且准备就绪以扩展。根据需要添加更多工具或增强界面——祝编码愉快!
原文链接:Build an AI-Powered Chatbot with Vercel AI SDK and Supabase Edge Functions
汇智网翻译整理,转载请标明出处