Обнаружение аномалий во временных рядах при помощи ChatGPT

20 февраля 2024
Обнаружение аномалий во временных рядах при помощи ChatGPT

Можем ли мы использовать ChatGPT, чтобы превзойти крупных игроков в области обнаружения аномалий? Давайте выясним!

Получение ключа API OpenAI
Получение ключа API OpenAI

Введение

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

[
1048, 829, 823, 783, 827, 894, 842, 865, 886, 894, 831, 371, 589, 391, 279,
246, 298, 2761, 20907, 6866, 871, 945, 844, 3516, 6242, 844, 894, 542, 797,
832, 828, 847, 891, 915, 896, 814, 680, 417, 177, 0, 0, 1376, 6111, 18184,
3546, 911, 480, 711, 820, 814, 793, 783, 834, 833, 845, 943, 882, 936, 840,
747, 576, 393, 261, 180, 303, 2975, 12446, 6882, 896, 919, 820, 749, 779, 812,
677, 903, 849, 806, 526, 796, 807, 791, 833, 813, 821, 482, 379, 245, 124,
382, 1776, 13503, 5255, 1757, 1945, 1615, 1092, 822, 856, 843, 862, 899, 835,
821, 825, 821, 837, 551, 725, 649, 412, 283, 134, 384, 886, 11587, 5876, 1251,
1012, 841, 855, 898, 936, 903, 921, 953, 919, 903, 904, 790, 811, 686, 522,
280, 179, 123, 293, 3781, 9501, 1409, 1911, 1329, 1039, 952, 894, 989, 982,
839, 889, 953, 937, 961, 1195, 938, 943, 458, 576, 322, 426, 248, 411, 671,
823, 850, 1278, 1081, 860, 820, 16
];
Обнаружение аномалии в данных временного ряда
Обнаружение аномалии в данных временного ряда

Точка, которая нас интересует, это последнее число (16). Представим, что список чисел представляет собой количество платящих клиентов вашего интернет-магазина. Если число ниже ожидаемого, мы хотим получить оповещение. Теперь представьте, что вы управляете сотнями интернет-магазинов. Как мы можем автоматизировать этот процесс, чтобы получать уведомления, если количество платящих клиентов упадёт в одном из наших магазинов?

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

Если вы не хотите платить за услуги вроде Anodot или аналогичные, вы сталкиваетесь с необходимостью в значительных первоначальных инвестициях для запуска этого проекта.

По крайней мере, до тех пор, пока не появились крупные языковые модели!

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

Пример

Проверим, можем ли мы быстро, дешево и надежно использовать ChatGPT для автоматизации нашего обнаружения аномалий.

Первое, что нам нужно, это библиотека openai.

npm install openai
  1. Получить ключ API Получение ключа API OpenAI

  2. А затем немного кода

import OpenAI from 'openai';

const apiKey = 'YOUR_API KEY'
const model = "gpt-3.5-turbo-0125"

const openai = new OpenAI({
    apiKey
});

const formQuestion = dynamicContent => {
    const question = `Given numbers (users per day), is the last datapoint an outlier?
    [${dynamicContent}]
    return json { outlier: boolean, value: number, belowLowerLimitBand: boolean}
    outlier should tell if the point is an anomaly.
    the value should have the value of the point in question.
    `
    return question
}

const askQuestion = async question => {
    const completions = await openai.chat.completions.create({
        messages: [{ "role": "user", "content": question }],
        model,
        response_format: { "type": "json_object" },
        temperature: 0,
    });
    const { choices, usage } = completions
    return { choices, usage }
}

const answerMyQuestion = async (list) => {
    const question = formQuestion(list)
    const { choices, usage } = await askQuestion(question)
    // const price = getPrice(usage, model)
    // console.log(`The price was ${price} USD`);
    choices.forEach(completion => {
        const result = completion.message.content
        const { outlier, belowLowerLimitBand, value } = JSON.parse(result)
        console.log({ outlier, belowLowerLimitBand, value });
    })
}

