רוב המדריכים ל-RAG מסתיימים ב-notebook. הם טוענים כמה קובצי PDF מלוטשים, מפצלים את הטקסט כל אלף תווים, דוחסים את השברים לתוך בסיס נתונים וקטורי, וקוראים לזה ארכיטקטורה. בשישי אחר הצהריים, הדמו הזה רץ בצורה מושלמת. בסביבת ייצור (production), אותו pipeline הופך בשקט לנטל.

צוואר הבקבוק האמיתי במערכת שליפה (retrieval) הוא לעיתים רחוקות המודל או ה-prompt. זהו תהליך ההזנה (ingestion). pipeline של RAG יכול לשלוף רק את מה שהוזן לו, ואם ההזנה רועשת, מיושנת או לא שלמה, המודל יספק שטויות בביטחון עצמי. כשמשתמשים מתלוננים שהבוט "הזיה" (hallucinated), האשמה היא לרוב רחוק מאוד למעלה, ב-data pipeline שאף אחד לא מנטר מקרוב.

מלכודת הלוח הלבן

תרשימי ארכיטקטורה גורמים להזנה להיראות כמו חץ בודד עם הכיתוב "Documents → Vector DB". המציאות מבולגנת יותר. מערכות מקור משתנות ללא הודעה מראש. פריסות HTML עוברות עיצוב מחדש. כתובות URL מפנות לדפי נחיתה כלליים. framework של JavaScript מחליף את התוכן לאחר תגובת ה-HTTP הראשונית. להתייחס להזנה כמשימת הגדרה חד-פעמית זו הטעות הראשונה. זוהי בעיית הנדסת נתונים מתמשכת שראויה לאותה קפדנות כמו כל pipeline של ETL.

מדוע כשלונות ב-RAG הם בדרך כלל כשלונות בהזנה

דמיינו את זה: משתמש שואל את העוזר הפנימי שלכם לגבי מדיניות ההחזרים הנוכחית. המודל שולף את ה-chunk העליון מה-vector store ומציין חלון זמן של 30 יום. המדיניות בפועל השתנתה ל-60 יום ברבעון האחרון. ה-LLM לא המציא את התשובה השגויה. הוא פשוט בטח במידע שגוי. שכבת השליפה הגישה דף ישן, ומכיוון שה-embedding נראה קרוב מספיק מבחינה סמנטית, המודל התייחס אליו כאמת המוחלטת (ground truth).

הדפוס הזה חוזר על עצמו ללא הרף. צוותים מבזבזים שעות על כוונון של temperature ו-top-k כשה-corpus שלהם מלא בכותרות תחתונה של ניווט, הודעות לעיתונות כפולות, ו-chunks שמפצלים טבלאות לשניים. לפני שאתם מבצעים אופטימיזציה ל-generation, בדקו (audit) מה המערכת שלכם מורשית לדעת.

שבע מלכודות שהורסות את ההזנה

1. ההרצה הראשונה היא שקר

סימן וי (checkmark) ירוק בסריקה (crawl) הראשונית שלכם כמעט ואינו אומר דבר. נתוני ייצור הם חיים. דפי תיעוד עוברים refactoring, קישורי permalink בבלוגים נשברים, ומפות אתר (sitemaps) מפסיקות בשקט להכיל חלק מהסעיפים. אם אתם רק מוודאים שה-pipeline הסתיים ללא שגיאה, אתם טסים בעיניים עצומות. אתם חייבים לוודא את הפלט. בדקו שהמסמכים המצופים קיימים, שהמבנה שלהם עדיין ניתן לניתוח (parse), ושהנפח הכולל של הטקסט לא קרס כי מקור מסוים החליט להציג תוצאות בדפים (pagination) בצורה שונה.

2. סריקה (Crawling) היא לא הזנה

שליפת HTML היא החלק הקל. סריקה גולמית (raw crawl) לוכדת הכל: באנרים של עוגיות (cookies), סרגל צד של "מאמרים קשורים", בלוקים של פרסומות והודעות זכויות יוצרים בכותרת התחתונה. אם תפצלו (chunk) את ה-HTML הגולמי הזה בצורה נאיבית, כל פיסת טקסט תגרור איתה שברים מתפריט הניווט. כשמשתמש שואל על מגבלות קצב (rate limits) של API, השליף (retriever) עלול להציג chunk שבו 40 אחוז הם קישורי סרגל צד. חילוץ נקי הוא קריטי. עליכם לזהות את אזור התוכן העיקרי, להסיר boilerplate ולהסיר אלמנטים שחוזרים על עצמם בכל דף. אחרת, אתם לא בונים בסיס ידע; אתם בונים מנוע חיפוש עבור ה-"chrome" (המסגרת הוויזואלית) של האתר.

