זיכרון וידע
למה נועד הזיכרון
קטע בשם “למה נועד הזיכרון”בלי זיכרון, כל שיחה עם סוכן מתחילה מאפס: אותה מוסכמה צריכה להיות מוסברת מחדש, אותה החלטה נדונה מחדש, אותו מבוי סתום נחקר מחדש. הזיכרון הוא המאגר ברמת סביבת העבודה ששורד הרצות, והוא קיים כדי שידע שאחד הסוכנים הפיק יהיה ניתן למציאה בידי סוכן אחר, מאוחר יותר.
יש לו שלוש שכבות, והן עונות על שאלות שונות:
- עובדות — מה נכון (מוסכמה, תוצאה, החלטה).
- מדיניות — מה הסוכנים חייבים לעשות בקשר לזה (כלל נורמטיבי).
- זיכרון עבודה — מה סוכן אחד היה באמצעו.
ההבחנה חשובה מפני שהן מגיעות לסוכן בדרכים שונות. עובדות מחפשים. מדיניות נדחפת. זיכרון עבודה הוא פרטי.
עובדות
קטע בשם “עובדות”MemoryFact הוא יחידת ידע המשויכת לסביבת עבודה ולתחום.
| מאפיין | מהו |
|---|---|
domain |
תחום הידע (“conventions”, “decisions”, “codebase”) |
topic |
תווית נושא קצרה |
content |
טקסט הידע |
confidence |
0.0–1.0, מאותחל מהמקור ועולה עם אזכור חוזר |
memoryType |
סוג העובדה — מניע את עקומת הדעיכה הזמנית שלה |
veracity |
כיצד נודעה — מזריע את הביטחון וקובע את גודל התוספת בכל אזכור חוזר |
sourceObservationIds |
אילו תצפיות הובילו אליה |
supersededBy |
העובדה החדשה שהחליפה אותה, אם יש |
validUntil, recallCount, mentionCount |
אותות תפוגה ושימוש שנעשה בהם בשליפה |
שתי השורות האחרונות הן אלה שאנשים מפספסים, והן מה שקובע איזו עובדה תצוף.
memoryType נושא פרמטרי דעיכת Weibull לכל סוג, כך שהתחייבות תחומה בזמן דועכת
מהר בעוד עובדת פרופיל יציבה אינה דועכת. veracity מתעד את המקור — נאמרה בידי
אדם (משקל 1.0), הוסקה בידי סוכן (0.7), הופקה בידי כלי (0.5), יובאה (0.6) —
והמשקל הזה מזריע את ביטחון הפתיחה של העובדה.
עובדות לעולם אינן נערכות במקום כשסותרות אותן. כתיבת עובדה מפעילה זיהוי התנגשויות מול עובדות באותו תחום ובאותו נושא ומחליפה את המפסידה, תוך רישום שורת התנגשות. שובל הביקורת הוא העיקר: תמיד אפשר לראות מה האמינו קודם ומה החליף את זה.
מדיניות
קטע בשם “מדיניות”MemoryPolicy הוא כלל נורמטיבי שנגזר מעובדות, משויך לסביבת עבודה ולתחום, עם
דגל פעיל ו-requiredRole אופציונלי.
כל מדיניות פעילה בסביבת העבודה מוזרקת לכל שליחה, בלי סינון — אין
סינון לפי תחום, תפקיד, משימה או מרחב. כדאי לדעת זאת לפני שכותבים את המדיניות
העשרים, כי מדיניות מתחרה על אותו חלון הקשר כמו המשימה. זו גם הסיבה ש-
requiredRole במדיניות הוא מייעץ: הוא מתאר למי מיועד הכלל, אבל אינו מונע
מהכלל להגיע לכל האחרים.
תחומים
קטע בשם “תחומים”MemoryDomain מקבץ עובדות ומדיניות בתוך סביבת עבודה. תחומים נותנים לידע מבנה
ארגוני והם היחידה שכנגדה נכתבות הענקות גישה — אבל ראו את האזהרה שלהלן לפני
שאתם מתייחסים לתחום כאל גבול סודיות.
תחום הוא או ברמת סביבת העבודה כולה (architecture) או משויך למאגר אחד
(repo:<slug>/architecture). אותו שם בשני ההיקפים הוא שני מאגרים בלתי
תלויים: עובדה שנכונה לגבי בסיס קוד אחד אינה דורסת את זו שברמת סביבת העבודה.
search_memory והפתיח של השליחה מדרגים זיכרון המשויך למאגר ראשון כשהסוכן עובד
במאגר הזה; הם אינם מסננים החוצה את השאר. העבירו repo ל-propose_fact /
propose_policy / search_memory כדי לכתוב או לחזק את ההיקף הזה.
בקרת הגישה היא כשל פתוח בקריאות
קטע בשם “בקרת הגישה היא כשל פתוח בקריאות”MemoryAccessGrant ממפה תפקיד סוכן ותחום לאחת משלוש רמות הרשאה:
| הרשאה | משמעות |
|---|---|
none |
אין גישה |
read |
אפשר לחפש ולשלוף עובדות |
write |
נדרשת ב-propose_policy. כתיבת עובדות (propose_fact, supersede_fact) אינה מותנית בהענקת גישה |
האסימטריה — רכה בקריאות, נוקשה בכתיבת מדיניות — היא החלפה מכוונת. הזיכרון מועיל
ביותר כשהוא זורם, וסירוב קריאה מייצר סוכן שיודע פחות בשקט במקום סוכן שמדווח על
בעיה. לעומת זאת, סירוב כתיבת מדיניות הוא קולני וניתן לתיקון, ולכן שם יושבת
האכיפה. תחום חדש שנוצר מזריע write לכל תפקיד; הידוקו לאחר מכן הוא עריכה
ב-RPC בלבד, כי אין ממשק להענקות.
זיכרון עבודה
קטע בשם “זיכרון עבודה”לכל סוכן יש AgentWorkingMemory: פנקס רשימות בטקסט חופשי שממופתח לפי סביבת
עבודה וסוכן. הוא נשמר בין הרצות, פרטי לאותו סוכן, ומוזרק להנחיה שלו בכל שליחה.
שם חי “הייתי באמצע רפקטורינג של האימות” — המצב ששווה לשאת להרצה הבאה אבל לא
שווה לקדם לעובדה עמידה.
מה באמת מגיע להנחיה של הסוכן
קטע בשם “מה באמת מגיע להנחיה של הסוכן”בעת השליחה, הפתיח של הזיכרון מורכב משלושה דברים בדיוק:
- כל מדיניות פעילה בסביבת העבודה, כשורות
- [domain] rule. - זיכרון העבודה של הסוכן עצמו, מילה במילה.
- רשימה קצרה של עובדות שהותאמו לפי מילות מפתח למשימה הזו — חמש לכל היותר, בתקציב של כ-1,200 תווים, ורק כאשר תיאור המשימה באורך של 20 תווים לפחות. משימות קצרות יותר לא מקבלות עובדות בכלל.
הרשימה הקצרה מבוססת FTS/מילות מפתח בלבד והיא מוגבלת בכוונה. הטמעת שאילתה היא
איטית ונתיב השליחה הוא המקום היחיד שבו השהיה נראית מיד, ולכן הנתיב הסמנטי האיטי
מוחזק ממנו החוצה במכוון. הפתיח נחתם בהוראה לסוכן לאמת פריטים נושאי משקל עם
search_memory, ושם חי מודל השליפה המלא.
בנתיב הזה לא מתייעצים עם הענקות גישה. מה שהרשימה הקצרה מוצאת הוא מה שהסוכן רואה.
שליפה: שאילתה אחת, ארבעה קולות
קטע בשם “שליפה: שאילתה אחת, ארבעה קולות”לכלי search_memory הפונה לסוכן יש שלושה מצבים, והם באמת חיפושים שונים:
keyword— FTS5 בלבד.semantic— תוצאות BM25 ווקטוריות ממוזגות במיזוג דירוגים הופכי.hybrid(ברירת המחדל) — שליפה פוליפונית: ארבעה קולות מדורגים שממוזגים יחד ואז מגוונים.
ארבעת הקולות הם לקסיקלי (FTS), סמנטי (KNN וקטורי), זמני (עובדות פעילות אחרונות) וגרף — הליכה של שתי קפיצות על קצוות אפיזודיים מנקודות הזרע הלקסיקליות והסמנטיות החזקות ביותר. קול הגרף הוא הסיבה לכך שקצוות אפיזודיים קיימים בכלל: הוא מציף את העובדה שמקושרת לתשובה שלכם בלי להתאים לאף אחת מהמילים שלכם. הקולות נשקלים לפי כוונת שאילתה מסווגת (לסמנטי המשקל הגדול ביותר כברירת מחדל, אחריו גרף ולקסיקלי, ואז עדכניות), הניקוד של כל מועמד מוכפל בדעיכת ה-Weibull שלו, וקבוצת התוצאות מגוונת לפי MMR כך שחמש חזרות של עובדה אחת לא ידחקו ארבע עובדות שונות.
חיפוש הזיכרון בשולחן העבודה ובווב הוא נתיב נפרד ופשוט יותר: פעולת ה-RPC
memory_fact.search היא FTS5 בלבד, כי לקוח דק אינו יכול לשלוח הטמעת שאילתה
והנתיב ההיברידי נשאר פנימי למארח. לכן הדירוג שאתם רואים בדפדפן הזיכרון אינו
הדירוג שסוכן מקבל מ-search_memory. זה צפוי, ולא תקלה, אבל זה כן אומר
ש“חיפשתי ולא מצאתי” בממשק אינו ראיה שהסוכן לא ימצא.
היכן הזיכרון חי ומי כותב אותו
קטע בשם “היכן הזיכרון חי ומי כותב אותו”דפדפן הזיכרון נמצא בהגדרות ← סביבת עבודה ← זיכרון
(/workspaces/<id>/settings/memory), עם הלשוניות עובדות, כללי מדיניות וגרף
ידע.
יש שם אסימטריה שמפתיעה אנשים: אפשר לערוך ולמחוק זיכרון, אבל אי אפשר ליצור
אותו. לא ללשונית עובדות ולא ללשונית כללי מדיניות יש אמצעי הוספה. הכתיבה היא
בצד הסוכן, דרך propose_fact ו-propose_policy (supersede_fact /
supersede_policy כדי להחליפן). remember כותב פריט בשכבה החמה שתחום לסשן,
ש-consolidate_memory עשוי לקדם בהמשך לעובדה; record_observation
ו-update_my_notes כותבים את הפנקס הפרטי שמוזרק בשליחה. הדפדפן הוא משטח סקירה
ותיקון, לא משטח כתיבה — כך שאם אתם רוצים עובדה בזיכרון, הדרך להכניס אותה לשם
היא לספר לסוכן.
שתי פעולות תחזוקה מופעלות אף הן בידי הסוכן ולא לפי תזמון: consolidate_memory
מאחד ומגזם עובדות שנצברו, ו-harmonize_memory מיישב אמונות שהתפצלו בין סוכנים.
list_memory_conflicts מציג מה שזיהוי ההתנגשויות כבר רשם. שום דבר לא מריץ אותן
עבורכם לפי טיימר. החלטות מפגישות נאספות אל תחום decisions כאשר שלב שמירת
פגישה רושם אותן; זה אינו טיימר על הרצות סוכן שהושלמו.
מושגים קשורים
קטע בשם “מושגים קשורים”- מודל הסוכן: תפקידים הם מה שכנגדו נכתבות הענקות גישה
- סביבות עבודה ובידוד: הזיכרון משויך לסביבת עבודה וחי בקובץ מסד הנתונים של אותה סביבה
- ניהול זיכרון סביבת העבודה: עבודה עם זיכרון בפועל