قبلاً فکر می‌کردم ساختن یک عامل هوش مصنوعی (AI agent) اساساً همان کارِ پرامپت‌نویسی برای یک چت‌بات است. سؤال را خوب مطرح می‌کنید، مدل پاسخ می‌دهد و کار تمام است. اما وقتی چند اپلیکیشن را عرضه کردم، با واقعیت تلخی روبرو شدم. یک LLM یک عامل نیست. یک LLM فقط توکن بعدی را پیش‌بینی می‌کند. این «حلقه» (loop) است که یک عامل را می‌سازد.

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

چرخه‌ای که عاملیت را می‌سازد

این حلقه یک تئوری انتزاعی نیست؛ بلکه ضربان عملیاتی هر سیستمی است که از طرف شما اقدام می‌کند. در عمل، این چرخه به این صورت است:

  • تفکر (Think): مدل درباره هدف استدلال می‌کند و تصمیم می‌گیرد به چه چیزی نیاز دارد. کاربر می‌پرسد: «آیا فردا باید با خودم چتر به پورتلند ببرم؟» مدل تشخیص می‌دهد که به پیش‌بینی هواشناسی و یک موقعیت مکانی نیاز دارد.
  • عمل (Act): مدل یک ابزار را فراخوانی می‌کند. ممکن است یک API مربوط به ژئوکدینگ را برای مشخص کردن "Portland" فراخوانی کند و سپس با استفاده از مختصات، به یک نقطه پایانی (endpoint) هواشناسی درخواست بفرستد.
  • مشاهده (Observe): مدل خروجی ابزار را می‌خواند. آیا API یک پیش‌بینی JSON برگرداند، یا خطای 403 داد، یا یک صفحه HTML مربوط به تعمیرات را نمایش داد؟
  • به‌روزرسانی (Update): بر اساس آنچه می‌بیند، مدل برنامه خود را اصلاح می‌کند. اگر ژئوکودر به جای Portland, Oregon، عبارت Portland, Maine را برگرداند، مدل باید ابهام‌زدایی کند. اگر API از دسترس خارج شده باشد، ممکن است به یک منبع جایگزین سوئیچ کند یا از کاربر سوال بپرسد.
  • بازگشت به تفکر (Think Again): چرخه با بافت (context) جدید دوباره شروع می‌شود.

این‌ها پنج تابع مجزا نیستند که یک بار بنویسید و فراموش کنید. این یک موتور مداوم است که تا رسیدن به هدف یا فعال شدن یک توقف اجباری، در حال اجراست. مدل مانند یک اسکریپت، کد را اجرا نمی‌کند؛ بلکه درباره وضعیت جهان استدلال می‌کند، یک اقدام را انتخاب می‌کند، پیامد آن را می‌خواند و تصمیم می‌گیرد قدم بعدی چیست. تفاوت بین یک تکمیل‌کننده متن (autocomplete) پیشرفته و عاملی که کار را به پایان می‌رساند، در همین است.

چرا همه فریم‌ورک‌ها شبیه هم به نظر می‌رسند

اگر با LangGraph، CrewAI یا AutoGen کار کرده باشید، احتمالاً متوجه شده‌اید که مرز بین آن‌ها کم‌رنگ می‌شود. LangGraph جریان کار را به صورت یک گراف پایدار از گره‌ها (nodes) و یال‌ها (edges) مدل‌سازی می‌کند. CrewAI عامل‌ها را در قالب نقش‌ها و گروه‌ها (crews) سازماندهی می‌کند. AutoGen گفتگوهای چندعاملی را هماهنگ می‌کند. بسته‌بندی متفاوت، اما استخوان‌بندی یکسان.

آن‌ها شبیه هم به نظر می‌رسند چون همگی حول همین اصلِ حلقه‌ای مهندسی شده‌اند. LangGraph صراحتاً چرخه را به عنوان انتقال وضعیت بین فراخوانی ابزارها و استنتاج‌های مدل ساختاردهی می‌کند. CrewAI حلقه را درون عامل‌های نقش‌محور می‌پیچد، اما هر عضو گروه همچنان مراحل برنامه‌ریزی، عمل و مشاهده را طی می‌کند. AutoGen پیام‌ها را بین بازیگران میانجی‌گری می‌کند، اما هر نوبت همچنان گونه‌ای از تولید، اجرا، تأمل و مسیریابی است.

این فریم‌ورک‌ها بر روی حلقه تمرکز دارند، زیرا عاملیت در همان‌جا نهفته است. مدل زیرساختی می‌تواند GPT-4، Claude یا یک مدل متن‌بازِ Fine-tuned باشد. بدون حلقه، شما فقط یک تکمیل‌کننده جملات بسیار گران‌قیمت دارید. با حلقه، شما سیستمی دارید که می‌تواند در طول چندین تلاش، برای رسیدن به یک هدف پایداری کند.

وقتی کار واقعی شروع می‌شود

دموهای محلی جادویی به نظر می‌رسند، اما در محیط عملیاتی (Production) است که جادو با آشفتگی روبرو می‌شود. وقتی از مرحله نمونه‌سازی فراتر می‌روید، دیگر مسائل هوش مصنوعی را حل نمی‌کنید، بلکه شروع به حل مسائل مهندسی سیستم می‌کنید.

