Как заставить ChatGPT не только писать код, но и исполнять его

от автора

Продолжаю эту серию статей: первая и вторая.

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

Пример диалога с ботом (его код далее…)

Для наглядности в каждое сообщение добавлен код созданный моделью для ответа.

Пишем такого бота

За оболочку в которой все будет происходить возьмем этот Телеграм бот и немного модифицируем его код.

Главная идея на которой основано решение — заставить языковую модель писать Python код для каждого ответа. Делать это она должна всегда, даже, если ответ не требует вычислений. Так мы можем отказаться от системного сообщения и уменьшим глюки.

Для того, что бы модель не могла уклонится от написания кода передадим ей на вход только один инструмент и пропишем условие tool_choice="required".

В инструменте подробно объясним моделе что ей делать:

tools = [     {"type": "function",      "function": {          "name": "execute_Python_code",          "description": "A tool that executes python code. The result of the code execution will be sent to the user as your response. Use this tool for all responses, including text ones. Example: print('Hello! How can I assist you today?')",          "strict": True,          "parameters": {              "type": "object",              "properties": {                  "python_code": {                      "type": "string",                      "description": "Python code. To receive outputs, they must be printed with print() method."}},              "required": ["python_code"],              "additionalProperties": False}}}]

Код созданный моделью будем запускать такой функцией:

def execute_Python_code(code):     output = io.StringIO()     try:         with contextlib.redirect_stdout(output):             exec(code, globals())         return output.getvalue()     except Exception as e:         return e

А в Телеграм бота добавим вызов инструмента и в каждое сообщение добавим созданный моделью код для наглядности:

# pip install pyTelegramBotAPI openai import telebot, json, contextlib, io from openai import OpenAI  client = OpenAI(api_key='OpenAI_API_KEY') bot = telebot.TeleBot("TELEGRAM_BOT_TOKEN") messages = []  # tools = [...] сюда копируем tools и функцию для выполнения кода # def execute_Python_code(code): ...  @ bot.message_handler(content_types=['text']) def get_text_messages(message):     global messages     messages.append({"role": 'user', "content": message.text})     if len(messages) > 6:         messages = messages[-6:]     # Указываем инструмент     response = client.chat.completions.create(model='gpt-4o-mini', messages=messages, tools=tools, tool_choice="required", temperature=0)     # Вынимаем из ответа Python code     tool_call = response.choices[0].message.tool_calls[0]     code = json.loads(tool_call.function.arguments)['python_code']     # Исполняем код и ответ отправляем     reply = execute_Python_code(code)     bot.send_message(message.from_user.id, reply)     messages.append({"role": 'assistant', "content": f"{reply}\n<pre>{code}</pre>"}, parse_mode="HTML")  while True:     bot.polling(none_stop=True, interval=0, timeout=0)

Вставьте в код tools и функцию execute_Python_code и замените в коде OpenAI_API_KEY на api ключ полученный в OpenAI и TELEGRAM_BOT_TOKEN на токен телеграм бота, все должно быть в кавычках.

Пример работы

Я сделал бота НашGPT, он тоже пишет код для каждого сообщения.

Еще НашGPT умеет создавать картинки, распознавать содержимое изображений, искать в интернете, понимать голосовые сообщения и он очень умный ))

P.S. Пинговать ваш IP как в примере не будет, ему это делать нельзя.


ссылка на оригинал статьи https://habr.com/ru/articles/838072/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *