Что такое вложения? Простое объяснение векторов и косинусного сходства

  1. Главная
  2. Блог
  3. Искусственный интеллект

Искусственный интеллект

Что такое вложения? Простое объяснение сходства векторов и косинусов

Вложения позволяют компьютерам сравнивать значения, а не сопоставлять точные слова. Они обеспечивают семантический поиск, рекомендации и RAG. Узнайте, что это такое, как измеряется сходство и в чем они вас подводят.

8 мин чтения
Что такое вложения? Сходство векторов и косинусов объясняется просто

Главное

  • Вложение — это список чисел, который представляет значение текста, изображения или других данных.
  • Похожие предметы получаются с одинаковыми числами, поэтому их значение можно сравнить с математикой.
  • Косинусное сходство сравнивает направление, и это распространенный способ оценить, насколько похожи два вложения.
  • Сравнивайте только встраивания из одной и той же модели и проверяйте результаты на собственных данных.

Введите в поиск «как вернуть мои деньги», и хорошая система должна найти страницу с названием «Политика возврата денег», даже если между ними нет общих важных слов. Эта способность возникает благодаря встраиваниям, одной из самых полезных идей в современном ИИ.

В этом руководстве объясняются вложения без сложной математики. Мы запустили небольшой пример на Python 3.13, его результаты показаны ниже. Векторы в нем — это те, которые мы составили вручную, используя всего три числа в каждом, чтобы идею было легче понять. Настоящие вложения происходят из обученной модели и часто имеют сотни или тысячи чисел.

Что такое встраивание?

Вложение — это представление чего-либо в виде списка чисел, называемого вектором. Модель обучается так, что элементы со связанными значениями получают векторы, расположенные близко друг к другу.

"kitten"  -> [0.9, 0.8, 0.1]
"cat"     -> [0.9, 0.7, 0.2]
"invoice" -> [0.0, 0.1, 0.9]

Когда текст находится в такой форме, компьютер может рассчитать, насколько похожи два фрагмента текста, чего он не может сделать непосредственно со словами. Вложения также не ограничиваются словами. Предложения, целые документы, изображения, аудио и продукты могут быть встроены.

Почему бы просто не сопоставить ключевые слова?

Запрос и документ Поиск по ключевым словам Встраивание поиска
«возврат денег» и «политика возврата» Пропускает это, нет общих слов Могу найти это
«ноутбук» и «ноутбук» скучает по этому Могу найти это
“ошибка Е1042” и страница с “Е1042” Находит это точно Могу пропустить это
«банк» (река) и «банк» (деньги) Относится к ним одинаково Может разделить их, учитывая контекст

Наше руководство по RAG показывает это на практике. Простой поиск по количеству слов не дал результатов по запросу «Когда я смогу вернуть свои деньги?» против документа о возмещении, поскольку они не обменялись ни одним словом. Обратите также внимание на третью строку: точные идентификаторы — слабость вложений, поэтому поиск по ключевым словам все еще имеет место.

Подумайте о карте

Представьте себе, что каждое слово нанесено на огромную карту, где местоположение отражает значение. «Кот» и «котенок» сидят почти рядом, «собака» в одном районе, а «счет» в другом городе. Чтобы найти похожие слова, просто посмотрите поблизости.

Настоящее встраивание работает таким же образом, за исключением того, что карта имеет сотни измерений, а не два. Люди не могут себе этого представить, но математика работает точно так же. Отдельные цифры обычно не имеют четкого значения, например, «пушистость». Важно общее положение.

Небольшой рабочий пример

Вот как можно сравнить наши сделанные вручную векторы:

import math

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    return dot / (math.sqrt(sum(x * x for x in a)) *
                  math.sqrt(sum(y * y for y in b)))

vectors = {
    "kitten":  [0.9, 0.8, 0.1],
    "cat":     [0.9, 0.7, 0.2],
    "dog":     [0.8, 0.3, 0.2],
    "invoice": [0.0, 0.1, 0.9],
}

