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

סוכן AI יכול להחזיר בסוף תשובה מושחרת ונקייה, ובכל זאת לחשוף מידע רגיש בזמן שהמשתמש צופה בה נכתבת. בדיקה עצמאית שפורסמה ב-AgentNotebook מצביעה על הפער הזה במסלול הזרמה של Mastra. המדריך הבא מסביר איך לבדוק את התזמון אצלכם, בלי להשתמש בנתוני לקוחות ובלי להניח שסינון התוצאה הסופית מגן גם על הדרך אליה.
מה נמצא בבדיקה, ומה עדיין לא אומת
ב-30 בספטמבר 2026 פרסם AgentNotebook מדריך המבוסס על בדיקה ב-@mastra/core 1.72.0. לפי התיאור, סינון באמצעות processOutputResult מתבצע אחרי שמקטעי התשובה כבר נשלחו לקורא. המשמעות בתרחיש שנבדק: שינוי הטקסט הסופי אינו משנה את התוכן שכבר עבר בזרם. המקור מתאר גם שחזור שאינו דורש מפתח API.
זוהי בדיקה עצמאית, לא חולשה שאושרה בידי Mastra. לצורך כתבה זו לא בוצע שחזור ולא התקבלה תגובת החברה; התחקיר גם אינו קובע אם ההתנהגות צפויה או תוקנה. יש לאמת אותה מול הגרסה והתצורה שלכם לפני שמסיקים מסקנות על המוצר.
ההבחנה החשובה היא בין שני דברים שונים: התשובה שהיישום שומר בסוף הריצה, והמידע שהיישום שולח במהלכה. בדיקת אבטחה שמסתכלת רק על הרשומה הסופית עלולה לפספס חשיפה בערוץ ההזרמה. לכן נקודת המדידה צריכה להיות בצד המקבל, ולא רק בתוך פונקציית הסינון בשרת.
שלב ראשון: הגדירו מה אסור להעביר ולמי
פתחו סביבת בדיקה מבודדת ורשמו את גרסת החבילה המותקנת, את הגדרות ההזרמה ואת המקום שבו מופעל הסינון. בחרו סמן מלאכותי, למשל PRIVATE_TEST_VALUE, שמייצג מידע שאסור ללקוח לקבל. אל תשתמשו בתעודת זהות אמיתית, במפתח גישה או בפרטי לקוח, גם אם מדובר בסביבה פנימית.
שרטטו מסלול קצר: מקור התשובה, עיבוד בשרת, שכבת הסינון, ערוץ ההעברה והלקוח. סמנו את הנקודה שבה התוכן יוצא מהסביבה המורשית. אם הדפדפן אינו רשאי לקבל את המידע, הסתרתו באמצעות רכיב תצוגה אינה מספיקה: תוכן שהגיע בתעבורת הרשת כבר חצה את הגבול שהגדרתם.
- הגדירו תנאי הצלחה: הסמן אינו מופיע בשום תוכן שנמסר ללקוח, גם לאחר חיבור המקטעים לפי הסדר.
- תעדו בנפרד את המקטעים שהתקבלו ואת התשובה הסופית שנשמרה.
- הכינו תשובת ביקורת ללא הסמן, כדי לוודא שהמערכת מסוגלת להעביר תוכן מותר ולא רק לחסום הכול.
- בדקו גם ערוצי שגיאה ותיעוד בצד הלקוח, ולא רק את בועת הצ'אט.
במוצר ישראלי כדאי לבחור גם דוגמאות בעברית ובטקסט מעורב עברית ואנגלית. למשל, הודעת שירות שבה שם שדה באנגלית מופיע לצד הסבר בעברית. המטרה אינה לבדוק רק התאמה למחרוזת אחת, אלא לוודא שמקרי הבדיקה דומים למסמכי התמיכה, החשבוניות או הרשומות שהיישום שלכם באמת מעבד.
שלב שני: שחזרו את פער התזמון בלי מודל
לפני חיבור לסוכן, אפשר להמחיש את הבעיה בקוד JavaScript קצר. הדוגמה הבאה עצמאית לחלוטין: היא אינה מפעילה את Mastra ואינה משחזרת את המימוש שלה. היא מדגימה מדוע בדיקה של התוצאה הסופית בלבד נותנת תחושת ביטחון שגויה, ומספקת בסיס לבדיקת רגרסיה.
const marker = 'PRIVATE_TEST_VALUE';
const chunks = ['Reply: PRIVATE_', 'TEST_VALUE'];
const redact = text => text.replaceAll(marker, '[REDACTED]');
const received = [];
for (const chunk of chunks) received.push(chunk);
const finalResult = redact(chunks.join(''));
console.assert(!finalResult.includes(marker));
console.assert(received.join('').includes(marker));
const checkedBeforeSend = redact(chunks.join(''));
console.assert(!checkedBeforeSend.includes(marker));שתי הבדיקות הראשונות מדגימות מצב שבו התוצאה הסופית נקייה, אבל חיבור המקטעים שהלקוח קיבל חושף את הסמן. החלק האחרון מציג חלופה פשוטה: צבירה וסינון לפני השחרור. שימו לב שהסמן פוצל בכוונה בין מקטעים; חיפוש שלו בכל מקטע בנפרד לא היה מזהה אותו.

