Статья рассматривает принцип использования векторов GPT-3 для рекомендательной системы, которая посредством косинусного сходства (англ. cosine similarity) находит похожие документы.

GPT-3  —  это языковая модель от OpenAI, обученная на огромных количествах текстовых данных. 

В число ключевых особенностей GPT-3 входит способность генерировать высококачественный текст, а также векторные представления входного текста, которые применяются для разных задач обработки естественного языка, например для анализа сходства документов. 

Шаг 1. Генерация векторов GPT-3

Работа с векторами GPT-3 для рекомендательной системы начинается с генерации векторов для набора документов. Для этой цели задействуется OpenAI GPT-3 API, который позволяет отправить блок текста и получить в ответ векторное представление. 

Чтобы сгенерировать векторы для набора документов, вы должны отправить каждый документ в API и сохранить возвращенные векторы в массиве. Ниже приведен пример генерации векторов GPT-3 для набора документов в Python: 

import openai

# Список документов:
docs = ["document1", "document2", "document3"]

# Получение векторных представлений этих документов
vectors = []
model = "text-embedding-ada-002"
for doc in docs:
# Для аутентификации требуется переменная окружения: OPENAI_API_KEY="YOUR-OPEN-AI-KEY"
response = openai.Embedding.create(input = [doc], model=model)
openai.Davinci.create_embedding
vector = response["data"][0]["embedding"]
vectors.append(vector)

Шаг 2. Вычисление косинусного коэффициента 

Получив векторы для набора документов, вы применяете показатели косинусного сходства для выявления сходства между ними. Косинусное сходство  —  это мера подобия между двумя ненулевыми векторами пространства внутреннего произведения, которая измеряет косинус угла между ними. Косинусное сходство между двумя векторами вычисляется по следующей формуле: 

cosine_similarity = (A * B) / (||A|| * ||B||)

Где A и B  —  векторы для двух документов, а ||A|| и ||B||  —  векторные величины. Ниже приведен пример вычисления косинусного сходства между всеми парами документов в Python:

import numpy as np

# Вычисление косинусного сходства
cosine_similarities = []
for i in range(len(vectors)):
for j in range(i+1, len(vectors)):
cosine_similarities.append(np.dot(vectors[i], vectors[j])/(np.linalg.norm(vectors[i])*np.linalg.norm(vectors[j])))

Шаг 3. Поиск наиболее похожих документов 

Вычислив показатели косинусного сходства для всех пар документов, вы находите наиболее похожие документы. Для этого следует расположить результаты в порядке убывания и выбрать N количество первых из них. 

Полученный список документов можно использовать для рекомендации пользователям схожего контента. Ниже представлен пример поиска похожих документов с помощью косинусного сходства в Python: 

import numpy as np

# Определение набора документов
docs = ["document1", "document2", "document3", "document4"]

# Генерация GPT-3 векторов для документов
vectors = []
for doc in docs:
# Код для генерации векторных представлений документа с помощью OpenAI GPT-3 API
vector = # ...
vectors.append(vector)

# Поиск наиболее похожих документов
similar_documents = []
for i in range(len(vectors)):
for j in range(i+1, len(vectors)):
cosine_similarity = np.dot(vectors[i], vectors[j]) / (np.linalg.norm(vectors[i]) * np.linalg.norm(vectors[j]))
if cosine_similarity > threshold:
similar_documents.append((docs[i], docs[j], cosine_similarity))

#Расположение документов на основе показателей сходства в порядке убывания
similar_documents.sort(key=lambda x: x[2], reverse=True)

#Вывод N количества первых похожих документов
for doc in similar_documents[:N]:
print(doc[0], "is similar to", doc[1], "with a cosine similarity of", doc[2])

В этом примере docs  —  список строк, представляющих набор документов. vectors  —  список векторов GPT-3, сгенерированных для каждого документа посредством OpenAI GPT-3 API. 

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

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

Примечание. Вместо #Код для генерации векторных представлений документа с помощью OpenAI GPT-3 API подставляется фактический код для генерации векторов GPT-3. 

Шаг 4. Практическое применение 

Вы можете провести индексацию векторов в Elasticsearch или ArangoDB так, чтобы обеспечить поддержку косинусного сходства. 

Например, в Elasticsearch можно использовать тип поля dense_vector (плотный вектор), как описано здесь. Рассмотрим, как должен выглядеть маппинг (англ. mapping), т.е. процесс определения схемы документа, описывающей свойства его полей:

{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 1024,
"similarity": "l2_norm",
"index": true
},
"document" : {
"type" : "text"
}
}
}
}

Я не вычислял косинусное сходство с помощью ArangoDB, но вы можете самостоятельно это сделать, опираясь на документацию

Отметим, что поиск векторного сходства требует больших вычислительных затрат. Поэтому для этой цели рекомендуются такие движки, как Faiss и NMSLIB. Они созданы для обработки больших наборов векторных данных с быстрым поиском сходства. 

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

Заключение 

Мы рассмотрели принцип использования векторов GPT-3 для рекомендательной системы, которая задействует косинусное сходство для поиска похожих документов. 

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

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Moustafa Abdelhamid: Using GPT-3 for Search and Recommendations of Text Content

Предыдущая статьяBlaze: ускорение ZK для программируемой пользователем вентильной матрицы
Следующая статьяСбросы базовых CSS-стилей для применения в любом приложении