Все уроки · 44
Что такое эмбеддинги
Идея, на которой держатся семантический поиск и RAG: превращение текста в векторы чисел так, чтобы близкие по смыслу тексты оказывались рядом. И где эмбеддинги применяются в реальных продуктах.
Текст как координаты
Вся идея в одном предложении: эмбеддинг присваивает каждому фрагменту текста набор координат на карте смыслов, причём похожие по смыслу тексты получают близкие координаты.
Если говорить технически: эмбеддинг — это способ превратить текст в список чисел (вектор), который передаёт его смысл.
Эмбеддинг передаёт именно смысл. Предложения «Как сбросить пароль?» и «Не могу войти в аккаунт» почти не имеют общих слов, но их эмбеддинги оказываются совсем рядом. А вот слова «password» и «passport», почти совпадающие по написанию, попадают в далёкие друг от друга места.
Это важно, потому что именно этот приём позволяет компьютеру искать по намерению, а не по написанию. На нём держатся «чат с вашими документами», рекомендации и поиск дубликатов — и он лежит в основе всех техник этого курса, которые идут дальше.
Картинка в голове
Представьте, что каждому фрагменту текста присвоено место на гигантской карте смыслов. Близкие по смыслу вещи стоят рядом, а разные по смыслу — далеко друг от друга. Всё остальное в этом уроке — подробности к этой единственной картинке.
Координаты с нуля
Если вы ни разу не встречали вектор, вот он в три шага и без математики:
- Одно число — это координата на прямой. «Температура: 23» помещает сегодняшний день где-то на прямой от холодного к горячему.
- Два числа — это координата на листе бумаги. Широта и долгота помещают город на карту. Города, которые находятся рядом на карте, похожи друг на друга единственным способом, который карта умеет измерять: расстоянием.
- Список чисел — это координата по стольким же направлениям. Эмбеддинг — тот же приём: 1536 чисел задают положение в пространстве с 1536 направлениями — карте смыслов, где «далеко друг от друга» означает «различаются по смыслу».
Представить 1536 направлений невозможно, и вам это никогда не понадобится. Единственный вопрос, который вы задаёте этим координатам, — «какие из них близки к этой?», и он работает одинаково и в 2 измерениях, и в 1536.
Три слова, которые будут встречаться постоянно, — без математики:
- Вектор — мудрёное слово для «списка чисел». И всё. Эмбеддинг предложения — это вектор: несколько сотен чисел, описывающих, где это предложение «живёт» на карте.
- Размерность — сколько чисел в списке. 1536-мерный вектор — это просто список из 1536 чисел. Чем больше размерность, тем больше места для оттенков смысла; на то, как вы этим пользуетесь, это не влияет.
- Косинусное сходство (cosine similarity) — оценка «насколько эти два близки?», которую вычисляет векторный поиск, обычно от 0 до 1. Одна и та же мысль — оценка около 1. Несвязанные вещи — около 0. Сами вы её не считаете — это делает база данных, — но за любым утверждением «эти два текста связаны» стоит именно это число.
На практике вектор длинный: современные модели выдают от 384 до 3072 чисел на текст. Человек не может представить себе 1536-мерное пространство, но математике это безразлично: «расстояние» между векторами по-прежнему работает — и служит заменителем сходства по смыслу.
Посмотрите сами
Ниже — мини-карта обращений в поддержку, расположенных по смыслу. Каждая подпись — это обращение; зелёный элемент — новый входящий вопрос. Наведите курсор на любую точку, чтобы увидеть трёх её ближайших соседей — именно это и вычисляет семантический поиск:
Обратите внимание, что произошло: запрос «сбросить пароль?» совпал по намерению с обращениями не помню пароль и аккаунт заблокирован. Поиск по ключевым словам вернул бы все обращения со словом «пароль» и пропустил бы всё остальное.
Наведите курсор на обращение об оплате и на обращение о доставке: соседями каждого оказываются другие обращения из его же группы. Эту кластеризацию никто не программировал — она сама получается из карты смыслов.
Вот весь продукт в одном действии: пользователь спрашивает своими словами, а вы возвращаете ближайшие точки на карте. Сделать то же для миллиона документов вместо двенадцати — уже задача хранения, и решают её векторные базы данных.
Как вектор выглядит в коде
Эти числа вы никогда не читаете — вы только сравниваете их. Но один раз увидеть вектор полезно: так идея запоминается лучше:
from openai import OpenAI
client = OpenAI()
text = "How do I reset my password?"
vector = client.embeddings.create(
model="text-embedding-3-small", input=text
).data[0].embedding
print(len(vector)) # 1536 — по одной координате на каждое измерение
print(vector[:4]) # [0.0231, -0.0412, 0.0167, -0.0084]
# Другое предложение с тем же смыслом → почти те же числа
other = client.embeddings.create(
model="text-embedding-3-small",
input="I can't log in to my account",
).data[0].embeddingОт того, какая модель выдала эти числа, зависит многое — этому посвящён следующий урок.
Почему близкие по смыслу тексты оказываются рядом?
Модель эмбеддингов — это нейросеть, обученная на огромных объёмах текста. Во время обучения она узнаёт, какие слова и фразы встречаются в похожих контекстах, а контексты несут смысл. «Сбросить пароль» и «не помню пароль» встречаются в одних и тех же разговорах, поэтому сеть учится помещать их почти в одни и те же координаты.
Из этого следуют два полезных свойства:
- Связанные тексты расположены рядом. Расстояние превращается в оценку сходства, по которой можно ранжировать.
- Направление тоже несёт смысл. Известный пример: вектор от «король» к «королева» примерно такой же, как от «мужчина» к «женщина» — отношения сохраняются в виде геометрии.
Для чего используют эмбеддинги
На этой одной идее держится множество современных ИИ-продуктов:
| Сценарий | Как это работает |
|---|---|
| Семантический поиск | Посчитайте эмбеддинги всех документов и запроса и верните ближайших соседей. Так находятся документы о «сбросе пароля», даже если в запросе написано «не могу войти» |
| Рекомендации | Посчитайте эмбеддинги товаров или статей и рекомендуйте то, что лежит рядом с понравившимся пользователю |
| Поиск аномалий | Посчитайте эмбеддинги событий: всё, что далеко от всех обычных кластеров, подозрительно — мошенничество, ошибки, выбросы |
| Классификация | Посчитайте эмбеддинг текста и отнесите его к тому классу, чьи размеченные примеры лежат рядом, — обучать модель не нужно |
| RAG | Посчитайте эмбеддинги базы знаний; когда приходит вопрос, возьмите ближайшие фрагменты и передайте их LLM как контекст |
Последняя строка таблицы — генерация, дополненная поиском (retrieval-augmented generation), техника, которая стоит за «чатом с вашими данными», — работает на эмбеддингах. Ей посвящён отдельный урок, Что такое RAG, и на эмбеддингах держится всё остальное в этом курсе.
Несколько оговорок
- Эмбеддинги создаёт модель, а у моделей есть предвзятость и слепые зоны. Редкие предметные области (юридический жаргон, узкоспециальное оборудование) могут кластеризоваться хуже.
- Карта выше двумерная — для людей; реальные эмбеддинги живут в сотнях измерений, и некоторые важные для нас различия при этом сжимаются.
- Разные модели выдают несовместимые векторы: сравнивать можно только эмбеддинги одной и той же модели. Как выбрать модель, рассказывает урок Модели эмбеддингов и провайдеры.
Одна модель — одно пространство
Никогда не смешивайте векторы двух разных моделей эмбеддингов. Каждая модель задаёт собственное пространство смыслов, и координаты из одного пространства в другом ничего не значат. Если вы меняете модель, пересчитайте эмбеддинги всех данных заново.
Что именно передаёт эмбеддинг?
У двух предложений нет ни одного общего слова. Где окажутся их эмбеддинги?
Что здесь называют «размерностью»?
Вы построили эмбеддинги документов моделью A, а запроса пользователя — моделью B. Что произойдёт?