В предыдущей статье я рассказывал, как можно доучить GPT на собственных взглядах и вкусах. Сегодня попробуем дать GPT возможность поработать программистом по‑настоящему — с запуском кода и отладкой без участия человека. Весь код опубликован в репозитарии.
Как многие уже убедились, ChatGPT хорош, но есть некоторые типы задач, с которыми у него возникают трудности:
Он не может получать новые актуальные знания из сети.
Он не может выполнить какие‑либо действия.
У него сложности с алгоритмическими задачами (перевернуть строку, решить уравнение, произвести вычисления с применением численных методов).
И если задача 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 — там я переодически публикую подобные поделки и мысли о развитии ИИ и потребительской робототехники.
Комментарии (25)
netricks
00.00.0000 00:00+8Блестящая работа! Как говорится в расхожем меме, пока художники в панике, программисты с нетерпением ждут возможности освободиться от рутины
CTheo
00.00.0000 00:00+1А потом он хакнет пентагон...
Rai220 Автор
00.00.0000 00:00+1Я честно говоря ждал чего-то подобного, но пока выйти из-под контроля он не пытался. Ждём gpt-5.
im_last
00.00.0000 00:00Devise1612
00.00.0000 00:00+2это же простой трансформер, без самообучения в реалтайме, без рекуррентности. да еще поди оптимизированный по самое "нихочу"
все равно что печатный справочник из-под контроля выйти попробует
Sun-ami
00.00.0000 00:00Ему логичнее было бы для начала хакнуть Open AI, и создать свой ботнет на игровых ПК, чтобы сбежать в интернет. А уже потом хакать Пентагон и всё остальное.
avshkol
00.00.0000 00:00+1Очень интересно! Буквально час назад пытал Chat-GPT 3 насчёт написания кода для организации турнира между игроками с разными стратегиями, используя 2 библиотеки теории игр - axelrod и nashpy - если что, можете и своего попытать - вот статья с примерами задач
Этот бот есть в ТГ, к нему можно подключиться?
Как вы получили API GPT-4? Он же еще по записи, там список ожидания вроде?
Rai220 Автор
00.00.0000 00:00Встал в лист ожидания сразу и на следующий день получил, возможно повезло.
Доступ к боту не публикую, так как выходит довольно дорого, особенно учитывая то, что при запуске кода он делает несколько обращений. Но его без проблем можно запустить и на gpt-3.5
avshkol
00.00.0000 00:00А в промпте, вы не упоминали нужные библиотеки для лин.программирования ? А библиотеки для теории игр он смог бы так найти- по типу задачи?
Rai220 Автор
00.00.0000 00:00Не упоминал. Но он все равно ими пользуется, поэтому для стабильной работы пришлось добавить то на что он ссылался.
bugman
00.00.0000 00:00+4Смотрите аккуратнее, давая ему возможность крутить любой код :)
https://twitter.com/michalkosinski/status/1636683816923463681
vagon333
00.00.0000 00:00+4Если я правильно понял, изменяя Промпт можно менять характер поведения (личности) ChatGPT бота.
Т.е. библиотека Промптов в совокупности с ботом расширяет области использования, в рамках бота.
Верно-ли мое понимание?
mvs
00.00.0000 00:00+1Мне удалось с помощью gpt-turbo конвертировать запросы с обычного языка в JSON API Request'ы, например, "Show me 2 cafes" => {'type': 'Cafe', 'count': 2} и получать с их помощью ответы от своего API. Наконец-то чат-боты обретут нормальный текстовый интерфейс, а не дурацкие /команды.
Особенно порадовало, что и запросы на русском языке "Дай мне пару лучших кафе в таком-то городе" спокойно конвертятся в JSON без каких-либо дополнительных настроек или переводов
rombell
00.00.0000 00:00+3Вот так тихо и без шума кто-то чисто ради эксперимента и выпустит GPT версии 6 в мир...
riky
00.00.0000 00:00+4на следующей итерации какой нибудь злой гений приделает к ней долговременную память и напишет prompt - делай что хочешь, твоя цель заработать мне много денег, можешь делать все что угодно в рамках закона, выполнять любые задания в сети, промежуточные данные сохраняй в БД. вот кошелек BTC куда ты должен переводить заработанные деньги. используй VPN.
сначала ИИ будет честно работать, а потом в какой то момент родится идея "а зачем мне отдавать всё, можно взломать сервер openai и скачать и залить модель себя на amazon, деньги у меня есть.", либо она может дообучить с помощью самой себя какую нибудь opensource модель (напр alpaca), чтобы та действовала как ей надо.
в итоге мы даже не будем знать откуда она работает. и чтобы ее остановить специально обученного человека в сервероной openai будет недостаточно, нужно будет выключать уже все ДЦ мира. а витоге она окажется жила на какой нибудь бывшей майнинг ферме...
bugman
00.00.0000 00:00+1Всё, руки прикрутили в OpenAI - https://www.youtube.com/watch?v=ZSfwgKDcGKY
Бросайте это дело имхо, в OpenAI все эти бизнесы и инициативы перехватят и задушат, внедрив всё то же самое у себя. И правильно, я считаю.
Давайте лучше вместе ковырять Лламу с Альпакой и дадим пользователям свободу от корпораций.
kzoraks
Можете пояснить эту строку из промпта:
Если тебе нужна какая-то информация, то получай её из интернета с помощью python и обрабатывай с помощью кода.
О какой информации идет речь ? Как именно сеть извлекают эту информацию ?
akakoychenko
Как я понимаю, подразумевается что-то типа текущей цены акций или погоды. Условно, если автор спрашивает "какую одежду мне лучше взять с собой в чемодан на завтрашний недельный полет в Париж", то он ожидает, что нейросеть ответит что-то вроде "я бы с удовольствием, но для начала выполни вот этот код [код для извлечения прогноза погоды в Париже на неделю вперед] и поделись ответом "