Обзор векторных представлений

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

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


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

При выборе провайдера векторных представлений вы можете учитывать несколько факторов в зависимости от ваших потребностей и предпочтений:

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

Anthropic не предлагает собственную модель векторных представлений. Одним из провайдеров векторных представлений, который имеет широкий спектр опций и возможностей, охватывающих все четыре вышеперечисленных соображения, является Voyage AI. Voyage AI создает современные модели векторных представлений и предлагает настраиваемые модели для конкретных отраслевых доменов, таких как финансы и здравоохранение, или индивидуальные модели, настроенные для отдельных клиентов.

Остальная часть этого руководства предназначена для Voyage AI, но мы рекомендуем вам оценить различных поставщиков векторных представлений, чтобы найти наиболее подходящий для вашего конкретного варианта использования.


Начало работы с Voyage AI

Ознакомьтесь с нашим блокнотом векторных представлений, чтобы увидеть пример реализации Voyage AI.

Чтобы получить доступ к векторным представлениям Voyage:

  1. Зарегистрируйтесь на сайте Voyage AI
  2. Получите API ключ
  3. Установите API ключ в качестве переменной среды для удобства:
Python
export VOYAGE_API_KEY="<your secret key>"

Вы можете запустить векторные представления, используя либо официальный пакет voyageai Python, либо HTTP-запросы, как описано ниже.

Пакет Voyage Python

Пакет voyageai можно установить с помощью следующей команды:

Python
pip install -U voyageai

Затем вы можете создать объект клиента и начать использовать его для встраивания ваших текстов:

Python
import voyageai

vo = voyageai.Client()
# Это автоматически использует переменную среды VOYAGE_API_KEY.
# Альтернативно, вы можете использовать vo = voyageai.Client(api_key="<your secret key>")

texts = ["Sample text 1", "Sample text 2"]

result = vo.embed(texts, model="voyage-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddings будет списком из двух векторов векторных представлений, каждый из которых содержит 1024 числа с плавающей запятой.

После запуска приведенного выше кода два векторных представления будут выведены на экран:

Python
[0.02012746, 0.01957859, ...]  # векторное представление для "Sample text 1"
[0.01429677, 0.03077182, ...]  # векторное представление для "Sample text 2"

При создании векторных представлений вы можете указать несколько других аргументов для функции embed(). Вот спецификация:

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - Список текстов в виде списка строк, например ["I like cats", "I also like dogs"]. В настоящее время максимальная длина списка составляет 128, а общее количество токенов в списке не более 320K для voyage-2 и 120K для voyage-large-2/voyage-code-2.
  • model (str) - Название модели. Рекомендуемые варианты: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, необязательно, по умолчанию None) - Тип входного текста. По умолчанию None. Другие варианты: query, document
    • Когда input_type установлен в None, входной текст будет непосредственно кодироваться моделью векторных представлений Voyage. Альтернативно, когда входные данные являются документами или запросами, пользователи могут указать input_type как query или document соответственно. В таких случаях Voyage добавит специальную подсказку к входному тексту и отправит расширенные входные данные в модель векторных представлений.
    • Для вариантов использования поиска/извлечения мы рекомендуем указывать этот аргумент при кодировании запросов или документов для повышения качества извлечения. Векторные представления, сгенерированные с аргументом input_type и без него, совместимы.
  • truncation (bool, необязательно, по умолчанию None) - Следует ли обрезать входные тексты, чтобы они соответствовали длине контекста.
    • Если True, слишком длинные входные тексты будут обрезаны, чтобы соответствовать длине контекста, прежде чем они будут векторизованы моделью векторных представлений.
    • Если False, будет вызвана ошибка, если какой-либо заданный текст превышает длину контекста.
    • Если не указано (по умолчанию None), Voyage обрежет входной текст перед отправкой его в модель векторных представлений, если он незначительно превышает длину окна контекста. Если он значительно превышает длину окна контекста, будет вызвана ошибка.

Voyage HTTP API

Вы также можете получить векторные представления, запросив Voyage HTTP API. Например, вы можете отправить HTTP-запрос через команду curl в терминале:

Shell
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-2"
  }'

Ответ, который вы получите, представляет собой объект JSON, содержащий векторные представления и использование токенов:

Shell
{
  "object": "list",
  "data": [
    {
      "embedding": [0.02012746, 0.01957859, ...],
      "index": 0
    },
    {
      "embedding": [0.01429677, 0.03077182, ...],
      "index": 1
    }
  ],
  "model": "voyage-2",
  "usage": {
    "total_tokens": 10
  }
}

Конечная точка векторных представлений Voyage AI - https://api.voyageai.com/v1/embeddings (POST). Заголовок запроса должен содержать API ключ. Тело запроса представляет собой объект JSON, содержащий следующие аргументы:

  • input (str, List[str]) - Одна текстовая строка или список текстов в виде списка строк. В настоящее время максимальная длина списка составляет 128, а общее количество токенов в списке не более 320K для voyage-2 и 120K для voyage-large-2/voyage-code-2.
  • model (str) - Название модели. Рекомендуемые варианты: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, необязательно, по умолчанию None) - Тип входного текста. По умолчанию None. Другие варианты: query, document
  • truncation (bool, необязательно, по умолчанию None) - Следует ли обрезать входные тексты, чтобы они соответствовали длине контекста
    • Если True, слишком длинные входные тексты будут обрезаны, чтобы соответствовать длине контекста, прежде чем они будут векторизованы моделью векторных представлений.
    • Если False, будет вызвана ошибка, если какой-либо заданный текст превышает длину контекста.
    • Если не указано (по умолчанию None), Voyage обрежет входной текст перед отправкой его в модель векторных представлений, если он незначительно превышает длину окна контекста. Если он значительно превышает длину окна контекста, будет вызвана ошибка.
  • encoding_format (str, необязательно, по умолчанию None) - Формат, в котором кодируются векторные представления. Voyage в настоящее время поддерживает два варианта:
    • Если не указано (по умолчанию None): векторные представления представлены в виде списков чисел с плавающей запятой.
    • "base64": векторные представления сжимаются в кодировки Base64.

