המודל העדכני ביותר שלנו, Claude 3.5 Sonnet המשודרג, הגיע ל-49% במדד SWE-bench Verified, הערכת ביצועים בהנדסת תוכנה, ועקף את מודל החזית הקודם שעמד על 45%. פוסט זה מסביר את ה"סוכן" שבנינו סביב המודל, ונועד לעזור למפתחים למצות את הביצועים הטובים ביותר האפשריים מ-Claude 3.5 Sonnet.
SWE-bench הוא מדד ביצועים להערכת AI, הבוחן את יכולתו של מודל להשלים משימות הנדסת תוכנה אמיתיות. באופן ספציפי, הוא בודק כיצד המודל יכול לפתור בעיות GitHub ממאגרי Python פופולריים בקוד פתוח. עבור כל משימה במדד, מודל ה-AI מקבל סביבת Python מוכנה ועותק עבודה מקומי של המאגר (checkout) מהרגע שלפני פתרון הבעיה. לאחר מכן, המודל צריך להבין, לשנות ולבדוק את הקוד לפני הגשת הפתרון המוצע שלו.
כל פתרון נבדק מול בדיקות היחידה האמיתיות מבקשת המשיכה (pull request) שסגרה את בעיית ה-GitHub המקורית. זה בודק האם מודל ה-AI הצליח להשיג את אותה פונקציונליות כמו המחבר האנושי המקורי של בקשת המשיכה.
SWE-bench אינו מעריך רק את מודל ה-AI בבידוד, אלא מערכת "סוכן" שלמה. בהקשר זה, "סוכן" מתייחס לשילוב של מודל AI עם הפיגומים (scaffolding) התוכנתיים הסובבים אותו. פיגומים אלו אחראים על יצירת הפרומפטים הנכנסים למודל, ניתוח פלט המודל לצורך ביצוע פעולה, וניהול לולאת האינטראקציה שבה תוצאת הפעולה הקודמת של המודל משולבת בפרומפט הבא שלו. ביצועי סוכן ב-SWE-bench יכולים להשתנות באופן משמעותי בהתאם לפיגומים הללו, גם כאשר נעשה שימוש באותו מודל AI בסיסי.
קיימים מדדי ביצועים רבים אחרים ליכולות הקידוד של מודלי שפה גדולים, אך SWE-bench צבר פופולריות מכמה סיבות:
- הוא משתמש במשימות הנדסיות אמיתיות מפרויקטים קיימים, ולא בשאלות בסגנון תחרות או ראיון;
- הוא עדיין אינו רווי – יש הרבה מקום לשיפור. אף מודל עדיין לא חצה את רף 50% ההשלמה ב-SWE-bench Verified (אם כי Claude 3.5 Sonnet המעודכן עומד, נכון לכתיבת שורות אלה, על 49%);
- הוא מודד מערכת "סוכן" שלמה, ולא מודל בבידוד. מפתחי קוד פתוח וסטארט-אפים הצליחו מאוד באופטימיזציה של פיגומים כדי לשפר באופן ניכר את הביצועים סביב אותו מודל.
יש לציין כי מערך הנתונים המקורי של SWE-bench מכיל משימות מסוימות שאינן ניתנות לפתרון ללא הקשר נוסף מחוץ לבעיית ה-GitHub (לדוגמה, לגבי הודעות שגיאה ספציפיות שיש להחזיר). SWE-bench-Verified הוא תת-קבוצה של 500 בעיות מתוך SWE-bench שנבדקה על ידי בני אדם כדי לוודא שהן ניתנות לפתרון, ובכך מספק את המדד הברור ביותר לביצועי סוכני קידוד. זהו מדד הביצועים שאליו נתייחס בפוסט זה.
השגת רף הביצועים המוביל
סוכן המשתמש בכלים
פילוסופיית העיצוב שלנו בעת יצירת פיגומי הסוכן שעברו אופטימיזציה עבור Claude 3.5 Sonnet המעודכן הייתה להעניק כמה שיותר שליטה למודל השפה עצמו, ולשמור על פיגומים מינימליים. לסוכן יש פרומפט, כלי Bash לביצוע פקודות bash, וכלי עריכה לצפייה ועריכה של קבצים וספריות. אנו ממשיכים לדגום עד שהמודל מחליט שהוא סיים, או חורג מאורך חלון ההקשר שלו (200 אלף טוקנים). פיגומים אלו מאפשרים למודל להשתמש בשיקול דעתו כיצד לפתור את הבעיה, במקום להיות מקודד מראש לתבנית או זרימת עבודה ספציפית.
הפרומפט מתווה גישה מוצעת למודל, אך הוא אינו ארוך מדי או מפורט יתר על המידה עבור משימה זו. המודל חופשי לבחור כיצד הוא עובר משלב לשלב, במקום שיהיו לו מעברים קפדניים ודיסקרטיים. אם אינכם רגישים למספר הטוקנים, ניתן לעודד את המודל במפורש לייצר תגובה ארוכה.
הקוד הבא מציג את הפרומפט מתוך פיגומי הסוכן שלנו:
<uploaded_files>
{location}
</uploaded_files>
I've uploaded a python code repository in the directory {location} (not in /tmp/inputs). Consider the following PR description:
<pr_description>
{pr_description}
</pr_description>
Can you help me implement the necessary changes to the repository so that the requirements specified in the <pr_description> are met?
I've already taken care of all changes to any of the test files described in the <pr_description>. This means you DON'T have to modify the testing logic or any of the tests in any way!
Your task is to make the minimal changes to non-tests files in the {location} directory to ensure the <pr_description> is satisfied.
Follow these steps to resolve the issue:
1. As a first step, it might be a good idea to explore the repo to familiarize yourself with its structure.
2. Create a script to reproduce the error and execute it with `python <filename.py>` using the BashTool, to confirm the error
3. Edit the sourcecode of the repo to resolve the issue
4. Rerun your reproduce script and confirm that the error is fixed!
5. Think about edgecases and make sure your fix handles them as well
Your thinking should be thorough and so it's fine if it's very long.
הכלי הראשון של המודל מבצע פקודות Bash. הסכמה פשוטה, ומקבלת רק את הפקודה שיש להריץ בסביבה. עם זאת, לתיאור הכלי יש משקל רב יותר. הוא כולל הוראות מפורטות יותר עבור המודל, כולל בריחת קלט (escaping inputs), היעדר גישה לאינטרנט, וכיצד להריץ פקודות ברקע.
לאחר מכן, אנו מציגים את המפרט עבור כלי ה-Bash:
{
"name": "bash",
"description": "Run commands in a bash shell\n\n* When invoking this tool, the contents of the \"command\" parameter does NOT need to be XML-escaped.\n\n* You don't have access to the internet via this tool.\n\n* You do have access to a mirror of common linux and python packages via apt and pip.\n\n* State is persistent across command calls and discussions with the user.\n\n* To inspect a particular line range of a file, e.g. lines 10-25, try 'sed -n 10,25p /path/to/the/file'.\n\n* Please avoid commands that may produce a very large amount of output.\n\n* Please run long lived commands in the background, e.g. 'sleep 10 &' or start a server in the background.",
"input_schema": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "The bash command to run."
}
},
"required": ["command"]
}
}
הכלי השני של המודל (כלי העריכה) מורכב בהרבה, ומכיל את כל מה שהמודל צריך לצפייה, יצירה ועריכה של קבצים. שוב, תיאור הכלי שלנו מכיל מידע מפורט עבור המודל על אופן השימוש בכלי.
השקענו מאמץ רב בתיאורים ובמפרטים של כלים אלו עבור מגוון רחב של משימות סוכני. בדקנו אותם כדי לחשוף כל דרך שבה המודל עלול להבין לא נכון את המפרט, או את המלכודות האפשריות בשימוש בכלים, ולאחר מכן ערכנו את התיאורים כדי למנוע בעיות אלו. אנו מאמינים כי יש להקדיש תשומת לב רבה יותר לעיצוב ממשקי כלים למודלים, באותה מידה שמוקדשת תשומת לב רבה לעיצוב ממשקי כלים לבני אדם.
הקוד הבא מציג את התיאור עבור כלי העריכה שלנו:
{
"name": "str_replace_editor",
"description": "Custom editing tool for viewing, creating and editing files\n\n* State is persistent across command calls and discussions with the user\n\n* If `path` is a file, `view` displays the result of applying `cat -n`. If `path` is a directory, `view` lists non-hidden files and directories up to 2 levels deep\n\n* The `create` command cannot be used if the specified `path` already exists as a file\n\n* If a `command` generates a long output, it will be truncated and marked with `<response clipped>` \n\n* The `undo_edit` command will revert the last edit made to the file at `path`\n\n\n
Notes for using the `str_replace` command:\n\n* The `old_str` parameter should match EXACTLY one or more consecutive lines from the original file. Be mindful of whitespaces!\n\n* If the `old_str` parameter is not unique in the file, the replacement will not be performed. Make sure to include enough context in `old_str` to make it unique\n\n* The `new_str` parameter should contain the edited lines that should replace the `old_str`",
...
אחת הדרכים שבהן שיפרנו את הביצועים הייתה "לאטום שגיאות" (error-proof) בכלי העבודה שלנו. לדוגמה, לפעמים מודלים עלולים לטעות בנתיבי קבצים יחסיים לאחר שהסוכן עבר מחוץ לספריית השורש. כדי למנוע זאת, פשוט חייבנו את הכלי תמיד לדרוש נתיב מוחלט.
ערכנו ניסויים עם מספר אסטרטגיות שונות לציון עריכות בקבצים קיימים, והשגנו את האמינות הגבוהה ביותר עם החלפת מחרוזות, כאשר המודל מציין את `old_str` שיש להחליף ב-`new_str` בקובץ הנתון. ההחלפה תתבצע רק אם יש התאמה אחת בדיוק ל-`old_str`. אם יש יותר או פחות התאמות, המודל מקבל הודעת שגיאה מתאימה כדי שיוכל לנסות שוב.
המפרט עבור כלי העריכה שלנו מוצג להלן:
...
"input_schema": {
"type": "object",
"properties": {
"command": {
"type": "string",
"enum": ["view", "create", "str_replace", "insert", "undo_edit"],
"description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`."
},
"file_text": {
"description": "Required parameter of `create` command, with the content of the file to be created.",
"type": "string"
},
"insert_line": {
"description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`.",
"type": "integer"
},
"new_str": {
"description": "Required parameter of `str_replace` command containing the new string. Required parameter of `insert` command containing the string to insert.",
"type": "string"
},
"old_str": {
"description": "Required parameter of `str_replace` command containing the string in `path` to replace.",
"type": "string"
},
"path": {
"description": "Absolute path to file or directory, e.g. `/repo/file.py` or `/repo`.",
"type": "string"
},
"view_range": {
"description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file.",
"items": {
"type": "integer"
},
"type": "array"
}
},
"required": ["command", "path"]
}
}
תוצאות
באופן כללי, Claude 3.5 Sonnet המשודרג מפגין יכולות חשיבה, קידוד ומתמטיקה גבוהות יותר ממודלים קודמים שלנו, וכן מודל החזית הקודם. הוא גם מדגים יכולות סוכני משופרות: הכלים והפיגומים עוזרים לנצל את היכולות המשופרות הללו בצורה הטובה ביותר.



