בבניית TrialProof הפסקתי לרדוף דיוק והתחלתי לספור את המטופלים הזכאים שלא איבדתי: 0 מול 3 על סט זהב קבוע של 13 מקרים.
Clinical TrialsMachine LearningHealthcare

בניתי הדגמה לשחזר טעות מפורסמת של בינה מלאכותית. בסיס הייחוס שלי סירב לבצע אותה.

Ashutosh SinghalAshutosh Singhal29 ביוני 202612 min

הטעות שלא הצלחתי לגרום שתקרה

התחלתי את הבנייה הזו ברצון לשחזר כשל ספציפי, מתועד היטב. בינה מלאכותית להתאמת מטופלים קוראת הערה קלינית כטקסט, ולכן מבלבלת בין מילים שנראות דומות אך משמעותן שונה ברפואה. הדוגמה הקנונית נקייה: מחקר נוגד קרישה בשלב III מחריג מטופלים עם היסטוריה של צנתור לבבי, בהערת המטופל כתוב החדרת צנתר ורידי מרכזי, מתאם דמיון רואה שתי פרוצדורות צנתר קרדיווסקולריות, נותן להן ציון קרוב, ומחריג מטופל שהיה למעשה זכאי. הערכות שפורסמו מאשרות שמודלים אמיתיים עושים בדיוק את השגיאה הזו (Fierce Biotech, 2025). רציתי שההדגמה שלי תראה את זה קורה, ואז תראה את המנוע שלי תופס את זה.

