Karabas интернет-магазин
сетевого оборудования
Alexandr Mak 08 окт. 2023 Alexandr Mak 0

OpenAi embedding для создания короткого контекста из больших данных

Формула косинусного сходства

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

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

В контексте OpenAI, эмбеддинги также могут быть использованы для создания "моделей мира", которые могут предсказывать, что произойдет в следующем шаге в заданном контексте. Это особенно полезно в областях, таких как искусственный интеллект и робототехника.

Ниже приведен пример кода, который вы можете использовать как отправную точку.

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

public class OpenAiExample {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();

        // Заголовки
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Authorization", "Bearer YOUR_OPEN_AI_KEY");

        // Тело запроса
        String body = "{"
            + "\"documents\": ["
            + "{ \"id\": \"1\", \"text\": \"This is a test.\" }"
            + "]"
            + "}";

        // Создание запроса
        HttpEntity<String> request = new HttpEntity<>(body, headers);

        // Отправка запроса и получение ответа
        ResponseEntity<String> response = restTemplate.postForEntity("https://api.openai.com/v1/engines/davinci-codex/completions", request, String.class);

        // Вывод ответа
        System.out.println(response.getBody());
    }
}

Пожалуйста, замените "Bearer YOUR_OPEN_AI_KEY" на ваш собственный ключ API. Этот код использует RestTemplate из Spring Framework для отправки HTTP запроса.

Параметры ответа openai при создании embedding включают в себя:

  • id: Уникальный идентификатор для созданного embedding.
  • object: Тип объекта, в данном случае "embedding".
  • model: Используемая модель для создания embedding.
  • created: Время создания embedding в формате Unix timestamp.
  • vectors: Список векторов, представляющих собой embedding. Каждый вектор представляет собой список чисел с плавающей точкой.
  • token: Токен, для которого был создан embedding.

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

import java.util.*;

public class VectorComparator implements Comparator<Map.Entry<String, double[]>> {
    private double[] targetVector;

    public VectorComparator(double[] targetVector) {
        this.targetVector = targetVector;
    }

    @Override
    public int compare(Map.Entry<String, double[]> o1, Map.Entry<String, double[]> o2) {
        double similarity1 = cosineSimilarity(targetVector, o1.getValue());
        double similarity2 = cosineSimilarity(targetVector, o2.getValue());
        return Double.compare(similarity2, similarity1);
    }

    private double cosineSimilarity(double[] vectorA, double[] vectorB) {
        double dotProduct = 0.0;
        double normA = 0.0;
        double normB = 0.0;
        for (int i = 0; i < vectorA.length; i++) {
            dotProduct += vectorA[i] * vectorB[i];
            normA += Math.pow(vectorA[i], 2);
            normB += Math.pow(vectorB[i], 2);
        }   
        return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    }
}

// Использование
public static void main(String[] args) {
    Map<String, double[]> vectors = new HashMap<>();
    // Заполните карту векторами

    double[] targetVector = new double[] { /* Заполните целевой вектор */ };

    List<Map.Entry<String, double[]>> entries = new ArrayList<>(vectors.entrySet());
    entries.sort(new VectorComparator(targetVector));

    for (Map.Entry<String, double[]> entry : entries) {
        System.out.println("Key: " + entry.getKey() + ", Value: " + Arrays.toString(entry.getValue()));
    }
}

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

Косинусное сходство (cosine similarity) — это мера сходства между двумя векторами в многомерном пространстве, которая измеряется по косинусу угла между ними. Эта метрика широко используется в области машинного обучения, особенно в задачах обработки текста и рекомендательных системах.

Косинусное сходство определяется следующей формулой:

Формула косинусного сходства

где A и B — это векторы, а ∥A∥ и ∥B∥ — их евклидовы нормы.

Косинусное сходство может принимать значения от -1 до 1. Значение 1 означает, что векторы идентичны, 0 — что векторы ортогональны (не связаны), -1 — что векторы противоположны.

Основное преимущество косинусного сходства перед другими метриками (например, евклидовым расстоянием) в том, что оно учитывает направление векторов, а не их абсолютные значения. Это особенно полезно при работе с текстами, где важнее учитывать направление (смысл) векторов (слов), а не их абсолютные значения (частота встречаемости слов).