مواد پر جائیں

ٹول کانٹیکسٹ اور پرامپٹ کیشنگ

بلٹ اِن ہارنس کی بنائی گئی ہر درخواست کے بارے میں دو باتیں درست ہیں: اُس میں ٹول تعریفیں سب سے بڑا مستقل خرچ ہیں، اور اُن میں سے تقریباً کوئی بھی استعمال نہیں ہوگا۔ یہ صفحہ بتاتا ہے کہ Control Center اس بارے میں کیا کرتا ہے، اور جواب محض ”کم ٹولز بھیجیں“ کیوں نہیں ہے۔

Control Center تقریباً 126 ٹولز رجسٹر کرتا ہے۔ مکمل بھیجنے پر اُن کی تعریفیں ہر درخواست پر تقریباً 23,000 ٹوکنز پر پڑتی ہیں — ایسا خرچ جسے کوئی کمپیکشن چھو نہیں سکتا، کیونکہ ٹول تعریفیں درخواست کے اُس حصے میں سفر کرتی ہیں جو گفتگو سے الگ ہے۔

ٹوکن کا بل سب سے نمایاں شکایت ہے، اور پرامپٹ کیشنگ کے ساتھ یہ چھوٹا مسئلہ بھی ہے۔ اصل خرچ انتخاب کی درستگی ہے۔ ٹول کالنگ کے شائع شدہ جائزوں کا اتفاق ہے کہ ماڈلز کانٹیکسٹ میں تقریباً 30–50 ٹولز تک درست ٹول قابلِ اعتماد طور پر چنتے ہیں، اور اُس کے بعد بتدریج بگڑتے جاتے ہیں۔ بتائی جانے والی وجہ ٹوکن کی تعداد نہیں بلکہ معنوی اوورلیپ ہے: جب کسی کیٹلاگ میں کئی ایسے ٹولز ہوں جن کی تفصیلات ایک جیسی پڑھی جائیں، تو ماڈل کسی قابلیت کو یاد کرنے کے بجائے ہم شکل چیزوں میں سے انتخاب کر رہا ہوتا ہے۔

126 ٹولز پر ایک ایجنٹ ہر ایک باری میں اُس حد سے کہیں آگے ہوتا ہے — اُن کئی باریوں سمیت جہاں اُسے صرف ایک فائل پڑھنی تھی۔

اس لیے ایک رن کو دو چیزیں دکھائی جاتی ہیں:

  • ایک ریذیڈنٹ مجموعہ — تقریباً دو درجن ٹولز، جو ہر درخواست پر مکمل اسکیموں کے ساتھ بھیجے جاتے ہیں؛
  • باقی سب کا ایک نام انڈیکس، جو ”Tickets and projects“ یا ”Memory and knowledge“ جیسے عنوانات کے تحت گروہ بند ہوتا ہے اور پورے کیٹلاگ کے لیے چند سو ٹوکنز پر پڑتا ہے۔

موجودہ کیٹلاگ پر ناپا گیا تو یہ ٹول بلاک کو ~23.1k ٹوکنز سے ~5.0k تک لے آتا ہے، یعنی تقریباً 78% کم، اور ہمیشہ نظر آنے والے مجموعے کو اُس حد کے اندر رکھتا ہے جہاں انتخاب قابلِ اعتماد ہوتا ہے۔

ریذیڈنٹ مجموعہ وہ ٹولز ہیں جو ایک رن زیادہ تر رنز میں استعمال کرتا ہے: فائل اور شیل کے الفاظ کا مجموعہ (read، write، edit، search، bash، …)، دریافت کے ٹولز، ٹاسک چیک لسٹ، میموری سرچ، اور وہ فعل جسے موجودہ موڈ کو اپنا نتیجہ پیش کرنے کے لیے کال کرنا ضروری ہوتا ہے۔ موڈ کا اپنا آؤٹ پٹ فعل ہمیشہ ریذیڈنٹ رہتا ہے — کسی رن کو کبھی اُس ایک کال کو ڈھونڈنے نہیں جانا پڑنا چاہیے جو اُس کا ڈیلیوریبل بناتی ہے۔

