fix(citation-view): פיזור בלתי-מוגבל הפיל את דף אימות-הפסיקה ב-500 #462

Merged
chaim merged 1 commits from worktree-citation-view-perf into main 2026-08-05 13:26:18 +00:00
Owner

פתיחת טאב "אימות פסיקה" ירתה asyncio.gather על כל טיעוני התיק בבת אחת. מעל ~8 קריאות Voyage מווסת וכולן נתקעות — הפיזור הבלתי-מוגבל היה איטי יותר ממבוקר:

זמן
חיפוש בודד 1.2 שנ׳
32 ללא מגבלה 30.4 שנ׳
32 עם מגבלת 8 22.1 שנ׳

תיק עם 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` על כל טיעוני התיק בבת אחת. מעל ~8 קריאות Voyage מווסת וכולן נתקעות — הפיזור הבלתי-מוגבל היה **איטי יותר** ממבוקר: | | זמן | |---|---| | חיפוש בודד | 1.2 שנ׳ | | 32 ללא מגבלה | **30.4 שנ׳** | | 32 עם מגבלת 8 | **22.1 שנ׳** | תיק עם 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 שערים ירוקים.
chaim added 1 commit 2026-08-05 13:26:04 +00:00
fix(citation-view): פיזור בלתי-מוגבל הפיל את דף אימות-הפסיקה ב-500
All checks were successful
INV-AG3 Agent Tool Grants / agent-tool-grants (pull_request) Successful in 41s
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
Lint — undefined names / undefined-names (pull_request) Successful in 12s
d65c335a4a
פתיחת טאב "אימות פסיקה" ירתה `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 עוברים.
chaim merged commit df60636876 into main 2026-08-05 13:26:18 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#462