איך לשפר סוכן AI: שבע השורות שמפרידות בין סקריפט לסוכן
למי שכבר יש לו סוכנים שרצים. שיטת אודיט בשמונה שאלות שמראה מה חסר לכל סוכן, באיזה סדר לתקן, ואיך להעביר את אותו אודיט ללקוח בפגישה אחת.
תקציר ב30 שניות: סוכן בשל הוא רשומה עם שבעה שדות ידועים, ולא פרומפט מוצלח. כאן תמצאו את שבעת השדות, אודיט של שמונה שאלות שאפשר להריץ על כל סוכן קיים, סדר תיקונים לפי מה שמחזיר הכי מהר, וקוד להעתקה לתקרת ריצה ולטבלת אודיט.
המאמר הזה מניח שכבר יש לכם סוכן שרץ. אחד לפחות. אם עוד לא בניתם, הוא לא יעזור לכם, כי אין על מה להריץ את מה שכתוב פה. הקהל הוא מי שיש לו כמה דברים שרצים לבד, ואחד מהם עומד לגעת בלקוח.
סוכן שעובד הוא לא סוכן מוכן. את זה מגלים אחרי שהוא עשה מה שביקשו ממנו, על הנתונים הלא נכונים. או פעמיים במקום פעם אחת. או בשלוש לפנות בוקר, בלי שאף אחד ידע.
בשנה האחרונה צמחה קטגוריה של מוצרים שמוכרים פתרון לזה. הם קוראים לעצמם שכבת שליטה: לא המקום שבו בונים סוכנים, אלא השכבה שכל סוכן עובר דרכה בדרך לייצור. הרעיון טוב יותר מהמוצרים, ואפשר לאמץ אותו בלי לקנות כלום. סטאק קיים, סוכן קיים, שבוע עבודה.
מה שיש פה זו שיטת עבודה. לא סקירת כלים.
מילון מושגים קצר
- סוכן ישות שמתעוררת מאירוע, בוחרת בעצמה באיזה כלי להשתמש, ומריצה כמה סבבים עד שהמשימה נסגרת. אם סדר הפעולות קבוע מראש, זו אוטומציה.
- כלי פעולה שהסוכן יכול לקרוא לה: שליחת מייל, שאילתה במסד נתונים, יצירת אירוע ביומן. הסוכן מבקש, הקוד מתחתיו מבצע.
- control plane שכבת שליטה. קובעת מי מותר לו לרוץ, על מה, בכמה כסף, ומי מאשר. נפרדת מהשכבה שבה הסוכן נבנה.
- human in the loop צעד שדורש אישור אנושי לפני שהוא מתבצע. תנאי בקוד, לא הערה בתיעוד.
- audit trail רישום של מה נשאל, מה חזר, מה הוחלט וכמה זה עלה.
- shadow agents סוכנים שרצים בלי שאף אחד רשם אותם. אצל עצמאי זה נראה כמו סקריפט ישן שממשיך לרוץ בקרון.
- הסלמת הרשאות משתמש מקבל דרך הסוכן גישה לנתונים שאין לו הרשאה אליהם ישירות.
למה סוכן שעובד עדיין לא בשל
הפער בין דמו לייצור הוא כמעט אף פעם לא פער של מודל או של פרומפט. הוא בכל מה שמסביב. ארבע שאלות שאף אחד לא שואל בשבוע הראשון:
- מי אישר שהסוכן הזה רץ, ומי אחראי עליו כשהוא נופל?
- במה מותר לו לגעת, ובאיזו רמת הרשאה?
- כמה עלתה הריצה, ומה עוצר אותה כשהיא מתחילה לרוץ בלולאה?
- אם לקוח ישאל מחר למה נשלחה ההודעה הזו, יש תשובה מתועדת?
כל עוד המשתמש היחיד הוא אתם, אפשר לחיות בלי התשובות, ורוב הסוכנים אכן חיים בלעדיהן. כשמישהו אחר משלם על התוצאה, ארבע השאלות הופכות מרשימת שיפורים לחוב.
המודל: סוכן הוא רשומה בת שבעה שדות
זה הגרעין. סוכן בשל הוא רשומה שאפשר להסתכל עליה ולדעת עליה שבעה דברים:
- זהות שם, בעלים, גרסה, סביבה, מתי רץ לאחרונה. מידע שקיים רק בראש שלכם לא קיים.
- כלים מותרים רשימה סגורה ומוצהרת. לא "כל מה שיש בספרייה", אלא רשימה שאפשר להצביע עליה ולומר שזה הכל.
- גבול נתונים לא רק לאילו כלים יש גישה. לאילו נתונים. קריאה בלבד, טבלאות מסוימות, שורות של לקוח מסוים.
- אישורים אילו פעולות דורשות בן אדם לפני הביצוע, ומה הרף המדויק שמפעיל את הדרישה.
- סביבת ריצה איפה הוא רץ ולאן מותר לו לפנות החוצה.
- מודל ותקציב איזה מודל, ומה התקרה שמפסיקה את הריצה. תקרה, לא התראה.
- אודיט כל קריאת כלי: מה נשאל, מה חזר, כמה עלה, מי אישר.
המבחן פשוט. אם לישות שבניתם אין את שבע השורות האלה, מה שיש לכם הוא סקריפט עם מודל שפה בפנים. הוא יכול להיות סקריפט מצוין, והוא עדיין ייכשל בשאלה של מישהו אחר.
השדה שהכי הרבה אנשים מדלגים עליו הוא גבול הנתונים, והוא היחיד שכשל בו לא מתקן את עצמו. כלי חסר מייצר שגיאה שרואים מיד. הרשאה רחבה מדי לא מייצרת כלום, עד היום שבו היא מייצרת הכל.
האודיט: שמונה שאלות על סוכן קיים
קחו סוכן אחד שרץ אצלכם עכשיו. כל שאלה היא כן או לא. תשובה שדורשת הסבר היא לא.
- יש לו שם, בעלים וגרסה? קובץ מניפסט אחד לכל סוכן.
- רשימת הכלים סגורה ומוצהרת מראש? אם התשובה היא "מה שהמודל יבחר", זו לא רשימה.
- יש לו גבול נתונים ולא מפתחעל? בפרויקטים שמבוססים על Supabase זו התשובה הכי נפוצה שהיא לא.
- הפעולות הבלתי הפיכות עוברות דרך אישור אנושי? שליחה ללקוח, מחיקה, תשלום. הרף מוגדר במספר.
- אתם יודעים איפה הוא רץ ולאן מותר לו לפנות? פונקציה, קרון, worker, ולאילו דומיינים.
- יש תקרת הוצאה שנאכפת בקוד? מונה טוקנים ומונה איטרציות שעוצרים את הריצה בפועל.
- כל קריאת כלי נרשמת? מה נשאל, מה חזר, כמה עלה.
- הסוכן פועל בהרשאות המשתמש שהפעיל אותו? רלוונטי מהרגע שיותר מאדם אחד משתמש בו.
סוכן ממוצע יעבור שלוש או ארבע מהשמונה. זה תקין כשהמשתמש הוא אתם. ברגע שלקוח משלם על התוצאה, השורות שנשארו ריקות הן רשימת המשימות.
סדר התיקונים
אף אחד לא סוגר את שמונת הסעיפים במכה אחת. הסדר הזה ממיין לפי נזק אפשרי חלקי מאמץ:
- גבול נתונים. להוריד את הסוכן ממפתחעל להרשאה מצומצמת. שעה עבודה, ומונע את התרחיש שאין ממנו חזרה.
- תקרה בקוד. מונה איטרציות ומונה טוקנים שזורקים חריגה. חצי שעה, ומונע חשבון מפתיע.
- טבלת אודיט. שורה לכל קריאת כלי. שעה, ומכאן יש נתונים במקום תחושות.
- אישור אנושי על פעולות בלתי הפיכות. יום עבודה אם אין תשתית. אחריו אפשר לתת לסוכן לגעת בלקוחות.
- מניפסט לכל סוכן. עשר דקות לסוכן. משעמם, ובלעדיו אין על מה לנהל שיחה.
- רשימת כלים סגורה. בדרך כלל מסתדרת תוך כדי כתיבת המניפסט.
- הרשאות לפי המשתמש המפעיל. היקר ביותר להטמעה, ורלוונטי רק כשיש כמה משתמשים.
שלושת הראשונים הם יום עבודה אחד ביחד, והם מכסים את רוב הסיכון האמיתי. אם יש לכם אחר צהריים פנוי, זה מה שכדאי לעשות בו.
שלושה שדרוגים שמשנים סוכן
1. תקרה שנאכפת, לא התראה שנשלחת
התראה במייל היא לא תקרה. תקרה היא קוד שעוצר את הריצה. שני מונים מספיקים, ושניהם נבדקים בראש הלולאה.
const MAX_TURNS = 12;
const MAX_TOKENS = 120000;
let turns = 0;
let tokens = 0;
while (true) {
if (++turns > MAX_TURNS) throw new Error('agent: turn cap reached');
if (tokens > MAX_TOKENS) throw new Error('agent: token cap reached');
const res = await model.run(messages);
tokens += res.usage.input_tokens + res.usage.output_tokens;
if (!res.tool_calls?.length) return res;
messages.push(...await runTools(res.tool_calls));
}
המונה הראשון סופר סבבים ולא זמן. לולאה שנתקעת לא מתבטאת בזמן ארוך, אלא במספר סבבים שגדל בשקט. שם נשרף הכסף.
2. המודל לא רואה סוד
הסוד מוזרק ברגע קריאת הכלי ולא נטען לתוך ההקשר. המודל מבקש לשלוח מייל, השכבה שמתחת מצרפת את המפתח, המודל מקבל בחזרה את התוצאה. זה חוסם הזרקת פרומפט שמנסה לשלוף מפתחות, וגם מפתחות שדולפים ללוגים.
בדיקה מעשית: הדפיסו את מערך ההודעות שנשלח למודל בריצה אמיתית, וחפשו בו מחרוזת של מפתח. אם היא שם, זו הבעיה הראשונה לתקן.
3. הסוכן פועל בהרשאות מי שהפעיל אותו
כשמשתמש מבקש מהסוכן לשלוף נתונים, הסוכן ניגש למערכת בהרשאות של אותו משתמש ולא בהרשאות של עצמו. ההשלכה חדה: אי אפשר להשתמש בסוכן כדי לעקוף הרשאות.
בלי זה, כל סוכן שרץ עם מפתח שירות יחיד הוא מנגנון הסלמת הרשאות. זו נקודת הכשל הנפוצה במערכות שנבנות היום. בפרקטיקה זה אומר להעביר את הטוקן של המשתמש לשכבת הכלים, ולתת למדיניות הגישה של מסד הנתונים לעשות את העבודה.
טבלת האודיט
טבלה אחת. שורה לכל קריאת כלי. מכאן נגזר הכל: לדעת למה סוכן עשה משהו, לתמחר סוכן ללקוח מנתונים, ולזהות דפוס שחוזר ונכשל.
create table agent_runs (
id uuid primary key default gen_random_uuid(),
agent_slug text not null,
agent_version text not null,
run_id uuid not null,
turn int not null,
tool_name text,
input jsonb,
output jsonb,
approved_by text,
tokens_in int default 0,
tokens_out int default 0,
cost_usd numeric(10,4) default 0,
status text not null,
created_at timestamptz default now()
);
create index on agent_runs (agent_slug, created_at desc);
השדה שהכי קל לוותר עליו הוא זה שמתעד מי אישר. הוא זה שהופך את הטבלה מלוג טכני לשרשרת החלטות, וזו השאלה שלקוח ישאל.
בונה ומפעיל, אותו כיסא
יש כאן שני תפקידים ששווה להפריד ביניהם, גם כשהם יושבים על אותו אדם. הבונה שואל איך לגרום לזה לעבוד. המפעיל שואל האם מותר לזה לרוץ.
הכובע הראשון מנצח כמעט תמיד, כי רק הוא נותן סיפוק מיידי. אין דרך לתקן את זה במשמעת. הדרך היחידה היא להפוך את המניפסט לתנאי לפני שסוכן נוגע במשהו אמיתי. ברגע שהמניפסט הוא חלק מהבנייה, שאר השדות נסגרים כמעט לבד. קשה לכתוב שורה בשם "כלים מותרים" ולהשאיר אותה ריקה.
איך מעבירים את האודיט למישהו אחר
השיטה שווה יותר כשהיא לא נשארת אצלכם. מבנה של פגישה אחת בת 45 דקות, בלי הכנה מוקדמת מצד השני:
- חמש דקות: רשימה. שיספרו בקול את כל הסוכנים והאוטומציות שרצים אצלם. הרשימה כמעט תמיד ארוכה ממה שהם חשבו, וזה כבר חצי מהערך של הפגישה.
- עשר דקות: המודל. שבעת השדות. לא כתיאוריה אלא כטופס שממלאים.
- עשרים דקות: אודיט חי. בוחרים את הסוכן המסוכן ביותר ברשימה ועוברים עליו את שמונה השאלות, על המסך שלהם.
- עשר דקות: שלושה תיקונים. לא שמונה. שלושה, עם שם אחראי ותאריך.
מה שהופך את זה לשיחה טובה: האודיט לא מבקר את איכות הבנייה, אלא את מה שמסביב. מי שבנה את הסוכן לא נכנס להגנה. הבדל קטן בניסוח עם השפעה גדולה על מה שקורה בחדר.
אל תסיימו את הפגישה לפני שמישהו סימן מי הבעלים של כל סוכן ברשימה. הפעולה הזולה ביותר בכל התהליך, וזו שמונעת את מרבית ההפתעות.
ארבע טעויות שחוזרות
- התראה במקום תקרה. מייל שמגיע אחרי שהכסף נשרף הוא תיעוד.
- מפתחעל כברירת מחדל. מתחילים איתו כי הוא עובד, ולא חוזרים לצמצם. השורה המסוכנת ביותר ברוב הפרויקטים.
- אודיט שנרשם ולא נקרא. לוג שאף אחד לא שואל אותו שאלות הוא עלות אחסון. קבעו בדיקה שבועית של עשר דקות.
- החלת המודל על אוטומציה פשוטה. אם סדר הפעולות קבוע מראש, אין צורך ברוב השבע. בזבוז זמן שגורם לאנשים לזנוח את השיטה.
מה לקחת מכאן
המודל הזה הוא לא טכנולוגיה. אף רכיב בו לא בלתי אפשרי לבנייה, ולכן אין סיבה לקנות אותו. מה שכן צריך זה להפוך אותו לשלב חובה. סוכן בלי תקרה ובלי לוג הוא ניסוי שנשאר דלוק.
יש כאן גם זווית עסקית. ממשל סוכנים הוא נושא שארגונים בישראל יתחילו לשאול עליו בשנה הקרובה, ורובם עדיין לא יודעים שהם צריכים אותו. מי שיודע להעביר את האודיט הזה בפגישה של 45 דקות מחזיק שירות שכמעט אף אחד לא מוכר.
צעד ראשון להיום: בחרו סוכן אחד שרץ אצלכם, ענו עליו את שמונה השאלות, ותקנו את שלושת הראשונים בסדר התיקונים. אחר צהריים אחד.