طلب پر لوڈ ہونے کا مطلب دستیاب نہ ہونا نہیں

سیکشن کا عنوان “طلب پر لوڈ ہونے کا مطلب دستیاب نہ ہونا نہیں”

یہی وہ حصہ ہے جو اِس ڈیزائن کو محض سستا نہیں بلکہ محفوظ بناتا ہے۔ ایک طلب پر لوڈ ٹول پہلی باری ہی سے کال کے قابل ہوتا ہے۔ صرف اُس کا اسکیما روکا جاتا ہے۔

ایجنٹ اپنے پرامپٹ میں نام دیکھتا ہے۔ اگر وہ اُس نام کو براہِ راست کال کرے تو ہارنس اُسی قدم میں اسکیما لوڈ کر کے ٹول چلا دیتا ہے — نہ کوئی خرابی، نہ کوئی راؤنڈ ٹرپ۔ ماڈل کو یہ جاننے کی ضرورت نہیں کہ ٹول کبھی ”ان لوڈ“ ہوا تھا۔

جب ایجنٹ کو کام معلوم ہو مگر نام نہ ہو، تو search_tools سادہ زبان میں دی گئی تفصیل (”کسی کو ٹکٹ تفویض کریں“) لیتا ہے، رن کی پوری سطح کی درجہ بندی کرتا ہے، اور نتائج اُن کے اسکیموں کے ساتھ جو پہلے ہی لوڈ ہو چکے ہوتے ہیں واپس کرتا ہے، تاکہ اگلی ہی باری اُن میں سے کوئی کال کر سکے۔ اگر کوئی تلاش کچھ نہ پائے تو صاف بتا دیتی ہے اور مختلف الفاظ یا وسیع تر تلاش تجویز کرتی ہے — جان بوجھ کر، کیونکہ جو ایجنٹ خالی تلاش کو ”یہ قابلیت موجود نہیں“ پڑھے گا وہ دوبارہ دیکھنے کے بجائے کوئی متبادل گھڑ لے گا۔

search_tools صرف بلٹ اِن ہارنس میں موجود ہے۔ بیرونی MCP کلائنٹس کے پاس اس کے بجائے search_tool_bm25 ہے، جو وہی انڈیکس درجہ بند کرتا ہے مگر صرف نتائج کی تفصیل دیتا ہے — اُن کلائنٹس کو tools/list سے پہلے ہی ہر اسکیما مل چکا ہوتا ہے، اس لیے لوڈ کرنے کو کچھ نہیں بچتا۔

طلب پر لوڈ موڈ کے ٹول فلٹر کے بعد لاگو ہوتا ہے، اُس کے بدلے کبھی نہیں۔ یہ ایک اسکیما چھپاتا ہے؛ جو ٹول موڈ نے مسترد کیا ہو اُسے ظاہر نہیں کر سکتا۔ فعال شدہ ٹول بھی منظوری کے پرامپٹ اور ایکشن گارڈریلز سے بالکل ویسے ہی گزرتا ہے جیسے کوئی ریذیڈنٹ ٹول گزرتا، اور کوئی ٹول ایسا نام لوڈ نہیں کر سکتا جو شروع ہی سے رن کی سطح پر نہ تھا۔

بیرونی کلائنٹس کو نظر آنے والی MCP سطح متاثر نہیں ہوتی۔ tools/list اب بھی مکمل کیٹلاگ واپس کرتا ہے۔ اُسے کاٹنے کی ایک پہلے کی کوشش نے ایجنٹس کو بالکل توڑ دیا تھا: MCP کلائنٹس ٹول کے نام اپنی کیش شدہ فہرست کے خلاف جانچتے ہیں اور سرور سے پوچھے بغیر ہر غیر درج نام سے انکار کر دیتے ہیں، اس لیے ”چھپا ہوا مگر کال کے قابل“ ٹول محض ناقابلِ رسائی تھا۔ طلب پر لوڈ ہارنس ہی میں رہتا ہے، جہاں رن کے دوران ٹول لوڈ کرنا واقعی ہارنس کا کام ہے۔

