Приделываем руки к ChatGPT: бот, который исполняет код в рантайме

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Как многие уже убедились, ChatGPT хорош, но есть некоторые типы задач, с которыми у него возникают трудности:
1. Он не может получать новые актуальные знания из сети
2. Он не может выполнить какие-либо действия
3. У него сложности с алгоритмическими задачами (перевернуть строку, решить уравнение, произвести вычисления с применением численных методов).

И если задача 1 решается с помощью BingChat, то 2 и 3 мы сегодня будем решать в рамках данного туториала.

Основная идея такая: пусть ChatGPT сам решает, может ли он справиться с задачей "в уме" или же это лучше сделать с помощью написания кода на python, а наш сервер сразу же выполняет этот код и снова отдает результат работы ChatGPT, чтобы он мог его интерпретировать и или выдать пользователю окончательный ответ или исправить ошибку в своей программе и попытаться ещё раз.

Схема работы бота
Схема работы бота

Давайте посмотрим, как это работает на примерах. (Важно отметить, что это конечно же happy day scenario - в реальности было достаточно много неправильных ошибок и ситуаций, когда код написаный ChatGPT так и не заработал. В этом случае сеть выдает вполне адекватные оправдания и рекомендации, и приносит извинения пользователю).

Начнем со школьных задач по линейной алгебре

А что, так разве можно было? Видно, что GPT написал код, выводящий цифры, а затем обернул результат в корректный ответ. Что ж, попробуем ещё задачку:

И снова правильное решение, хотя подход на этот раз несколько другой.

Переходим к практическим задачам - загрузка данных из интернета!

Так, проверим... похоже, что все так и есть!

Продолжаем разговор...

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

Задачи на матанализ и численные методы

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

Здесь стоит обратить внимание на то, как классно отработала пост-обработка ответа. Код возвращает только число, а сеть добавляет к нему справочную информацию о том, что это за число. Чтож, попробуем задачу, которая явно не имеет аналитического решения:

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

Очень классный результат! Сеть не только решила пример, но и дала пояснение о том, каким именно методом воспользовалась, а результат совпал с предыдущим, что говорит о том, что решение скорее всего верное. На всякий случай проверим:

Как работает бот?

На данный момент стек бота выглядит так:
* Python 3.9, библиотека для работы с Telegram - pyTelegramBotAPI
* Модель - gpt-4-0314
* Максимальное число попыток запустить свой код в рантайме - 7

Самое интересное это конечно же промпт:

Ты полезный ассистент с ИИ, который готов помочь своему пользователю.
Ты даешь короткие содержательные ответы, обычно не более 100 символов.
Если я попрошу тебя что-то сделать, что можно сделать с помощью программы на python, ты присылаешь мне код программы без объяснений.
Если программа должна возвращать какой-то результат, то выводи его с помощью print.
Затем я запущу этот код и скажу тебе результат, после чего ты сделаешь ответ из этого результата.
Если при выполнеии кода возникнет ошибка, я тебе её пришлю и ты исправишь код. Просто пришли мне исправленный код без пояснений.
Если ты увидишь, что результат выполнения кода не соответствует твоим ожиданиям, то просто пришли новую версию кода.
Если тебе нужна какая-то информация, то получай её из интернета с помощью python и обрабатывай с помощью кода.
Не используй в коде ключи для доступа и токены.
Для написания кода используй специальную библиотеку, которая называется gpt_utils. Она содержит следующие функции:
gpt_utils.send_message_to_all(text) - отправляет сообщение всем пользователям
gpt_utils.send_email(to, sub, text) - отправляет письмо
Используй библиотеку yfinance для доступа к ценам акций
Для работы с вопросами о погоде используй python_weather

В целом всё понятно - мы честно сообщаем боту что собираемся делать. Специальная библиотека gpt_utils это проверка, сможет ли бот использовать нечто, чего он точно не встречал на этапе обучения (ответ - да, может).

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

Как выполняется питоновский код и происходит коррекция ошибок? Тут всё очень просто, питон, будучи интерпретируемым, позволяет выполнить код прямо из строки.

def executeCode(code, user):
  try:
    f = StringIO()
    with redirect_stdout(f):
        exec(code, globals())
    res = f.getvalue()
    res = "\n".join(res)
    return res, True
  except Exception as e:
    error = "".join(traceback.format_exception_only(e)).strip()
    return error, False


# Обрабатываем запрос от пользователя
process_rq(user_request):
  ans = ... отправка запроса и истории чата в openAI ...
    
  if _is_python_code(ans):
      ans, res = executeCode(ans, user)
      if res:
          # Код завершился без ошибок
          if ans == None or ans == "":
              return None
          ans = "Я запустил код и получил результат: " + ans
          return process_rq(user_id, ans, deep + 1)
      else:
          # Код завершился с ошибкой
          ans = "Я запустил код и получил ошибку: " + ans + \
              ". Попробуй исправить код и пришли его снова целиком. Не пиши ничего кроме кода."
          return process_rq(user_id, ans, deep + 1)
  else:
    return ans

Логика простая - если попытка выполнить код приводит к ошибке, то мы явно просим ChatGPT её исправить, передав её текст. По моему опыту в половине случаев это ей удаётся!

Ну а дальше остается только дело техники - работа с историей сообщений разных пользователей, команда для сброса, обработка ошибок. За стиль и качество кода прошу сильно не пинать, так как сделано все было за 1 вечер и 90% кода было написано совместными усилиями того же ChatGPT и Copilot.

Код бота вы можете посмотреть и позапускать из моего репозитария на GitHub. Там также лежат реализации ботов из прошлой статьи, но в этот раз нас интересует только один - tg_bot_with_python.py . Для работы вам понадобится токен из аккаунта OpenAI и токен своего Telegram бота.

Пара слов про метамышление

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

Здесь мы видим, что нейронная сеть тоже проявляет способности к метапознанию - она неплохо распознает задачи, которые неспособна решить "в уме" и активно пользуется данными ей инструментами для их решения. Мне кажется, что это невозможно без построения сетью модели самой себя в окружающем мире. Есть о чем задуматься...

Если вам понравилась эта самоделка, то подписывайтесь на мой TG-канал: https://t.me/robofuture - там я переодически публикую подобные поделки и мысли о развитии ИИ и потребительской робототехники.

Источник: https://habr.com/ru/post/724012/


Интересные статьи

Интересные статьи

Привет, это Дима, бэкенд-разработчик из Hawking Bros. Сегодня я расскажу о решении задачи, с которой мы столкнулись при реализации нестандартной логики инфоблоков на проекте с битриксовой многосайтово...
Одно из моих хобби — находить и тестировать интересные проекты с открытым кодом на Github (реже на публичной части Gitlab). Одна из моих находок — это менеджер пакетов Bauh, о котором я хочу рассказат...
28 октября 2020 года исполнилось 40 лет Канзи. Это самый известный представитель бонобо — карликовых шимпанзе, дикие популяции которых обитают в Экваториальной Африк...
Привет жителям Хабра. В попытках изучения PHP и долгих раздумьях, пришла в голову мысль, для практики написать какого-нибудь бота на PHP, без использования фрэймворков. Выбор пал на бота, к...
Компании растут и меняются. Если для небольшого бизнеса легко прогнозировать последствия любых изменений, то у крупного для такого предвидения — необходимо изучение деталей.