ยินดีต้อนรับสู่คู่มือเริ่มต้นใช้งาน Vercel AI SDK ฉบับสมบูรณ์ ในโลกที่ปัญญาประดิษฐ์กำลังเปลี่ยนแปลงภูมิทัศน์ดิจิทัลอย่างรวดเร็ว ความสามารถในการรวม AI เข้ากับเว็บแอปพลิเคชันได้เปลี่ยนจากการเป็นความเชี่ยวชาญเฉพาะทางไปสู่ความสามารถหลักสำหรับนักพัฒนาสมัยใหม่ คู่มือนี้ออกแบบมาเพื่อนำคุณจากผู้เริ่มต้นที่อยากรู้อยากเห็นไปสู่การเป็นนักพัฒนาแอปพลิเคชัน AI ที่มีความสามารถ
เป็นเวลานาน การเชื่อมช่องว่างระหว่าง Large Language Model (LLM) ที่ทรงพลังกับเว็บอินเทอร์เฟซที่ใช้งานง่ายนั้นเป็นความพยายามที่ซับซ้อน นักพัฒนาต้องต่อสู้กับ API ของผู้ให้บริการที่แตกต่างกัน จัดการสถานะที่ซับซ้อน และต้องนำคุณสมบัติต่างๆ เช่น การสตรีมการตอบกลับมาใช้งานเอง Vercel AI SDK ถูกสร้างขึ้นเพื่อแก้ปัญหาเหล่านี้โดยเฉพาะ เป็นชุดเครื่องมือที่เน้น TypeScript ซึ่งมีเลเยอร์นามธรรมที่รวมและสง่างามเพื่อจัดการความซับซ้อนของการสร้างประสบการณ์ที่ขับเคลื่อนด้วย AI
นี่ไม่ใช่แค่คู่มือเริ่มต้นใช้งานฉบับย่อเท่านั้น ตลอดการสอนนี้ เราจะสร้างแชทบอท AI ที่สมบูรณ์และมีคุณสมบัติครบถ้วนตั้งแต่เริ่มต้น โดยใช้ Next.js และโมเดล Gemini ของ Google เราจะไปไกลกว่าตัวอย่าง "hello world" ง่ายๆ คุณจะได้เรียนรู้:
- เหตุผล ("The Why"): ความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับแนวคิดหลักและรูปแบบสถาปัตยกรรมของแอปพลิเคชัน AI สมัยใหม่
- วิธีการ ("The How"): กระบวนการทีละขั้นตอนโดยละเอียดสำหรับการตั้งค่าโปรเจกต์ การเขียนตรรกะฝั่งเซิร์ฟเวอร์ และการสร้างส่วนหน้า (frontend) ที่สวยงามและโต้ตอบได้
- ความสามารถขั้นสูง ("Advanced Capabilities"): วิธีเพิ่มพลังให้แชทบอทของคุณด้วย "เครื่องมือ (Tools)" เพื่อเข้าถึงข้อมูลแบบเรียลไทม์ และวิธีจัดการการโต้ตอบที่ซับซ้อนและมีหลายขั้นตอน
- แนวทางปฏิบัติที่พร้อมใช้งานจริง ("Production-Ready Practices"): วิธีจัดการสถานะการโหลด จัดการข้อผิดพลาดอย่างสวยงาม และจัดโครงสร้างโค้ดสำหรับแอปพลิเคชันในโลกจริง
เมื่อสิ้นสุดคู่มือฉบับสมบูรณ์นี้ คุณจะไม่ได้มีเพียงแค่แชทบอทที่ทำงานได้และมีความสามารถขั้นสูงเท่านั้น แต่ยังมีความรู้เชิงแนวคิดที่ลึกซึ้งซึ่งจำเป็นต่อการสร้างแอปพลิเคชันที่ขับเคลื่อนด้วย AI ที่เป็นเอกลักษณ์และทรงพลังของคุณเองด้วย Vercel AI SDK อย่างมั่นใจ
ต้องการแพลตฟอร์มแบบ All-in-One ที่รวมทุกอย่างสำหรับทีมพัฒนาของคุณเพื่อทำงานร่วมกันด้วย ประสิทธิภาพสูงสุด?
Apidog ตอบสนองทุกความต้องการของคุณ และ แทนที่ Postman ในราคาที่ย่อมเยากว่ามาก!
บทที่ 1: พื้นฐานและการตั้งค่า
โครงสร้างที่ยอดเยี่ยมทุกอย่างต้องการรากฐานที่แข็งแกร่ง ในบทนี้ เราจะตั้งค่าสภาพแวดล้อมการพัฒนา ติดตั้งเครื่องมือที่จำเป็น และจัดเรียงคีย์ API ของเราให้เรียบร้อย นอกจากนี้เราจะใช้เวลาทำความเข้าใจ "เหตุผล" เบื้องหลังแต่ละทางเลือกที่เราทำ
ข้อกำหนดเบื้องต้น
ก่อนที่เราจะเขียนโค้ดแม้แต่บรรทัดเดียว มาตรวจสอบให้แน่ใจว่ากล่องเครื่องมือของคุณพร้อมแล้ว
- Node.js (เวอร์ชัน 18 หรือใหม่กว่า): Vercel AI SDK และเฟรมเวิร์ก JavaScript สมัยใหม่ เช่น Next.js อาศัยคุณสมบัติที่มีอยู่ใน Node.js เวอร์ชันล่าสุด คุณสามารถตรวจสอบเวอร์ชันของคุณได้โดยการรัน
node -v
ในเทอร์มินัลของคุณ หากคุณยังไม่มี คุณสามารถดาวน์โหลดได้จาก เว็บไซต์ทางการของ Node.js - คีย์ Google AI API: คีย์นี้คือบัตรผ่านที่ได้รับการยืนยันตัวตนของคุณเพื่อใช้โมเดล Gemini ที่ทรงพลังของ Google Vercel AI SDK ไม่ขึ้นกับผู้ให้บริการรายใด แต่สำหรับคู่มือนี้ เราจะเน้นที่ Gemini
- ไปที่ Google AI Studio
- ลงชื่อเข้าใช้ด้วยบัญชี Google ของคุณ
- คลิก "Get API key" แล้วคลิก "Create API key in new project"
- คัดลอกคีย์ที่สร้างขึ้นและเก็บไว้ในที่ปลอดภัยสำหรับตอนนี้ ดูแลคีย์นี้เหมือนรหัสผ่าน; อย่าเปิดเผยต่อสาธารณะเด็ดขาด
ขั้นตอนที่ 1: การเริ่มต้นโปรเจกต์ Next.js
เราจะใช้ Next.js ซึ่งเป็นเฟรมเวิร์ก React ชั้นนำสำหรับการสร้างแอปพลิเคชันระดับ Production พาราดิกม์ App Router ของมันเข้ากันได้อย่างสมบูรณ์แบบกับลักษณะที่เน้นเซิร์ฟเวอร์ของแอปพลิเคชัน AI
เปิดเทอร์มินัลของคุณและรันคำสั่งนี้เพื่อสร้างโปรเจกต์ใหม่:
npx create-next-app@latest vercel-ai-tutorial
โปรแกรมติดตั้งจะถามคำถามหลายข้อ ใช้การตั้งค่าเหล่านี้เพื่อติดตามได้อย่างราบรื่น:
- คุณต้องการใช้ TypeScript หรือไม่? ใช่ (TypeScript สำคัญสำหรับการโต้ตอบกับ AI ที่ปลอดภัยจากข้อผิดพลาดด้านชนิดข้อมูล)
- คุณต้องการใช้ ESLint หรือไม่? ใช่ (เพื่อคุณภาพโค้ด)
- คุณต้องการใช้ Tailwind CSS หรือไม่? ใช่ (เพื่อการจัดสไตล์ UI ของเราอย่างรวดเร็ว)
- คุณต้องการใช้ไดเรกทอรี
src/
หรือไม่? ใช่ (เป็นแนวทางทั่วไปสำหรับการจัดระเบียบโค้ด) - คุณต้องการใช้ App Router หรือไม่? ใช่ (นี่เป็นสิ่งสำคัญสำหรับคู่มือนี้)
- คุณต้องการกำหนดค่า import alias เริ่มต้นเองหรือไม่? ไม่ (ค่าเริ่มต้นก็ใช้ได้)
เมื่อการติดตั้งเสร็จสมบูรณ์ ให้เข้าไปยังไดเรกทอรีโปรเจกต์ที่คุณเพิ่งสร้างขึ้น:
cd vercel-ai-tutorial
ขั้นตอนที่ 2: การติดตั้ง Vercel AI SDK
ตอนนี้ มาเพิ่มแพ็กเกจ AI SDK ลงในโปรเจกต์ของเรา
npm install ai @ai-sdk/react @ai-sdk/google zod
มาแยกย่อยว่าแต่ละแพ็กเกจเหล่านี้ทำอะไรบ้าง:
ai
: นี่คือหัวใจหลักของ SDK มันมีฟังก์ชันหลักที่ไม่ขึ้นกับเฟรมเวิร์ก เช่นstreamText
และgenerateObject
ซึ่งจัดการการสื่อสารโดยตรงกับผู้ให้บริการ LLM@ai-sdk/react
: แพ็กเกจนี้มี React hooks โดยเฉพาะuseChat
ซึ่งทำให้การสร้าง UI แบบโต้ตอบเป็นเรื่องง่าย มันจะจัดการความซับซ้อนของการจัดการสถานะ การสตรีม และการสื่อสารกับ API@ai-sdk/google
: นี่คือแพ็กเกจผู้ให้บริการ เป็นอะแดปเตอร์เฉพาะที่ช่วยให้แพ็กเกจai
หลักสื่อสารกับโมเดล AI ของ Google ได้ หากคุณต้องการใช้ OpenAI คุณจะต้องติดตั้ง@ai-sdk/openai
แทนzod
: ไลบรารีการประกาศและตรวจสอบ schema ที่ทรงพลัง แม้ว่าจะไม่ได้เป็นส่วนหนึ่งของ AI SDK โดยตรง แต่ก็เป็นพันธมิตรที่ขาดไม่ได้สำหรับการกำหนดโครงสร้างข้อมูลสำหรับคุณสมบัติขั้นสูง เช่น Tool Calling เพื่อให้แน่ใจว่าผลลัพธ์ของ AI สามารถคาดการณ์ได้และปลอดภัยจากข้อผิดพลาดด้านชนิดข้อมูล
ขั้นตอนที่ 3: การรักษาความปลอดภัยคีย์ API ของคุณ
อย่าฮาร์ดโค้ดคีย์ API ในโค้ดแอปพลิเคชันของคุณเด็ดขาด นี่เป็นความเสี่ยงด้านความปลอดภัยที่สำคัญ มาตรฐานระดับมืออาชีพคือการใช้ environment variables Next.js มีการรองรับสิ่งนี้ในตัวด้วยไฟล์ .env.local
สร้างไฟล์ใน root ของโปรเจกต์ของคุณ:
touch .env.local
ตอนนี้ เปิดไฟล์ใหม่นี้และเพิ่มคีย์ Google AI ของคุณ:
# .env.local
# This file is for local development and should NOT be committed to git.
GOOGLE_GENERATIVE_AI_API_KEY=YOUR_GOOGLE_AI_API_KEY
แทนที่ YOUR_GOOGLE_AI_API_KEY
ด้วยคีย์ที่คุณคัดลอกไว้ก่อนหน้านี้ Next.js จะโหลดไฟล์นี้โดยอัตโนมัติและทำให้คีย์พร้อมใช้งานบนเซิร์ฟเวอร์ ซึ่งเป็นที่ที่เราต้องการมันพอดี
บทที่ 2: การสร้างแกนหลักของแชทบอท
เมื่อตั้งค่าโปรเจกต์ของเราเสร็จแล้ว ก็ถึงเวลาสร้างส่วนประกอบหลักของแอปพลิเคชันของเรา: ปลายทาง API ฝั่งเซิร์ฟเวอร์ที่พูดคุยกับ AI และ UI ฝั่งไคลเอ็นต์ที่ผู้ใช้จะโต้ตอบด้วย
สถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ของแอป AI
แชทบอทของเราจะมีสองส่วนหลัก:
- เส้นทาง API ฝั่งเซิร์ฟเวอร์ (
/api/chat/route.ts
): นี่คือสภาพแวดล้อมที่ปลอดภัยซึ่งทำงานบนเซิร์ฟเวอร์ หน้าที่หลักคือการรับประวัติการแชทจากเบราว์เซอร์ของผู้ใช้ เพิ่มคีย์ API ลับของเรา ส่งต่อคำขอไปยังบริการ Google AI และจากนั้นสตรีมการตอบกลับกลับไปยังผู้ใช้ การเก็บตรรกะนี้ไว้บนเซิร์ฟเวอร์เป็นสิ่งสำคัญสำหรับความปลอดภัย—เพื่อให้แน่ใจว่าคีย์ API ของเราจะไม่ถูกเปิดเผยต่อสาธารณะ - UI ฝั่งไคลเอ็นต์ (
page.tsx
): นี่คือส่วนประกอบ React ที่ทำงานในเบราว์เซอร์ของผู้ใช้ มีหน้าที่ในการแสดงประวัติการแชท จับการป้อนข้อมูลของผู้ใช้ และส่งข้อมูลที่ป้อนนั้นไปยังเส้นทาง API ของเรา
การแยกนี้เป็นพื้นฐานสำหรับการสร้างเว็บแอปพลิเคชันที่ปลอดภัยและมีประสิทธิภาพ
ขั้นตอนที่ 4: การสร้างตัวจัดการเส้นทาง API
มาสร้างปลายทางฝั่งเซิร์ฟเวอร์กัน ในไดเรกทอรี src/app
ของคุณ ให้สร้างโฟลเดอร์ใหม่ชื่อ api
และภายในนั้น ให้สร้างโฟลเดอร์อีกอันชื่อ chat
สุดท้าย ให้สร้างไฟล์ชื่อ route.ts
ภายในโฟลเดอร์ chat
พาธสุดท้ายควรเป็น src/app/api/chat/route.ts
เติมไฟล์นี้ด้วยโค้ดต่อไปนี้:
// src/app/api/chat/route.ts
import { google } from '@ai-sdk/google';
import { streamText } from 'ai';
// Vercel-specific configuration to allow streaming responses for up to 30 seconds
export const maxDuration = 30;
// The main API route handler
export async function POST(req: Request) {
try {
// Extract the `messages` array from the request body
const { messages } = await req.json();
// Call the AI provider with the conversation history
const result = await streamText({
model: google('models/gemini-1.5-pro-latest'),
// The `messages` array provides the model with context for the conversation
messages,
});
// Respond with a streaming response
return result.toDataStreamResponse();
} catch (error) {
// It's a good practice to handle potential errors
if (error instanceof Error) {
return new Response(JSON.stringify({ error: error.message }), { status: 500 });
}
return new Response(JSON.stringify({ error: 'An unknown error occurred' }), { status: 500 });
}
}
มาวิเคราะห์ไฟล์ที่สำคัญนี้กัน:
export const maxDuration = 30;
: นี่คือการตั้งค่าเฉพาะสำหรับ Vercel ฟังก์ชัน Serverless มีค่าหมดเวลาเริ่มต้น เนื่องจากบางครั้งการตอบกลับของ AI อาจใช้เวลาสักครู่ในการเริ่มสร้าง เราจึงขยายเวลาหมดเวลาเป็น 30 วินาทีเพื่อป้องกันไม่ให้คำขอถูกยกเลิกก่อนเวลาอันควรexport async function POST(req: Request)
: ใน Next.js App Router การส่งออกฟังก์ชัน async ที่ตั้งชื่อตามเมธอด HTTP (เช่นPOST
) ในไฟล์route.ts
จะสร้างปลายทาง APIconst { messages } = await req.json();
: ส่วนหน้า (frontend) จะส่งอ็อบเจกต์ JSON ในคำขอ และเรากำลังแยกส่วนอาร์เรย์messages
ออกจากมัน อาร์เรย์นี้คือประวัติการสนทนาทั้งหมด ซึ่งเป็นสิ่งสำคัญสำหรับ LLM ในการให้การตอบกลับที่เข้าใจบริบทconst result = await streamText(...)
: นี่คือการเรียกหลักไปยัง Vercel AI SDK เราให้model
ที่เราต้องการใช้และประวัติmessages
แก่มัน SDK จะจัดการคำขอที่ได้รับการยืนยันตัวตนไปยัง Google API ในเบื้องหลังreturn result.toDataStreamResponse();
: นี่คือฟังก์ชันตัวช่วยที่ทรงพลัง มันนำReadableStream
ที่ส่งคืนโดยstreamText
และห่อหุ้มไว้ในอ็อบเจกต์Response
พร้อมส่วนหัวและรูปแบบที่ถูกต้อง ทำให้ hooks ฝั่งไคลเอ็นต์ของเราบริโภค stream ได้ง่ายอย่างไม่น่าเชื่อtry...catch
: เราได้ห่อหุ้มตรรกะของเราไว้ในบล็อกtry...catch
เพื่อจัดการข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการเรียก API อย่างสวยงาม โดยส่งคืนข้อความแสดงข้อผิดพลาดที่ชัดเจนไปยังไคลเอ็นต์
ขั้นตอนที่ 5: การสร้างส่วนต่อประสานผู้ใช้
ตอนนี้ถึงส่วนที่สนุก: การสร้าง UI ต้องขอบคุณแพ็กเกจ @ai-sdk/react
ทำให้สิ่งนี้ง่ายอย่างน่าประหลาดใจ เปิดไฟล์หน้าหลักที่ src/app/page.tsx
และแทนที่เนื้อหาทั้งหมดด้วยโค้ดต่อไปนี้:
// src/app/page.tsx
'use client';
import { useChat } from '@ai-sdk/react';
import { useRef, useEffect } from 'react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit, isLoading, error } = useChat();
// A ref to the scrollable container of messages
const messagesContainerRef = useRef<HTMLDivElement>(null);
// Effect to scroll to the bottom of the messages container whenever messages change
useEffect(() => {
if (messagesContainerRef.current) {
messagesContainerRef.current.scrollTop = messagesContainerRef.current.scrollHeight;
}
}, [messages]);
return (
<div className="flex flex-col h-screen bg-gray-50">
{/* Messages container */}
<div ref={messagesContainerRef} className="flex-1 overflow-y-auto p-8 space-y-4">
{messages.map(m => (
<div
key={m.id}
className={`flex gap-3 ${m.role === 'user' ? 'justify-end' : 'justify-start'}`}
>
{/* Display user's avatar */}
{m.role === 'user' && (
<div className="w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center text-white font-bold">U</div>
)}
{/* Message bubble */}
<div
className={`max-w-xl p-3 rounded-2xl shadow-md whitespace-pre-wrap ${
m.role === 'user'
? 'bg-blue-500 text-white rounded-br-none'
: 'bg-white text-black rounded-bl-none'
}`}
>
<span className="font-bold block">{m.role === 'user' ? 'You' : 'AI Assistant'}</span>
{m.content}
</div>
{/* Display AI's avatar */}
{m.role !== 'user' && (
<div className="w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center text-white font-bold">AI</div>
)}
</div>
))}
</div>
{/* Input form */}
<div className="p-4 bg-white border-t">
<form onSubmit={handleSubmit} className="flex items-center gap-4 max-w-4xl mx-auto">
<input
className="flex-1 p-3 border rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500"
value={input}
placeholder="Ask me anything..."
onChange={handleInputChange}
disabled={isLoading}
/>
<button
type="submit"
className="px-6 py-3 bg-blue-500 text-white rounded-full font-semibold hover:bg-blue-600 disabled:bg-blue-300 disabled:cursor-not-allowed"
disabled={isLoading}
>
Send
</button>
</form>
{error && (
<p className="text-red-500 mt-2 text-center">{error.message}</p>
)}
</div>
</div>
);
}
นี่เป็นโค้ดจำนวนมาก แต่ส่วนใหญ่ใช้สำหรับการสร้าง UI ที่สวยงามด้วย Tailwind CSS มาเน้นที่ตรรกะกัน:
'use client';
: นี่เป็นสิ่งสำคัญ มันทำเครื่องหมายส่วนประกอบนี้ว่าเป็น Client Component ซึ่งหมายความว่าจะทำงานในเบราว์เซอร์และสามารถใช้ state และ effects ได้const { ... } = useChat();
: บรรทัดเดียวนี้คือความมหัศจรรย์ของไลบรารี UI ของ AI SDK มันมี state และฟังก์ชันทั้งหมดที่เราต้องการ:messages
: อาร์เรย์ของข้อความแชท ซึ่งจะถูกซิงค์โดยอัตโนมัติinput
,handleInputChange
,handleSubmit
: state และ handlers สำหรับฟอร์มป้อนข้อมูลของเราhandleSubmit
จะจัดแพ็กข้อความและเรียกปลายทาง/api/chat
ของเราโดยอัตโนมัติisLoading
: ค่า boolean ที่จะเป็นtrue
ในขณะที่ AI กำลังสร้างการตอบกลับ เราใช้สิ่งนี้เพื่อปิดใช้งานฟอร์มในขณะที่รอerror
: อ็อบเจกต์ error ที่จะถูกเติมหากการเรียก API ของเราล้มเหลว เราจะแสดงสิ่งนี้ให้ผู้ใช้เห็นuseRef
และuseEffect
: นี่คือรูปแบบ React มาตรฐานเพื่อให้มุมมองการแชทเลื่อนลงไปด้านล่างโดยอัตโนมัติเมื่อมีข้อความใหม่เข้ามา เพื่อให้แน่ใจว่าข้อความล่าสุดจะมองเห็นได้เสมอ
ขั้นตอนที่ 6: รันแอปพลิเคชันของคุณ
ตอนนี้คุณได้สร้างแชทบอท AI ที่สมบูรณ์และมีโครงสร้างที่ดีแล้ว มาเริ่มทำงานกันเลย!
npm run dev
ไปที่ http://localhost:3000
ในเบราว์เซอร์ของคุณ คุณควรจะเห็นอินเทอร์เฟซการแชทที่สวยงาม ถามคำถามอะไรก็ได้ คุณจะเห็นข้อความของคุณปรากฏขึ้นทันที และการตอบกลับของ AI จะสตรีมเข้ามาทีละ token
บทที่ 3: ความสามารถขั้นสูง - มอบพลังพิเศษให้กับแชทบอทของคุณ
แชทบอทของเราฉลาด แต่ความรู้ของมันจำกัดอยู่เพียงข้อมูลการฝึกฝน มันไม่สามารถเข้าถึงข้อมูลสดหรือดำเนินการในโลกจริงได้ ในบทนี้ เราจะมอบ "เครื่องมือ (Tools)" ให้มันเพื่อเอาชนะข้อจำกัดเหล่านี้
เครื่องมือ (Tools) คืออะไร?
เครื่องมือคือฟังก์ชันที่คุณกำหนดซึ่ง LLM สามารถเลือกที่จะดำเนินการได้ คุณอธิบายเครื่องมือให้โมเดลทราบ และเมื่อโมเดลคิดว่าเครื่องมือนั้นจำเป็นต่อการตอบคำถามของผู้ใช้ มันจะหยุดการสร้างข้อความชั่วคราวและส่งออกอ็อบเจกต์ "tool call" พิเศษแทน โค้ดของคุณจะดำเนินการฟังก์ชันนั้นด้วยอาร์กิวเมนต์ที่โมเดลให้มา และผลลัพธ์จะถูกส่งกลับไปยังโมเดล จากนั้นโมเดลจะใช้ข้อมูลใหม่นี้เพื่อสร้างการตอบกลับสุดท้ายที่แม่นยำยิ่งขึ้น
มาเพิ่มพลังให้แชทบอทของเราด้วยเครื่องมือสองอย่าง:
- เครื่องมือสำหรับรับสภาพอากาศปัจจุบันสำหรับสถานที่หนึ่งๆ
- เครื่องมือสำหรับแปลงอุณหภูมิจากฟาเรนไฮต์เป็นเซลเซียส
สิ่งนี้จะช่วยให้บอทของเราตอบคำถามได้ เช่น "สภาพอากาศในลอนดอนเป็นอย่างไรในหน่วยเซลเซียส?" ซึ่งเป็นงานที่ต้องใช้หลายขั้นตอนและข้อมูลภายนอก
ขั้นตอนที่ 7: การอัปเกรด API เพื่อรองรับเครื่องมือ
เราจำเป็นต้องกำหนดเครื่องมือของเราในการเรียก streamText
บนเซิร์ฟเวอร์ เปิด src/app/api/chat/route.ts
และแก้ไขเพื่อรวมการกำหนด tools
ใหม่
// src/app/api/chat/route.ts
import { google } from '@ai-sdk/google';
import { streamText, tool } from 'ai';
import { z } from 'zod';
export const maxDuration = 30;
export async function POST(req: Request) {
const { messages } = await req.json();
const result = await streamText({
model: google('models/gemini-1.5-pro-latest'),
messages,
// Define the tools the model can use
tools: {
getWeather: tool({
description: 'Get the current weather for a specific location. Always returns temperature in Fahrenheit.',
parameters: z.object({
location: z.string().describe('The city and state, e.g., San Francisco, CA'),
}),
execute: async ({ location }) => {
// In a real app, you would fetch from a real weather API
console.log(`Fetching weather for ${location}`);
return {
temperature: Math.floor(Math.random() * (100 - 30 + 1) + 30),
high: Math.floor(Math.random() * (100 - 80 + 1) + 80),
low: Math.floor(Math.random() * (50 - 30 + 1) + 30),
conditions: ['Sunny', 'Cloudy', 'Rainy'][Math.floor(Math.random() * 3)],
};
},
}),
convertFahrenheitToCelsius: tool({
description: 'Convert a temperature from Fahrenheit to Celsius.',
parameters: z.object({
temperature: z.number().describe('The temperature in Fahrenheit'),
}),
execute: async ({ temperature }) => {
console.log(`Converting ${temperature}°F to Celsius`);
return {
celsius: Math.round((temperature - 32) * (5 / 9)),
};
},
}),
},
});
return result.toDataStreamResponse();
}
มาวิเคราะห์อ็อบเจกต์ tools
กัน:
- แต่ละคีย์ (
getWeather
,convertFahrenheitToCelsius
) คือชื่อเครื่องมือของเรา description
: นี่คือส่วนที่สำคัญที่สุดสำหรับโมเดล มันอ่านคำอธิบายนี้เพื่อทำความเข้าใจว่าเครื่องมือทำอะไรและควรใช้เมื่อใด ควรเขียนให้ชัดเจนและเฉพาะเจาะจงparameters
: เราใช้zod
เพื่อกำหนด signature ของฟังก์ชัน สิ่งนี้บอกโมเดลอย่างชัดเจนว่าต้องระบุอาร์กิวเมนต์ใดบ้างz.string().describe(...)
ให้คำแนะนำแก่โมเดลเกี่ยวกับรูปแบบที่คาดหวังexecute
: นี่คือฟังก์ชันฝั่งเซิร์ฟเวอร์จริงที่ทำงานเมื่อเครื่องมือถูกเรียกใช้ ที่นี่ เราจำลองการเรียก API ด้วยข้อมูลสุ่ม แต่คุณสามารถแทนที่สิ่งนี้ด้วยการเรียกfetch
ไปยังบริการสภาพอากาศจริงได้อย่างง่ายดาย
ขั้นตอนที่ 8: การเปิดใช้งานการเรียกเครื่องมือแบบหลายขั้นตอนใน UI
การกำหนดเครื่องมือบนเซิร์ฟเวอร์เพียงอย่างเดียวยังไม่พอ โดยค่าเริ่มต้น เมื่อโมเดลทำการเรียกเครื่องมือ การสนทนาจะหยุดลง เราจำเป็นต้องบอก hook useChat
ของเราให้ส่งผลลัพธ์ของการเรียกเครื่องมือนั้นกลับไปยังโมเดลโดยอัตโนมัติ เพื่อให้โมเดลสามารถดำเนินการให้เหตุผลต่อไปและสร้างคำตอบสุดท้ายได้
สิ่งนี้ทำได้ง่ายอย่างไม่น่าเชื่อ ใน src/app/page.tsx
ให้ปรับปรุงการเริ่มต้น hook useChat
:
// src/app/page.tsx
// ...
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit, isLoading, error } = useChat({
// Tell the hook to automatically send tool results back to the model
experimental_sendExtraToolMessages: true,
});
// ... rest of the component
}
แค่นั้นเอง คุณสมบัติ experimental_sendExtraToolMessages: true
จะเปิดใช้งานขั้นตอนการใช้เครื่องมือแบบหลายขั้นตอน
ขั้นตอนที่ 9: UI ที่ดีขึ้นสำหรับการเรียกใช้เครื่องมือ
UI ปัจจุบันของเราแสดงเฉพาะ m.content
เมื่อมีการเรียกเครื่องมือ ข้อมูลที่น่าสนใจจะอยู่ในคุณสมบัติอื่นของอ็อบเจกต์ข้อความ มาสร้างส่วนประกอบเฉพาะเพื่อแสดงผลการเรียกเครื่องมืออย่างสวยงาม
ก่อนอื่น มาปรับปรุง loop ข้อความหลักใน src/app/page.tsx
เพื่อแสดงผลการเรียกเหล่านี้
// src/app/page.tsx
// ... inside the Chat component's return statement
<div ref={messagesContainerRef} className="flex-1 overflow-y-auto p-8 space-y-4">
{messages.map(m => (
<div
key={m.id}
className={`flex gap-3 ${m.role === 'user' ? 'justify-end' : 'justify-start'}`}
</div>
))}
</div>
</div>
);
}
ฉันยังได้เพิ่มตัวบ่งชี้การพิมพ์แบบง่ายๆ ที่ปรากฏขึ้นในขณะที่ผู้ช่วยกำลังคิด คุณจะต้องเพิ่ม CSS เล็กน้อยสำหรับสิ่งนี้ ในไฟล์ src/app/globals.css
ของคุณ ให้เพิ่ม:
/* src/app/globals.css */
.typing-indicator span {
height: 8px;
width: 8px;
background-color: #9E9EA1;
border-radius: 50%;
display: inline-block;
animation: a 1.2s infinite ease-in-out;
}
.typing-indicator span:nth-child(1) { animation-delay: -0.4s; }
.typing-indicator span:nth-child(2) { animation-delay: -0.2s; }
@keyframes a {
0%, 60%, 100% { transform: scale(0.2); }
30% { transform: scale(1); }
}
ตอนนี้ รันแอปพลิเคชันอีกครั้ง ถามว่า "สภาพอากาศในนิวยอร์กเป็นอย่างไรในหน่วยเซลเซียส?" คุณจะเห็นเหตุการณ์ที่น่าสนใจเกิดขึ้นใน UI ของคุณ:
- โมเดลจะเรียกเครื่องมือ
getWeather
ก่อน คุณจะเห็นการเรียกเครื่องมือที่แสดงผลใน UI - ผลลัพธ์ (อุณหภูมิสุ่มในหน่วยฟาเรนไฮต์) จะถูกส่งกลับไปยังโมเดล
- โมเดล เมื่อรู้ว่าต้องการหน่วยเซลเซียส จะเรียกเครื่องมือ
convertFahrenheitToCelsius
โดยใช้อุณหภูมิจากผลลัพธ์ของเครื่องมือแรกเป็นอินพุต - สุดท้าย เมื่อได้อุณหภูมิในหน่วยเซลเซียสแล้ว ก็จะสร้างการตอบกลับด้วยภาษาธรรมชาติเพื่อตอบคำถามเดิมของคุณ
นี่คือพลังของการสร้าง AI Agents และ Vercel AI SDK ทำให้การจัดการที่ซับซ้อนนี้ตรงไปตรงมาอย่างน่าทึ่ง
บทที่ 4: จะไปต่อที่ไหนดี?
คุณได้สร้างแชทบอทที่ขับเคลื่อนด้วย AI ที่มีความสามารถขั้นสูงสำเร็จแล้ว คุณได้เปลี่ยนจากหน้าว่างเปล่าไปสู่แอปพลิเคชันที่มีคุณสมบัติครบถ้วนที่สามารถสตรีมการตอบกลับ จัดการสถานะการโหลดและข้อผิดพลาด และใช้เครื่องมือเพื่อโต้ตอบกับข้อมูลภายนอกในลักษณะหลายขั้นตอน
คู่มือนี้ได้ให้รากฐานที่แข็งแกร่งแก่คุณ แต่มันเป็นเพียงจุดเริ่มต้น Vercel AI SDK ยังมีอะไรอีกมากมายที่จะนำเสนอ นี่คือแนวทางสำหรับการสำรวจเพิ่มเติมของคุณ:
- Generative UI: เราได้สตรีมเพียงข้อความและข้อมูล ด้วย React Server Components ทำให้ AI SDK ช่วยให้คุณให้ AI สร้างและสตรีมส่วนประกอบ React ที่มีรูปแบบสมบูรณ์และโต้ตอบได้ ลองนึกภาพการถามสภาพอากาศและได้รับวิดเจ็ตสภาพอากาศที่สวยงามและโต้ตอบได้กลับมา แทนที่จะเป็นแค่ข้อความ นี่คือคุณสมบัติล้ำสมัยที่มีศักยภาพมหาศาล
- Retrieval-Augmented Generation (RAG): สร้างแชทบอทที่สามารถให้เหตุผลจากเอกสารส่วนตัวของคุณเอง คุณสามารถสร้างแชทบอทที่ตอบคำถามเกี่ยวกับไฟล์ PDF ชุดไฟล์ Markdown หรือฐานความรู้ภายในบริษัทของคุณ
- สำรวจผู้ให้บริการรายอื่น: สถาปัตยกรรมที่เราสร้างขึ้นมีความเป็นโมดูลสูง ลองเปลี่ยนโมเดลของ Google เป็นโมเดลจาก OpenAI หรือ Anthropic มักจะง่ายเพียงแค่เปลี่ยนโค้ดบรรทัดเดียวในเส้นทาง API ของคุณ ทำให้คุณสามารถทดลองและค้นหาโมเดลที่ดีที่สุดสำหรับกรณีการใช้งานเฉพาะของคุณ
- Vercel AI Playground: AI Playground เป็นเครื่องมือที่ทรงคุณค่าสำหรับการทดสอบ prompts และเปรียบเทียบผลลัพธ์ ประสิทธิภาพ และค่าใช้จ่ายของโมเดลต่างๆ แบบเคียงข้างกัน
อนาคตของการพัฒนาเว็บนั้นชาญฉลาด โต้ตอบได้ และเป็นส่วนตัว ด้วย Vercel AI SDK ตอนนี้คุณมีเครื่องมือและความรู้ที่จะอยู่แถวหน้าของการปฏิวัติครั้งนี้ ขอให้สร้างสรรค์ผลงานอย่างมีความสุข!
ต้องการแพลตฟอร์มแบบ All-in-One ที่รวมทุกอย่างสำหรับทีมพัฒนาของคุณเพื่อทำงานร่วมกันด้วย ประสิทธิภาพสูงสุด?
Apidog ตอบสนองทุกความต้องการของคุณ และ แทนที่ Postman ในราคาที่ย่อมเยากว่ามาก!