--tool-deferral=off (یا CC_SERVER_TOOL_DEFERRAL=off) ہر منظور شدہ ٹول کو دوبارہ ریذیڈنٹ بنا دیتا ہے، اور بالکل وہی درخواستیں بناتا ہے جو سرور طلب پر لوڈ سے پہلے بناتا تھا۔ دیکھیں cc_server CLI حوالہ۔

ایجنٹ کے کام کا بوجھ ایک طرف جھکا ہوتا ہے: وہ باری در باری بہت بڑے پرامپٹ بھیجتے اور چھوٹے جواب پاتے ہیں، ہر بار وہی پریفکس لے کر۔ فراہم کنندہ اُس پریفکس کو کیش کرتے ہیں، اور ایک کیش ریڈ تازہ ریڈ کے تقریباً دسویں حصے پر پڑتا ہے۔ اس لیے کیش ہٹ ریٹ ہارنس کی ایک بنیادی خصوصیت ہے، کوئی آپٹیمائزیشن نہیں — اور Anthropic پر یہ تھرو پٹ بھی دیتا ہے، کیونکہ کیش شدہ ٹوکنز فی منٹ ان پٹ کی حد میں نہیں گنے جاتے۔

کیشنگ عین پریفکس کی مماثلت پر کام کرتی ہے، جس سے ایک ہی حاکم اصول برآمد ہوتا ہے۔

جو پہلے بھیجا جا چکا اُسے کبھی نہ لکھیں

سیکشن کا عنوان “جو پہلے بھیجا جا چکا اُسے کبھی نہ لکھیں”

کوئی بھی بدلتا ہوا بائٹ اُس مقام سے آگے کیش کو باطل کر دیتا ہے۔ اس لیے ہارنس صرف جوڑتا ہے: نئے پیغام آخر میں، اور نئے فعال ہونے والے ٹول اسکیمے کیش شدہ ٹول بلاک کے بعد، نہ کہ اُس میں ضم۔ یہی ترتیب ایکٹیویشن کو سستا بناتی ہے — کیش شدہ پریفکس جوں کا توں رہتا ہے اور رن صرف اُن اسکیموں کی قیمت دیتا ہے جو اُس نے ابھی لوڈ کیے۔

لوپ کانٹیکسٹ واپس پانے کے لیے پرانی باریوں کے باسی ٹول آؤٹ پٹ کو بھی کاٹتا ہے۔ یہ اُس وقت تک انتظار کرتا ہے جب واپس پانے کے لیے اتنا کچھ ہو کہ دوبارہ لکھنا پڑے، اس لیے کاٹنا مسلسل کیش مس کے بجائے کوئی کبھی کبھار کی گہری دوبارہ تحریر ہوتا ہے۔

فراہم کنندہ محدود تعداد میں کیش مارکر کی اجازت دیتا ہے، اور Control Center اُنہیں سوچ سمجھ کر خرچ کرتا ہے:

مارکر کیا ڈھانپتا ہے دورانیہ
آخری ریذیڈنٹ ٹول ٹول بلاک 1 گھنٹہ
آخری سسٹم بلاک ٹولز + سسٹم پرامپٹ 1 گھنٹہ
پچھلی باری کی دم آخری درخواست تک کی تاریخ 5 منٹ
موجودہ باری کی دم مکمل تاریخ 5 منٹ

