عاملهای شما خوب هستند، اما انتقال بین آنها نه.
بیشتر دموهای چندعاملی (multi-agent) یک عامل واحد را نشان میدهند که در حال ایفای نقش است. آنها نشان میدهند که عامل A وظیفهای را انجام میدهد و سپس عامل B وظیفه دیگری را. آنها نشان نمیدهند که وقتی عامل A نمیتواند آنچه را که عامل B نیاز دارد به او بدهد، چه اتفاقی میافتد.
من امسال سه سیستم چندعاملی را در محیط عملیاتی (production) عرضه کردم. عاملها بخش سخت کار نبودند؛ بلکه انتقالها (handoffs) بودند.
انتقال چیزی فراتر از پاس دادن متن است. شما باید موارد زیر را مدیریت کنید:
- همراستایی طرحواره (Schema alignment): عامل B باید هر بار خروجی عامل A را تجزیه (parse) کند.
- انتشار خطا (Failure propagation): سیستم باید بداند چه زمانی یک عامل با شکست مواجه میشود.
- پاکیزگی بافتار (Context hygiene): هر انتقال، نویز اضافهای به پنجره (context window) شما اضافه میکند.
بزرگترین اشتباه این است که با عاملها مانند جعبههای سیاهی برخورد کنید که با یک رشته به هم متصل شدهاند. شما به عامل A پرامپت میدهید، نتیجه را میگیرید و آن را به زور به عامل B میسپارید. این روش تا زمانی که سیستم خراب نشود، کار میکند. وقتی خراب شود، نخواهید دانست چرا.
از این سه حالت رایج شکست اجتناب کنید:
۱. قطع شدن بیصدای دادهها (Silent truncation): عامل A دادههای بسیار زیادی تولید میکند. عامل B انتهای دادهها را قطع میکند. سپس عامل B دادههای ناقص را پردازش کرده و اطلاعات بیمعنی به شما میدهد. تعداد توکنهای خود را در هر مرحله اندازهگیری کنید.
۲. انحراف طرحواره (Schema drift): شما پرامپت عامل A را تغییر میدهید. حالا خروجی آن فرمت متفاوتی دارد. عامل B از کار میافتد چون انتظار فرمت قدیمی را دارد. به جای تکیه بر پرامپتها، از خروجیهای ساختاریافته مانند Pydantic استفاده کنید.
۳. شرایط رقابتی (Race conditions): شما پنج کارگر (worker) را همزمان اجرا میکنید. سه مورد تمام میشوند، اما دو مورد هنوز در حال اجرا هستند. تجمیعکننده (aggregator) شما زودتر از موعد با دادههای ناقص شروع به کار میکند. این روش در تستها کار میکند اما در محیط عملیاتی شکست میخورد. از یک سد (barrier) استفاده کنید تا منتظر تمام وظایف بمانید.
اولین سیستم من هوشمندانه اما نامنظم بود. از مسیریابی پویا (dynamic routing) و انتقالهای ضمنی (implicit handoffs) استفاده میکرد. تا زمانی که با ترافیک واقعی روبرو نشد و بیصدا شکست نخورد، کار میکرد.
دومین سیستم من زشت اما درست بود. هر انتقال از یک قرارداد تایپشده (typed contract) استفاده میکرد. هر خطا صریح بود. هر عامل ایزوله بود.
سیستم فعلی من هر دو را ترکیب میکند. از انضباط نسخه دوم استفاده میکند اما کدهای خستهکننده را پشت یک فریمورک پنهان میکند.
اگر سیستمهای چندعاملی میسازید، با نسخه زشت و درست شروع کنید. در ابتدا سعی نکنید هوشمندانه عمل کنید. ابتدا در محیط عملیاتی آن را درست انجام دهید، سپس آن را ظریف و زیبا کنید.
مشکل انتقال آسانتر نمیشود، اما دیگر از آن غافلگیر نخواهید شد.
Source: https://dev.to/mrclaw207/your-agents-are-fine-the-handoff-between-them-isnt-2dij
Optional learning community: https://t.me/GyaanSetuAi