for word in ("kitten", "dog", "invoice"):
    print(word, round(cosine(vectors["cat"], vectors[word]), 3))

# kitten 0.994
# dog 0.955
# invoice 0.238

По сравнению с «кошкой» «котенок» получает наивысшие оценки, «собака» следует за ним, а «счет-фактура» гораздо ниже. Мы выбрали эти векторы для создания этого шаблона, поэтому рейтинг ничего не доказывает о реальном языке. Это только показывает, как ведет себя расчет. Семантический поиск делает то же самое в три этапа: встраивает запрос, оценивает его по каждому сохраненному элементу и сортирует.

query = [0.85, 0.75, 0.15]
sorted(vectors, key=lambda w: cosine(query, vectors[w]), reverse=True)

# ['kitten', 'cat', 'dog', 'invoice']

Объяснение косинусного сходства

Каждый вектор можно рассматривать как стрелку, указывающую начало координат. Косинусное подобие измеряет угол между двумя стрелками, не обращая внимания на их длину. Мы подтвердили ключевые ценности:

cosine([1, 2, 3], [2, 4, 6])   # 1.0   same direction
cosine([1, 0], [0, 1])         # 0.0   unrelated (at right angles)
cosine([1, 0], [-1, 0])        # -1.0  opposite directions
Оценка Значение
Рядом с 1 Направьте почти в ту же сторону, очень похоже.
Близко к 0 Несвязанный
Близко к -1 Направьте в противоположные стороны

Посмотрите на первую строку. [2, 4, 6] в два раза длиннее, чем [1, 2, 3], но оценка — идеальная 1,0, потому что единственное, что имеет значение — это направление. Это полезно для текста, длина которого может отражать такие вещи, как размер документа, а не его значение. Будьте осторожны и с порогами. Не существует универсального показателя, означающего «похожий», поскольку полезные диапазоны различаются от модели к модели, поэтому проверьте свои собственные данные.

Другие меры расстояния

Мера На что он смотрит Примечания
Косинусное подобие Только угол Обычное значение по умолчанию для текста
Скалярное произведение Угол и длина Быстро и равно косинусу нормализованных векторов.
Евклидово расстояние Расстояние по прямой Меньше значит больше похоже

Разницу легко увидеть. Те же самые два вектора с коэффициентом косинуса 1,0 имеют евклидово расстояние 3,742, поскольку один длиннее другого. Многие системы нормализуют векторы, масштабируя каждый из них до длины 1. После этого скалярное произведение и косинус дают один и тот же ответ, и мы это подтвердили: обе дали 0,955 для «кошки» и «собаки». Проверьте документацию вашей модели, чтобы узнать, какую меру она рекомендует.

Как изучаются вложения

В реальных системах никто не присваивает эти числа вручную. Нейронная сеть изучает их во время обучения. Ранняя и влиятельная идея заключается в том, что слова, встречающиеся в схожих контекстах, имеют схожие значения, например, «Я кормил свою кошку» и «Я кормил свою собаку». Такие модели, как Word2Vec и GloVe, изучали векторы слов на основе этих шаблонов.

Позже модели на основе преобразователей, такие как BERT, сделали встраивания контекстно-зависимыми, поэтому «банк» мог получить другой вектор в «берег реки» и «банковский кредит». Многие современные модели встраивают целые предложения или отрывки сразу. В нашем руководстве по большим языковым моделям объясняется, как преобразователи обрабатывают контекст.

Где используются вложения

Использование Как это помогает
Семантический поиск Находит результаты по смыслу, а не по точным словам
ТРЯПКА Извлекает соответствующие отрывки для языковой модели.
Рекомендации Предлагает предметы, похожие на те, которые вам понравились.
Кластеризация Группы поддержки билетов или обзоров по темам
Обнаружение дубликатов Находит похожие вопросы или списки
Классификация Предоставляет функции для простых моделей.
Обнаружение аномалий Отмечает элементы, далекие от всего остального

