Problém: Limity tradičního vyhledávání
Tradiční fulltextové vyhledávání, založené na algoritmech jako BM25, má několik zásadních omezení:
1. Překlepy a variace
- Uživatelé často píší dotazy s překlepy nebo používají různé varianty názvů
- Tradiční vyhledávání vyžaduje přesnou shodu nebo velmi podobný text
2. Vyhledávání pouze v názvech
- Fulltextové vyhledávání typicky hledá pouze v konkrétních polích (například název produktu nebo entity)
- Pokud je relevantní informace v popisu nebo v souvisejících entitách, systém ji nenajde
3. Chybějící sémantické porozumění
- Systém nerozpozná synonyma nebo související koncepty
- Například dotaz "auto" nenajde výsledky obsahující "automobil" nebo "vůz", i když jde o stejný koncept
- Mezijazyčné vyhledávání je téměř nemožné – český dotaz nenajde anglické výsledky
4. Kontextové vyhledávání
- Uživatelé často hledají podle kontextu, ne přesných názvů
- Například dotaz "produkty od výrobce X" by měl najít všechny relevantní produkty, i když název výrobce není explicitně uveden v dotazu
Řešení: Hybridní vyhledávání s embeddingy
Řešením je kombinace dvou přístupů: tradičního fulltextového vyhledávání (BM25) a vektorových embeddingů pro sémantické vyhledávání.
Vektorové embeddingy pro sémantické porozumění
Vektorové embeddingy převádějí text do vícerozměrného prostoru, kde podobné významy jsou blízko sebe. To umožňuje:
- Vyhledávání podle významu: Dotaz "notebook" najde výsledky obsahující "laptop", "přenosný počítač" nebo dokonce související koncepty
- Mezijazyčné vyhledávání: Český dotaz může najít anglické výsledky, pokud mají podobný význam
- Kontextové vyhledávání: Systém rozumí vztahům mezi entitami a koncepty
- Vyhledávání v celém obsahu: Embeddingy mohou být vytvořeny z celého dokumentu, nejen z názvu
Proč embeddingy samotné nestačí
I když jsou embeddingy mocným nástrojem, samy o sobě nejsou dostatečné:
- Překlepy: Vektorové embeddingy mohou mít problém s překlepy, protože malá změna v textu může vést k odlišnému embeddingu
- Přesné shody: Někdy chceme najít přesnou shodu názvu, což fulltextové vyhledávání dělá lépe
- Výkon: Vektorové vyhledávání může být pomalejší než optimalizované fulltextové indexy
Hybridní přístup: BM25 + HNSW
Ideální řešení kombinuje oba přístupy:
- BM25 (Best Matching 25): Tradiční fulltextový algoritmus, který exceluje v přesných shodách a zpracování překlepů
- HNSW (Hierarchical Navigable Small World): Efektivní algoritmus pro vyhledávání v prostoru vektorů, který umožňuje rychlé nalezení nejbližších sousedů v embedding prostoru
Kombinací těchto dvou přístupů získáme to nejlepší z obou světů: přesnost fulltextového vyhledávání pro přesné shody a sémantické porozumění embeddingů pro kontextové dotazy.
Výzva: Správné seřazení výsledků
Najít relevantní výsledky je jen první krok. Stejně důležité je je správně seřadit. Uživatelé typicky klikají na první několik výsledků, takže špatné seřazení může výrazně snížit užitečnost vyhledávání.
Proč samotné seřazení (sort by) nestačí
Jednoduché seřazení podle jednoho kritéria (například data) není dostatečné, protože potřebujeme zohlednit více faktorů současně:
- Relevance: Jak dobře výsledek odpovídá dotazu (z fulltextového i vektorového vyhledávání)
- Obchodní hodnota: Výsledky s vyšší marží by měly být výše
- Čerstvost: Novější položky jsou často relevantnější než staré
- Popularita: Populárnější položky mohou být pro uživatele zajímavější
Scoring funkce: Kombinace více faktorů
Místo jednoduchého "sort by" potřebujeme komplexní scoring systém, který kombinuje:
- Fulltextové skóre: Jak dobře výsledek odpovídá dotazu podle BM25
- Vektorové distance: Sémantická podobnost podle embeddingů
- Scoring funkce:
- Magnitude funkce pro marži/popularitu (vyšší hodnoty = vyšší skóre)
- Freshness funkce pro čas (novější = vyšší skóre)
- Další obchodní metriky podle potřeby
Výsledné skóre je pak vážená kombinace všech těchto faktorů. Problém je, že správné váhy nejsou zřejmé a musíme je najít experimentálně.
Hyperparameter search: Hledání optimálních vah
Správné nastavení vah pro fulltextové vyhledávání, vektorové embeddingy a scoring funkce je kritické pro kvalitu výsledků. Tento proces se nazývá hyperparameter search.
Vytvoření testovacího datasetu
Základem úspěšného hyperparameter search je kvalitní testovací dataset. Vytvoříme dataset dotazů, u kterých přesně víme, jak by měly vypadat ideální výsledky:
- Referenční výsledky: Pro každý testovací dotaz máme seznam očekávaných výsledků v správném pořadí
- Anotace: Každý výsledek je označen jako relevantní nebo nerelevantní, případně s prioritou
- Reprezentativní vzorky: Dataset by měl pokrývat různé typy dotazů (přesné shody, synonyma, překlepy, kontextové dotazy)
Metriky pro hodnocení kvality
Abychom mohli objektivně posoudit, zda jsou výsledky dobré, potřebujeme metriky, které porovnávají skutečné výsledky s referenčními:
1. Kontrola úplnosti (Recall)
- Obsahují výsledky vše, co by měly obsahovat?
- Jsou všechny relevantní položky přítomny v seznamu výsledků?
2. Kontrola pořadí (Ranking Quality)
- Jsou výsledky ve správném pořadí?
- Jsou nejrelevantnější výsledky na prvních místech?
Mezi konkrétní metriky patří například NDCG (Normalized Discounted Cumulative Gain), která hodnotí jak úplnost, tak správné pořadí výsledků. Další užitečné metriky zahrnují Precision@K (kolik relevantních výsledků je v prvních K pozicích) nebo MRR (Mean Reciprocal Rank), která měří pozici prvního relevantního výsledku.
Iterativní optimalizace
Proces hyperparameter search probíhá iterativně:
- Nastavení počátečních vah: Začneme s rozumnými výchozími hodnotami
- Testování kombinací: Systematicky testujeme různé kombinace vah pro:
- Váhy fulltextových polí (například název produktu vs. popis)
- Váhy vektorových polí (embeddingy pro různé části dokumentu)
- Boost hodnoty pro scoring funkce (marže, čas, popularita)
- Agregační funkce (jak kombinovat různé scoring funkce)
- Hodnocení výsledků: Pro každou kombinaci spustíme vyhledávání na testovacím datasetu a vypočítáme metriky
- Výběr nejlepších parametrů: Vybereme kombinaci s nejlepšími metrikami
- Refinování: Pokud je to potřeba, zúžíme rozsah testování kolem nejlepších hodnot a opakujeme proces
Tento proces může být časově náročný, ale je nezbytný pro dosažení optimálních výsledků. Automatizace tohoto procesu umožňuje testovat stovky nebo tisíce kombinací parametrů a najít ty nejlepší.
Sledování a iterativní zlepšování
I po optimalizaci parametrů je důležité systém kontinuálně sledovat a zlepšovat.
Sledování chování uživatelů
Klíčovou metrikou je, zda uživatelé klikají na výsledky, které jim systém nabízí. Pokud uživatel neklikne na první výsledek, ale až na třetí nebo čtvrtý, je to signál, že seřazení není optimální.
Co sledovat:
- Click-through rate (CTR): Kolik uživatelů klikne na výsledky
- Pozice kliknutí: Na které pozici uživatelé klikají (ideálně by měli klikat na první výsledky)
- Dotazy bez kliknutí: Dotazy, na které uživatelé vůbec nekliknou, mohou indikovat špatné výsledky
Analýza problémových případů
Když identifikujeme dotazy, kde uživatelé neklikají na první výsledky, měli bychom:
- Zaznamenat tyto případy: Uložit dotaz, vrácené výsledky a pozici, na kterou uživatel klikl
- Analyzovat: Proč systém vrátil špatné pořadí? Chybí relevantní výsledky? Jsou na špatných pozicích?
- Přidat do testovacího datasetu: Tyto případy by měly být součástí našeho testovacího datasetu pro budoucí optimalizace
- Upravit váhy: Na základě analýzy můžeme upravit váhy nebo přidat nová pravidla
Tento iterativní proces zajišťuje, že systém se neustále zlepšuje a přizpůsobuje se skutečnému chování uživatelů.
Implementace na Azure: AI Search a OpenAI Embeddings
Všechny tyto komponenty můžeme efektivně implementovat pomocí služeb Microsoft Azure.
Azure AI Search
Azure AI Search (dříve Azure Cognitive Search) poskytuje:
- Hybridní vyhledávání: Nativní podpora pro kombinaci fulltextového (BM25) a vektorového vyhledávání
- HNSW indexy: Efektivní implementace HNSW algoritmu pro vektorové vyhledávání
- Scoring profiles: Flexibilní systém pro definování vlastních scoring funkcí
- Text weights: Možnost nastavit váhy pro různá fulltextová pole
- Vector weights: Možnost nastavit váhy pro různá vektorová pole
Azure AI Search umožňuje definovat scoring profiles, které kombinují:
- Magnitude scoring funkce pro numerické hodnoty (marže, popularita)
- Freshness scoring funkce pro časové hodnoty (datum vytvoření, datum aktualizace)
- Text weights pro fulltextová pole
- Vector weights pro vektorová pole
- Agregační funkce pro kombinování různých scoring funkcí
OpenAI Embeddings
Pro vytváření embeddingů používáme OpenAI Embeddings, konkrétně modely jako text-embedding-3-large:
- Kvalitní embeddingy: OpenAI modely poskytují vysoce kvalitní embeddingy, které dobře fungují i pro češtinu
- Konzistentní API: Jednoduchá integrace s Azure AI Search
- Škálovatelnost: OpenAI API zvládne velké objemy požadavků
OpenAI embeddingy jsou zvlášť vhodné pro češtinu, protože byly trénovány na vícejazyčných datech a poskytují dobré výsledky i pro menší jazyky.
Integrace
Azure AI Search umožňuje přímo použít OpenAI embeddingy jako vectorizer, což zjednodušuje integraci. Můžeme definovat vektorová pole v indexu, která automaticky používají OpenAI pro vytváření embeddingů při indexování dokumentů.
Shrnutí
Vytvoření kvalitního vyhledávacího systému vyžaduje více než jen implementaci základního fulltextového vyhledávání. Kombinace fulltextového vyhledávání (BM25) a vektorových embeddingů (HNSW) poskytuje nejlepší výsledky, ale správné nastavení vah a scoring funkcí je kritické.
Hyperparameter search s kvalitním testovacím datasetem je nezbytný pro nalezení optimálních parametrů. A kontinuální sledování chování uživatelů a iterativní zlepšování zajišťuje, že systém zůstává efektivní i když se mění potřeby uživatelů.
S Azure AI Search a OpenAI Embeddings máme k dispozici všechny nástroje potřebné pro implementaci takového systému, včetně podpory pro češtinu a další jazyky. Klíčem k úspěchu je systematický přístup k optimalizaci a ochota neustále se učit z dat a chování uživatelů.



.avif)