ہفتوں کے خاموش ڈیٹا کے نقصان کے بعد، LangGraph agents کو آخر کار اپنا اسٹیٹ برقرار رکھنے کا ایک قابل بھروسہ طریقہ مل گیا ہے۔ تین ناکام چیک پوائنٹنگ طریقوں—SQLite، خام (raw) آبجیکٹ اسٹوریج، اور ان میں سے ہر ایک کے ایک خراب ورژن—کے بعد، مصنف ایک ایٹامک اپ ڈیٹ پیٹرن (atomic-update pattern) پر پہنچا جو ایجنٹس کو ہر بار نئی درخواست آنے پر شروع سے دوبارہ شروع کرنے سے روکتا ہے۔

LangGraph کے لیے چیک پوائنٹنگ کیوں اہم ہے

LangGraph ڈویلپرز کو LLM کالز کو دوبارہ استعمال کے قابل "agents" میں جوڑنے کی اجازت دیتا ہے جو گفتگو میں پہلے ہونے والے واقعات کو یاد رکھ سکتے ہیں۔ یہ ایجنٹس صارف کی درخواست کو ذیلی کاموں (sub-tasks) میں تقسیم کرتے ہیں، درمیانی نتائج کو محفوظ کرتے ہیں، اور اگلی کال پر وہیں سے شروع کرتے ہیں جہاں انہوں نے چھوڑا تھا۔ اگر محفوظ شدہ اسٹیٹ غائب ہو جائے، تو ایجنٹ سب کچھ دوبارہ کیلکولیٹ کرتا ہے، جس سے کمپیوٹ کا ضیاع ہوتا ہے، لیٹنسی (latency) بڑھتی ہے، اور صارف کا تجربہ خراب ہوتا ہے۔ ٹیلی گرام پیغامات ہینڈل کرنے والے ایک پروڈکشن بوٹ میں، اس نقصان نے ہفتوں کی گفتگو کی ہسٹری مٹا دی۔

پہلا حل: SQLite saver

بلٹ ان SqliteSaver اس وقت ٹھیک کام کرتا ہے جب ایجنٹ کو ایک ہی انسٹنس چلا رہا ہو۔ یہ ہر چیک پوائنٹ کو مقامی SQLite فائل میں ایک JSON بلاگ کے طور پر لکھتا ہے۔ مسئلہ تب شروع ہوا جب ڈویلپر نے AgentState ٹائپ میں ایک نیا فیلڈ شامل کیا اور اسے دوبارہ ڈیپلائے کیا۔ موجودہ چیک پوائنٹس، جو اسکیما کی تبدیلی سے پہلے بنائے گئے تھے، ان میں نیا فیلڈ موجود نہیں تھا۔ چونکہ SqliteSaver کبھی مائیگریشن (migration) نہیں چلاتا، اس لیے LangGraph نے نامکمل JSON لوڈ کیا، مفقود ڈیٹا کو چھوڑ دیا، اور ایجنٹ شروع سے دوبارہ شروع ہو گیا۔

اہم نکتہ: SQLite اسٹوریج ایک ڈیمو ٹول ہے، یہ پروڈکشن کے لیے تیار حل نہیں ہے جب اسکیما میں تبدیلی کی ضرورت ہو۔

دوسرا حل: Object storage

سیریلائزیشن فارمیٹ پر کنٹرول حاصل کرنے کے لیے، مصنف نے ایک کسٹم سیور لکھا جو JSON چیک پوائنٹ کو Oracle Cloud Object Storage پر اپ لوڈ کرتا تھا۔ اس اقدام نے اسکیما کو دستی طور پر ورژن کرنے کی لچک تو دی، لیکن اس نے ناکامی کا ایک نیا طریقہ متعارف کروا دیا۔ جب دو درخواستیں بیک وقت ایک ہی گفتگو کے تھریڈ پر پہنچیں، تو دونوں نے ایک ہی آبجیکٹ کو اوور رائٹ کرنے کی کوشش کی۔ آبجیکٹ اسٹوریج سروسز "write-once, read-many" پیٹرنز کے لیے بہتر ہوتی ہیں؛ وہ ایٹامک اوور رائٹ (atomic overwrite) کی سہولت فراہم نہیں کرتیں۔ اس ریس کنڈیشن (race condition) نے خراب یا ادھورے JSON فائلز پیدا کیے، اور ایجنٹ نے ایک بار پھر اپنا سیاق و سباق (context) کھو دیا۔