В нашем примере запрос сравнивается с каждым элементом, что называется точным поиском. Это отлично работает для тысяч элементов, но при многих миллионах становится медленным. Индексы приблизительного ближайшего соседа (ANN), такие как HNSW, решают эту проблему. Они быстро находят очень близкие совпадения, отказываясь от небольшого шанса пропустить самое лучшее.

Векторные базы данных и расширения, такие как pgvector для PostgreSQL, предоставляют эти индексы наряду с фильтрацией и хранением. В нашем руководстве по векторным базам данных описаны эти варианты. Для небольшого проекта он может вам вообще не понадобиться, и поиск в памяти — отличный способ начать.

Совет. Рассмотрите гибридный поиск заранее. Сочетание сходства встраивания с сопоставлением ключевых слов часто дает лучшие результаты, чем любое из них по отдельности, особенно когда пользователи ищут коды продуктов, имена или сообщения об ошибках.

Выбор модели встраивания

  • Язык. Если ваш контент, например, на хинди или тамильском языке, убедитесь, что модель хорошо его обрабатывает.
  • Предмет. Общие модели могут противоречить специальным юридическим или медицинским терминам.
  • Размеры. Чем больше измерений, тем больше деталей можно получить, но для этого требуется больше места и памяти.
  • Стоимость и хостинг. Сравните размещенный API с открытой моделью, которую вы можете запустить самостоятельно, особенно для частных данных.
  • Длина ввода. Модели имеют ограничение, поэтому длинные документы необходимо сначала разделить на части.

Лучший тест — ваши собственные данные. Соберите около 20 реальных запросов вместе с документами, которые они должны найти, и сравните, как их ранжирует каждая модель. Опубликованные тесты могут не отражать ваш контент.

Ограничения

  • Привязка модели. Векторы из разных моделей нельзя сравнивать. Если вы меняете модели, вам придется встраивать все заново.
  • Точные условия. Идентификаторы, коды и редкие имена могут не совпадать надежно.
  • Отрицание. Слова «возврат разрешен» и «возврат запрещен» могут находиться рядом друг с другом, несмотря на то, что они означают противоположные вещи.
  • Похоже не значит правильно. Близкое совпадение может быть устаревшим или просто неправильным.
  • Смещение. Встраивания могут поглощать стереотипы из своих обучающих данных.
  • Косинус — это не волшебство. Исследователи задаются вопросом, насколько он значим для некоторых изученных вложений, поэтому воспринимайте оценки как полезный сигнал, а не как меру истины.

Распространенные ошибки

  • Смешение моделей. Встраивайте запросы и документы с одной и той же моделью и версией.
  • Повсюду используйте один порог сходства. Настройте его для каждой модели и задачи.
  • Встраивание огромных документов целиком. Смысл становится размытым, поэтому сначала разбейте их на части.
  • Пропуск оценки. Без тестовых запросов вы не сможете определить, помогло ли изменение.
  • Использование встраивания для всего. Если пользователи ищут точные идентификаторы, лучше использовать обычный индекс базы данных.

Итоги

Встраивание превращает смысл в числа, так что программное обеспечение может сравнивать идеи, а не строки. Идея проста, а практическая работа заключается в выборе модели, фрагментировании данных и тестировании на реальных запросах. Чтобы попробовать это самостоятельно, встройте несколько десятков собственных документов с помощью любой модели встраивания, выполните поиск по ним с помощью реальных вопросов и посмотрите, результаты вас удивят.

Часто задаваемые вопросы

Что такое вложения простыми словами?

Вложения — это списки чисел, которые представляют значение. Предметам со схожим значением присваиваются одинаковые номера, что позволяет компьютеру сравнивать их математически.

Что такое косинусное подобие?

Он измеряет угол между двумя векторами от -1 до 1. Оценка около 1 означает, что они направлены почти в одном направлении, что предполагает схожее содержание.

В чем разница между встраиваниями и токенами?

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

Сколько измерений должно иметь вложение?

