ה AI Agent הראשון שלי
מתחת לכל המילים הגבוהות, סוכן AI הוא בסך הכל תוכנית מחשב שנעזרת ב API של ספקי ה AI כדי לבצע חלק מהעבודה שלה. הרבה פעמים סוכני AI יוכלו לקבל החלטות באיזושהי צורה - או באמצעות החזרת קוד מסוים לתוכנית ששלחה את השאלה או באמצעות הפעלת כלים.
בפוסט היום נראה דוגמה לסוכן מאוד בסיסי אבל הקוד יוכל לשמש כבסיס לסוכנים מתוחכמים יותר. הסוכן שלי ימשוך את המאגרים הפופולריים מגיטהאב (מרשימת ה Trending Repositories), יארגן לי אותה בתור ניוזלטר וישלח אליי למייל. הוא יוכל לעשות את זה כל יום בשעה קבועה, וכל זה בחינם דרך val.town.
1. קוד הסוכן
נתחיל עם הקוד:
import { email } from "https://esm.town/v/std/email";
import { OpenAI } from "https://esm.town/v/std/openai";
import { JSDOM } from "npm:jsdom";
import { NodeHtmlMarkdown, NodeHtmlMarkdownOptions } from "npm:node-html-markdown";
const html = await fetch("https://github.com/trending").then(r => r.text());
const { window: { document } } = new JSDOM(html);
const trendingHTML = document.querySelector("[data-hpc]").innerHTML;
const trendingMarkdown = NodeHtmlMarkdown.translate(
trendingHTML,
/* options (optional) */ {},
/* customTranslators (optional) */ undefined,
/* customCodeBlockTranslators (optional) */ undefined,
);
const openai = new OpenAI();
console.log(trendingMarkdown);
const completion = await openai.chat.completions.create({
messages: [
{
role: "user",
content: `
1. Summarize the trending repositories from the trending github page below.
2. Output the format in newsletter style HTML that I can use in an email.
3. Respond with the HTML only, no prefix or suffix)
https://github.com/trending:
${trendingMarkdown}
`,
},
],
model: "gpt-4",
});
const responseText = completion.choices[0].message.content;
const responseHTML = responseText.replace(/^```(?:html)?\s*|\s*```$/g, "");
await email({
html: responseHTML,
});
אתם יכולים לראות אותו בפעול ואפילו להריץ (אחרי שתירשמו לואל טאון) בקישור:
https://www.val.town/x/ynonp/GitHub-trending-summary/code/summarize-to-email
קצת על הקוד:
ה AI אחראי על תרגום רשימת המאגרים לתבנית HTML. נכון בתוכנית אמיתית היינו מעדיפים לעשות את זה בקוד כדי לקבל את אותה תבנית בכל המיילים, אבל פה אנחנו בדוגמה לשילוב AI בתוכנית.
רוב הקוד של התוכנית אחראי על סידור המידע לפני הפנייה ל AI וטיפול בתשובת ה AI. זה יהיה המבנה של כל סוכן AI שנכתוב. במקרה שלנו אנחנו מושכים את ה HTML, לוקחים ממנו את הבלוק של רשימת המאגרים הפופולריים והופכים אותו למארקדאון כדי שיהיה קל ל AI לקרוא אותו.
החלק האחרון לוקח את ה HTML שחוזר מה AI ושולח אותו אליי למייל.
הספריה
std/openai
שייכת ל val.town והיא מאפשרת גישה בחינם ל API של ChatGPT. אם אתם מעדיפים לשלם יש פריימוורק הרבה יותר מתוחכם שנקרא Vercel AI SDK. הוא מאפשר גם הפעלת כלים והגדרת סכימה לאוביקט שחוזר מה AI, לדוגמה:
import { generateObject } from 'ai';
import { z } from 'zod';
const { object } = await generateObject({
model: yourModel,
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
steps: z.array(z.string()),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
(בעצם הם מבקשים מה AI להחזיר JSON, ואז בודקים שה JSON שחזר מתאים לסכימה).
- ואל טאון מאפשרים להריץ את הסקריפט בצורה מחזורית כל יום בשעה קבועה, וכך אנחנו יכולים להעלות את הסוכן שיהיה "תמיד זמין" וישלח אימייל כל יום. דרכים נוספות לאינטרקציה כוללות בניית בוט לטלגרם או יצירת API Endpoint.
2. מה הלאה
רוצים להתאמן על פיתוח סוכני AI? הנה כמה הרחבות שתוכלו להוסיף לסטארטר מהפוסט:
במקום לתת ל AI לכתוב את כל האימייל, נבקש מה AI רק ליצור אוביקט JSON (נוודא שתואם לסכימה) ונשתמש ב JSON כדי לבנות אימייל.
נוסיף ל JSON את השפה המרכזית של כל מאגר ונקבל רק מאגרים בשפה או שפות שמעניינות אותנו.
נוסיף ל JSON גם Issue או שניים מתוך המאגר שמתאימים לתורמים חדשים לפרויקט. כך נוכל לזהות הזדמנויות לתרום קוד לפרויקטי קוד פתוח.
רעיונות נוספים? ספרו לי בתגובות.