Retrieval jednomodalny przegrywa w przypadkach brzegowych: dense vectors gubią rzadkie tokeny i IDs; czysty lexical gubi parafrazy i podobieństwo semantyczne. Hybrid retrieval łączy komplementarne sygnały, dense semantic, sparse lexical, structured metadata i temporal freshness, aby tworzyć stabilne zbiory kandydatów o wysokiej precision. Ten artykuł opisuje architekturę, normalizację, fuzję scoringu, obsługę awarii i ewaluację.
Motywacja
Scenariusze awarii:
- Nazwy własne / kody SKU pomijane przez model dense.
- Zapytania o zmianę cen pobierające przestarzały snapshot bez temporal boost.
- Długie pytania naturalne nadmiernie ważone na stopwords w systemie sparse only.
- Vector false positives na semantycznie szerokich stronach, np. marketingowym fluffie, bez leksykalnego zakotwiczenia.
Hybrid ogranicza to, przechwytując ortogonalne wymiary dowodów.
Warstwowanie komponentów
Rekomendowany flow:
- Query Embedding → ANN search (k_vec)
- Lexical Search (BM25 / SPLADE / Elasticsearch) (k_lex)
- Union → Score Normalization (per source scaling)
- Metadata Filter Pass (locale, access_tier, page_type)
- Diversity & Freshness Adjustments
- Optional Cross/Mono Re-Ranker
- Final Truncation (top K)
Zachowuj surowe pre-fusion scores dla audytu.
Normalizacja query
Kroki:
- Normalizacja Unicode NFKC
- Lowercase, z zachowaniem snapshotu wielkości liter do formatowania odpowiedzi, jeśli potrzebny
- Tokenizacja i zachowanie stopwords, bo semantic embeddings mogą używać kontekstu
- Synonym / Alias Expansion: dopisz alternatywne tokeny dla mapowania wewnętrznych codenames produktu, nie wkładaj ich do promptu modelu, używaj tylko dla sparse retrieval
- Numeric & Version Extraction: wychwyć wzorce X.Y.Z do celowanego scoringu leksykalnego
Filtry metadata i atrybutów
Filtry stosowane po początkowej union kandydatów minimalizują utratę recall. Typowe pola: locale, access_tier, page_type, product_area, updated_bucket. Egzekwuj security filters (tenant / tier) PRZED scoring fusion, aby zapobiec wpływowi leakage na re-ranking. Zapewnij tryb debug zwracający filtered_out set do inspekcji.
Strategia re-rankingu
Użyj lekkiego cross-encodera, np. modelu distilled, na top N (10-20). Jeśli latency > budget, degraduj: pomiń re-rank ALBO zmniejsz candidate count, zwiększając lexical weight. Śledź re_rank_delta = MRR_post - MRR_pre, aby uzasadnić koszt. Cache’uj wyniki re-rankingu dla identycznych union sets w krótkim TTL.
Freshness i sygnały temporalne
Oblicz freshness_weight = exp(-lambda * age_days), gdzie lambda jest dostrajana per typ treści, wyższa dla pricing, niższa dla stabilnego API. Połącz: final_score = w_sem * sem_score + w_lex * lex_score + w_fresh * freshness_weight + w_meta * meta_priors. Najpierw normalizuj każdy komponent (z-score albo min-max), aby uniknąć dominacji.
Failure modes
| Failure | Cause | Mitigation |
|---|---|---|
| Popularity Bias | Zbyt duża waga leksykalnego tf-idf | Ogranicz wkład term frequency |
| Stale Results | Freshness weight źle dostrojony | Rekalibruj lambda na zbiorze ewaluacyjnym |
| Locale Leakage | Filtry zastosowane zbyt późno | Przenieś security filters wcześniej |
| Semantic Drift | Upgrade modelu embeddingów | Dual-index i porównanie A/B przed rollout |
| Over-fusion Noise | Nieograniczony union size | Ogranicz union, diversity pruning |
Framework ewaluacji
Eksperymenty:
- Ablation: (tylko vector, tylko lexical, hybrid bez rerank, full) mierz Recall@k, MRR.
- Fusion Weight Tuning: grid search weights na validation gold set.
- Latency Budget: śledź średnią + P95 retrieval latency per konfiguracja.
- Drift: monitoruj tygodniową względną zmianę recall dla head vs tail queries.
Utrzymuj evaluation manifest z hashami konfiguracji.
Pętla optymalizacji
Cykl:
- Loguj retrieval traces (query, candidates, scores, source_tag).
- Identyfikuj mis-hits (niska downstream faithfulness albo niski citation count) → klasyfikuj root cause (brakujący lexical candidate, semantic false positive, stale content).
- Dostosuj weights / thresholds; uruchom offline suite.
- Canary nowych fusion weights za feature flag.
- Promote po statystycznie istotnej poprawie.
Najważniejsze wnioski
- Hybrid retrieval to system strojalnych pokręteł, instrumentuj bezlitośnie.
- Stosuj security i access filters wcześnie; unikaj leakage w scoringu.
- Re-ranking musi uzasadniać latency mierzalnym wzrostem MRR / Recall.
- Temporal decay zapobiega dominacji przestarzałych stron o wysokim autorytecie.
- Traktuj fusion changes jak kod: version, evaluate, roll forward or back.