Всеки подход се проваля по свой начин
| Само ключови думи | Само вектори | |
|---|---|---|
| Проваля се при | синоними, перифрази, друга форма на думата | точни кодове, имена, номера |
| Пример за провал | „как да сваля температура“ не намира „лечение на треска“ | „грешка E-4021“ намира „общи проблеми при работа“ |
| Отрицание | разпознава думата „не“ | често го подминава |
| Нова терминология | намира я, ако е изписана точно | може да не е в обучението на модела |
Хибридно търсене
Изпълнение и на двете търсения върху една заявка и обединяване на резултатите в едно класиране.
Търсене по ключови думи в базата
PostgreSQL има вградено пълнотекстово търсене. То не е просто LIKE — прилага нормализиране на думите и класиране по честота.
ALTER TABLE parcheta ADD COLUMN tsv tsvector
GENERATED ALWAYS AS (to_tsvector('simple', tekst)) STORED;
CREATE INDEX ON parcheta USING GIN (tsv);
SELECT id, tekst, ts_rank(tsv, plainto_tsquery('simple', $1)) AS ocenka
FROM parcheta
WHERE tsv @@ plainto_tsquery('simple', $1)
ORDER BY ocenka DESC
LIMIT 10;Български език
Речниците за стеминг на български не са вградени навсякъде. Ако липсват, се използва simple — тогава „урок“ и „уроци“ са различни думи. Точно тази слабост покрива смисловото търсене.
Как се обединяват класиранията
Проблемът
Двете търсения дават несравними числа: близост между 0 и 1 и оценка за релевантност с произволен мащаб. Директното им събиране е безсмислено.
Обединяване по ранг (RRF)
Най-простото надеждно решение: игнорираме числата и използваме само местата. Всеки резултат получава точки 1 / (k + място) от всяко класиране, а точките се събират.
място 1 → 1/61 = 0.0164 (при k = 60)
място 2 → 1/62 = 0.0161
място 3 → 1/63 = 0.0159
Документ на 2-ро място в едното и 3-то в другото:
0.0161 + 0.0159 = 0.0320 — изпреварва документ, който е 1-ви само в едното.- Не изисква настройка на тегла между несравними мащаби.
- Награждава резултати, които и двете търсения намират.
- Работи и когато едното търсене не върне нищо.
Претегляне
Алтернатива: и двете оценки се привеждат към 0–1 и се смесват с тегло. По-гъвкаво, но изисква измерване, за да се избере теглото — иначе е гадаене.
Пренареждане
Трета стъпка, която дава голямо подобрение: взимат се първите 20–50 резултата от хибридното търсене и се подават на по-скъп модел, който оценява всеки спрямо заявката поотделно.
- Търсене — бързо, върху цялата колекция, дава 50 кандидата.
- Пренареждане — бавно, но само върху 50, дава по-добър ред.
- Показват се първите 5.
Защо е разумно
Скъпият модел се прилага върху 50 записа вместо върху милион. Това е същият принцип като в базите: груб филтър, после точна проверка.