למה RAG Qdrant טועה בשאילתות צרות
התבנית נראית כך: מסמכים נחתכים למקטעים, כל אחד הופך לוקטור ונכנס למסד נתונים וקטורי Qdrant. השאילתה עוברת וקטוריזציה באותו אופן, המסד מחזיר את המקטעים הקרובים ביותר, והמודל הגנרטיבי עונה לפיהם. בשאלות רחבות זה עובד — לכן חיפוש במסמכים עובר קבלה, אבל נשבר כבר בעבודה.
שאילתה צרה — זה מק"ט, מספר תקנון, שם משפחה, שלילה, תנאי דרך «למעט». ה-Embedding ממצע את המשמעות עד לנושא, ולכן לתוצאות המובילות נכנסים מקטעים «על זה בכללי», והפסקה הנדרשת עם הניסוח המדויק נמצאת מחוץ לתוצאות הראשונות.
המסד מחזיר תוצאות לא רלוונטיות; ככל שהסף לקרבה נוקשה יותר, כך לעיתים קרובות יותר שום דבר לא נכנס להקשר.
המקור השני לתקלות — חיתוך. העובדה נקרעת על גבול המקטע: תנאי באחד, חריגה בשכן. החיפוש מביא חצי, המודל משלים את השאר לפי המשקלים שלו ועונה בביטחון זהה לזה שעם נתונים מלאים. אלו הן ההזיות של המודל: ההקשר קיים פורמלית, הוא פשוט חסר.
השכבה השלישית — היעדר בדיקת תוצאה: הערכת הקרבה אינה מכוילת, המועמדים אינם ממוינים מחדש, והמודל לא מקבל אות «במסמכים אין תשובה» ולוקח תשובה מהזיכרון. המטא-נתונים כאן לא תמיד עובדים כפילטר.
בהמשך נפרק איך זה נסגר: חיפוש היברידי, פילטרים לפי מטא-נתונים, מיון מחדש של מועמדים ומצב סירוב במקום ניחוש בטוח.
מה משתנה לאחר הטמעת RAG Qdrant
איכות החיפוש מפסיקה להיות תלויה במילים שבהן נשאלת השאלה. מסד הנתונים הווקטורי Qdrant שומר מקטעי מסמכים כווקטורים ומחזיר את השכנים הקרובים ביותר עם פילטרים לפי מטא-נתונים — שיעור הפגיעות הנכונות בשלוש העמדות הראשונות בתוצאות נקבע לפי משמעות השאלה, ולא לפי התאמת ניסוחים.
נסחתם את השאלה מחדש, החלפתם מילה נרדפת, שאלתם אותה קצר יותר — בחירת המקורות נשארת אותה, והפיזור בין ניסוחים שונים נמדד ונשמר במסדרון צר.
מחלקות שלמות של כשלים נעלמות, ולא «נעשות נדירות יותר». תשובה בלי מקור, הפניה למקטע לא קיים, הדבקת טענות ממסמכים שונים — כל משפט בתוצאה מקושר למקטע מסוים, והקישור הזה נראה בממשק.
אם המקטע הטוב ביותר שנמצא מתחת לסף הרלוונטיות, המערכת מודיעה בכנות שאין נתונים במסד, במקום המצאה סבירה.
יציבות התוצאות נבדקת על סט שאלות אמיתיות עם מקורות ייחוס מסומנים מראש. מחשבים שלושה מספרים: שיעור הפגיעות של הייחוס בשלוש העמדות הראשונות, שיעור התשובות עם הפניה נכונה למסמך ושיעור הסירובים הנכונים במקום שאין תשובה במסד.
לפני הטמעה זה שיחה בסגנון «נראה שנהיה מדויק יותר», אחרי — מדדים שלפיהם רואים רגרסיה בעדכון האינדקס הבא.
הוסיפו או החליפו מסמך — הוא לבדו עובר אינדוקס, בלי לבנות מחדש את כל המסד. פילטרים לפי הרשאות גישה מיושמים בשלב החיפוש, ולכן אותו אינדקס משרת תפקידים שונים ולא מחזיר לאדם מקטעים שאסור לו לראות. זה מסיר את הפחד הנפוץ ביותר מפני חיפוש וקטורי בסביבה ארגונית.
דרכים לארגון חיפוש: השוואת גישות
מה שבאמת ייכנס להקשר של המודל נקבע לא על ידי מסד וקטורי, אלא על ידי מצב החיפוש ואיך המסמכים נחתכים למקטעים. אנחנו בוחרים בין חיפוש וקטורי טהור, היברידי, סינון עם פילטרים לפי מטא-נתונים וסכימה עם דירוג מחדש — אין אפשרות אוניברסלית, ולכל אחת יש מחיר משלה בשיהוי ובשלמות התוצאות.
| אפשרות | מתי מתאימה | מגבלות |
|---|---|---|
| חיפוש וקטורי | שאילתות מנוסחות לפי משמעות, הטרמינולוגיה משתנה | לא תופס מק"טים, קודים ומונחים נדירים — אין להם שכנים קרובים במרחב ה-Embeddings |
| חיפוש היברידי | בשאילתה יש גם משמעות וגם מחרוזות מדויקות: ראשי תיבות, מזהים | צריך לאחד שתי תוצאות ולכויל משקלים, האינדקס גדל, החיפוש יקר יותר |
| פילטרים לפי מטא-נתונים | הנתונים מסומנים לפי מסמך, תפקיד, תקופה, גרסה | בסימון חלקי מקטעים רלוונטיים נחתכים יחד עם רעש |
| חלוקה למקטעים | תקנונים ארוכים שבהם התשובה מפוזרת בין פרקים | מקטעים קטנים מאבדים הקשר, גדולים מטשטשים את הווקטור |
| דירוג מחדש | הסינון הראשון נותן עשרות מועמדים, הסדר חשוב | מוסיף שיהוי לשאילתה ומודל דירוג נפרד לקונטור |
ב-Qdrant המצבים האלה עובדים על אינדקס אחד, ולכן אפשר לשלב ביניהם בלי מאגר שני. בפועל הפילטר מצמצם את מרחב החיפוש, ההיברידי שולף מונחים מדויקים, הדירוג מחדש מתקן את סדר התוצאות העליונות, והחלוקה נבחרת לפי מבנה המסמכים ונבדקת על שאלות אמיתיות של הלקוח.
שלבי הטמעה: מביקורת עד מסירה
ההטמעה מתחילה לא במודל, אלא בקורפוס המסמכים: כל עוד לא ברור מה נמצא בו ומי רשאי לראות מה, כל כיול חיפוש יהיה ניחוש. לכן העבודה מתנהלת בשלבים, וכל שלב מסתיים בארטיפקט שאפשר לבדוק לפני המעבר לשלב הבא.
- ביקורת נתונים. מפרקים את הקורפוס: פורמטים ומקורות, כפילויות וגרסאות מיושנות, שיעור סריקות בלי שכבת טקסט, הפרדת הרשאות לפי מחלקות. בפלט — רשימה של מה שכפוף לאינדוקס וכללי גישה ברמת רשומות.
- סכימת קולקציות. מחליטים כמה קולקציות צריך ולמה, אילו מטא-נתונים מלווים כל מקטע, איך מסמך מתחלק לחלקים, איזה מודל Embeddings משמש ולפי אילו שדות מתבצע סינון. הסכימה מקובעת לפני הטעינה הראשונה — לשנות אותה על אינדקס חי יקר יותר.
- כיול חיפוש. בונים תוצאה היברידית: חיפוש וקטורי לפי משמעות בתוספת התאמה מדויקת לפי מונחים, מספרים וראשי תיבות, ומעל — דירוג מחדש וסף חיתוך, כך שהמערכת אומרת בכנות «במסמכים אין תשובה» במקום המצאה סבירה.
- בנייה ואכלוס. עושים צינור אינדוקס: טעינה ראשונית של הקורפוס, ואז עדכון אינקרמנטלי עם תיקוני מסמכים, עם אחסון נפרד של גרסאות ויכולת לאנדקס מחדש קולקציה אחת בלי לפגוע באחרות.
- בדיקת איכות. מכינים סט שאלות עם תשובות ומקורות ייחוס, מודדים שיעור פגיעות במסמך הנכון, שלמות ודיוק ציטוטים, יציבות לניסוחים מחדש והתנהגות בשאלות מחוץ לקורפוס. שגיאות מפרקים לפי סיבות: חלוקה, מטא-נתונים, חיפוש או ניסוח השאילתה.
- מסירת הפתרון. מוסרים סכימה ותצורות, נהלי עדכון הקורפוס ואינדוקס מחדש, הוראות לתמיכה, מעבירים הדרכה לצוות שלכם ונשארים בקשר בתקופת התיקונים הראשונים.
סדר כזה נותן эффект מצטבר: עד לרגע ההשקה יש לכם לא רק חיפוש עובד במסמכים, אלא גם נהל ברור לתחזוקה שלו.
תיעוד וארטיפקטים בפלט
מערכת עובדת בלי תיעוד הופכת מהר לקופסה שחורה: השינוי הראשון במקורות או החלפת מודל Embeddings נתקעים בבחינה מחדש של אפשרויות. לכן הפתרון נמסר יחד עם ערכת ארטיפקטים שנמצאת באותו מאגר כמו הקוד ומתעדכנת יחד איתו.
- סכימות קולקציות ב-Qdrant — שם הקולקציה, מימד הווקטור, מדד הקרבה, הרכב שדות שירות ואינדקסים לפי מאפיינים מסוננים. מהן רואים במה אפשר לצמצם את הבחירה ומה לשנות כשהקורפוס גדל.
- כללי חלוקת מסמכים — גודל המקטע, החפיפה, קישור מטא-נתונים למקור ולפרק. בלעדיהם בלוק חדש של בסיס הידע שובר את איכות התוצאות.
- נוהל עדכון — תדירות בנייה מחדש, סדר טעינת מסמכים חדשים, מחיקת גרסאות מיושנות וחזרה לתמונת מצב קודמת של האינדקס.
- מדיניות גישה — תפקידים, מפתחות נפרדים לקריאה ולכתיבה, הגבלת נראות לפי מחלקות, יומן פניות לנתונים.
- תיעוד הפתרון — סכימת רכיבים, זרימות נתונים, רשימת נקודות כשל ופעולה בכל אחת: מה להפעיל מחדש, מה לאנדקס מחדש, היכן לבדוק לוגים.
- סט שאלות בדיקה עם תשובות ייחוס — מורץ אחרי כל החלפת מודל או שינוי בהגדרות חיפוש, כדי לראות ירידה באיכות לפני תלונות משתמשים.
- הוראות לצוות — איך להרים סביבה, להוסיף מקור, לקרוא מדדי איכות חיפוש ולאן להסתכל בתשובות ריקות.
- יומן שינויים וגבולות אחריות — מה אנחנו מתחזקים ומה נשאר בצד הלקוח.
ערכה כזו מקצרת את ניתוח האירוע לדקות ומסירה את התלות באנשים ספציפיים: מהנדס חדש נכנס לפרויקט לפי מסמכים, לא לפי שיחות טלפון.
מקרה בוחן: איך צמצמנו את שיעור התשובות השגויות
המדידות נעשו על קורפוס של תיעוד נורמטיבי: כמה מאות מסמכים, מהדורות הוכנסו בזמנים שונים, חלק מהסעיפים ביטלו זה את זה. לפני ההטמעה מהנדס חיפש תשובה ידנית — פתח תקנונים, השווה מספרי סעיפים ותאריכי תחילה.
על שאלה אחת הלכו 12–15 דקות, ושיעור התשובות השגויות הגיע לשליש: האדם או לקח מהדורה שבוטלה, או לא מצא את הסעיף הנדרש וענה מהזיכרון.
| מדד | לפני | אחרי כיול מחדש |
|---|---|---|
| זמן חיפוש תשובה | 12–15 דקות | 20–30 שניות |
| שיעור תשובות שגויות | 34% | 6% |
| הפניות למקור | לא תועדו | בכל תשובה, עם מספר סעיף |
מה שינינו
את המסמכים חילקנו לא לפי עמודים, אלא לפי יחידות מבניות — סעיף, פרק, נספח — כדי שתוצאת החיפוש תכיל מקטע שלם, לא קטע טבלה קרוע. החיפוש נעשה היברידי: קרבה סמנטית דרך Qdrant בתוספת התאמה מדויקת לפי מספרי סעיפים ומונחים, ומעל — מיון מחדש של מועמדים ופילטר לפי המהדורה התקפה.
בנפרד קבענו סף ביטחון: אם אין מקטעים קרובים, המערכת עונה «בקורפוס אין תשובה» במקום המצאה סבירה. בדקנו על סט בקרה של שאלות עם תשובות ייחוס — אותן שאלות הורצו לפני ואחרי השינויים, ולכן המספרים בני השוואה. האפקט העיקרי אינו במהירות: כל תשובה נבדקת כעת במעבר אחד בקישור לסעיף מסוים במסמך.
במה חיפוש היברידי שונה מווקטורי
חיפוש סמנטי משווה את וקטור השאילתה לווקטורים של מקטעים ומוצא קרובים לפי משמעות — הוא יחזיר פסקה על אורך חיי ציוד, גם אם השאילתה מנוסחת כ«כמה עובד המכשיר». נקודת התורפה — טוקנים נדירים: מק"טים, ראשי תיבות, שמות תקנים. הווקטור ממצע אותם למשמעות כללית ומחזיר «דומה בנושא», לא פגיעה מדויקת.
התאמה מדויקת פועלת לפי מופעי מונחים: אם בשאילתה יש קוד חלק או ציון תקן, האינדקס הלקסיקלי מוצא בדיוק את המקטעים שבהם מופיעה המחרוזת הזו. הצד השני — ניסוחים מחדש: המשתמש כותב «משלוח מואץ», במסמכים כתוב «לוגיסטיקת אקספרס», אין התאמה.
חיפוש היברידי מפעיל את שני הערוצים ומאחד שני רשימות מועמדים, ומשקלי הדירוג קובעים עד כמה החלק הלקסיקלי משפיע על הסדר הסופי. את המשקלים לא בוחרים לפי העין: מכיילים אותם על סט שאילתות אמיתיות ובודקים לפי שיעור התשובות הרלוונטיות בחלק העליון של התוצאות.
בחירת המצב נקבעת לפי הרכב השאילתות, לא לפי אופנה של היברידי. מסתכלים בלוגים של פניות וסופרים את שיעור השאילתות עם קודים, ראשי תיבות ושמות מדויקים: אם הוא קטן, חיפוש סמנטי נותן אותה תוצאה במספר קטן יותר של חישובים וקל יותר לאיתור תקלות. אם השאילתות מעורבות, ההיברידי נדלק עם משקלים נפרדים לסוגי שאלות שונים.
ב-Qdrant וקטורים סמנטיים ולקסיקליים נשמרים בקולקציה אחת, ולכן ההיברידי לא דורש מסד שני וסנכרון אינדקסים: המצב מוחלף בפרמטר של השאילתה, והמשקלים משתנים בלי לאנדקס מחדש את הקורפוס.
ספקות טכניים ושאלות נפוצות
חיפוש במסמכים רק לעיתים רחוקות מעורר שאלות בשלב ההשקה — הן מופיעות מאוחר יותר, כשהקורפוס מתחיל להשתנות, ואת הנתונים צריך להחזיק בתוך ההיקף. להלן מה ששואלים עליו הכי הרבה.
איך מעבירים אינדקס ממסד אחר?
בבנייה מחדש: המסמכים נקראים מהמקור, נחתכים לפי הלוגיקה הקודמת למקטעים ונשלחים ל-Qdrant במנות עם השוואת מונים לפי קולקציה. שיעור השאילתות שבהן התוצאה החדשה שונה מהישנה נבדק לפני העברת התעבורה, ולכן חזרה למסד הקודם נשארת אפשרית.
הקורפוס מתעדכן כל שבוע — התוצאות לא יתקלקלו?
מזיקות רק עריכות מעל בלי לאנדקס מחדש את הקשרים בין המקטעים: החיפוש מתחיל להביא חלקים מיושנים. אנחנו מגרסנים קולקציות — החדשה מתמלאת ברקע, הישנה עונה לשאילתות, וההחלפה מתבצעת לפי מוכנות.
אפשר לפרוס הכול בסביבה סגורה?
כן: מודלים, מסד וקטורי ושירות חיפוש חיים ברשת מבודדת בלי קריאות חוץ, העדכון עובר דרך מאגר ארטיפקטים פנימי. הגישה מופרדת לפי תפקידים — מוחזרים רק מקטעים שמותר למשתמש מסוים לראות.
מה יקרה בגידול כפול ומעלה בנפח המסמכים?
מראש קובעים ספים: גודל הקולקציה, מספר סגמנטים, כללי דחיסה ומחיקת גרסאות מיושנות. עם הגידול מוסיפים רפליקות ופיזור הקולקציה בין צמתים, והאיכות נבדקת בסט שאלות ייחוס עם מקורות צפויים — המדד ירד, לא מוציאים גרסה.
נדבר על המשימה ונחזור עם הערכה ותוכנית
כדי שאחרי ניתוח המשימה תופיע תוכנית עבודה, ולא ניסוחים כלליים, צריך מינימום נתונים ראשוניים מצדכם: היכן נמצאים המסמכים ובאיזה פורמט, מי משתמש בהם, אילו תשובות המערכת מחויבת לתת במדויק, ואיפה «אין נתונים» כן עדיף על ניחוש.
בנפרד מדברים על הרשאות — אילו מקורות נקראים במלואם, אילו רק לפי פרקים והאם יש נתונים שאסור להם להיכנס לחיפוש.
בהמשך אנחנו חוזרים עם חבילה שאפשר לקבל לפיה החלטות, לא עם מצגת של רעיון:
- הגדרת המשימה — רשימת תרחישים, שאלות בדיקה עם תשובות צפויות וקריטריונים להערכה: תשובה נכונה, חלקית או מסוכנת.
- תוכנית עבודה — שלבים, הסדר שלהם, מה בודקים בכל שלב ומאיזו תוצאה תלוי המעבר לשלב הבא.
- הרכב הפתרון — ניתוח מסמכים, אינדקס וקטורי ב-Qdrant, יצירת תשובה, שכבת הרשאות גישה; מה ניקח מוכן ומה נכתוב עבורכם.
- סכימת עדכון נתונים — איך מסמכים נכנסים לאינדקס, איך הם עוברים אינדוקס מחדש אחרי עריכות ומה קורה כשנשללת הרשאה מעובד.
- סדר קבלה — סט שאלות בקרה, שיעור התשובות הנכונות ובדיקת התנהגות המערכת בנושאים שאין להם כיסוי במסד.
- תחילת הפרויקט — הרכב הצוות מצדנו, נקודות קשר, מה ומתי נדרש מהמומחים שלכם.
- גבולות הגרסה הראשונה — מה בכוונה לא נכנס אליה ולמה.
תארו את המשימה בצורה חופשית — מקורות, משתמשים ומה שמפריע כרגע. נחזור עם הערכת לוחות זמנים, תוכנית עבודה וסדר קבלה, כדי שתראו תוצאה לפני ההתחלה.