כעת העבירו מקור פלט מדומה דרך מסלול ההזרמה האמיתי של היישום, באמצעות מנגנון הבדיקות המתאים לספרייה שלכם. המטרה היא להפעיל את אותם מעבדים ואת אותה שכבת העברה שפועלים בייצור. אל תסתפקו בקריאה ישירה לפונקציית ההשחרה: היא בודקת את ההחלפה, לא את סדר האירועים.
תשובה נקייה בסוף אינה הוכחה לזרם נקי בדרך.
שלב שלישי: בחרו היכן לעצור את המידע
האפשרות הפשוטה לבדיקה היא לצבור את התשובה בשרת, להפעיל עליה את מדיניות הסינון ורק אז להעביר אותה. המחיר הוא שהמשתמש ממתין לתוכן במקום לראות אותו נכתב מיד. אפשר להציג בזמן הזה הודעת מצב קבועה, שאינה מכילה טקסט שנוצר מתוך המידע הרגיש.
אם הזרמה חיונית למוצר, נדרשת שכבת סינון לפני השחרור, שמחזיקה מספיק הקשר כדי לקבל החלטה. אין גודל חוצץ יחיד שמבטיח הגנה לכל סוג מידע: סוד בעל מבנה מוגדר שונה מחשיפה המשתמעת מתוך משפט שלם. גם חיבור כמה מקטעים אינו תחליף למדיניות ברורה ולבדיקות שלה.
הגדירו גם התנהגות במקרה של תקלה במסנן. במסלול שאמור להגן על מידע אסור, העברת התוכן ללא בדיקה כפתרון גיבוי מבטלת את ההגנה. עדיף לעצור את הפלט ולהחזיר הודעה בטוחה וקבועה. ביטול ההזרמה יכול לעצור תוכן עתידי, אבל אינו מוחק מידע שכבר התקבל אצל הלקוח.
שלב רביעי: הפכו את התרחיש לבדיקה קבועה
לצוות פיתוח בישראל שמפעיל סוכן תמיכה עבור כמה לקוחות עסקיים, הבדיקה הזאת צריכה להתחבר גם להרשאות. השחרת פלט היא שכבת הגנה נוספת, לא הצדקה להזין לסוכן מידע של לקוח אחר. צמצמו מראש את הנתונים שנשלפים בהתאם למשתמש ולארגון, ובדקו בנפרד את מה שיוצא.
- הריצו מקרים שבהם הסמן מגיע בשלמותו, מפוצל בין מקטעים ומופיע כמה פעמים.
- דמו כשל במסנן וניתוק באמצע התשובה; ודאו שאין מסלול עוקף שמשחרר תוכן לא בדוק.
- בדקו את הזרם בנקודת הקבלה לצד התוצאה הסופית, עם נתונים מלאכותיים בלבד.
- לאחר שדרוג חבילה או שינוי בתשתית ההעברה, הריצו שוב את אותה סדרת בדיקות.
אם שחזרתם את ההתנהגות, הכינו דוגמה מינימלית עם גרסה, הגדרות וסדר אירועים ופנו ל-Mastra לבירור האם זה החוזה המתועד של המנגנון. עד לקבלת תשובה, המסקנה המעשית אינה להכריז על הספרייה כלא בטוחה, אלא לוודא שביישום שלכם החלטת הסינון מתקבלת לפני שהמידע עוזב את השרת.
שאלות נפוצות
האם processOutputResult ב-Mastra מונע חשיפת מידע בזמן Streaming?
לפי בדיקה עצמאית שפורסמה ב-AgentNotebook ב-30 בספטמבר 2026 על @mastra/core 1.72.0, הסינון התרחש לאחר שמקטעי תשובה כבר נשלחו לקורא. אין להסתמך על הבדיקה כהוכחה להתנהגות בכל גרסה או תצורה, ויש לבדוק את המסלול שמגיע בפועל ללקוח.
איך בודקים דליפת מידע מסוכן AI בלי מפתח API?
אפשר להזרים מקטעים מלאכותיים עם סמן בדיקה, להפעיל סינון ולתעד מה הגיע לצד הלקוח לעומת התוצאה הסופית. בדיקה כזאת מאמתת את לוגיקת הבדיקה; כדי לבדוק את Mastra עצמה צריך להעביר את המקור המדומה דרך מסלול ההזרמה של הספרייה.
האם אפשר לסנן כל מקטע של תשובת AI בנפרד?
לא כדאי להסתמך על כך בלבד, משום שמידע רגיש עשוי להתחלק בין כמה מקטעים או לדרוש הקשר לזיהוי. אפשר לצבור תשובה ולבדוק אותה לפני השחרור, או לתכנן סינון מצטבר עם כללים ברורים לגבי מה מותר לשחרר ומתי.
דרגו את הכתבה
הדירוג עוזר לנו לדעת מה שווה לכם.



תגובות