Усі уроки · 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. Що станеться?