בניתי RAG מאפס ב-Python כדי להבין אותו

השתמשתי ב-LangChain בסביבת ייצור במשך שישה חודשים. לא יכולתי להסביר איך הוא עבד. לא ידעתי למה בחרתי במדדים מסוימים או איך טקסט הופך לווקטורים. הספרייה הסתירה את הלוגיקה.

כדי לתקן זאת, מחקתי את ה-framework. כתבתי pipeline של RAG מאפס באמצעות 500 שורות של Python נקי.

הנה מה שלמדתי מבניית ה-stack באופן ידני.

The Problem with Black Boxes כשמשתמשים בספריות ברמה גבוהה (high-level), מאבדים שליטה. ראיתי מודלים שמזייפים עובדות (hallucinate) או נותנים ציטוטים שגויים. לא יכולתי לדעת אם השגיאה הייתה ב-chunker, במודל ה-embedding או ב-prompt.

כשבונים את זה בעצמכם, ניתן לבחון כל שכבה. אפשר להדפיס את ה-chunks המדויקים שנשלחו ל-LLM. אפשר לראות בדיוק איפה משפט נקטע.

The Five Layers of RAG RAG הוא לא אלגוריתם אחד. אלו חמישה תהליכים שונים המצטברים יחד:

  • Chunking: החלטה כיצד לפצל טקסט.
  • Embedding: הפיכת טקסט למתמטיקה.
  • Retrieval: מציאת החלקים הנכונים.
  • Prompt Construction: הנחיית המודל כיצד להתנהג.
  • Generation: קבלת התשובה הסופית.

Lessons from the Build

  1. Chunking הוא השלב החשוב ביותר רוב המדריכים מדלגים על זה. אם לא משתמשים ב-overlap, מאבדים את ההקשר בגבולות. השתמשתי ב-sliding window עם overlap ברמת התווים. זה מבטיח שהמודל יראה את הקשר בין שני chunks.

  2. למדדי מרחק (distance metrics) יש חשיבות ביליתי שעות ב-debugging של תוצאות חיפוש גרועות. הבעיה לא הייתה בנתונים. היא הייתה במדד. ב-ChromaDB ברירת המחדל היא מרחק L2. לחיפוש סמנטי, צריך Cosine similarity. שורת קוד אחת שינתה הכל.

  3. Prompts זקוקים למגבלות LLM הוא כלי להשלמת טקסט, לא אורקל. אם שואלים שאלה מעורפלת, הוא ימציא תשובה. למדתי להשתמש ב-refusal template קשיח. אמרתי למודל: "אם ההקשר (context) אינו מכיל את התשובה, אמור שאינך יודע". זה הפחית את ה-hallucinations מ-40% ל-5%.

  4. בצעו שליחות ב-batches שליחת בקשת HTTP אחת לכל chunk היא איטית. שליחה ב-batches מהירה הרבה יותר. זה מאפשר למודל המקומי לבצע pipeline לעבודה.

  5. בצעו בדיקות מלמטה למעלה אל תכתבו בדיקות בסוף. בדקו קודם את ה-chunker שלכם. אחר כך את ה-embedder. ואז את ה-store. אם תבדקו רק בסוף, תבדקו את הבאגים במקום את הלוגיקה.

אם אתם מרגישים שאתם לא באמת מבינים את ה-AI stack שלכם, תבנו אותו בעצמכם. הקוד הוא לא המטרה. החשיבה היא המטרה.

Source: https://dev.to/avinash_zala_1c6f5e7c4af9/i-built-rag-from-scratch-in-python-to-understand-it-heres-what-i-learned-33kf

Optional learning community: https://t.me/GyaanSetuAi