Sentence Transformers и эмбеддинги

Учимся превращать тексты в векторы и искать похожие по смыслу — основа семантического поиска и RAG.

Эмбеддинг — числовой вектор фиксированной длины, который кодирует смысл текста так, что близкие по смыслу тексты дают близкие векторы.

Зачем нужны эмбеддинги

Обычный поиск ищет по точным словам. Но «как починить машину» и «ремонт автомобиля» — про одно, а слова разные. Эмбеддинги решают это: они переводят смысл в вектор, и близость векторов отражает близость смысла. Это фундамент семантического поиска и RAG (Retrieval-Augmented Generation) — связь с курсом по LLM/LangChain прямая.

Sentence Transformers

Библиотека sentence-transformers даёт модели, которые превращают предложение в один вектор (обычно 384–768 чисел). Код требует библиотеки и не исполняется в браузере:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L6-v2")
vecs = model.encode(["кошка спит", "кот дремлет", "идёт дождь"])
print(vecs.shape)  # (3, 384)

Косинусная близость своими руками

Близость векторов измеряют косинусом угла между ними: 1 — одинаковое направление, 0 — нет связи. Посчитаем на чистом Python (реально запускается):

import math

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(y * y for y in b))
    return dot / (na * nb)

cat1 = [0.9, 0.1, 0.0]   # "кошка спит"
cat2 = [0.8, 0.2, 0.1]   # "кот дремлет"
rain = [0.0, 0.1, 0.9]   # "идёт дождь"

print("кошки между собой:", round(cosine(cat1, cat2), 3))
print("кошка и дождь    :", round(cosine(cat1, rain), 3))

Вывод:

кошки между собой: 0.984
кошка и дождь    : 0.012

Две фразы про кошек дали высокую близость, фраза про дождь — низкую. Так работает семантический поиск: запрос превращают в вектор и ищут ближайшие к нему документы.

Как работает под капотом

Sentence Transformers берут encoder-модель (вроде BERT) и добавляют операцию пулинга — усреднение векторов всех токенов в один вектор предложения. Модель дообучают так, чтобы похожие по смыслу предложения давали близкие векторы (contrastive learning). В RAG эти векторы складывают в векторную базу (FAISS, Chroma и др.); по запросу находят ближайшие документы и подставляют их в промпт LLM как контекст.

Частые ошибки

  • Сравнивать эмбеддинги от разных моделей. Векторы из разных моделей несравнимы между собой.
  • Использовать евклидово расстояние вместо косинуса без нормализации. Для текстовых эмбеддингов обычно берут косинус.
  • Брать модель не для того языка. Для русского нужна многоязычная или русскоязычная модель эмбеддингов.

Итог

  • Эмбеддинг — вектор, кодирующий смысл текста; близкие смыслы дают близкие векторы.
  • Sentence Transformers превращают предложение в один вектор через пулинг.
  • Близость измеряют косинусом угла между векторами.
  • Это основа семантического поиска и RAG.
Проверьте себя
1. Что такое эмбеддинг текста?
AСжатая модель
BЧисловой вектор, кодирующий смысл так, что близкие смыслы дают близкие векторы
CТокенизатор
DЛицензия модели
2. Чем измеряют близость текстовых эмбеддингов?
AДлиной строки
BКосинусом угла между векторами
CЧислом токенов
DРазмером модели
3. Какую роль эмбеддинги играют в RAG?
AОбучают LLM с нуля
BПозволяют найти релевантные документы по смыслу и подставить их в промпт
CКвантуют модель
DПереводят текст