چیت‌شیت

مهندسی بافتار و حافظه ایجنت

Context Engineering and Agent Memory

بودجه‌بندی پنجره، ترتیب‌دهی بافتار، صفحه‌بندی حافظه به داخل و خارج، تلفیق مخازن حافظه و پایدارسازی وضعیت ایجنت.

  • ۱۱ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. بودجه‌بندی پنجره‌ی بافتار
  2. اعدادی که اهمیت دارند
  3. سرهم‌بندی بافتار بر اساس هر پرسش
  4. ContextEngine.assemble
  5. سطح ابزار حافظه (Memory tool surface)
  6. مقایسه‌ی رویکردهای طراحی حافظه در کنار هم
  7. وظایف در قالب کد
  8. پروژه‌ی سرور حافظه
  9. پیش‌فرض‌ها
  10. عیب‌یابی
  11. پرسش‌ها

بودجه‌بندی پنجره‌ی بافتار

معماری
جا می‌گیرد یا کوتاه (truncate) می‌شودSystem promptحدود 500 توکن، در ابتدا قرار می‌گیردتعریف ابزارهاحدود 2 تا 8 هزار توکنبافتار بازیابی‌شدهحدود 2 تا 10 هزار توکنتاریخچه‌ی گفت‌وگوحدود 2 تا 20 هزار توکننمونه‌های Few-shotحدود 1 تا 3 هزار توکنپرسش کاربرحدود 100 تا 500 توکن، در انتها قرار می‌گیردبودجه‌ی تولید پاسخحدود 2 تا 8 هزار توکنپنجره‌ی بافتار128 هزار توکن

اعدادی که اهمیت دارند

مفهوم‌ها
گم شدن در میانه (Lost in the middle)
دقت 85 تا 90 درصد وقتی سند در ابتدا یا انتها باشد؛ دقت 60 تا 70 درصد در موقعیت 10 از 20.
منطقه‌ی افت
موقعیت‌های 40 تا 70 درصدی بافتار، 10 تا 20 درصد از دقت را از دست می‌دهند.
گلچین‌شده بهتر از فله‌ای است
یک بافتار 10 هزار توکنی گلچین‌شده اغلب از یک بافتار 100 هزار توکنی خام و فله‌ای بهتر عمل می‌کند.
هزینه‌ی ابزار
50 تا 200 توکن به ازای هر ابزار. 50 ابزار با میانگین 150 توکن معادل 7,500 توکن است.
هرس کردن ابزارها
توکن‌های ابزار را 60 تا 80 درصد کاهش می‌دهد.
تاریخچه
50 نوبت گفت‌وگو با میانگین 200 توکن یعنی 10,000 توکن.
خلاصه‌سازی
100 توکن جایگزین 10 نوبت گفت‌وگو می‌شود که قبلاً 2,000 توکن فضا می‌گرفتند.
تخمین توکن
تعداد کلمات ضربدر 1.3 در count_tokens.

سرهم‌بندی بافتار بر اساس هر پرسش

گام‌به‌گام
  1. طبقه‌بندی‌کنندهتابع classify_intent(query) تعداد تطابق کلمات کلیدی را در هر نیت می‌شمارد. در صورت عدم تطابق، خروجی ["code"] خواهد بود.
  2. انتخاب‌گر ابزارتابع select_tools(query, token_budget=2000) ابزارهایی را که دسته‌بندی آن‌ها مطابقت دارد نگه می‌دارد.
  3. بازیابتابع score_relevance(query, documents) میزان همپوشانی کلمات را امتیازدهی می‌کند. اسناد پایین‌تر از threshold حذف می‌شوند.
  4. بازترتیبتابع reorder_lost_in_middle(items, scores) بهترین آیتم‌ها را در ابتدا و انتها قرار می‌دهد.
  5. تاریخچهتا زمانی که تاریخچه فراتر از سقف باشد، ConversationManager دو نوبت گفت‌وگوی قدیمی‌تر را خلاصه می‌کند.
  6. بودجهکلاس ContextBudget هر بخش را متناسب با سقف آن و فضای باقی‌مانده کوتاه می‌کند.

ContextEngine.assemble

کد
python
budget = ContextBudget(max_tokens=128000, generation_reserve=4000)
budget.allocate("system_prompt", self.system_prompt, max_tokens=1000)
tools, tool_tokens = select_tools(query, token_budget=2000)
budget.allocate("tools", tool_text, max_tokens=2000)
budget.allocate("retrieved_context", doc_text, max_tokens=3000)
budget.allocate("conversation_history", history_text, max_tokens=5000)
budget.allocate("user_query", query, max_tokens=500)  # پرسش در انتها قرار می‌گیرد
print(budget.report())                                # توکن‌ها و درصد به ازای هر مؤلفه

