Embeddings OpenAI измеряют степень связанности текстовых строк. Embeddings обычно используются для:

  • Поиска (где результаты ранжируются по релевантности к строке запроса)
  • Кластеризации (где текстовые строки группируются по схожести)
  • Рекомендаций (где предлагаются элементы с схожими текстовыми строками)
  • Обнаружения аномалий (где выявляются выбросы с низкой степенью связанности)
  • Измерения разнообразия (где анализируются распределения сходства)
  • Классификации (где текстовые строки классифицируются по их наиболее схожему метке)

Embedding - это вектор (список) из чисел с плавающей точкой. Расстояние между двумя векторами измеряет их связанность. Маленькие расстояния указывают на высокую связанность, а большие расстояния - на низкую.

Чтобы получить embedding, отправьте вашу текстовую строку на конечную точку API embeddings вместе с ID модели embedding (text-embedding-3-small). В ответе будет содержаться embedding, который вы можете извлечь, сохранить и использовать.

Примеры запросов:

Пример: Получение embeddings
1curl https://api.openai.com/v1/embeddings \
2  -H "Content-Type: application/json" \
3  -H "Authorization: Bearer $OPENAI_API_KEY" \
4  -d '{
5    "input": "Ваш текстовый запрос здесь",
6    "model": "text-embedding-3-small"
7  }'

Пример ответа:

1{
2  "data": [
3    {
4      "embedding": [
5        -0.006929283495992422,
6        -0.005336422007530928,
7        ...
8        -4.547132266452536e-05,
9        -0.024047505110502243
10      ],
11      "index": 0,
12      "object": "embedding"
13    }
14  ],
15  "model": "text-embedding-3-small",
16  "object": "list",
17  "usage": {
18    "prompt_tokens": 5,
19    "total_tokens": 5
20  }
21}

OpenAI предлагает две мощные модели для получения embedding третьего поколения (обозначается как -3 в идентификаторе модели). Использование оценивается по количеству входных токенов, ниже приведен пример цен за страницы текста за доллар США (при условии примерно 800 токенов на страницу):

Модель~ страниц за долларПРОИЗВОДИТЕЛЬНОСТЬ НА MTEB EVALмаксимальный ввод
text-embedding-3-small62,50062.3%8191
text-embedding-3-large9,61564.6%8191
text-embedding-ada-00212,50061.0%8191

Набор данных содержит в общей сложности 568,454 обзора продуктов, оставленных пользователями Amazon до октября 2012 года. Мы будем использовать подмножество из 1000 наиболее свежих обзоров в иллюстративных целях. Обзоры написаны на английском языке и обычно являются положительными или отрицательными. Каждый обзор содержит ProductId, UserId, Score, заголовок обзора (Summary) и текст обзора (Text). Например:

Product IdUser IdScoreSummaryText
B001E4KFG0A3SGXH7AUHU8GW5Good Quality Dog FoodI have bought several of the Vitality canned...
B00813GRG4A1D87F6ZCVE5NK1Not as AdvertisedProduct arrived labeled as Jumbo Salted Peanut...

Мы объединим заголовок обзора и текст обзора в единый текст. Модель закодирует этот объединенный текст и выведет один векторный embedding.

1from openai import OpenAI
2client = OpenAI()
3
4def get_embedding(text, model="text-embedding-3-small"):
5   text = text.replace("\n", " ")
6   return client.embeddings.create(input = [text], model=model).data[0].embedding
7
8df['ada_embedding'] = df.combined.apply(lambda x: get_embedding(x, model='text-embedding-3-small'))
9df.to_csv('output/embedded_1k_reviews.csv', index=False)

Чтобы загрузить данные из сохраненного файла, вы можете выполнить следующее:

1import pandas as pd
2
3df = pd.read_csv('output/embedded_1k_reviews.csv')
4df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)

Наши модели встраивания могут быть ненадежными или представлять социальные риски в некоторых случаях и могут причинить вред при отсутствии мер по снижению рисков.

Ограничение: Модели не знают о событиях, произошедших после сентября 2021 года.

Наши модели обучены на наборах данных, которые содержат некоторую информацию о реальных событиях до 9/2021. Если вы полагаетесь на модели для представления недавних событий, то они могут работать не очень хорошо.

В Python вы можете разделить строку на токены с помощью токенизатора OpenAI tiktoken.

Пример кода:

1import tiktoken
2
3def num_tokens_from_string(string: str, encoding_name: str) -> int:
4    """Возвращает количество токенов в текстовой строке."""
5    encoding = tiktoken.get_encoding(encoding_name)
6    num_tokens = len(encoding.encode(string))
7    return num_tokens
8
9num_tokens_from_string("tiktoken is great!", "cl100k_base")

Для моделей встраивания второго поколения, таких как text-embedding-3-small, используйте кодировку cl100k_base.

Мы рекомендуем косинусное сходство. Выбор функции расстояния обычно не имеет большого значения.

Вложения OpenAI нормализуются до длины 1, что означает, что:

  • Косинусное сходство может быть вычислено немного быстрее с использованием только скалярного произведения
  • Косинусное сходство и Евклидово расстояние приведут к идентичным ранжированиям