شکست ابزارها اجتناب‌ناپذیر است. APIها با تایم‌اوت مواجه می‌شوند. JSONهای ناقص برمی‌گردانند. یا خطاهای 500 را در قالب HTML پرتاب می‌کنند. اگر حلقه شما کورکورانه به هر خروجی ابزار اعتماد کند، عامل شما یا موفقیت را توهم می‌زند و یا در گرداب سردرگمی فرو می‌رود. شما به منطق بازگشت (retry logic)، قطع‌کننده‌های مدار (circuit breakers) و اعتبارسنجی اسکیما (schema validation) روی هر پاسخ دریافتی نیاز دارید.

حافظه کهنه می‌شود. عامل شما به خاطر دارد که پایگاه داده مورد علاقه کاربر PostgreSQL است، اما تیم زیرساخت دیشب به یک کلاستر جدید مهاجرت کرده است. بدون مکانیزمی برای تازه کردن یا منقضی کردن بافت (context)، عامل با اطمینان دستوراتی را به سمت نقاط پایانی از کار افتاده صادر می‌کند. حافظه به برچسب زمانی، امتیاز اطمینان و توانایی ابطال خود نیاز دارد.

حلقه‌های بی‌نهایت، قاتلان خاموش هستند. یک عامل در وب جستجو می‌کند، چیز مفید پیدا نمی‌کند، پرس‌وجو (query) را کمی اصلاح می‌کند، دوباره جستجو می‌کند، باز هم چیزی پیدا نمی‌کند و این روند را تکرار می‌کند. بدون تعیین سقف حداکثر تکرار یا تشخیص تکرار معنایی، عامل در حالی که کاربر منتظر است، توکن و پول مصرف می‌کند. شما باید حفاظ‌هایی بسازید: محدودیت‌های سختگیرانه برای تلاش مجدد، بررسی انحراف و مسیرهای ارجاع به انسان.

داده‌های نامرتبط، استدلال را مختل می‌کنند. خط لوله‌های تولید مبتنی بر بازیابی (Retrieval-Augmented Generation) اغلب پنجاه پاراگراف از مستنداتِ به‌طور مبهم مرتبط را در پنجره بافت (context window) می‌ریزند. عامل (agent) در میان این حجم از نویزها گیر می‌کند و ابزار اشتباهی را انتخاب می‌کند یا یک پارامتر را توهم می‌زند. شما پیش از آنکه مدل با متن بازیابی‌شده مواجه شود، به فیلتر کردن، رتبه‌بندی و خلاصه‌سازی موجز نیاز دارید.

یک عامل به چیزی فراتر از هوش نیاز دارد. او به یک سیستم نیاز دارد: حافظه مدیریت‌شده، ردیابی صریح وضعیت، نرده‌های حفاظتی (guardrails) سخت‌گیرانه و تله‌متری قابل مشاهده. هرچه مدل بهتر باشد، آن سیستمِ پیرامونی نیز باید بهتر باشد. یک مدل قدرتمند در درون یک حلقه شکننده، فقط شکست‌های متقاعدکننده‌تری تولید می‌کند.

اتمام کار

هوش واقعی در عامل‌ها، در رسیدن به اولین پاسخ درست نیست؛ بلکه در پیمودن شکاف میان قصد و نتیجه، در زمانی است که هیچ‌چیز طبق برنامه پیش نمی‌رود. تلاش اول آسان است. هر کسی می‌تواند یک مسیر ایده‌آل (happy path) را کدنویسی کند. بخش دشوار، تکرار چهارم است؛ زمانی که API اصلی از کار افتاده، پنجره بافت در حال کوچک شدن است، کاربر بی‌صبر شده و عامل همچنان باید چیزی مفید ارائه دهد.

همین پایداری است که یک نسخه نمایشی (demo) را از یک محصول متمایز می‌کند. این تواناییِ یادگیری از هر قدم است، نه از طریق به‌روزرسانی وزن‌های مدل در لحظه، بلکه از طریق به‌روزرسانی برنامه. عامل، هدف را ثابت نگه می‌دارد در حالی که تاکتیک‌ها تغییر می‌کنند. این همان «اصل حلقه‌وار» (looping principle) در عمل است.

بنابراین، آیا آینده متعلق به مدل‌های بزرگ‌تر است یا به حلقه‌های اجرای بهتر؟ مقیاس قطعاً کمک می‌کند. یک مدل توانمندتر، در هر چرخه بهتر استدلال می‌کند. اما یک مدل کوچک‌تر که در یک حلقه منسجم، قابل مشاهده و منعطف اجرا می‌شود، تقریباً همیشه از یک مدل غول‌پیکر که از آن خواسته شده همه چیز را در یک مرحله حل کند، بهتر عمل خواهد کرد. این حلقه است که پیش‌بینی را به عمل تبدیل می‌کند. روی آن سرمایه‌گذاری کنید.

منبع: The Looping Principle: A Simple Mental Model for Understanding AI Agents

برای بحث‌های بیشتر از این دست، به جامعه یادگیری GyaanSetu در تلگرام بپیوندید.