fix(citation-view): פיזור בלתי-מוגבל הפיל את דף אימות-הפסיקה ב-500 #462
Reference in New Issue
Block a user
Delete Branch "worktree-citation-view-perf"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
פתיחת טאב "אימות פסיקה" ירתה
asyncio.gatherעל כל טיעוני התיק בבת אחת. מעל ~8 קריאות Voyage מווסת וכולן נתקעות — הפיזור הבלתי-מוגבל היה איטי יותר ממבוקר:תיק עם 69 טיעונים חרג מ-timeout 30 שנ׳ של הפרוקסי → 500, ורענונים חופפים הגיעו ל-
deadlock detectedב-Postgres.התיקון: semaphore(8) + תקציב 22 שנ׳ + קציר של מה שהספיק במקום
wait_for(gather(...))שמבטל הכל.retrieval_complete:falseמסמן תשובה חלקית — כדי שהיעדר-הצעות לא ייקרא כ"אין תקדים תומך".אחרי: 24/32 ו-26/69 טיעונים מקבלים הצעות במקום 500.
⚠️ נותר פתוח (PR נפרד):
hybrid_search.py:305דורס קוסינוס ב-RRF, כך ש-_SUGGEST_FLOOR=0.45מסנן הכל.invariants: §6 · INV-AH
4 טסטים חדשים; 525 עוברים; 3 שערים ירוקים.
פתיחת טאב "אימות פסיקה" ירתה `asyncio.gather` על **כל** טיעוני התיק בבת אחת — טיעון אחד = קריאת embed ל-Voyage + חיפוש היברידי + שאילתת סמכות. מעל ~8 קריאות במקביל Voyage מווסת, וכולן נתקעות יחד. הפיזור הבלתי-מוגבל היה לא רק מסוכן אלא **איטי יותר**: חיפוש בודד ............ 1.2 שנ' 32 ללא מגבלה .......... 30.4 שנ' ← פי 25 מחיפוש בודד 32 עם מגבלת 8 ......... 22.1 שנ' ← מבוקר = מהיר יותר תיק עם 69 טיעונים (1069-04-26) חרג מ-timeout ה-30 שניות של הפרוקסי והחזיר 500; רענוני-דף חופפים הערימו תחרות עד `deadlock detected` ב-Postgres, והאטו את כל המערכת. מה שונה - `_MAX_CONCURRENT_LOOKUPS = 8` — semaphore על הפיזור. - `_RETRIEVAL_BUDGET_S = 22` — תקציב זמן שנגמר לפני הפרוקסי. - בפקיעת התקציב **קוצרים את מה שהספיק** במקום לבטל הכל. במפורש *לא* `wait_for(gather(...))`: הוא מבטל כל משימה, כך שאיחור אחד היה זורק 30 תוצאות שכבר הצליחו. משימות ממתינות מבוטלות ונאספות לפני שהמאגר מתפרק, אחרת נותרת `connection_lost` יתומה. - `retrieval_complete: false` בתשובה — הצעות חסרות מסומנות ולא מוצגות כ"אין תקדים תומך" (§6). שתי הטענות שונות. מדידה אחרי: 24 מתוך 32 טיעונים ו-26 מתוך 69 חוזרים עם הצעות, במקום 500. invariants: §6 (חלקי מסומן, לא נבלע) · INV-AH (לא להציג היעדר-מידע כהיעדר-תקדים) ⚠️ **נותר פתוח, נפרד:** גם כשהחיפוש מצליח `arguments_with_support=0` — `hybrid_search.py:305` דורס את ציון הקוסינוס בציון RRF כשה-leg הלקסיקלי מחזיר תוצאות, כך ש-`_SUGGEST_FLOOR=0.45` (מכויל לקוסינוס) מסנן הכל. מטופל ב-PR נפרד. טסטים: 4 חדשים (tests/test_citation_view_fanout.py) — הראשונים נועלים את המגבלה והתקציב, האחרון משחזר בדיוק את הרגרסיה: קציר מול ביטול-הכל. 525 עוברים.