3. פיצול (Chunking) שובר משמעות

פיצול בנפח קבוע (fixed-size chunking) הוא ברירת המחדל כמעט בכל מדריך התחלה מהירה, וזה מסוכן. אם תפצלו מסמך אך ורק לפי מספר תווים, אתם תחתכו טבלאות באמצע, תפרידו בין שלב 4 לשלב 5 בהליך ממוספר, ותנתקו נקודות (bullet points) מהכותרות שלהן. chunk שמכיל רק את החצי השני של טבלת מחירים הוא חסר תועלת מבחינה סמנטית. פיצול מודע-מבנה (structure-aware chunking) מכבד את הפורמט המקורי. נתחו את היררכיית הכותרות. שמרו על טבלאות שלמות ככל האפשר. פצלו בנקודות קצה של פסקאות תחת אותה H2 או H3. שמרו על רשימות בתוך chunk בודד אם הן קצרות מספיק. המטרה היא לא בלוקים בגודל אחיד; המטרה היא יחידות משמעות קוהרנטיות.

4. בעיית הרעננות

צילום מצב סטטי של ויקי פנימית הוא מצב פשוט. איסוף נתונים (ingestion) רציף מהרשת החיה הוא משימה קשה. עליך לדעת מתי דף נאסף לאחרונה, האם הוא השתנה מאז, וכמה זמן המידע נותר תקף. נתונים מיושנים (stale) אינם תמיד מצביעים על תאריך ישן וגלוי לעין. לעיתים דף מעדכן את הטקסט שלו אך שומר על אותו URL, כך שהמערכת שלך לעולם לא תבחין בכך ללא hashing של התוכן. בנה כללי רענון ברורים המבוססים על התנודתיות (volatility) של המקור. פיד נתונים פיננסיים עשוי להזדקק לבדיקות מדי שעה. דף "אודות" של חברה עשוי להזדקק לבדיקות רבעוניות. רשום חותמות זמן (timestamps) והגדר גבולות זמן תוקף (time-to-live), במיוחד אם הדומיין שלך כולל הנחיות רגולטוריות או קריטיות לבטיחות שבהן עובדות ישנות עלולות לגרום נזק ממשי.

5. Duplicate Pollution

אתרים מלאים בכפילויות. אותו תיאור מוצר מופיע בדף הקטגוריה, בדף המוצר ובדף נחיתה שיווקי. אותה הודעה לעיתונות נמצאת תחת /news/, /press/, ו-/blog/. חיפוש וקטורי אינו מבצע הסרת כפילויות (deduplication) באופן אוטומטי. אם עשרה chunks (קטעים) כמעט זהים נמצאים במסד הנתונים שלך, הם עלולים לדחוק תוצאות מגוונות ורלוונטיות בשליפת ה-top-k שלך. עליך לבצע מעקב קנוני (canonical tracking) או הסרת כפילויות תוכן לפני ה-embedding. אם שני chunks אומרים את אותו הדבר, שמור על המקור הסמכותי והשמט את העותקים. למחזר (retriever) שלך יש מקום מוגבל. אל תיתן לו להתבזבז.

6. Missing Metadata

מסד נתונים וקטורי ללא מטא-דאטה הוא בסך הכל מנוע חיפוש טקסט דחוס ללא זיכרון של הקשר (context). שליפה חכמה תלויה באותות סינון ודירוג (ranking) ש-embeddings גולמיים אינם יכולים לספק. שמור את ה-URL של המקור, תאריך האיסוף, קטגוריית המסמך ומספר הגרסה. אם אתה אוסף תיעוד API, ניהול גרסאות הוא חיוני. בלעדיו, שאילתה עלולה לערבב מפרטים של v1 ו-v2 לאותה תשובה. אם אתה אוסף מדיניות משאבי אנוש, תיוג לפי אזור או מחלקה מאפשר לך לסנן תוצאות עוד לפני שהן מגיעות למודל. מטא-דאטה הופך "dump" של טקסט למערכת ידע מנוהלת.