سطح ابزار حافظه (Memory tool surface)

دستورها
دستورکاری که انجام می‌دهد
core_memory_append(section, text)در بخش پین‌شده‌ی پرامپت می‌نویسد
core_memory_replace(section, old, new)یک بخش پین‌شده را ویرایش می‌کند
archival_memory_insert(text)در مخزن خارجی قابل جست‌وجو می‌نویسد
archival_memory_search(query, top_k)فکت‌ها را برای نوبت گفت‌وگوی بعدی دوباره به بافتار بازمی‌گرداند (صفحه‌بندی به داخل)
conversation_search(query)نوبت‌های گفت‌وگوی گذشته، از جمله نوبت‌های بیرون‌رانده‌شده (evicted) را اسکن می‌کند
block_append(label, text)متن را به یک بلوک حافظه اضافه می‌کند
block_replace(label, old, new)یک بلوک حافظه را ویرایش می‌کند
block_summarize(label)بلوکی را که نزدیک به حد نصاب سقف خود باشد فشرده و خلاصه می‌کند

مقایسه‌ی رویکردهای طراحی حافظه در کنار هم

مقایسه
عاملمدل دو سطحی MemGPTبلوک‌های Lettaمدل ترکیبی Mem0حافظه‌ی مخزن (Repo memory)
مخازنبافتار اصلی به‌علاوه‌ی آرشیوهسته (core)، بازخوانی (recall)، آرشیوبرداری، KV و گراففایل‌های JSON تحت یک اسکیما
نوشتنفراخوانی ابزار حافظهابزارهای مبتنی بر بلوک و بازنویسی در محاسبات زمان خوابفراخوانی add(text, user_id, metadata) روی هر سه مخزناعتبارسنجی و سپس نوشتن اتمیک
خواندنarchival_memory_searchبلوک‌های هسته درون پرامپت باقی می‌مانندتابع search(query, user_id) امتیازها را تلفیق می‌کندبارگذاری و اعتبارسنجی
فکت‌های بیات و منسوخیکپارچه‌سازی نودها، بی‌اعتبارسازیایجنت محاسبات زمان خواب آن‌ها را بی‌اعتبار می‌کندیال قدیمی نامعتبر علامت‌گذاری می‌شود، نه اینکه حذف شودفلگ schema_version فایل‌های ناشناخته را رد می‌کند
ریسک اصلیپوسیدگی حافظه، مسموم‌سازی حافظهباد کردن بلوک، دریفت بی‌صداانحراف امبدینگ، انفجار ابعاد گرافنوشتن‌های ناقص و نیمه‌کاره
زمان استفادهحجم داده‌ها بزرگ‌تر از پنجره باشدبرخی فکت‌ها حتماً باید داخل پرامپت بمانندپرسش‌ها ترکیبی از شباهت، جست‌وجوی مستقیم و روابط باشندوضعیت باید بیشتر از نشست چت زنده بماند

وظایف در قالب کد

کار و کد
وظیفهکد
ایجاد یک بلوکcreate(label, description, limit=300)
بررسی شرایط بلوک برای خلاصه‌سازیblock.near_limit()
یکپارچه‌سازی خارج از مسیر بحرانیsleep.run(contradictions=[...])
حذف نرم (soft delete) یک فکت بیاتself.archival.invalidate(record.rid)
نوشتن در هر سه مخزنmem.add(text, user_id=..., kv_triples=...)
جست‌وجوی تلفیقی با تعیین دامنهmem.search(query, user_id=..., top_k=3)
پایدارسازی امن وضعیتatomic_write(path, content)
رد کردن یک نوشتن نامعتبر`mgr.commit(state)` raises `SchemaError`

پروژه‌ی سرور حافظه

دستورها
دستورکاری که انجام می‌دهد
python3 scripts/project_test.py memory-server --init <dir>میز کار شما را می‌سازد. کد اولیه‌ی دست‌نخورده با شکست مواجه می‌شود
python3 scripts/project_test.py memory-server --all --path <dir> --strictهر چهار مرحله را نمره‌دهی و ارزیابی می‌کند
node cli.ts --data-dir memory-data --put samples/memory.jsonنسخه‌ی 1 از cache-policy را اضافه می‌کند
node cli.ts --data-dir memory-data --query "cache policy"فضای نام docs را جست‌وجو می‌کند
node cli.ts --data-dir memory-data --put samples/memory-updated.json --revision 1نسخه‌ی 2 را اضافه می‌کند. ثبت مجدد نسخه‌ی 0 منجر به خطا و تداخل می‌شود
node cli.ts --data-dir memory-data --history cache-policy --html history.htmlتمام نسخه‌ها را چاپ کرده و یک جدول مقایسه‌ای می‌نویسد
node cli.ts --data-dir memory-data --serve --port 8788سرویس‌دهی از طریق REST و MCP؛ ابتدا مقدار MEMORY_TOKEN را تنظیم کنید