Это зависит от модели, обычно от сотен до нескольких тысяч. Чем больше данных, тем больше деталей можно получить, но это требует больше места для хранения, поэтому проверьте, что требуется для вашего варианта использования.

Нужна ли мне векторная база данных для использования вложений?

Нет. Небольшие коллекции можно искать в памяти. Векторные базы данных становятся полезными при больших коллекциях, частых обновлениях или необходимости фильтрации.

Продолжайте учиться

Работайте с Stack Quora

Нужна помощь с тестированием, WordPress или SEO?

Мы помогаем командам выпускать лучшее программное обеспечение и развивать свои сайты. Расскажите нам, над чем вы работаете, и мы предложим четкий следующий шаг.

Продолжайте читать

Больше руководств по тестирование, искусственный интеллект и современные разработки

Понравилась эта статья? Выберите тему и сразу приступайте к нашим новейшим руководствам.

Искусственный интеллект

Объяснение галлюцинаций искусственного интеллекта: почему языковые модели все выдумывают и как их уменьшить

Галлюцинации ИИ объяснили: что это такое, почему языковые модели их создают, распространенные типы, как уменьшить их с помощью заземления и подсказо…

Читать статью →
DevOps

Объяснение переменных среды: файлы .env, секреты и правильно выполненная конфигурация

Переменные среды объясняются на примерах Python, которые мы запускали: их чтение и установка, почему каждое значение является строкой, файлы .env, н…

Читать статью →
Разработка ПО

Объяснение ограничения скорости API: алгоритмы, заголовки и обработка ошибок 429

Ограничение скорости API объясняется с помощью проведенного нами моделирования: сегмент токенов, фиксированное окно, скользящее окно, 429 ответов, з…

Читать статью →
Автоматизация тестирования

Издевательство в Python: unittest.mock, патч и ошибки, из-за которых тесты лгут

Издевательство на Python с помощью unittest.mock, протестировано: Mock и return_value, Side_effect, исправление использования имени, спецификация и …

Читать статью →
Тестирование ПО

Объяснение покрытия кода: покрытие линий или ветвей и что на самом деле означает 100%

Покрытие кода объяснено с помощью реального запуска покрытия.py: покрытие строк, ветвей и условий, чтение отчета, почему 100%-ное покрытие все еще м…

Читать статью →
Базы данных и SQL

DELETE, TRUNCATE и DROP в SQL: различия, откат и когда использовать каждый из них

Объяснение DELETE, TRUNCATE и DROP на примере протестированного SQL: что каждый из них удаляет, откат, триггеры, сброс идентификаторов, скорость и ч…

Читать статью →
Базы данных и SQL

Объяснение представлений SQL: создавайте, используйте и избегайте ловушек, с примерами

Представления SQL, объясненные с помощью запросов, которые мы выполняли: создание представления, результаты в реальном времени, скрытие столбцов, пр…

Читать статью →
Разработка ПО

Интерфейс TypeScript и тип: реальные различия, протестированные с помощью компилятора

Интерфейс TypeScript против типа, проверенный реальным компилятором: что могут делать оба, что может делать только один, слияние объявлений, расшире…

Читать статью →
Разработка ПО

Объяснение Python *args и **kwargs: гибкие функции с понятными примерами

Python *args и **kwargs, объясненные с помощью кода, который мы запускали: упаковка и распаковка, порядок параметров, аргументы только по ключевым с…

Читать статью →
Разработка ПО

Лямбда-функции Python: синтаксис, реальное использование и когда их не следует использовать

Лямбда-функции Python, объясненные с помощью кода, который мы запускали: синтаксис, сортировка с помощью ключа, карты и фильтра, замыкания, ловушка …

Читать статью →
Искусственный интеллект

Что такое ИИ-агенты? Как они работают: можно запустить простой цикл агента

Что такое агенты ИИ? Простое руководство по циклу агента, инструментам, памяти и ограничениям, с небольшим циклом Python, который мы запустили, реал…

Читать статью →
DevOps

Мониторинг и наблюдаемость: реальная разница с журналами, метриками и трассировками

