Эмбеддинги
Текстовые эмбеддинги — это числовые представления текста, позволяющие измерять семантическое сходство. В этом руководстве рассказывается об эмбеддингах, их применении и о том, как использовать модели эмбеддингов для таких задач, как поиск, рекомендации и обнаружение аномалий.
Перед внедрением эмбеддингов
«Embeddings» (эмбеддинги, или векторные представления) — это числовые представления текста. При выборе поставщика эмбеддингов можно учитывать несколько факторов в зависимости от ваших потребностей и предпочтений:
- Размер набора данных и специфичность предметной области: размер обучающего набора данных модели и его релевантность предметной области, для которой вы хотите получать эмбеддинги. Более крупные или более специализированные данные, как правило, дают более качественные эмбеддинги в рамках предметной области
- Производительность инференса: скорость получения эмбеддингов и сквозная «latency» (задержка). Это особенно важно для крупномасштабных производственных развёртываний
- Кастомизация: возможности дообучения на закрытых данных или специализации моделей для очень узких предметных областей. Это может повысить качество работы с уникальной лексикой
Как получить эмбеддинги с Anthropic
Anthropic не предлагает собственную модель эмбеддингов. Одним из поставщиков эмбеддингов, обладающим широким набором вариантов и возможностей, охватывающих все перечисленные выше соображения, является Voyage AI.
Voyage AI создаёт передовые модели эмбеддингов и предлагает кастомизированные модели для конкретных отраслей, таких как финансы и здравоохранение, а также индивидуально дообученные («fine-tuned») модели для отдельных клиентов.
Остальная часть этого руководства посвящена Voyage AI, однако вам следует оценить различных поставщиков эмбеддингов, чтобы найти наиболее подходящий вариант для вашего конкретного сценария использования.
Доступные модели
Voyage рекомендует использовать следующие модели текстовых эмбеддингов:
Voyage 4 (последнее поколение)
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-4-large | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Лучшее качество универсального и многоязычного поиска. Подробности см. в публикации в блоге о Voyage 4. |
voyage-4 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована для качества универсального и многоязычного поиска. Баланс качества и эффективности. Подробности см. в публикации в блоге о Voyage 4. |
voyage-4-lite | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована по задержке и стоимости. Подробности см. в публикации в блоге о Voyage 4. |
voyage-4-nano | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Модель с открытыми весами (лицензия Apache 2.0), доступная на Hugging Face. Подробности см. в публикации в блоге о Voyage 4. |
Предыдущее поколение
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-3-large | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Лучшее качество универсального и многоязычного поиска. Подробности см. в публикации в блоге о voyage-3-large. |
voyage-3.5 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована для качества универсального и многоязычного поиска. Подробности см. в публикации в блоге о voyage-3.5. |
voyage-3.5-lite | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована по задержке и стоимости. Подробности см. в публикации в блоге о voyage-3.5. |
voyage-code-3 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована для поиска по коду. Подробности см. в публикации в блоге о voyage-code-3. |
voyage-finance-2 | 32 000 | 1024 | Оптимизирована для поиска и RAG в области финансов. Подробности см. в публикации в блоге о voyage-finance-2. |
voyage-law-2 | 16 000 | 1024 | Оптимизирована для поиска и RAG в юридической области и с длинным контекстом. Также улучшена производительность во всех предметных областях. Подробности см. в публикации в блоге о voyage-law-2. |
Кроме того, Voyage рекомендует следующие мультимодальные модели эмбеддингов:
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-multimodal-3.5 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Богатая мультимодальная модель эмбеддингов, способная векторизовать чередующиеся текст, изображения и видео. Включает поддержку видео как первая модель видеоэмбеддингов производственного уровня. Подробности см. в публикации в блоге о voyage-multimodal-3.5. |
voyage-multimodal-3 | 32 000 | 1024 | Богатая мультимодальная модель эмбеддингов, способная векторизовать чередующиеся текст и насыщенные содержимым изображения, такие как скриншоты PDF, слайды, таблицы, рисунки и многое другое. Подробности см. в публикации в блоге о voyage-multimodal-3. |
Следующие модели контекстуализированных эмбеддингов фрагментов создают векторы на уровне фрагментов (chunks), которые учитывают полный контекст документа без ручного добавления метаданных. Вызывайте эти модели с помощью contextualized_embed() вместо embed():
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-context-4 | 120 000 | 1024 (по умолчанию), 256, 512, 2048 | Контекстуализированные эмбеддинги фрагментов, оптимизированные для качества универсального и многоязычного поиска. Подробности см. в публикации в блоге о voyage-context-4. |
voyage-context-3 | 120 000 | 1024 (по умолчанию), 256, 512, 2048 | Контекстуализированные эмбеддинги фрагментов, оптимизированные для качества универсального и многоязычного поиска. Подробности см. в публикации в блоге о voyage-context-3. |
Voyage AI также предлагает «rerankers» (модели переранжирования), которые принимают запрос и список документов и возвращают их отсортированными по релевантности запросу. Вызывайте эти модели с помощью rerank():
| Модель | Длина контекста | Описание |
|---|---|---|
rerank-2.5 | 32 000 | Наивысшая точность. Рекомендуется для большинства приложений. Подробности см. в публикации в блоге о rerank-2.5. |
rerank-2.5-lite | 32 000 | Оптимизирована по задержке и стоимости. Подробности см. в публикации в блоге о rerank-2.5. |
Нужна помощь в выборе модели текстовых эмбеддингов? Ознакомьтесь с FAQ Voyage AI.
Начало работы с Voyage AI
Чтобы получить доступ к эмбеддингам Voyage:
- Зарегистрируйтесь на сайте Voyage AI.
- Получите ключ API.
- Для удобства задайте ключ API в качестве переменной окружения:
export VOYAGE_API_KEY="<your secret key>"Вы можете получить эмбеддинги либо с помощью официального Python-пакета voyageai, либо с помощью HTTP-запросов, как описано в следующих разделах.
Библиотека Voyage для Python
Установите пакет voyageai с помощью следующей команды:
pip install -U voyageaiЗатем вы можете создать объект клиента и начать использовать его для получения эмбеддингов ваших текстов:
import voyageai
vo = voyageai.Client()
# Автоматически используется переменная окружения VOYAGE_API_KEY.
# Либо можно использовать vo = voyageai.Client(api_key="<ваш секретный ключ>")
texts = ["Sample text 1", "Sample text 2"]
result = vo.embed(texts, model="voyage-4", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])result.embeddings — это список из двух векторов эмбеддингов, каждый из которых содержит 1024 числа с плавающей запятой. После выполнения приведённого выше кода оба эмбеддинга будут выведены на экран:
[-0.013131560757756233, 0.019828535616397858, ...] # embedding for "Sample text 1"
[-0.0069352793507277966, 0.020878976210951805, ...] # embedding for "Sample text 2"При создании эмбеддингов вы можете указать несколько других аргументов функции embed().
Дополнительную информацию о Python-пакете Voyage см. в документации Python-пакета Voyage.
HTTP API Voyage
Вы также можете получать эмбеддинги, обращаясь к HTTP API Voyage. Например, можно отправить HTTP-запрос с помощью команды curl в терминале:
curl https://api.voyageai.com/v1/embeddings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $VOYAGE_API_KEY" \
-d '{
"input": ["Sample text 1", "Sample text 2"],
"model": "voyage-4"
}'В ответ вы получите JSON-объект, содержащий эмбеддинги и данные об использовании токенов:
{
"object": "list",
"data": [
{
"embedding": [-0.013131560757756233, 0.019828535616397858 /* ... */],
"index": 0
},
{
"embedding": [-0.0069352793507277966, 0.020878976210951805 /* ... */],
"index": 1
}
],
"model": "voyage-4",
"usage": {
"total_tokens": 10
}
}Дополнительную информацию о HTTP API Voyage см. в документации HTTP API Voyage.
AWS Marketplace
Эмбеддинги Voyage доступны на AWS Marketplace. Инструкции по доступу к Voyage на AWS доступны в документации Voyage по AWS Marketplace.
Пример быстрого старта
Следующий краткий пример показывает, как использовать эмбеддинги.
Предположим, у вас есть небольшой корпус из шести документов, по которым нужно выполнять поиск
documents = [
"The Mediterranean diet emphasizes fish, olive oil, and vegetables, believed to reduce chronic diseases.",
"Photosynthesis in plants converts light energy into glucose and produces essential oxygen.",
"20th-century innovations, from radios to smartphones, centered on electronic advancements.",
"Rivers provide water, irrigation, and habitat for aquatic species, vital for ecosystems.",
"Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.",
"Shakespeare's works, like 'Hamlet' and 'A Midsummer Night's Dream,' endure in literature.",
]Сначала используйте Voyage, чтобы преобразовать каждый документ в вектор эмбеддинга.
import voyageai
vo = voyageai.Client()
# Создаём эмбеддинги документов
doc_embds = vo.embed(documents, model="voyage-4", input_type="document").embeddingsЭмбеддинги позволяют выполнять семантический поиск / извлечение в векторном пространстве. Пусть дан пример запроса,
query = "When is Apple's conference call scheduled?"Далее преобразуйте его в эмбеддинг и выполните поиск ближайшего соседа, чтобы найти наиболее релевантный документ на основе расстояния в пространстве эмбеддингов.
import numpy as np
# Получаем эмбеддинг запроса
query_embd = vo.embed([query], model="voyage-4", input_type="query").embeddings[0]
# Вычисляем сходство
# Эмбеддинги Voyage нормализованы к длине 1, поэтому скалярное произведение
# и косинусное сходство совпадают.
similarities = np.dot(doc_embds, query_embd)
retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])Обратите внимание, что input_type="document" и input_type="query" используются для получения эмбеддингов документа и запроса соответственно. Более подробную спецификацию можно найти в разделе Библиотека Voyage для Python.
Результатом будет пятый документ, который действительно наиболее релевантен запросу:
Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.Если вы ищете подробный набор рецептов по реализации RAG с эмбеддингами, включая векторные базы данных, ознакомьтесь с рецептом RAG.
FAQ
Модели эмбеддингов опираются на мощные нейронные сети для захвата и сжатия семантического контекста, подобно генеративным моделям. Команда опытных исследователей ИИ Voyage оптимизирует каждый компонент процесса получения эмбеддингов, включая:
- Архитектуру модели
- Сбор данных
- Функции потерь
- Выбор оптимизатора
Узнайте больше о техническом подходе Voyage в блоге Voyage AI.
Для эмбеддингов общего назначения рекомендуются следующие модели:
voyage-4-large: лучшее качествоvoyage-4-lite: наименьшие задержка и стоимостьvoyage-4: сбалансированная производительность
Для поиска используйте параметр input_type, чтобы указать, является ли текст запросом или документом.
Модели для конкретных предметных областей:
- Юридические задачи:
voyage-law-2 - Код и документация по программированию:
voyage-code-3 - Задачи, связанные с финансами:
voyage-finance-2
Для поиска на уровне фрагментов и документов: voyage-context-4
Вы можете использовать эмбеддинги Voyage со сходством по скалярному произведению, косинусным сходством или евклидовым расстоянием. Объяснение сходства эмбеддингов см. в этом руководстве по сходству векторов.
Эмбеддинги Voyage AI нормализованы до длины 1, что означает:
- Косинусное сходство эквивалентно сходству по скалярному произведению, при этом последнее вычисляется быстрее.
- Косинусное сходство и евклидово расстояние дают идентичное ранжирование.
Для всех задач и сценариев поиска (например, RAG) используйте параметр input_type, чтобы указать, является ли входной текст запросом или документом. Не опускайте input_type и не задавайте input_type=None. Указание того, является ли входной текст запросом или документом, позволяет создавать более качественные плотные векторные представления для поиска, что может привести к повышению качества поиска.
При использовании параметра input_type перед получением эмбеддинга к входному тексту добавляются специальные подсказки. А именно:
📘 Подсказки, связанные с
input_type
- Для запроса подсказка: «Represent the query for retrieving supporting documents: ».
- Для документа подсказка: «Represent the document for retrieval: ».
- Пример
- При
input_type="query"запрос вида "When is Apple's conference call scheduled?" превратится в "Represent the query for retrieving supporting documents: When is Apple's conference call scheduled?"- При
input_type="document"запрос вида "Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET." превратится в "Represent the document for retrieval: Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET."
voyage-large-2-instruct, как следует из названия, обучена реагировать на дополнительные инструкции, добавляемые перед входным текстом. Для классификации, кластеризации или других подзадач MTEB используйте инструкции voyage-large-2-instruct.
Квантизация эмбеддингов преобразует значения высокой точности, такие как 32-битные числа с плавающей запятой одинарной точности, в форматы более низкой точности, такие как 8-битные целые числа или 1-битные двоичные значения, сокращая объём хранения, память и затраты в 4 и 32 раза соответственно. Поддерживаемые модели Voyage позволяют включить квантизацию, указав тип выходных данных с помощью параметра output_dtype:
float: каждый возвращаемый эмбеддинг представляет собой список 32-битных (4-байтовых) чисел с плавающей запятой одинарной точности. Это значение по умолчанию, обеспечивающее наивысшую точность / точность поиска.int8иuint8: каждый возвращаемый эмбеддинг представляет собой список 8-битных (1-байтовых) целых чисел в диапазоне от -128 до 127 и от 0 до 255 соответственно.binaryиubinary: каждый возвращаемый эмбеддинг представляет собой список 8-битных целых чисел, представляющих упакованные по битам квантизованные однобитные значения эмбеддинга:int8дляbinaryиuint8дляubinary. Длина возвращаемого списка целых чисел составляет 1/8 от фактической размерности эмбеддинга. Тип binary использует метод двоичного кода со смещением, о котором можно узнать больше в FAQ по эмбеддингам.
Пример двоичной квантизации
Рассмотрим следующие восемь значений эмбеддинга: -0.03955078, 0.006214142, -0.07446289, -0.039001465, 0.0046463013, 0.00030612946, -0.08496094 и 0.03994751. При двоичной квантизации значения, меньшие или равные нулю, квантизуются в двоичный ноль, а положительные значения — в двоичную единицу, что даёт следующую двоичную последовательность: 0, 1, 0, 0, 1, 1, 0, 1. Затем эти восемь битов упаковываются в одно 8-битное целое число 01001101 (крайний левый бит — старший).
ubinary: двоичная последовательность напрямую преобразуется и представляется как беззнаковое целое число (uint8) 77.binary: двоичная последовательность представляется как знаковое целое число (int8) -51, вычисленное методом двоичного кода со смещением (77 - 128 = -51).
Обучение Matryoshka создаёт эмбеддинги с представлениями от грубых к детальным в рамках одного вектора. Модели Voyage, такие как voyage-code-3, поддерживающие несколько выходных размерностей, генерируют такие эмбеддинги Matryoshka. Вы можете усекать эти векторы, сохраняя начальное подмножество измерений. Например, следующий код на Python демонстрирует, как усечь 1024-мерные векторы до 256 измерений:
import voyageai
import numpy as np
def embd_normalize(v: np.ndarray) -> np.ndarray:
"""
Normalize the rows of a 2D numpy array to unit vectors by dividing each row by its Euclidean
norm. Raises a ValueError if any row has a norm of zero to prevent division by zero.
"""
row_norms = np.linalg.norm(v, axis=1, keepdims=True)
if np.any(row_norms == 0):
raise ValueError("Cannot normalize rows with a norm of zero.")
return v / row_norms
vo = voyageai.Client()
# Генерируем векторы voyage-code-3, по умолчанию это 1024-мерные числа с плавающей запятой
embd = vo.embed(["Sample text 1", "Sample text 2"], model="voyage-code-3").embeddings
# Задаём меньшую размерность
short_dim = 256
# Изменяем размер и нормализуем векторы до меньшей размерности
resized_embd = embd_normalize(np.array(embd)[:, :short_dim]).tolist()Цены
Посетите страницу с ценами Voyage, чтобы получить самую актуальную информацию о ценах.
Was this page helpful?