fix(retrieval): סף מכויל-קוסינוס סינן פלט RRF — דף אימות-הפסיקה הציג אפס תקדימים #463
Reference in New Issue
Block a user
Delete Branch "worktree-relevance-scale"
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?
_merge_sem_lexדורס אתscoreבערך RRF (~0.008–0.02) כשה-leg הלקסיקלי מחזיר שורות, ואילו_SUGGEST_FLOOR=0.45כויל לקוסינוס. כל שאילתה במונחים נפוצים סוננה עד האחרונה, והדף הציג "אין תקדים תומך" לכל טיעון בכל תיק.התיקון: עוגן
relevanceבמקור הסמנטי (G1), נשמר דרך הפיוז׳ן, והצרכן מסנן לפיו. שורה לקסיקלית-בלבד →relevance=None("לא נמדד" ≠ "לא רלוונטי") ונשמרת במודע — היא הגיעה לצמרת בדירוג BM25, וסינונה היה מחביא התאמות ביטוי/מספר-תיק. הדירוג לא השתנה — RRF עדיין קובע סדר.אימות מול DB חי:
score=0.0082·relevance=0.7297היומונים לא נפגעו —
search_digests_semanticהוא סמנטי טהור.invariants: G1 · G2 · INV-AH
6 טסטים חדשים; 531 עוברים; 3 שערים ירוקים.
`hybrid_search._merge_sem_lex` דורס את `score` בערך RRF (~0.008–0.02) ברגע שה-leg הלקסיקלי מחזיר שורות. `score` הוא אות-דירוג לגיטימי, אבל הוא מפסיק להיות קוסינוס — ואילו `case_citation_verification._SUGGEST_FLOOR = 0.45` כויל לקוסינוס. התוצאה: **כל שאילתה במונחים משפטיים נפוצים סוננה עד האחרונה**, והדף הציג "אין תקדים תומך" לכל טיעון בכל תיק. אותה פונקציה החזירה שתי סקאלות, תלוי בשאילתה: "המונח חזית הבניין יפורש..." leg לקסיקלי ריק → 0.63–0.71 (קוסינוס) "סמכות ועדה מקומית לפי 62א" leg לקסיקלי מלא → 0.016 (RRF) מה שונה - **עוגן קוסינוס במקור (G1):** `db.search_precedent_library_semantic` מסמן `relevance` לצד `score`. **לא** בפונקציה הלקסיקלית — שם `ts_rank_cd`, ולסמן אותו כ-relevance היה חוזר על אותה טעות בדיוק. - **הפיוז'ן משמר:** `_merge_sem_lex` מעביר את הקוסינוס הלאה. שורה לקסיקלית-בלבד מקבלת `relevance = None` — "לא נמדד" אינו "נמדד כלא-רלוונטי". - **הצרכן קורא `relevance`:** `_passes_floor()` במקום השוואה ל-`score`. שורות לקסיקליות-בלבד **נשמרות במודע** — הן הגיעו לצמרת בדירוג BM25 בתוך top-k זעיר, וסינונן היה מחביא בדיוק את התאמות-הביטוי ומספרי-התיק שהיו"ר מחפש בשם. הדירוג לא השתנה: RRF ממשיך לקבוע סדר. רק הסינון עבר לסקאלה יציבה. אימות מול הקורפוס החי: 8124-09-24: 0 → **32 מתוך 32** טיעונים עם תקדים תומך (21.5 שנ', שלם) 1069-04-26: 0 → **29 מתוך 69** (24.1 שנ', חלקי — תקציב הזמן) שורה סמנטית: score=0.0082 · relevance=0.7297 היומונים לא נפגעו ולא נגעתי בהם: `case_digest_radar` עובר דרך `search_digests_semantic` — סמנטי טהור, בלי RRF, ולכן `min_score=0.45` שלו מכויל נכון. invariants: G1 (עוגן במקור, לא תיקון-סף בקריאה) · G2 (הגדרה אחת ל-relevance לכל הצרכנים) · INV-AH (היעדר-מדידה אינו היעדר-רלוונטיות) טסטים: 6 חדשים (tests/test_relevance_scale.py) — אחד מהם מוכיח את הבאג ואת התיקון באותה שורה. 531 עוברים.