אז כתבתי בסיס ייחוס הוגן שישחק את הנבל. דמיון קוסינוס TF-IDF ברמת ישויות, גרמי מילים וגרמי תווים באורך 3 עד 5, שיטת דמיון וקטורים אמיתית. אפילו הענקתי לו הגדרה נדיבה ואימתתי את סף ההחלטה שלו בהצלבה לטובתו (ROC מרובד ב-3 קיפולים, Youden's J, seed 13, מתייצב ב-t = 0.6932), כי איש קש לא מוכיח דבר. אחר כך הרצתי את מקרה הצנתור הלבבי והמתנתי להחרגה השגויה.

היא לא הגיעה. בסיס הייחוס דירג את שני ביטויי הצנתר בנוחות מתחת לסף שאימת בהצלבה בעצמו והחזיר זכאי. הטעות שבניתי סביבה את כל ההדגמה פשוט לא השתחזרה.

יצאתי לביים כשל מפורסם וגיליתי שהנבל הכנה שלי חלש מדי מכדי לבצע אותו.

הסיבה התבררה כמלמדת, ואני רוצה להיות מדויק לגביה כי קל להגזים. בסיס ייחוס דליל לקסיקלי אינו מייצר את אותה החרגה שגויה ספציפית. הוא זקוק להטמעות סמנטיות צפופות כדי לקרב את שני הביטויים מספיק כדי להכשיל. הוספת מודל הטמעה כבד הייתה מנפחת את ההדגמה למשהו שאי אפשר להריץ בפקודה אחת אופליין, אז קיבלתי החלטה: לשמור על בסיס הייחוס כנה ודליל, ולהפסיק להעמיד פנים שהוא מבצע פשע שאינו יכול לבצע. ההחלטה הזו ארגנה מחדש את כל החלק שאני בונה. אם תרצו להריץ אותו בעצמכם, הוא חי ב-veriprajna.com/he/demos/clinical-trial-recruitment-ai.

מהי בכלל קו מרכזי?

עדיין שמרתי על מקרה הצנתור הלבבי, כי התברר שהוא מוכיח משהו טוב יותר מטעות שנתפסה. הוא מוכיח מדוע תשובת המנוע שלי אמינה בכלל. לשני המושגים כאן יש מזהי SNOMED-CT אמיתיים וניתנים לבדיקה. צנתור ורידי מרכזי הוא 392230005. צנתור לבבי הוא 41976001. אפשר להדביק כל אחד מהם בכל דפדפן SNOMED ציבורי ולאשר שהם יושבים על ענפים שונים של ההיררכיה. אין מסלול is-a מאחד לשני. קו מרכזי אינו צנתור לבבי, ורק היררכיה יודעת את זה.

זו כל התזה בקצה אחד של גרף. ציון דמיון אינו יכול לייצג "is-a." הוא יכול לייצג רק "המחרוזות האלה נראות דומות," ונראות דומות אינה זהה למשמעות דומה. כשהמנוע שלי מעריך את ההחרגה "ללא צנתור לבבי קודם," הוא אינו מנקד דבר. הוא שואל שאלה מבנית: האם העובדה המאומתת של המטופל מוכלת תחת המושג האסור? הוא עובר באונטולוגיה, מוצא שאין מסלול הכלה, ומחזיר זכאי עם שובל בן שלושה שלבים שנותן שם לשני מזהי המושג ולקצה הגרף שבדק.

שובל נימוק של TrialProof המראה צנתור ורידי מרכזי 392230005 is-a צנתור לבבי 41976001 מוערך כ-False, ענף שונה של ההיררכיה, פסק דין ELIGIBLE
שובל EXCL-CARDCATH על מטופל סינתטי P-074. שלב 2 שואל האם צנתור ורידי מרכזי (392230005) is-a צנתור לבבי (41976001), עונה False (ענף שונה של ההיררכיה), ומחזיר ELIGIBLE. לוח בסיס הייחוס למטה מדווח על ציון דמיון מתחת לסף ללא מקור וללא דבר שניתן לשחזור.

כשראיתי לראשונה את השובל הזה מוצג, מה שתפס אותי לא היה פסק הדין. זה היה הקבלה שמתחתיו. התיבה של בסיס הייחוס באותו מסך מראה מספר דמיון ללא מקור וללא דבר שניתן לשחזור. התיבה של המנוע שלי נותנת שם לשני ה-SCTID ולשאלה המדויקת מסוג is-a ששאל. אחד מאלה שרגולטור יכול להגיש לתיק. השני הוא מספר עם תנועת כתפיים מצורפת. הניגוד הזה, לא שגיאה שנתפסה, הוא מה שמקרה הצנתור הלבבי באמת מרוויח.

המטופל שהמתאם באמת זרק החוצה

עדיין נזקקתי למטופל אבוד אמיתי, אז חיפשתי היכן בסיס הייחוס הכנה שלי באמת נכשל, ומצאתי את זה במילה אחת: לא. תיק הגיבור הסינתטי P-074 נושא את שורת ההערה "אין עדות לסוכרת." אחת מהחרגות פרוטוקול האונקולוגיה היא "ללא אבחנה של diabetes mellitus." בסיס הייחוס הווקטורי רואה את הטוקן "diabetes" יושב ממש ליד ה-"diabetes" של הקריטריון ומתאים אותם ב-דמיון 1.0. ציון מושלם. אין לו מודל של שלילה, אז הוא קורא משפט שפוסל סוכרת החוצה כאילו הכניס סוכרת פנימה, ומחריג מטופל שהיה זכאי.

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

שובל EXCL-DM של TrialProof: בסיס הייחוס מתאים diabetes ל-diabetes בדמיון 1.0 ומחזיר EXCLUDED, בעוד המאמת מסיר את האזכור השלילי והמנוע מחזיר ELIGIBLE
החלטת EXCL-DM על P-074. האזכור הטוב ביותר של בסיס הייחוס מתאים "Diabetes mellitus" ל-"Diabetes mellitus" בדמיון 1.0 ומחזיר EXCLUDED. המאמת של TrialProof מסיר את האזכור השלילי, כך שאף עובדה מאומתת אינה מוכלת תחת המושג האסור, ופסק הדין הוא ELIGIBLE.

אני ממשיך לחשוב כמה שקט הכשל הזה. אין הודעת שגיאה, אין דגל ביטחון נמוך, אין אות שמשהו השתבש. הציון הוא 1.0, הגבוה ביותר האפשרי, הביטחון הרב ביותר שהמערכת יכולה אי פעם להיות. בסיס הייחוס לעולם אינו בטוח יותר מאשר ברגע המדויק שבו הוא הכי טועה. רכז שסוקר תור של כאלה אין לו דרך לדעת שההתאמה המושלמת הספציפית הזו היא מטופל שהיה צריך להירשם. הכפילו את זה על פני פרוטוקול ותבינו מדוע 80% מהמחקרים מפספסים את לוחות הזמנים לגיוס (קונצנזוס בענף, 2025), ומדוע כל כישלון סינון עולה בממוצע כ-1,200$ (Antidote.me, 2025).

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

מדוע פסק הדין חי מחוץ למודל?

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

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

לוח Verify Facts של TrialProof המציג כל עובדה מוצעת מאותגרת על נוכחות מקטע, שלילה ונושא לפני שהיא יכולה להיכנס להחלטה
שלב Verify Facts על P-074. כל עובדה שהמודל מציע מאותגרת לפני שהיא יכולה להיכנס להחלטה: מקטע קיים, לא שלילי, נושא של המטופל עצמו. כאן עובדת הצנתור הוורידי המרכזי היא ACCEPTED, סיבה: מקטע קיים, לא שלילי, נושא המטופל. עובדות שנכשלות בבדיקה מסומנות REJECTED עם הסיבה בשמה.

על פני סט הזהב המלא, המאמת הזה דחה 7 מופעי עובדה, 3 עובדות רעות מובחנות (אזכור סוכרת שלילי, ייחוס היסטוריה משפחתית של סרטן השד, ותרופה מושתלת מהלוצינציה ללא מקטע תומך), פרוסים על פני 4 מתוך 13 הרצות המקרה שנוקדו, כולן לפני שיכלו לגעת בפסק דין. כשאנשים שואלים אותי "איך אני סומך על מה שהסוכן שלף מההערות שלי," הלוח הזה הוא כל התשובה. אני לא מבקש שתסמכו עליו. אני מראה לכם מה הוא הציע ומה נזרק החוצה ומדוע.

ואז פסק הדין עצמו הוא Python פשוט שיושב מחוץ למסגרת הסוכן: מנוע לוגיקה דאונטית שמעריך איסורים, חריגים זמניים ודרישות על פני האונטולוגיה וקצת חשבון תאריכים. מודל אינו יכול לעקוף את השער הזה, כי המודל אינו בחדר כשהשער רץ. זה גם מה שהופך את המנוע לניתן לשחזור. כשהלוגיקה היא קוד דטרמיניסטי על אונטולוגיה קבועה, הרצה חוזרת של אותו תיק מפיקה את אותה תשובה, בייט אחר בייט, בכל פעם.

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

המספר היחיד שאכפת לקורא שלי בתפעול קליני

ביליתי שבועות באופטימיזציה של מדדים ש, בסופו של דבר הודיתי לעצמי, הקונה אינו שוכב ער עליהם. דיוק החלטה הוא מספר לוח תוצאות. מי שאחראי על היתכנות אצל נותן חסות או CRO אינו משווה ציוני לוח תוצאות. הוא צופה בלוח זמנים לגיוס מחליק, וכל יום של החלקה יקר. דוח ההשפעה של Tufts CSDD (2024) מעמיד את עלות עיכוב הגיוס על כ-800K$ ליום באובדן מכירות מרשם, וגבוה יותר בתחומים הטיפוליים שההדגמה הזו נוגעת בהם: כ-840K$ ליום באונקולוגיה ו-1.4M$ ליום בקרדיווסקולר. מורכבות הפרוטוקול עלתה ב-139% בפרוצדורות מחקר מאז 2005 (IQVIA, 2026), מה שאומר יותר קריטריונים, יותר סעיפים, ויותר מקומות שבהם מתאם טקסט יכול לטעות באחד.

אז הפסקתי להוביל בדיוק והתחלתי להוביל במספר שבאמת ממפה לכאב הזה: מטופלים זכאים שלא איבדתם. על סט זהב מסומן קבוע של 13 מקרים שנלקחו מ-7 מטופלים סינתטיים על פני 2 פרוטוקולים סינתטיים, המנוע שלי מאבד 0 מטופלים זכאים. בסיס הייחוס ההוגן מאבד 3. אותו סט, אותו סף שאומת בהצלבה לטובת בסיס הייחוס עצמו.

אריחי מדד של TrialProof: דיוק החלטה 100 אחוז מול 53.8 אחוז בבסיס הייחוס, מטופלים זכאים שאבדו 0 מול 3, כיסוי שובל ניתן לביקורת 100 אחוז מול 0 אחוז, על סט הזהב המסומן
מדד סט הזהב. על 13 המקרים המסומנים, TrialProof משיג דיוק החלטה של 100% מול 53.8% של בסיס הייחוס, מאבד 0 מטופלים זכאים במקום שבו בסיס הייחוס מאבד 3, ונושא שובל נימוק ב-100% מההחלטות במקום שבו בסיס הייחוס נושא 0%. הרצה חוזרת של כל 13 המקרים מניבה פסקי דין ושובלים זהים בייט-אחר-בייט.

אני רוצה להיות מדויק לגבי מה המספרים האלה ומה הם אינם. הם הפלט של הרתמה עצמה על אותו סט קבוע של 13 מקרים, לא הבטחה לעולם פתוח. ה-100% הוא "100% על סט הזהב הזה," לעולם לא "תמיד צודק." אני לא הולך לומר לכם ש-TrialProof לעולם אינו טועה, כי אין לי את הנתונים לומר את זה ולא הייתי מאמין לאף אחד שכן. מה שאני יכול לומר צר יותר, ולדעתי שימושי יותר: על הסט הזה המנוע מאבד אפס מטופלים זכאים, כל החלטה נושאת שובל שניתן לשחזור, שתי החלטות נמנעו בבטחה עם NEEDS-REVIEW כשחסר מעבדה או חיוני נדרש במקום לנחש, והרצה חוזרת של כל הסט הייתה זהה בייט-אחר-בייט, 13 מתוך 13. כל המטופלים, ההערות והפרוטוקולים הם מתקנים סינתטיים, ללא רשומות אמיתיות בשום מקום. אפשר לצפות בכל אחת מההרצות האלה ב-veriprajna.com/he/demos/clinical-trial-recruitment-ai.

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

יש לזה גם צורה רגולטורית, ואני אציין אותה בזהירות. הנחיית Clinical Decision Support של ה-FDA מינואר 2026 היא המסגרת הרלוונטית לעזר התאמה עם אדם בלולאה כמו זה. כל החלטה שהמנוע פולט יכולה להיות מיוצאת כרשומת CDISC SDTM IE, שורה אחת לכל מטופל וקריטריון, הנושאת את פסק הדין, שובל הנימוק, מזהי המושג והפעולה הדאונטית. זו אינה אישור ואני לא טוען לאישור. זה יישור וכיוון. אבל זה אומר שהשובל אינו נוחות לניפוי באגים. הוא ארטיפקט שניתן להגשה לתיק, והוא קיים מטבע הבנייה בכל החלטה ולא כמחשבה שלאחר מעשה.

אל מה אני חוזר שוב ושוב

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

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

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

ואם תעדיפו לצפות בזה מאשר לקרוא אותי מתאר, הנה כל הדבר רץ מקצה לקצה.

אז הנה השאלה שלא הפסקתי להפוך, ואני באמת רוצה לדעת איך אתם עונים עליה. כשהסיכון הוא ההזדמנות של אדם אמיתי למחקר, איפה אתם רוצים שהאמון שלכם יחיה: במודל שצריך להאמין בו, או בקוד שאפשר לקרוא?

מחקר קשור

פורסם גם ב

בנו את ה-AI שלכם בביטחון.

שותפו עם צוות בעל ניסיון עמוק בבניית הדור הבא של AI ארגוני. אנו נסייע לכם לתכנן, לבנות ולהטמיע אסטרטגיית AI שתוכלו לסמוך עליה.

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