میں نے اسے سمجھنے کے لیے Python میں بالکل شروع سے RAG بنایا
میں نے چھ ماہ تک پروڈکشن میں LangChain کا استعمال کیا۔ میں یہ نہیں بتا سکتا تھا کہ یہ کیسے کام کرتا ہے۔ مجھے نہیں معلوم تھا کہ میں نے مخصوص میٹرکس (metrics) کیوں منتخب کیے یا ٹیکسٹ ویکٹرز (vectors) میں کیسے تبدیل ہوا۔ لائبریری نے منطق (logic) کو چھپا رکھا تھا۔
اس مسئلے کو حل کرنے کے لیے، میں نے فریم ورک کو ہٹا دیا۔ میں نے 500 لائنوں کے سادہ Python کوڈ کا استعمال کرتے ہوئے بالکل شروع سے ایک RAG پائپ لائن لکھی۔
اس اسٹیک (stack) کو دستی طور پر بنانے سے میں نے جو کچھ سیکھا، وہ یہاں ہے:
بلیک باکسز (Black Boxes) کا مسئلہ
جب آپ ہائی لیول لائبریریز استعمال کرتے ہیں، تو آپ کنٹرول کھو دیتے ہیں۔ میں نے دیکھا کہ ماڈلز حقائق کے بارے میں غلط بیانی (hallucinate) کرتے ہیں یا غلط حوالہ جات دیتے ہیں۔ میں یہ نہیں بتا سکتا تھا کہ غلطی چنکر (chunker)، ایمبیڈنگ ماڈل (embedding model)، یا پرامپٹ (prompt) میں سے کس میں تھی۔
جب آپ اسے خود بناتے ہیں، تو ہر لیئر کا معائنہ کیا جا سکتا ہے۔ آپ LLM کو بھیجے گئے درست چنکس (chunks) کو پرنٹ کر سکتے ہیں۔ آپ دیکھ سکتے ہیں کہ جملہ بالکل کہاں سے ٹوٹ رہا ہے۔
RAG کی پانچ لیئرز
RAG کوئی ایک الگورتھم نہیں ہے۔ یہ پانچ مختلف عمل ہیں جو ایک ساتھ جڑے ہوئے ہیں:
- Chunking: ٹیکسٹ کو تقسیم کرنے کا طریقہ طے کرنا۔
- Embedding: ٹیکسٹ کو ریاضی (math) میں تبدیل کرنا۔
- Retrieval: صحیح ٹکڑے تلاش کرنا۔
- Prompt Construction: ماڈل کو بتانا کہ اسے کیسے کام کرنا ہے۔
- Generation: حتمی جواب حاصل کرنا۔
تعمیر کے دوران حاصل ہونے والے اسباق
1. Chunking سب سے اہم مرحلہ ہے
زیادہ تر ٹیوٹوریلز اسے نظر انداز کر دیتے ہیں۔ اگر آپ اوورلیپ (overlap) استعمال نہیں کرتے، تو آپ کناروں پر سیاق و سباق (context) کھو دیتے ہیں۔ میں نے کریکٹر لیول اوورلیپ کے ساتھ سلائیڈنگ ونڈو (sliding window) کا استعمال کیا۔ یہ اس بات کو یقینی بناتا ہے کہ ماڈل دو چنکس کے درمیان تعلق دیکھ سکے۔
2. ڈسٹنس میٹرکس (Distance metrics) اہمیت رکھتے ہیں
میں نے خراب سرچ رزلٹس کو ٹھیک کرنے میں گھنٹوں صرف کیے۔ مسئلہ ڈیٹا کا نہیں تھا۔ مسئلہ میٹرک کا تھا۔ ChromaDB ڈیفالٹ کے طور پر L2 ڈسٹنس استعمال کرتا ہے۔ سیمنٹک سرچ (semantic search) کے لیے، آپ کو Cosine similarity کی ضرورت ہوتی ہے۔ کوڈ کی ایک لائن نے سب کچھ بدل دیا۔
3. پرامپٹس کو حدود (constraints) کی ضرورت ہوتی ہے
ایک LLM صرف جملے مکمل کرنے والا ہے، کوئی غیب دان (oracle) نہیں۔ اگر آپ کوئی مبہم سوال پوچھیں گے، تو وہ خود سے جواب گھڑ لے گا۔ میں نے ایک سخت ریفیوزل ٹیمپلیٹ (refusal template) استعمال کرنا سیکھا۔ میں نے ماڈل کو بتایا: "اگر سیاق و سباق میں جواب موجود نہیں ہے، تو کہہ دیں کہ آپ نہیں جانتے۔" اس سے ہالوسینیشنز (hallucinations) 40% سے کم ہو کر 5% رہ گئیں۔
4. اپنی درخواستوں کو بیچ (batch) میں بھیجیں
ہر چنک کے لیے ایک ایک HTTP ریکویسٹ بھیجنا سست ہے۔ انہیں بیچز (batches) میں بھیجنا بہت زیادہ تیز ہے۔ یہ لوکل ماڈل کو کام کو پائپ لائن (pipeline) کرنے کی اجازت دیتا ہے۔
5. نیچے سے اوپر کی طرف ٹیسٹ کریں
ٹیسٹ آخر میں نہ لکھیں۔ پہلے اپنے چنکر (chunker) کو ٹیسٹ کریں۔ پھر اپنے ایمبیڈر (embedder) کو ٹیسٹ کریں۔ پھر اپنے اسٹور (store) کو ٹیسٹ کریں۔ اگر آپ آخر میں ٹیسٹ کریں گے، تو آپ منطق کے بجائے بگ (bugs) کو ٹیسٹ کر رہے ہوں گے۔
اگر آپ کو محسوس ہوتا ہے کہ آپ اپنے AI اسٹیک کو صحیح معنوں میں نہیں سمجھتے، تو اسے خود بنائیں۔ کوڈ مقصد نہیں ہے۔ سوچنا مقصد ہے۔
Optional learning community: https://t.me/GyaanSetuAi
