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.