fix(maria): codul de eroare decide acoperirea, nu cosinusul
O captura cu ORA-06550 / PLS-00906 primea raspunsul despre ORA-12541 (TNS no
listener) si nu pleca la suport. Cauza: doua erori Oracle diferite se scriu
aproape la fel ("[Oracle][ODBC][Ora]ORA-..."), asa ca chunk-ul gresit a iesit la
cosinus 0,736 — peste RANK_STRONG_COSINE, care scurtcircuita orice alta dovada.
Chunk-ul corect din dictionar exista, dar statea pe pozitia 4, in afara TOP_K:
OCR-ul unei ferestre intregi aduce zeci de tokeni de zgomot, iar BM25 ineca tocmai
codul.
- `rank.codes()` scoate codurile de oriunde din text, nu doar ca token intreg —
OCR-ul le lipeste de ce e langa ("OraJORA-06550").
- `rank.by_codes()` e un al treilea clasament in fuziune: chunk-ul care poarta
codul cerut urca peste cele care doar seamana. Acum iese primul.
- `rank.assess()`: cand intrebarea are coduri, decid doar ele. Niciun cod gasit =
escaladare la suport, oricat de mare ar fi cosinusul.
- `consumer.search()` judeca acoperirea pe cosinusul chunk-urilor date chiar
modelului, nu pe cel mai bun din tot indexul.
Calibrare 21/21 (cele 19 cazuri + captura reala + ORA-00600, cod care nu e in
documente si trebuie sa plece la suport). Teste: 79 pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
@@ -121,9 +121,11 @@ def search(index: Index, query: str, top_k: int) -> dict:
|
||||
q_vec = embed(query)
|
||||
cosines = [cosine(q_vec, e["embedding"]) for e in index.entries]
|
||||
bm_scores = index.bm25.scores(query)
|
||||
order = rank.rank(cosines, bm_scores)[:top_k]
|
||||
order = rank.rank(cosines, bm_scores, rank.by_codes(query, index.texts))[:top_k]
|
||||
texts = [index.texts[i] for i in order]
|
||||
best = max(cosines)
|
||||
# cosinusul chunk-urilor CHIAR date modelului, nu cel mai bun din tot indexul:
|
||||
# altfel acoperirea se judeca pe o dovada care nu ajunge in context.
|
||||
best = max((cosines[i] for i in order), default=0.0)
|
||||
covered, reason = rank.assess(query, best, texts, index.bm25)
|
||||
return {
|
||||
"chunks": texts,
|
||||
|
||||
Reference in New Issue
Block a user