Почему близкие по смыслу тексты близки в пространстве
Углубляемся в «почему это вообще работает»: связь обучения, контекста и геометрии.
Дистрибутивная гипотеза: «слово узнаётся по компании» — слова, встречающиеся в похожих контекстах, имеют похожий смысл.
Идея, на которой держится всё
Откуда модель «знает», что «врач» и «доктор» близки, хотя буквы разные? Она много раз видела их в одинаковом окружении: «записаться к ...», «... выписал рецепт», «приём у ...». Обучение подталкивает векторы слов с похожим окружением сближаться. В итоге синонимы и тематически связанные слова собираются в одни области пространства.
Покажем на «контекстных профилях»
Смоделируем идею грубо: опишем каждое слово тем, как часто оно встречается рядом с «маркерными» словами. Получится контекстный профиль — игрушечный эмбеддинг. Похожие профили = близкие векторы.
import math
# профиль = частоты соседства с маркерами [лечить, рецепт, машина, дорога]
profiles = {
"врач": [8, 7, 0, 0],
"доктор": [7, 8, 0, 1],
"водитель": [0, 0, 8, 9],
"шофёр": [0, 1, 7, 8],
}
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(x * x for x in b))
return dot / (na * nb)
pairs = [("врач", "доктор"), ("врач", "водитель"), ("водитель", "шофёр")]
for a, b in pairs:
print(f"{a} ~ {b}: cos = {cosine(profiles[a], profiles[b]):.3f}")Вывод:
врач ~ доктор: cos = 0.987 врач ~ водитель: cos = 0.000 водитель ~ шофёр: cos = 0.996
«Врач» и «доктор» близки, «водитель» и «шофёр» близки, а пары из разных тем — нет. И всё это — лишь из того, с какими словами они соседствуют. Настоящие энкодеры делают это несравнимо тоньше, но принцип ровно такой.
Почему это важно для RAG
Пользователь спросит «как вернуть покупку?», а в документе написано «оформление возврата товара». Общих слов почти нет — поиск по ключевым словам промахнётся. А эмбеддинги поставят вопрос и документ рядом, потому что они про одно и то же. Именно поэтому семантический поиск часто бьёт классический полнотекстовый.
Где интуиция ломается
- Антонимы бывают близки: «дорого» и «дёшево» живут в похожих контекстах (про цену) — векторы могут оказаться рядом.
- Редкие термины и опечатки модель кодирует хуже.
- Очень общий запрос близок ко всему сразу и плохо различает.
Итог
- Близость в пространстве — следствие похожих контекстов при обучении.
- Поэтому синонимы и перефразировки находятся, даже без общих слов.
- Это даёт семантический поиск — основу качественного RAG.