اہم نکتہ: آبجیکٹ اسٹوریج میں سادہ اوور رائٹ محفوظ نہیں ہیں جب متعدد ورکرز ایک ہی وقت میں ایک ہی کی (key) کو چھو سکتے ہوں۔

تیسرا حل: ورژننگ کے ساتھ ایٹامک اپ ڈیٹس

حتمی اور مستحکم ڈیزائن دو آئیڈیاز کو یکجا کرتا ہے: واضح ورژن نمبرز اور آبجیکٹ کے ETag (اسٹوریج سروس کا چیکسم آئیڈنٹیفائر) کی بنیاد پر کنڈیشنل رائٹس (conditional writes)۔

  1. موجودہ چیک پوائنٹ کو پڑھیں (Read) اور اس کا ETag حاصل کریں۔
  2. چیک پوائنٹ اینویلپ کے اندر ایک ورژن فیلڈ میں اضافہ (Increment) کریں۔
  3. ایک کنڈیشنل ریکوئسٹ کا استعمال کرتے ہوئے اپ ڈیٹ شدہ چیک پوائنٹ کو لکھیں (Write) جو صرف اسی صورت میں کامیاب ہو اگر ETag وہی ہو جو پہلے پڑھا گیا تھا۔
  4. اگر کنڈیشنل رائٹ اس لیے ناکام ہو جائے کیونکہ کسی دوسرے عمل (process) نے آبجیکٹ کو تبدیل کر دیا ہے، تو پورے read-increment-write لوپ کو دوبارہ آزمائیں (Retry)۔

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

یہ پیٹرن ان آبجیکٹ اسٹوریج کے ساتھ کام کرتا ہے جو ETag پر مبنی کنڈیشنل رائٹس کو سپورٹ کرتی ہیں۔

AI انجینئرز کے لیے اسباق

  • SQLite کو صرف پروٹو ٹائپس کے لیے استعمال کریں۔ پروڈکشن ایجنٹس کو ایسے اسٹور کی ضرورت ہوتی ہے جو اسکیما کی تبدیلیوں اور بیک وقت ہونے والی رائٹس (concurrent writes) کو سنبھال سکے۔
  • اسکیما مائیگریشن کا منصوبہ خود بنائیں۔ ٹائپڈ ڈکشنریز اسٹیٹک اینالیسس کے لیے شکلیں بیان کرتی ہیں لیکن رن ٹائم اسٹرکچر کو نافذ نہیں کرتیں۔
  • اسٹیٹ کو ایک مشترکہ وسیلے (shared resource) کے طور پر سمجھیں۔ کنکرنسی بگ (concurrency bugs) خاموش ڈیٹا کے نقصان کی صورت میں ظاہر ہوتے ہیں؛ انہیں ڈی بگ کرنا واضح استثنائی حالات (exceptions) کے مقابلے میں زیادہ مشکل ہوتا ہے۔
  • کلاؤڈ پرائمٹیوز (cloud primitives) کا استعمال کریں۔ ETag پر مبنی کنڈیشنل رائٹس کسی الگ لاک سروس کے بغیر سستی آپٹیمسٹک لاکنگ فراہم کرتے ہیں۔
  • ہر قدم کو لاگ (log) کریں۔ خاموش ناکامیاں—جیسے کہ ایک مفقود فیلڈ جسے LangGraph نظر انداز کر دیتا ہے—انہیں ٹریک کرنا سب سے مشکل ہوتا ہے۔

LangGraph چیک پوائنٹنگ کا مستقبل کیا ہے؟

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

خلاصہ: ایک سادہ ورژنڈ اینویلپ اور کنڈیشنل رائٹس ایک غیر مستحکم نظام کو قابل بھروسہ نظام میں بدل دیتے ہیں، جس سے AI انجینئرز ڈیٹا کے نقصان کی لامتناہی ڈی بگنگ کے بجائے ایجنٹ لاجک پر توجہ مرکوز کر سکتے ہیں۔