پیش‌فرض‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیح
max_tokens128000منهای 4000 توکن سهم generation_reserve
max_history_tokens5000نوبت‌های گفت‌وگوی قدیمی بالاتر از آن خلاصه شوند
token_budget2000سقف برای تعریف ابزارها
Relevance `threshold`0.05نسخه‌ی استفاده‌شده در مستندات از 0.1 استفاده می‌کند
max_messages4بافتار اصلی MemGPT؛ پیام‌های قدیمی‌تر به evicted منتقل می‌شوند
Block `limit`300بر حسب کاراکتر؛ آستانه‌ی near_limit روی 0.8 فعال می‌شود
w_relevance0.6ضریب w_importance برابر 0.2 و w_recency برابر 0.2
recency_halflife_s86400.0میزان تازگی به ازای هر نیمه‌عمر 0.5 است

عیب‌یابی

عیب‌یابی
  • مدل یک فکت در میانه را نادیده می‌گیرد

    علت
    گم شدن در میانه (Lost in the middle)
    راه‌حل
    فکت‌های کلیدی در ابتدا و پرسش در انتها قرار گیرد. نکته‌ی اصلی را در پایان تکرار کنید
  • ابزارها کل پنجره را پر می‌کنند

    علت
    ارسال همه‌ی ابزارها در تک‌تک فراخوانی‌ها
    راه‌حل
    نیت را طبقه‌بندی کرده و ابزارها را هرس کنید
  • بازیابی در میان فکت‌های بیات غرق می‌شود

    علت
    پوسیدگی حافظه
    راه‌حل
    یکپارچه‌سازی نودها و بی‌اعتبارسازی در فاز پردازش زمان خواب
  • ایجنت از یک یادداشت تزریق‌شده‌ی قدیمی اطاعت می‌کند

    علت
    مسموم‌سازی حافظه
    راه‌حل
    با حافظه‌ی بازیابی‌شده مانند متن غیرقابل اعتماد رفتار کنید
  • ایجنت موضوع را به یاد می‌آورد اما نمی‌تواند به منبع ارجاع دهد

    علت
    از دست رفتن ارجاع (Citation loss)
    راه‌حل
    شناسه‌ی نشست و شناسه‌ی نوبت گفت‌وگو را در هر نوشتن ذخیره کنید
  • بلوک به سقف تعیین‌شده می‌رسد

    علت
    باد کردن بلوک
    راه‌حل
    قبل از عملیات نوشتنی که باعث رد شدن از سقف می‌شود خلاصه‌سازی کنید
  • یک کاربر فکت‌های مربوط به کاربر دیگری را می‌بیند

    علت
    تداخل و ادغام دامنه‌ها
    راه‌حل
    برای هر بار نوشتن یک دامنه‌ی مشخص تعیین کنید
  • نشست روی یک وضعیت مخدوش از سر گرفته می‌شود

    علت
    نوشتن غیراتمیک
    راه‌حل
    استفاده از فایل موقت، fsync و os.replace

پرسش‌ها

پرسش و پاسخ
پنجره‌ی بزرگ‌تر، بدون نیاز به حافظه؟
خطوط مبنا با پنجره‌ی 128 هزار توکنی باز هم فکت‌های دوردست در افق زمانی طولانی را از دست می‌دهند، در حالی که یک ایجنت با پنجره‌ی 4 هزار توکنی مجهز به حافظه‌ی خارجی آن‌ها را پیدا می‌کند.
چرا محاسبات زمان خواب؟
نوبت‌های گفت‌وگوی اصلی معطل نمی‌مانند. ایجنت زمان خواب می‌تواند از مدلی قوی‌تر و کندتر استفاده کند.
چرا سه مخزن؟
یک مخزن واحد برای دو مورد از سه دسته‌ی اصلی پرسش‌ها پاسخگوی نیاز نیست.
رتبه‌بندی تلفیقی چگونه کار می‌کند؟
یک مجموع وزن‌دار از میزان ارتباط، اهمیت و تازگی؛ که وزن‌ها بر اساس نوع محصول تغییر می‌کنند.
چه چیزهایی داخل حافظه‌ی مخزن قرار می‌گیرد؟
شناسه‌ی وظیفه، فایل‌های تغییریافته، فرضیات، موانع و اقدام بعدی؛ نه متن خام رونوشت گفت‌وگوها.