Пример векторного представления Voyage

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

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

Python
documents = [
    "Средиземноморская диета делает упор на рыбу, оливковое масло и овощи, считается, что она снижает риск хронических заболеваний.",
    "Фотосинтез в растениях преобразует энергию света в глюкозу и производит необходимый кислород.",
    "Инновации 20-го века, от радио до смартфонов, были сосредоточены на электронных достижениях.",
    "Реки обеспечивают воду, орошение и среду обитания для водных видов, жизненно важных для экосистем.",
    "Конференц-звонок Apple для обсуждения результатов четвертого финансового квартала и обновлений бизнеса запланирован на четверг, 2 ноября 2023 года, в 14:00 по тихоокеанскому времени / 17:00 по восточному времени.",
    "Произведения Шекспира, такие как 'Гамлет' и 'Сон в летнюю ночь', остаются в литературе."
]

Сначала мы используем Voyage, чтобы преобразовать каждый из них в вектор векторного представления

Python
import voyageai

vo = voyageai.Client()

# Встраивание документов
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

Векторные представления позволят нам выполнять семантический поиск/извлечение в векторном пространстве. Затем мы можем преобразовать пример запроса,

Python
query = "Когда запланирован конференц-звонок Apple?"

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

Python
import numpy as np

# Встраивание запроса
query_embd = vo.embed(
    [query], model="voyage-2", 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" для встраивания документа и запроса соответственно. Более подробную спецификацию можно найти здесь.

Выходом будет 5-й документ, который действительно наиболее релевантен запросу:

Конференц-звонок Apple для обсуждения результатов четвертого финансового квартала и обновлений бизнеса запланирован на четверг, 2 ноября 2023 года, в 14:00 по тихоокеанскому времени / 17:00 по восточному времени.

Доступные модели Voyage

Voyage рекомендует использовать следующие модели векторных представлений:

МодельДлина контекстаРазмерность векторного представленияОписание
voyage-large-2160001536Самая мощная универсальная модель векторных представлений Voyage AI.
voyage-code-2160001536Оптимизирована для извлечения кода (на 17% лучше, чем альтернативы), а также SoTA на универсальных корпусах. Подробности см. в блоге Voyage.
voyage-240001024Базовая универсальная модель векторных представлений, оптимизированная как для задержки, так и для качества.
voyage-lite-02-instruct40001024Обучена инструкциям для задач классификации, кластеризации и текстового сходства предложений, которые являются единственными рекомендуемыми вариантами использования для этой модели.

voyage-2 и voyage-large-2 являются универсальными моделями векторных представлений, которые достигают современной производительности во всех доменах и сохраняют высокую эффективность. voyage-code-2 оптимизирована для области кода, предлагая в 4 раза большую длину контекста для более гибкого использования, хотя и с относительно более высокой задержкой.

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

  • voyage-finance-2: скоро появится
  • voyage-law-2: скоро появится
  • voyage-multilingual-2: скоро появится
  • voyage-healthcare-2: скоро появится

Voyage на AWS Marketplace

Векторные представления Voyage также доступны на AWS Marketplace. Вот инструкции по доступу к Voyage на AWS:

  1. Подпишитесь на пакет модели
    1. Перейдите на страницу списка пакетов моделей и выберите модель для развертывания
    2. Нажмите кнопку Continue to subscribe
    3. Внимательно ознакомьтесь с деталями на странице Subscribe to this software. Если вы согласны со стандартным лицензионным соглашением конечного пользователя (EULA), ценами и условиями поддержки, нажмите “Accept Offer”
    4. После выбора Continue to configuration и выбора региона вам будет представлен Product Arn. Это ARN пакета модели, необходимый для создания развертываемой модели с помощью Boto3
      1. Скопируйте ARN, соответствующий выбранному вами региону, и используйте его в следующей ячейке
  2. Разверните пакет модели

Отсюда создайте пространство JupyterLab в Sagemaker Studio, загрузите блокнот Voyage и следуйте инструкциям внутри.


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

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

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

Python
import numpy

similarity = np.dot(embd1, embd2)
# Векторные представления Voyage нормализованы до длины 1, поэтому косинусное сходство
# то же самое, что и скалярное произведение.

Если вы хотите найти K ближайших векторов векторных представлений по большому корпусу, мы рекомендуем использовать возможности, встроенные в большинство векторных баз данных.

Могу ли я подсчитать количество токенов в строке перед ее встраиванием?

Да! Вы можете сделать это с помощью следующего кода.

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])

Цены

Посетите страницу цен Voyage для получения самой актуальной информации о ценах.