ניסוי AI - בואו נכתוב Tools
איך קורה שמודל שפה מצליח להפעיל קוד או לבדוק מזג אוויר? ומה ההבדל בין מודל לסוכן? בואו נראה את התשובה דרך ניסוי קצר ונבנה מנגנון שמאפשר למודל שפה להריץ כלים חיצוניים.
1. מודל וסוכן
מודל שפה הוא בסך הכל תוכנה שיודעת לקבל טקסט ולנחש על בסיס הגיון סטטיסטי לאן השיחה תמשיך. כדאי לחשוב על מודל שפה כמו מערכת זיהוי תבניות מאוד מאוד מתוחכמת. במהלך שלב האימון המערכת קראה כמויות אדירות של מידע וניתחה אותו לפי סדרה מאוד גדולה של תבניות סטטיסטיות, לדוגמה היא חיפשה תדירות הופעה של כל אות בקלט, תדירות הופעה של מילה, איזה אות באה אחרי אות אחרת, איזה מילה באה בדרך כלל אחרי מילה אחרת, איזה סיומות יש למילה שבאה בין שתי מילים אחרות וכך נדמיין מיליונים ומיליארדים של תבניות שהמערכת מחפשת בטקסט ומנתחת לפיהן את הטקסט. כשמגיע טקסט חדש אותו מודל שפה לוקח את כל מיליארדי המאפיינים שלו ובאופן סטטיסטי מציע מה יהיה ההמשך של אותו טקסט.
סוכן מתאר מערכת שיכולה לפעול בתוך סביבה - היא יכולה לתקשר עם הסביבה שלה באופן מסוים, לקבל קלט מהסביבה ולהשפיע על הסביבה.
כלי AI רבים היום בנויים בתור סוכנים שמפעילים מודלי שפה: הסוכן עוטף את מודל השפה ומשתמש בו כדי לחזות מה לעשות וממשיך בלולאה להזין את הקלטים מהסביבה בחזרה למודל השפה כדי לחזות מה לעשות הלאה.
2. ניסוי - פיתוח סוכן בעזרת מודל שפה
אחת הדרכים הפופולריות שמאפשרות לנו לחבר פלט של מודל שפה לפעולות בעולם היא "כלים". מאחר ומודל שפה פולט טקסט אנחנו יכולים להשפיע על הטקסט שהוא פולט כדי שיכיל מילות קוד מסוימות. התוכנית שהפעילה את מודל השפה מזהה את מילות הקוד האלה ומשתמשת בהן כדי להריץ קוד או מחליפה אותן בתוצאת הקוד כדי לייצר תשובה מלאה.
בואו ננסה לראות איך זה עובד באמצעות פיתוח סוכן פשוט. אני מתחיל בהגדרת שלוש פונקציות עם מימוש ריק רק בשביל הדוגמה:
const replaceWeather = (text: string) => text.replace(/\[getWeather\(.*\)\]/, "Sunny");
const replacePlus = (text: string) => text.replace(/\[plus\(\d+, \d+\)\]/, "5");
const replaceLocation = (text: string) => text.replace(/\[getLocation\(\)\]/, "Tel Aviv");
פונקציה אחת מחזירה מה מזג האוויר במקום מסוים, וכן היא תמיד תחזיר Sunny. פונקציה שניה תחזיר תוצאה של תרגיל חיבור (זה תמיד יהיה 5) ופונקציה שלישית תחזיר את המיקום הנוכחי של המשתמש. הפונקציות מחפשות מילת מפתח בטקסט ומחליפות את מילת המפתח בתוצאה של החישוב למשל פונקציית מזג האוויר מחפשת את מילת המפתח:
[getWeather(location)]
ומחליפה אותה במילה Sunny. כמובן שבמערכת אמיתית הפונקציה תיקח את המיקום מתוך הסוגריים ותלך ל API שמחזיר מזג אוויר.
בשביל לחבר את הפונקציות למודל השפה אני רק צריך לשכנע את מודל השפה לפלוט טקסט שמכיל את מילות המפתח שלי. שימו לב לשיחה הבאה:
const completion = await openai.chat.completions.create({
messages: [
{
role: "system",
content: `You are a smart assistant and can use external tools to perform common tasks.
To use a tool respond with square brackets, inside the tool name with options in parenthesis. Available tools:
getLocation - Returns the user's location. Usage: You are located at [getLocation()]
getWeather - take a location and returns the weather. Usage: The weather at your location is: [getLocation(getWeather())]
plus - add two numbers. Usage: [plus(2, 3)]`,
},
{ role: "user", content: "where am I?" },
{ role: "assistant", content: "You are at [getLocation()]" },
{ role: "user", content: "what is the weather in London?" },
],
model: "gpt-4",
max_tokens: 30,
});
אני שולח למודל השפה את רשימת מילות המפתח וגם הסבר מתי להשתמש בכל מילה. בהנתן כל ההקדמה ברור שהתשובה שלו לשאלה האחרונה תהיה:
The weather in London is: [getWeather("London")]
ואת זה אני יכול לשלוח לפונקציות שלי כדי לדווח על מזג האוויר האמיתי.
קוד הדוגמה המלא הוא:
import { OpenAI } from "https://esm.town/v/std/openai";
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
messages: [
{
role: "system",
content: `You are a smart assistant and can use external tools to perform common tasks.
To use a tool respond with square brackets, inside the tool name with options in parenthesis. Available tools:
getLocation - Returns the user's location. Usage: You are located at [getLocation()]
getWeather - take a location and returns the weather. Usage: The weather at your location is: [getLocation(getWeather())]
plus - add two numbers. Usage: [plus(2, 3)]`,
},
{ role: "user", content: "where am I?" },
{ role: "assistant", content: "You are at [getLocation()]" },
{ role: "user", content: "what is the weather in London?" },
],
model: "gpt-4",
max_tokens: 30,
});
const replaceWeather = (text: string) => text.replace(/\[getWeather\(.*\)\]/, "Sunny");
const replacePlus = (text: string) => text.replace(/\[plus\(\d+, \d+\)\]/, "5");
const replaceLocation = (text: string) => text.replace(/\[getLocation\(\)\]/, "Tel Aviv");
const pipeline = (text: string) => replaceWeather(replacePlus(replaceLocation(text)));
const result = completion.choices[0].message.content;
if (result) {
console.log(result);
console.log(pipeline(result));
}
ואתם יכולים להריץ אותו או לשנות את השאלות ב val.town בקישור:
https://www.val.town/v/ynonp/confidentWhiteOx
או מוטמע: