Qlik & ChatGPT API – как начать работу?
Работа с ChatGPT API началось некоторое время назад, когда мы начали использовать встроенный коннектор REST API в системе Qlik. Теперь мы хотели бы познакомить и Вас с возможностями подключения к OpenAI и поделиться своими выводами из проделанной работы.
Во время подготовки этой интеграции было много общения с ChatGPT. Предложения описаны в инструкции, состоящей из нескольких шагов, которые приведены ниже.
Вы можете использовать Qlik Sense локально/в облаке (SaaS) и QlikView.
Весь процесс выглядит следующим образом:
Сценарий № 1 – мы отправляем данные о компании
- Выберите, какие таблицы из Вашей модели данных и какой диапазон данных Вы хотите отправить в ChatGPT (примечание: есть ограничения по длине; для отправки большого количества данных повторно используйте цикл этого процесса);
- Подготовьте ОДНУ ТАБЛИЦУ (как мне сказали в ChatGPT), которая будет источником данных для ChatGPT. Вы можете отправить две или более таблиц в формате JSON. Я попробовал сделать это и увидел, что ChatGPT подключает их аналогично Qlik, используя общее имя столбцов. Однако все-таки рекомендуется использовать именно одну таблицу в качестве источника для последующего анализа;
- Конфиденциальные данные мы либо прячем, либо маскируем;
- Исходную таблицу нужно преобразовать в формат JSON (Вы можете последовать моему примеру);
- Подготовьте prompts (текстовые подсказки и запросы) для OpenAI;
- Отправьте исходные данные и prompts с помощью коннектора REST. Можете, конечно, отправить только prompts без каких-либо данных. Но тогда Вы получите общий результат, не относящийся к Вашим данным, который будет пригоден для презентации и дальнейшего анализа;
- Получите таблицу с результатом и статистикой использования токена. Ответ Вы найдете в одной ячейке таблицы;
- Сопоставьте конфиденциальные данные и переопределите результат ChatGPT;
- Отобразите результат в дашборде.
Сценарий 2 – мы не отправляем данные о компании, только общие вопросы
- Подготовьте prompts (текстовые подсказки и запросы) для OpenAI;
Лайфхак: больше деталей = лучше ответ, эксперимент с параметром "температура" от 0 до 1. 0 –предсказуемые значения; 1 – случайные значения.
- Отправьте prompts с помощью REST коннектора;
- Получите таблицу с результатами и статистикой использования токенов. Ответ Вы найдете в одной ячейке таблицы.
- Отобразите результат в дашборде.
Важно: невозможно запрашивать ChatGPT API повторно касательно данных, которые Вы отправили в предыдущем запросе. Это не та же самая версия, что и ChatGPT, которую Вы знаете по тестированию в браузере, где он запоминает контекст. В данном случае Вам необходимо каждый раз все помещать в одном запросе.
Памятка: Компетенции ChatGPT до сих пор ограничены данными 2021 года.
Предпосылки:
1) Документация: прочитайте раздел "Дополнения";
2) Playground – создайте свой аккаунт и действуйте. Начните чат с ChatGPT. Задавайте вопросы про свои данные, наиболее подходящие форматы и т.д. пробуйте различные настройки;
3) Создайте секретный API ключ – для авторизации в REST коннекторе;
4) Использование токенов. Токены рассчитываются на основе того, что Вы отправляете (prompt) и что получаете (completion). В зависимости от используемой модели запросы могут использовать до 4097 токенов, приходящихся и на prompt, и на completion. Если prompt составил 4000 токенов, completion может быть максимум 97 токенов.
1 токен ~= 4 символа на английском языке
1 токен ~= ¾ слова
100 токенов ~= 75 слов
1500 слов ~= 2048 токенов
$0.0200 / 1000 токенов; $1 = около 37500 слов.
5) Прайс – если Вы новичок, у Вас есть несколько месяцев и $18 , которые нужно потратить.
6) Безопасность данных – следите за тем, что Вы отправляете. Теоретически ChatGPT API не сохраняет то, что мы отправляем. Я проверил. Действительно, ссылка на предыдущий источник при повторном вызове API не дала мне результата. ChatGPT сказали, что анализируют данные только в одном сеансе, и этот сеанс представляет собой один запрос REST POST.
Мы за ограниченное доверие. Безопасность прежде всего!
Хотите отправить пакет данных — сделайте его анонимным.
Как это сделать:
- не отправляйте имена клиентов, только ID.
- не отправляйте персональные данные или точные адреса
- не отправляйте e-mail адреса и номера телефонов
- агрегируйте данные
- используйте таблицу сопоставления для конфиденциальных данных (мост между Вашей моделью и пакетом анализа OpenAI), например:
Приступим!
Скриншоты сделаны в Qlik Sense SaaS. Вы можете выполнить те же действия в других системах Qlik.
Шаг 1 - создать новое подключение для передачи данных
Шаг 2 – введите данные для POSTсоединения
URL: https://api.openai.com/v1/completions
Метод: POST
Тело запроса:
{ "model": "text-davinci-003", "prompt": "Say this is a test", "max_tokens": 7, "temperature": 0 }
Примечание: формат json, запрос нужен только для создания соединения. Далее в скрипте мы будем использовать функцию "with connection", она перезаписывает настройки и генерирует источник динамически.
Авторизация: ВАШ_СЕКРЕТНЫЙ_КЛЮЧ
Content-Type application/json
Проверьте опцию «Выбрать данные», чтобы увидеть результат этого запроса. Позже нам понадобится только Ваше соединение / имя «LIB».
Шаг 3 – загрузите скрипт - часть 1 – подготовьте источник и конвертируйте его в формат JSON. Можете пропустить этот шаг, если Вы посылаете только общие вопросы.
Выбираем только нужные нам столбцы. Объединяем в одну таблицу. Обратите внимание, что при преобразовании в JSON я использовал звездочку «*», чтобы открывать и закрывать параметры и значения. Qlik не любит использовать кавычки в POST REST. ChatGPT предложил мне вместо этого звездочку.
Orders: Load OrderDate, Year(OrderDate) & '-' & Num(Month(OrderDate), '00') as OrderMonth, Product, OrderValue Inline [ OrderDate, Product, OrderValue 2022-01-23, A, 120 2022-02-14, A, 200 2022-03-03, A, 300 2022-04-13, A, 150 2022-01-03, B, 300 2022-01-05, B, 350 2022-02-12, B, 200 2022-03-18, B, 250 2022-04-02, B, 200 ]; Products: Load * Inline [ Product, ProductName A, Apple B, Banana ]; // --------------------------------------- // Prepare single table for ChatGPT prompt NoConcatenate ChatGPT_Source: Load OrderDate, Product, OrderValue Resident Orders; left join (ChatGPT_Source) Load Product, ProductName Resident Products; // --------------------------------------------------------- // Prepare list of all fields for JSON formating procedure ChatGPT_JSON: Load '*Orders*: [' & concat('{*OrderDate*: *'& OrderDate & '*, *Product*: *' & Product & '*, *ProductName*: *' & ProductName & '*, *OrderValue*: *' & OrderValue & '*}' , ',') & ']' as JSON Resident ChatGPT_Source; LET vChatGPT_InputData = Peek('JSON'); Trace vChatGPT_InputData = '$(vChatGPT_InputData)'; Drop table ChatGPT_Source;
Шаг 4 – загрузите скрипт - часть 2 - подготовьте promptдля ChatGPTи отправьте запрос POST.
Здесь, в разделе INLINE, Вы можете определить prompts о том, как интерпретировать данные, задавать вопросы или попросить сгенерировать что-либо. Обратите внимание, что мы также отправляем наш пакет данных в формате JSON, а также вопросы или предложения относительно этих данных. Не забудьте использовать имя подключения LIB в этом скрипте. Перейдите к документации для получения дополнительной информации о параметрах «температура» или «max_tokens». Вы также можете добавить другие параметры, перечисленные в документации для "дополнений".
Load Concat(PROMPT_TEXT,' ', RecNo()) as Prompt_one_line Inline [ PROMPT_TEXT This is fruit sales analysis. Currency is EUR. Find the best selling month. Where is the best market for these products? Which countries to sell to and when? Add two marketing tips to increase sales. ](delimiter is '~'); Let vChatGPT_Prompt = Peek ('Prompt_one_line',0,'ChatGPT_Prompt'); Trace vChatGPT_Prompt = '$(vChatGPT_Prompt)'; Drop table ChatGPT_Prompt; LET vRequestBody ='{'; Let vRequestBody = vRequestBody&'"model":"text-davinci-003",'; Let vRequestBody = vRequestBody&'"prompt":"$(vChatGPT_Prompt) Source: $(vChatGPT_InputData)",'; // Source only here - in first request. Let vRequestBody = vRequestBody&'"max_tokens":3000,'; Let vRequestBody = vRequestBody&'"temperature":0'; // 0 being the most predictable and 1 being the most random Let vRequestBody = vRequestBody&'}'; let vRequestBody = replace(vRequestBody,'"', chr(34)&chr(34)); Trace vRequestBody = '$(vRequestBody)'; //Exit script; // test it before LIB CONNECT TO 'ChatGPT REST API - Completions'; // use your LIB name, open session RestConnectorMasterTable: SQL SELECT "id", "object", "created", "model", "__KEY_root", (SELECT "text", "index", "logprobs", "finish_reason", "__FK_choices" FROM "choices" FK "__FK_choices"), (SELECT "prompt_tokens", "total_tokens", "__FK_usage" FROM "usage" FK "__FK_usage") FROM JSON (wrap on) "root" PK "__KEY_root" WITH CONNECTION ( BODY "$(vRequestBody)"); ChatGPT_Completions: LOAD [text] as [ChatGPT Completions], [finish_reason] as [Completions Finish Reason], '$(vChatGPT_Prompt)' as [Prompt Request] RESIDENT RestConnectorMasterTable WHERE NOT IsNull([__FK_choices]); left join (ChatGPT_Completions) LOAD [prompt_tokens] as [Prompt Tokens], [total_tokens] as [Total Tokens], [total_tokens] * 0.02 / 1000 as [Request Cost USD], // $0.02 = 1000 tokens for Davinci model = about 750 words UTC() as [ChatGPT Request Time UTC] RESIDENT RestConnectorMasterTable WHERE NOT IsNull([__FK_usage]); left join (ChatGPT_Completions) LOAD [id] as ChatGPT_ID RESIDENT RestConnectorMasterTable WHERE NOT IsNull([__KEY_root]); DROP TABLE RestConnectorMasterTable; // STORE results to save your money :) DisConnect; // end of CHATGPT session!! Exit script;
Шаг 5 – отобразить результаты в дашборде.
Проверьте, сколько токенов Вы использовали для этого запроса и ответа.
Не доверяйте результатам. К сожалению, когда дело доходит до расчетов, текущая версия ChatGPT API иногда дает неверные результаты. Но в данном случае текст, сгенерированный системой, имеет смысл и представляет собой определенную ценность.
Зачем Вам вообще тестировать ChatGPT? Чтобы не отставать от рынка. Начните тестировать его прямо сейчас, даже если это нужно просто для Вашего общего развития. Есть большая вероятность, что мы будем работать с этим гораздо больше уже в самом ближайшем будущем.
Решение разработано Jacek Harazin