Как заставить 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{code}
»}, 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 как в примере не будет, ему это делать нельзя.