Embeddings OpenAI измеряют степень связанности текстовых строк. Embeddings обычно используются для:
- Поиска (где результаты ранжируются по релевантности к строке запроса)
- Кластеризации (где текстовые строки группируются по схожести)
- Рекомендаций (где предлагаются элементы с схожими текстовыми строками)
- Обнаружения аномалий (где выявляются выбросы с низкой степенью связанности)
- Измерения разнообразия (где анализируются распределения сходства)
- Классификации (где текстовые строки классифицируются по их наиболее схожему метке)
Embedding - это вектор (список) из чисел с плавающей точкой. Расстояние между двумя векторами измеряет их связанность. Маленькие расстояния указывают на высокую связанность, а большие расстояния - на низкую.
Чтобы получить embedding, отправьте вашу текстовую строку на конечную точку API embeddings
вместе с ID модели embedding (text-embedding-3-small
). В ответе будет
содержаться embedding, который вы можете извлечь, сохранить и использовать.
Примеры запросов:
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-small | 62,500 | 62.3% | 8191 |
text-embedding-3-large | 9,615 | 64.6% | 8191 |
text-embedding-ada-002 | 12,500 | 61.0% | 8191 |
Набор данных содержит в общей сложности 568,454 обзора продуктов, оставленных пользователями Amazon до октября 2012 года. Мы будем использовать подмножество из 1000 наиболее свежих обзоров в иллюстративных целях. Обзоры написаны на английском языке и обычно являются положительными или отрицательными. Каждый обзор содержит ProductId, UserId, Score, заголовок обзора (Summary) и текст обзора (Text). Например:
Product Id | User Id | Score | Summary | Text |
---|---|---|---|---|
B001E4KFG0 | A3SGXH7AUHU8GW | 5 | Good Quality Dog Food | I have bought several of the Vitality canned... |
B00813GRG4 | A1D87F6ZCVE5NK | 1 | Not as Advertised | Product 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, что означает, что:
- Косинусное сходство может быть вычислено немного быстрее с использованием только скалярного произведения
- Косинусное сходство и Евклидово расстояние приведут к идентичным ранжированиям