const list =[
  1048, 829, 823, 783, 827, 894, 842, 865, 886, 894, 831, 371, 589, 391, 279,
  246, 298, 2761, 20907, 6866, 871, 945, 844, 3516, 6242, 844, 894, 542, 797,
  832, 828, 847, 891, 915, 896, 814, 680, 417, 177, 0, 0, 1376, 6111, 18184,
  3546, 911, 480, 711, 820, 814, 793, 783, 834, 833, 845, 943, 882, 936, 840,
  747, 576, 393, 261, 180, 303, 2975, 12446, 6882, 896, 919, 820, 749, 779, 812,
  677, 903, 849, 806, 526, 796, 807, 791, 833, 813, 821, 482, 379, 245, 124,
  382, 1776, 13503, 5255, 1757, 1945, 1615, 1092, 822, 856, 843, 862, 899, 835,
  821, 825, 821, 837, 551, 725, 649, 412, 283, 134, 384, 886, 11587, 5876, 1251,
  1012, 841, 855, 898, 936, 903, 921, 953, 919, 903, 904, 790, 811, 686, 522,
  280, 179, 123, 293, 3781, 9501, 1409, 1911, 1329, 1039, 952, 894, 989, 982,
  839, 889, 953, 937, 961, 1195, 938, 943, 458, 576, 322, 426, 248, 411, 671,
  823, 850, 1278, 1081, 860, 820, 16
];


answerMyQuestion(list)

// RESULT:
// { outlier: true, belowLowerLimitBand: true, value: 16 }

Как вы можете видеть выше, нам нужно относительно небольшое количество кода, чтобы приступить к работе. Интересная часть приведенного выше кода - это переменная question. Это фактический вопрос, который мы зададим ChatGPT, точно так же, как вы бы задали его в их онлайн-версии. Результат приведенного выше кода дает нам следующую информацию:

  1. Что у нас есть выброс (аномалия)
  2. Если это ниже, чем мы ожидали (в этом случае большее количество платящих клиентов не является проблемой)
  3. Значение, которое мы анализируем

Ценообразование

По сравнению с предложением Azure (которое в любом случае устаревает): Стоимость 1000 транзакций (допустим, это 1000 ответов на один и тот же вопрос, есть ли аномалия?) составляет 0,314$. Это даже дешевле, чем у других компаний SaaS, занимающихся «обнаружением аномалий». Может ли ChatGPT превзойти это?

ДА!

Ценообразование ChatGPT

В приведенном выше тесте используется модель gpt-3.5-turbo-0125, которая в настоящее время стоит:

  • $0,0005 / 1 тыс. входных токенов
  • $0,0015 / 1 тыс. выходных токенов

Чтобы рассчитать цену за запрос, мы можем использовать небольшую вспомогательную функцию, поскольку API OpenAI вернет количество токенов, использованных для запроса:

const getPrice = (usage, model) => {
    const pricing = {
        'gpt-3.5-turbo-0125': {
            'prompt': 0.0005,
            'completion': 0.0015,
        }
    }
    const modelPrice = pricing[model]
    const promptCost = usage['prompt_tokens'] * modelPrice['prompt'] / 1000
    const completionCost = usage['completion_tokens'] * modelPrice['completion'] / 1000
    const totalCost = promptCost + completionCost
    return totalCost
}

Для нашего примера стоимость запроса составляет:

{ prompt_tokens: 440, completion_tokens: 25, total_tokens: 465 }

Это значительно дешевле, чем решение Azure, и это даже без оптимизаций, которые мы можем применить к запросу (вопросу, который мы задаем ChatGPT). Если мы сможем сократить размер вопроса, при этом получая желаемый результат, мы сможем сэкономить деньги!

Предостережение

Использование API Open Ai - единственный способ полностью автоматизировать процесс. Проблема в том, что это похоже на продвинутый чат-бот, то есть нам нужно очень осторожно формулировать вопросы. Малейшее изменение формулировки может привести к совершенно другому результату. Есть способы ограничить это, но имейте в виду, что при использовании ChatGPT описанным выше образом у нас нет понимания того, как получается результат. В некоторых случаях имеет значение, как кто-то пришел к определенному результату, в других случаях имеет значение только результат. По этим причинам разумно тестировать ваши запросы с различными типами ввода, чтобы убедиться, что мы не получаем ложноположительные или ложноотрицательные результаты.

Детерминированность

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

Заключение

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

В то время как другие сервисы SaaS уже построили много «вещей» поверх своего обнаружения аномалий, процесс запуска самостоятельно, не будучи привязанным или ограниченным этой службой, не так сложен, как некоторые могут думать. Обратной стороной этого аргумента является то, что вы в некоторой степени привяжете себя (привязка к поставщику) к OpenAI. Это лишь отчасти верно, поскольку большая часть вашего кода будет многоразовой, если вы переключитесь на другую LLM.

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