Объяснение мониторинга и наблюдаемости: известные и неизвестные сбои, журналы, метрики и трассировки, пошаговое руководство по инцидентам при оформл…

Читать статью →
DevOps

Docker Volumes против Bind Mounts: правильное сохранение данных контейнера

Объяснение томов Docker и монтирования привязки: почему исчезают данные контейнера, именованные тома, монтирование привязки, tmpfs, примеры создания…

Читать статью →
Автоматизация тестирования

TDD против BDD: ключевые различия, одна функция, созданная для обоих способов, и когда использовать каждый

TDD и BDD объясняются с помощью одной функции скидки, созданной в обоих направлениях: красно-зеленый рефакторинг с кодом, который мы запускали, сцен…

Читать статью →
Тестирование ПО

Пользовательское приемочное тестирование (UAT): процесс, контрольный список и реальные примеры

Приемочное тестирование пользователей объяснило: кто его проводит, чем оно отличается от контроля качества, семиэтапный процесс, шаблон тестового сц…

Читать статью →
Базы данных и SQL

Объяснение значений NULL в SQL: IS NULL, COALESCE, NULLIF и ловушки, которых следует избегать

Значения SQL NULL объяснены с помощью запросов, которые мы выполнили: трехзначная логика, IS NULL, COALESCE, NULLIF, как агрегаты, соединения и сорт…

Читать статью →
Базы данных и SQL

Оператор SQL CASE WHEN: синтаксис, реальные примеры и распространенные ошибки

SQL CASE WHEN объяснен с помощью запросов, которые мы выполняли: простые формы и формы для поиска, порядок условий, повороты с помощью SUM, трюки CO…

Читать статью →
Разработка ПО

Что такое JWT? Веб-токены JSON, объясненные на рабочем примере

Что такое JWT? Объяснение JSON Web Tokens: три части: токен, созданный и измененный в коде, который мы запускали, JWT и сеансы, хранилище, токены об…

Читать статью →
Разработка ПО

Объяснение цикла событий JavaScript: стек вызовов, микрозадачи и таймеры с примерами

Цикл событий JavaScript объясняется с помощью кода, который мы запускали: стек вызовов, очереди задач и микрозадач, почему setTimeout 0 не является …

Читать статью →
Разработка ПО

Генераторы Python и объяснение доходности: экономьте память с помощью реальных примеров

Генераторы Python и доходность, объясненные с помощью кода, который мы запускали: как они приостанавливаются и возобновляются, измеряют экономию пам…

Читать статью →
Искусственный интеллект

Что такое вложения? Простое объяснение векторов и косинусного сходства

Что такое вложения? Простое руководство по векторам, косинусному подобию и семантическому поиску с небольшим примером, который мы использовали, общи…

Читать статью →
DevOps

Сине-зеленое и канареечное развертывание: различия, компромиссы и как выбрать

Объяснение сине-зеленого и канареечного развертывания: как каждый из них работает, стоимость, риски и откат, стабильное группирование пользователей,…

Читать статью →
Автоматизация тестирования

Ненадежные тесты: что их вызывает и как их исправить навсегда

Ненадежные тесты объясняются на демонстрациях, которые мы запускали: основные причины, способы подтверждения и диагностики, правильные исправления в…

Читать статью →
Тестирование ПО

Нагрузочное тестирование и стресс-тестирование: различия, метрики и примеры k6

Объяснение нагрузочного и стресс-тестирования: что доказывает каждое из них, тесты на всплески и выдержки, важные метрики, почему средние значения в…

Читать статью →
Тестирование ПО

Тестовый пример и тестовый сценарий: ключевые различия, примеры и когда использовать каждый

Объяснение тестового случая и тестового сценария: четкие определения, параллельная таблица, одна функция сброса пароля, взятая из сценариев в случаи…

Читать статью →
Базы данных и SQL

Оптимизация SQL-запросов: чтение планов выполнения и исправление медленных запросов с указанием времени