آخری دو ایک گھومتا جوڑا ہیں، اور اِس جوڑے کی وجہ باریک ہے: کیش کی تلاش کسی پہلے کی درخواست کے ذخیرہ کردہ کے لیے محدود تعداد میں بلاکس پیچھے کی طرف دیکھتی ہے۔ ایک ہی باری جو کئی ٹولز متوازی چلائے، اُس کھڑکی سے زیادہ بلاکس نکال سکتی ہے، اور تب ایک دم کا مارکر خاموشی سے مس ہو جاتا ہے اور درخواست پوری قیمت دیتی ہے جبکہ جواب میں ایسا کہنے کو کچھ نہیں ہوتا۔ پچھلی درخواست جہاں رکی تھی اُس عین مقام کو نشان زد کرنا ہٹ کو دوڑ کے بجائے ساختی بنا دیتا ہے۔

ٹولز اور سسٹم والا پریفکس طویل دورانیہ لیتا ہے کیونکہ یہ پورے رن کے لیے مستقل رہتا ہے، ایک ہی شکل رکھنے والے ہر رن اور سب ایجنٹ میں مشترک ہوتا ہے، اور کیونکہ گھڑی اُس وقت شروع ہوتی ہے جب درخواست شروع ہوتی ہے — کئی منٹ تک اسٹریم کرنے والی باری اگلی درخواست بننے سے پہلے ہی کسی مختصر کھڑکی کا بیشتر حصہ خرچ کر چکی ہوتی ہے۔

ایک ہی قسم کے سب ایجنٹ بائٹ بہ بائٹ یکساں پرامپٹ پریفکس بناتے ہیں، اس لیے اُنہیں اپنا اپنا لکھنے کے بجائے ایک ہی کیش اندراج پڑھنا چاہیے۔ مگر کوئی اندراج پڑھنے کے قابل اُس وقت ہوتا ہے جب اُسے لکھنے والی درخواست جواب دینا شروع کرے، اس لیے ایک ساتھ شروع کیا گیا فین آؤٹ ہر بچے سے اُس پریفکس کی قیمت وصول کرتا ہے جو اُن سب کا مشترک ہے۔

ہارنس کسی دی گئی شکل کے پہلے بچے کو شروع ہونے دیتا ہے، پھر اُس کے اسٹریم کرنا شروع کرتے ہی اُس کے بہن بھائیوں کو چھوڑ دیتا ہے۔ انتظار محدود ہے: سست پہلا بچہ ایک کیش ہٹ کی قیمت ہے، خود فین آؤٹ کی نہیں۔ اسی وجہ سے ہر سب ایجنٹ کو اُس کے پروفائل سے قطع نظر وہی ریذیڈنٹ ٹول سیٹ ملتا ہے — اسے فی پروفائل بدلنا مشترکہ پریفکس کو بغیر کسی فائدے کے ٹکڑوں میں بانٹ دیتا، کیونکہ پروفائل پہلے ہی طے کر چکا ہوتا ہے کہ بچہ کیا کال کر سکتا ہے۔

دونوں حصے فرض کیے جانے کے بجائے قابلِ مشاہدہ ہیں:

  • کسی گفتگو پر کانٹیکسٹ ایکسپلورر ریذیڈنٹ ٹولز، طلب پر لوڈ انڈیکس، اور یہ کہ روکی گئی ہر اسکیما کی قیمت کیا ہوگی — سب اُسی کوڈ راستے سے بنا کر بتاتا ہے جو ایک حقیقی رن استعمال کرتا ہے۔
  • ہر رن ریکارڈ کرتا ہے کہ اُس نے کون سے طلب پر لوڈ ٹولز لوڈ کیے اور اُسے کس چیز نے متحرک کیا، اس لیے کوئی ایسی تلاش جو کچھ نہ پائے، کسی ایجنٹ کے خاموشی سے کوئی قریبی کام کرنے میں گم ہونے کے بجائے ایک ریٹریول مس کے طور پر نظر آتی ہے۔
  • آبزرویبلٹی کیش ریٹ کو کارروائی شدہ تمام پرامپٹ ٹوکنز پر کیش ریڈز کے طور پر بتاتی ہے، کیش رائٹس سمیت — اپنا پریفکس بار بار دوبارہ بنانے والا رن کم اسکور کرتا ہے، اُس طرح نہیں جیسے کسی کو کیش کی ضرورت ہی نہ ہو۔