7. JavaScript Gaps

אתרים מודרניים אינם שולחים את התוכן שלהם ב-payload ה-HTML הראשון. הם שולחים "שלד" (skeleton) ומבצעים לו hydration באמצעות קריאות JavaScript. בקשת HTTP בסיסית עשויה לראות דבר מלבד סמל טעינה (loading spinner) ושלד של פריסה (layout shell). אם ה-pipeline שלך אינו יכול להריץ JavaScript, אתה תאסוף דפים ריקים או קטעים חלקיים ולעולם לא תבין שמשהו לא כשורה. שימוש בדפדפן headless פותר את בעיית הרינדור (rendering) אך מציג בעיות חדשות: שימוש כבד יותר בזיכרון, קצב העברה (throughput) איטי יותר וחוֹמוֹת זיהוי בוטים. בחר את הפשרות (trade-offs) שלך בתבונה, אך אל תעמיד פנים שפקודת curl פשוטה מספיקה לכל מקור.

A Practical Ingestion Checklist

אם אתה בונה או בוחן feed של RAG, התחל כאן:

  • אמת את כיסוי המקורות ואת הפגנה (pagination). מפת אתר (sitemap) עשויה לרשום רק את עשרת המאמרים הראשונים בקטגוריה. בצע סריקה (crawl) עמוקה וודא שתוכן עם פגנציה או תוכן שנטען באופן דינמי אכן נאסף.
  • הסר boilerplate לפני ה-chunking. הסר ניווט, פרסומות, פוטרים (footers) והצהרות משפטיות חוזרות. אם ביטוי מופיע בכל דף, הוא מהווה רעש.
  • השתמש ב-chunking מודע-מבנה. כבד כותרות, רשימות בולטים וטבלאות. חלק לפי גבולות סמנטיים, לא לפי מספר תווים.
  • צרף מטא-דאטה עשיר. כלול URL, תאריך איסוף, קטגוריית תוכן וגרסה. הפוך את השדות הללו לניתנים לסינון בשאילתות השליפה שלך.
  • קבע תדירות רענון על בסיס התנודתיות של הנתונים. מקורות עם שינויים גבוהים זקוקים לסריקות חוזרות תכופות. ארכיונים סטטיים אינם זקוקים לכך.
  • נטר את הקורפוס (corpus), לא רק את סטטוס המשימה. pipeline יכול לסיים עם קוד 0 תוך שהוא מייצר זבל. בצע ביקורת (audit) לדגימות של chunks מאוחסנים באופן קבוע כדי לבדוק סטייה (drift) ואיכות.
  • הגדר כללים לניהול גרסאות ומחיקות. כאשר דף מקור מוסר, מחק את ה-chunks שלו. כאשר הוא מתעדכן, דרוס אותם או צור להם גרסה. נתונים יתומים הם רוצח שקט.

The Hard Truth About Embeddings

אף מודל embedding, לא משנה כמה מתקדם הוא, אינו יכול לתקן מסמך חסר. הוא לא יכול לנחש שדף עודכן בשבוע שעבר אם ה-feed שלך עדיין מחזיק בעותק של שנה שעברה. הוא לא יכול להסיק את ההקשר של שורה בטבלה שהופרדה מהכותרת שלה עקב גבול chunk לא תקין. embeddings דוחסים משמעות, אך הם אינם יוצרים משמעות במקום שבו שכבת האיסוף (ingestion layer) נכשלה בשימור שלה.

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

The Real Takeaway

הפסיקו למדוד את תקינות תהליך ההזנה (ingestion) באמצעות דאשבורדים של ה-pipeline בלבד. תהליכים שהסתיימו בהצלחה (green jobs) ויומני רישום (logs) נקיים אינם מבטיחים קורפוס נקי. פתחו את בסיס הנתונים וקראו את הנתחים (chunks) עצמם שהמשתמשים שלכם ישתמשו בהם. אם הטקסט מלא בהודעות זכויות יוצרים, טבלאות מפוצלות ודפי מדיניות מיושנים, הבעיה שלכם היא לא ה-LLM. תקנו את מקור הנתונים (feed) תחילה. כל השאר הוא כוונון (tuning) על גבי אשפה.