Эмбеддинги
Текстовые эмбеддинги — это числовые представления текста, позволяющие измерять семантическое сходство. В этом руководстве рассказывается об эмбеддингах, их применении и о том, как использовать модели эмбеддингов для таких задач, как поиск, рекомендации и обнаружение аномалий.
Перед внедрением эмбеддингов
«Embeddings» (эмбеддинги, или векторные представления) — это числовые представления текста. При выборе поставщика эмбеддингов можно учитывать несколько факторов в зависимости от ваших потребностей и предпочтений:
- Размер набора данных и специфичность предметной области: размер обучающего набора данных модели и его релевантность предметной области, для которой вы хотите получать эмбеддинги. Более крупные или более специализированные данные, как правило, дают более качественные эмбеддинги в рамках предметной области
- Производительность инференса: скорость получения эмбеддингов и сквозная «latency» (задержка). Это особенно важно для крупномасштабных производственных развёртываний
- Кастомизация: возможности дообучения на закрытых данных или специализации моделей для очень узких предметных областей. Это может повысить качество работы с уникальной лексикой
Как получить эмбеддинги с Anthropic
Anthropic не предлагает собственную модель эмбеддингов. Одним из поставщиков эмбеддингов с широким выбором моделей и возможностей является Voyage AI от MongoDB.
Voyage AI создает модели эмбеддингов и «rerankers» (модели переранжирования). Ее модели эмбеддингов включают универсальные, мультимодальные, контекстуализированные и специализированные для предметных областей модели.
Остальная часть этого руководства посвящена Voyage AI, однако вам следует оценить различных поставщиков эмбеддингов, чтобы найти наиболее подходящий вариант для вашего конкретного сценария использования.
Доступные модели
Voyage AI предлагает следующие модели текстовых эмбеддингов:
Последнее поколение
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
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-code-4 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Оптимизирована для поиска по коду и приложений агентного программирования. Подробности см. в публикации в блоге о voyage-code-4. |
voyage-4-nano | 32 000 | 2048 (по умолчанию), 256, 512, 1024 | Модель с открытыми весами (лицензия Apache 2.0), которую вы загружаете с Hugging Face и запускаете самостоятельно. Недоступна через Atlas Embedding and Reranking API. Подробности см. в публикации в блоге о Voyage 4. |
Предыдущее поколение
Статус жизненного цикла каждой модели и рекомендуемую замену см. в разделе Model deprecations, lifecycle states, and support документации MongoDB.
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-3-large | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Предыдущее поколение voyage-4-large. Подробности см. в публикации в блоге о voyage-3-large. |
voyage-3.5 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Предыдущее поколение voyage-4. Подробности см. в публикации в блоге о voyage-3.5. |
voyage-3.5-lite | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Предыдущее поколение voyage-4-lite. Подробности см. в публикации в блоге о voyage-3.5. |
voyage-code-3 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Предыдущее поколение voyage-code-4. Подробности см. в публикации в блоге о voyage-code-3. |
voyage-finance-2 | 32 000 | 1024 | Оптимизирована для поиска и RAG в сфере финансов. Подробности см. в публикации в блоге о voyage-finance-2. |
voyage-law-2 | 16 000 | 1024 | Оптимизирована для поиска и RAG в юридической сфере. Подробности см. в публикации в блоге о voyage-law-2. |
Кроме того, Voyage AI предлагает следующие мультимодальные модели эмбеддингов. Вызывайте эти модели с помощью multimodal_embed() вместо embed():
| Модель | Длина контекста | Размерность эмбеддинга | Описание |
|---|---|---|---|
voyage-multimodal-3.5 | 32 000 | 1024 (по умолчанию), 256, 512, 2048 | Многофункциональная мультимодальная модель эмбеддингов, способная векторизовать чередующиеся текст, изображения и видео. Включает поддержку видео как первая модель видеоэмбеддингов производственного уровня. Подробности см. в публикации в блоге о voyage-multimodal-3.5. |
voyage-multimodal-3 | 32 000 | 1024 | Предыдущее поколение voyage-multimodal-3.5. Векторизует чередующийся текст и насыщенные контентом изображения, такие как скриншоты 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-4. Подробности см. в публикации в блоге о voyage-context-3. |
Ограничение в 120 000 токенов применяется, когда вы устанавливаете enable_auto_chunking в значение true. В противном случае общее количество токенов во всех входных данных не может превышать 32 000.
Voyage AI также предлагает «rerankers» (модели переранжирования), которые принимают запрос и список документов и возвращают их отсортированными по релевантности запросу. Вызывайте эти модели с помощью rerank():
| Модель | Длина контекста | Описание |
|---|---|---|
rerank-3 | 32 000 | Наивысшая точность. Рекомендуется для большинства приложений. Подробности см. в публикации в блоге о rerank-3. |
rerank-3-lite | 32 000 | Оптимизирована по задержке и стоимости. Подробности см. в публикации в блоге о rerank-3. |
rerank-2.5 | 32 000 | Предыдущее поколение rerank-3. Подробности см. в публикации в блоге о rerank-2.5. |
rerank-2.5-lite | 32 000 | Предыдущее поколение rerank-3-lite. Подробности см. в публикации в блоге о rerank-2.5. |
Нужна помощь в выборе модели? См. раздел Voyage AI embedding and reranking models overview документации MongoDB.
Начало работы с Voyage AI
Чтобы получить доступ к моделям Voyage AI, создайте ключ API модели в MongoDB Atlas:
- Зарегистрируйте учетную запись MongoDB Atlas или войдите в нее.
- В вашем проекте Atlas выберите AI Model APIs на панели навигации, нажмите Create model API key, задайте имя ключа и нажмите Create.
- Для удобства задайте ключ API в качестве переменной окружения:
export VOYAGE_API_KEY="<your model API key>"Подробнее см. раздел Voyage AI quick start документации MongoDB.
Вы можете получить эмбеддинги, используя официальный пакет Python voyageai или HTTP-запросы, как описано в следующих разделах. У Voyage AI также есть официальный клиент TypeScript. Чтобы использовать его с ключом API модели из Atlas, установите его параметр environment в значение https://ai.mongodb.com/v1, как описано в разделе TypeScript client документации MongoDB.
Библиотека Python Voyage AI
Установите пакет voyageai с помощью следующей команды. Чтобы использовать ключ API модели из Atlas, вам нужна версия 0.3.7 или новее.
pip install -U voyageaiЗатем вы можете создать объект клиента и начать использовать его для получения эмбеддингов ваших текстов:
import voyageai
vo = voyageai.Client()
# Автоматически будет использована переменная окружения VOYAGE_API_KEY.
# Либо можно использовать vo = voyageai.Client(api_key="<your model 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 см. в разделе Accessing Voyage AI models документации MongoDB.
HTTP API Voyage AI
Вы также можете получить эмбеддинги, отправляя HTTP-запросы к Atlas Embedding and Reranking API. Например, вы можете отправить HTTP-запрос с помощью команды curl в терминале:
curl https://ai.mongodb.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",
"input_type": "document"
}'В ответ вы получите JSON-объект, содержащий эмбеддинги и данные об использовании токенов:
{
"object": "list",
"data": [
{
"object": "embedding",
"embedding": [-0.013131560757756233, 0.019828535616397858 /* ... */],
"index": 0
},
{
"object": "embedding",
"embedding": [-0.0069352793507277966, 0.020878976210951805 /* ... */],
"index": 1
}
],
"model": "voyage-4",
"usage": {
"total_tokens": 10
}
}Ключи API моделей из Atlas работают с ai.mongodb.com, за исключением ключей, привязанных к определенному географическому региону, — они используют конечную точку этого региона. Если вместо этого у вас есть ключ API с платформы Voyage AI, см. раздел Migrate your applications to use the Atlas Embedding and Reranking API документации MongoDB.
Полный справочник по запросам и ответам см. в разделе Create text embeddings документации Atlas Embedding and Reranking API.
AWS Marketplace
Модели Voyage AI также доступны на AWS Marketplace через профиль продавца MongoDB. Инструкции см. в разделе Deploy Voyage AI models using AWS Marketplace документации MongoDB.
Пример быстрого старта
Следующий краткий пример показывает, как использовать эмбеддинги.
Предположим, у вас есть небольшой корпус из шести документов, по которым нужно выполнять поиск
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 AI, чтобы преобразовать каждый документ в вектор эмбеддинга.
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 AI нормализованы к длине 1, поэтому скалярное произведение
# и косинусное сходство совпадают.
similarities = np.dot(doc_embds, query_embd)
retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])Обратите внимание, что input_type="document" и input_type="query" используются для создания эмбеддингов документа и запроса соответственно. Подробнее о input_type см. Когда и как следует использовать параметр input_type? в разделе часто задаваемых вопросов.
Результатом будет пятый документ, который действительно наиболее релевантен запросу:
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.
Часто задаваемые вопросы
Модели эмбеддингов, как и генеративные модели, опираются на мощные нейронные сети для захвата и сжатия семантического контекста. Команда опытных исследователей ИИ Voyage AI оптимизирует каждый компонент процесса создания эмбеддингов, включая:
- Архитектуру модели
- Сбор данных
- Функции потерь
- Выбор оптимизатора
Узнайте больше о техническом подходе Voyage AI в блоге Voyage AI.
Для эмбеддингов общего назначения рекомендуются следующие модели:
voyage-4-large: лучшее качествоvoyage-4-lite: наименьшие задержка и стоимостьvoyage-4: сбалансированная производительность
Для поиска используйте параметр input_type, чтобы указать, является ли текст запросом или документом.
Модели для конкретных предметных областей:
- Юридические задачи:
voyage-law-2 - Поиск по коду и агентное программирование:
voyage-code-4 - Задачи, связанные с финансами:
voyage-finance-2
Для поиска на уровне фрагментов и документов: voyage-context-4
Для текста, изображений и видео: voyage-multimodal-3.5
Вы можете использовать эмбеддинги Voyage AI со сходством на основе скалярного произведения, косинусным сходством или евклидовым расстоянием. Объяснение сходства эмбеддингов см. в этом руководстве по сходству векторов.
Эмбеддинги Voyage AI нормализованы до длины 1, что означает:
- Косинусное сходство эквивалентно сходству по скалярному произведению, при этом последнее вычисляется быстрее.
- Косинусное сходство и евклидово расстояние дают идентичное ранжирование.
См. раздел Tokenization документации MongoDB.
Для всех задач и сценариев поиска (например, 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.»
«Quantization» (квантование) эмбеддингов преобразует значения высокой точности, например 32-битные числа с плавающей запятой одинарной точности, в форматы более низкой точности, такие как 8-битные целые числа или 1-битные двоичные значения, сокращая объем хранилища, памяти и затраты в 4 и 32 раза соответственно. Поддерживаемые модели Voyage AI позволяют выполнять квантование путем указания выходного типа данных с помощью параметра output_dtype:
float: каждый возвращаемый эмбеддинг представляет собой список 32-битных (4-байтовых) чисел с плавающей запятой одинарной точности. Это значение по умолчанию, обеспечивающее наивысшую точность / точность поиска.int8иuint8: каждый возвращаемый эмбеддинг представляет собой список 8-битных (1-байтовых) целых чисел в диапазоне от -128 до 127 и от 0 до 255 соответственно.binaryиubinary: каждый возвращаемый эмбеддинг представляет собой список 8-битных целых чисел, которые представляют упакованные по битам квантованные однобитные значения эмбеддинга:int8дляbinaryиuint8дляubinary. Длина возвращаемого списка целых чисел составляет 1/8 от фактической размерности эмбеддинга. Двоичный тип использует метод двоичного кода со смещением, как показано в следующем примере.
Пример двоичного квантования
Рассмотрим следующие восемь значений эмбеддинга: -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).
Модели, поддерживающие каждый тип данных, см. в разделе Create text embeddings документации Atlas Embedding and Reranking API.
Обучение «Matryoshka» (матрёшка) создает эмбеддинги с представлениями от грубых к детальным в пределах одного вектора. Модели Voyage AI, поддерживающие несколько выходных размерностей, например voyage-code-4, генерируют такие эмбеддинги Matryoshka. Чтобы получить более короткие векторы от API, передайте output_dimension (например, output_dimension=256). Чтобы сократить уже сохраненные векторы, усеките их, оставив начальное подмножество измерений, а затем снова нормализуйте. Например, следующий код на 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-4, которые по умолчанию состоят из 1024 чисел с плавающей точкой
embd = vo.embed(["Sample text 1", "Sample text 2"], model="voyage-code-4").embeddings
# Задать меньшую размерность
short_dim = 256
# Уменьшить размерность векторов и нормализовать их
resized_embd = embd_normalize(np.array(embd)[:, :short_dim]).tolist()Цены
Самую актуальную информацию о ценах см. в разделе Model pricing документации MongoDB.
Was this page helpful?