Оптимизация SQL-запросов проверена на миллионе строк: читайте планы выполнения, добавляйте правильные индексы, исправляйте неразмещаемые фильтры, ис…

Читать статью →
Базы данных и SQL

SQL UNION против UNION ALL: различия, примеры и проверка производительности

SQL UNION и UNION ALL объяснены с помощью запросов, которые мы выполнили: дубликаты, правила, которым следуют оба, реальная ошибка данных, измеренна…

Читать статью →
Разработка ПО

Учебное пособие по API JavaScript Fetch: GET, POST, обработка ошибок и тайм-ауты

Учебное пособие по API JavaScript Fetch, протестированное на локальном сервере: GET и POST, почему не выдается ошибка 404, многоразовый помощник, ст…

Читать статью →
Разработка ПО

Обработка файлов Python: чтение, запись, CSV, JSON и pathlib с примерами

Обработка файлов Python объясняется с помощью кода, который мы запускали: открытые режимы, чтение больших файлов, CSV, JSON, pathlib, двоичные файлы…

Читать статью →
Разработка ПО

Классы и объекты Python: учебник ООП с реальными примерами

Классы и объекты Python, объясненные с помощью кода, который мы запускали: __init__, методы, атрибуты класса и экземпляра, наследование, свойства, м…

Читать статью →
Искусственный интеллект

Что такое большая языковая модель? Как работают LLM, объяснено без шумихи

Что такое большая языковая модель? LLM объясняется простым языком: токены, встраивания, внимание, обучение, температурные и контекстные окна, крошеч…

Читать статью →
DevOps

Команды Linux для начинающих: основное руководство по терминалу с примерами

Команды Linux для начинающих, сгруппированные по задачам: навигация, файлы, просмотр журналов, grep, каналы, разрешения, процессы и архивы, с практи…

Читать статью →
Автоматизация тестирования

Selenium vs Playwright: ключевые различия, сравнение кода и что выбрать

Сравнение Selenium и Playwright: архитектура, ожидание, поддержка браузера и языка, отладка, одинаковый тест в обоих инструментах, советы по миграци…

Читать статью →
Тестирование ПО

Разделение эквивалентности: метод проектирования тестов, объясненный на рабочих примерах

Объяснение эквивалентного разделения: как найти действительные и недействительные разделы, рабочие примеры для возрастов, паролей и купонов, проведе…

Читать статью →
Тестирование ПО

Серьезность и приоритет в тестировании программного обеспечения: различия, матрица и реальные примеры

Объяснение серьезности и приоритета при тестировании программного обеспечения: четкие определения, четырехсторонняя матрица с примерами, шкалы уровн…

Читать статью →
Базы данных и SQL

Учебное пособие по подзапросам SQL: типы, коррелирующие подзапросы и EXISTS с примерами

Руководство по подзапросам SQL с выполненными нами запросами: скалярные подзапросы, IN, FROM и SELECT, коррелированные подзапросы, EXISTS, ловушка N…

Читать статью →
Базы данных и SQL

Объяснение транзакций SQL и ACID: COMMIT, ROLLBACK и уровни изоляции

Транзакции SQL и ACID, объясненные с помощью банковского перевода, который мы выполнили: COMMIT, ROLLBACK, точки сохранения, блокировки, уровни изол…

Читать статью →
Разработка ПО

Git merge vs rebase: отличия, примеры и когда что использовать

Git merge vs rebase с реальным выводом log, сравнительной таблицей, золотым правилом rebase и безопасным рабочим процессом для команды.

Читать статью →
Разработка ПО

Генераторы списков в Python: синтаксис, примеры и когда их избегать

Генераторы списков в Python: синтаксис, фильтры, if-else, вложенные циклы, измеренное время и случаи, когда обычный цикл for лучше.

Читать статью →
Базы данных и SQL

SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)

Разберите SQL JOIN шаг за шагом на примерах таблиц и запросов: INNER, LEFT, RIGHT, FULL, CROSS и SELF, а также частые ошибки и советы по производите…

Читать статью →