زیادہ تر ٹیمیں اب بھی اپنا پہلا ریٹریول پائپ لائن (retrieval pipeline) ایک ہی طریقے سے تیار کرتی ہیں۔ وہ ایک مقررہ ٹوکن حد (token limit) منتخب کرتی ہیں، شاید 512، دستاویزات کو یکساں بلاکس میں تقسیم کرتی ہیں، اور ان بلاکس کو ویکٹر ڈیٹا بیس (vector database) میں ڈال دیتی ہیں۔ سادہ سوالات والے چھوٹے ڈیٹا سیٹ پر، یہ جادوئی لگتا ہے۔ لیکن پروڈکشن میں، یہ ناکام ہو جاتا ہے۔
قانونی معاہدے (legal contracts) بے معنی ٹکڑوں میں تقسیم ہو جاتے ہیں جب کوئی شق (clause) جملے کے درمیان میں کٹ جاتی ہے۔ اگر ایک ہی چنک (chunk) تین غیر متعلقہ فنکشنز کو اپنے اندر سمو لے تو API ڈاکومنٹیشن ایک شور زدہ مجموعے میں بدل جاتی ہے۔ کسٹمر سپورٹ ٹکٹس میں اگر حصوں کے درمیان اوورلیپ (overlap) نہ ہو تو وہ اپنا تمام بیانیہ تسلسل کھو دیتے ہیں۔ اس کا نتیجہ قابلِ پیش گوئی ہے: بڑھا ہوا لیٹنسی (latency)، کم ریکال (recall)، اور ایسے جوابات جو جنریٹر کو ہالوسینیٹ (hallucinate) کرنے پر مجبور کر دیتے ہیں۔
ہم نے اپنے ریٹریول لیئر (retrieval layer) کو مکمل طور پر ختم کر کے دوبارہ تعمیر کیا۔ اس کا نتیجہ ریکال میں 78 فیصد سے 95 فیصد تک کا اضافہ، لیٹنسی میں 62 فیصد کمی، اور ایک ایسا پائپ لائن تھا جو آخر کار ایک ویک اینڈ ہیک (weekend hack) کے بجائے حقیقی انفراسٹرکچر کی طرح کام کرنے لگا۔ یہاں وہ چیزیں ہیں جو حقیقت میں کام آئیں۔
اسمارٹ چنکنگ: ٹوکنز کے بجائے ساخت پر توجہ
پہلی غلطی یہ فرض کرنا ہے کہ ہر دستاویز ایک ہی زبان بولتی ہے۔ 512-ٹوکن کا چنک بیانیہ نثر (narrative prose) کے لیے تو ٹھیک ہے لیکن اس کے علاوہ کہیں بھی نہیں۔ ہم نے ایک ایسی حکمت عملی اپنائی جو اصل ذریعے (source) کی ساخت کا احترام کرتی ہے۔
قانونی دستاویزات کے لیے، ہم ریکرسو چنکنگ (recursive chunking) کا استعمال کرتے ہیں۔ الگورتھم پہلے سیکشنز اور آرٹیکلز جیسی اعلیٰ سطح کی حدود پر تقسیم کرنے کی کوشش کرتا ہے۔ اگر کوئی سیکشن اب بھی بہت طویل ہو، تو یہ ذیلی سیکشنز، پھر پیراگراف، اور پھر جملوں کو تلاش کرتا ہے۔ یہ شقوں (clauses) کی منطقی ترتیب کو برقرار رکھتا ہے۔ ایک نان-کمپیٹ معاہدہ (non-compete agreement) مکمل رہتا ہے۔ تعریفیں (definitions) تلافی کی شرائط (indemnity terms) میں نہیں گھلتییں۔
API ڈاکومنٹیشن کے لیے ایسی چنکنگ درکار ہوتی ہے جو ساخت سے واقف ہو۔ ایک فنکشن سگنیچر (function signature)، اس کا پیرامیٹر ٹیبل، اور اس کی مثال کے طور پر درخواست (example request) ایک ساتھ ہونی چاہیے۔ ایک مقررہ ٹوکن کی تعداد کے بعد تقسیم کرنے سے اکثر پیرامیٹرز ایک چنک میں رہ جاتے ہیں اور مثالیں دوسرے میں۔ اس کے بجائے، ہم ڈاکومنٹ آبجیکٹ کے ذریعے چنکنگ کرتے ہیں۔ ایک چنک میں ایک مکمل اینڈ پوائنٹ (endpoint) یا ایک واحد فنکشن ہوتا ہے۔ اس کے بعد ریٹریور ایک ایسا خود مختار حوالہ واپس کر سکتا ہے جو حقیقت میں سوال کا جواب دیتا ہو۔
سپورٹ ٹکٹس قدرتی طور پر سیمنٹک چنکنگ (semantic chunking) کے لیے موزوں ہوتے ہیں۔ ٹوکن کی حد پر کاٹنے کے بجائے، ہم اس جگہ کا پتہ لگاتے ہیں جہاں موضوع بدلتا ہے۔ ایک ٹکٹ جو لاگ ان کی شکایت سے شروع ہو اور بلنگ کے سوال کی طرف مڑ جائے، وہ دو مربوط حصوں میں تقسیم ہو جاتا ہے۔ ہر حصہ اپنے ساتھ ضروری میٹا ڈیٹا (metadata) رکھتا ہے، اور ماڈل کو اب یہ اندازہ لگانے کی ضرورت نہیں پڑتی کہ صارف اصل میں کس مسئلے کے بارے میں فکر مند ہے۔
اندرونی وکیز (internal wikis) زیادہ الجھی ہوئی ہوتی ہیں۔ ان میں نثر، ٹیبلز، ڈایاگرامز اور ایمبیڈڈ تھریڈز کا امتزاج ہوتا ہے۔ ان کے لیے، ہم ایجنٹک چنکنگ (agentic chunking) کا استعمال کرتے ہیں۔ ایک چھوٹا لینگویج ماڈل آگے پڑھتا ہے اور فیصلہ کرتا ہے کہ موضوعاتی طور پر مکمل یونٹ کہاں ختم ہوتا ہے۔ انجیشن (ingestion) کے وقت اس پر تھوڑا زیادہ خرچ ہوتا ہے، لیکن یہ ہر نئے پیج فارمیٹ کے لیے قواعد کو دستی طور پر درست کرنے کی انسانی مشقت کو ختم کر دیتا ہے۔
ہائبرڈ ریٹریول: تمام پہلوؤں کا احاطہ کریں
ویکٹر سرچ (vector search) مبہم معنی (fuzzy meaning) کو سمجھنے میں بہترین ہے۔ اگر آپ سلو اپ لوڈز کے بارے میں پوچھیں گے تو یہ خوشی سے لیٹنسی اور بینڈوتھ کے بارے میں پیراگراف واپس کر دے گا۔ لیکن یہ درست مماثلتوں (exact matches) کو بگاڑنے کے لیے مشہور ہے۔ اگر کوئی ڈویلپر ایرر کوڈ ERR_CONNECTION_REFUSED تلاش کرتا ہے، تو ڈینس ایمبیڈنگز (dense embeddings) اکثر اسے عام شور (noise) سمجھ کر نظر انداز کر دیتی ہیں۔
BM25، جو کہ ایک کلاسک کی ورڈ الگورتھم ہے، اس کے برعکس کام کرتا ہے۔ یہ درست اسٹرنگز اور نایاب الفاظ کو بالکل صحیح پکڑتا ہے، لیکن یہ سیمنٹک باریکیوں (semantic nuance) کو نظر انداز کر دیتا ہے۔ معاہدے پر دستخط کرنے کے بارے میں ایک سوال شاید کبھی بھی اس مواد کو سامنے نہ لا سکے جسے 'معاہدے پر عمل درآمد' (executing the contract) کے طور پر ٹیگ کیا گیا ہو۔
