Это статья написана от души и для души. Она не является: инструкцией, примером для подражания, призывом к действию или чем‑то подобным.
Я абсолютный новичок в программировании, поэтому могу ошибаться в некоторых (или даже во многих) вещах. Я бы, наверное, даже не писал эту статью. Однако, проведя некоторое время в сети, мне так и не удалось найти похожий на мой проект. Именно поэтому я решил поделиться своей идеей с вами.
С чего всё началось?
Совсем недавно Microsoft представили Copilot — умного помощника для Windows 11. Кроме базовых возможностей, присущих большинству языковых моделей вроде ChatGPT или Gemini, Copilot предлагает некоторую интерактивность взаимодействия с операционной системой.
Microsoft Copilot может управлять некоторыми настройками Windows, открывать некоторые приложения. И... кажется, на этом его уникальные возможности заканчиваются. Copilot достаточно ограничен. А как бы хотелось, например, сказать ему: «Создай папку в месте X с названием Y и положи в неё всё, что находится в папке Z».
Так начался мой проект по созданию своего «второго пилота».
Идея
Умный помощник — это настолько заезженная тема: каждый второй когда‑то пытался делать что‑то подобное. В большинстве случаев всё сводится к тому, чтобы определить, чего именно хочет пользователь, а затем — выполнить действие, уже заложенное в программу. Очевидно, что это не совсем то, чего мы хотим — пускай нейросеть будет придумывать сама, как именно будут выполняться просьбы пользователя.
Наверняка есть более удачные способы реализации этой задачи, однако я увидел это так:
В начальном промпте вводим нейросеть в курс дела. Пишем что‑то вроде: «Ты — умный помощник для Windows 11. Если для выполнения задачи простой генерации текста недостаточно — пиши код на Python».
Если в ответе от нейросети присутствует код на Python — выполняем его, выводим результат на экран.
Конечно этот код должен быть правильно оформлен, а так же должен использовать только те модули, которые находятся в виртуальном окружении. Я же просто описал, какие именно модули должна использовать программа, перечислив их через запятую.
Графический интерфейс
Для реализации графического интерфейса я выбрал PyQt6. Мне всегда нравился дизайн системы Windows 11, поэтому я также использовал PyQt‑Fluent‑Widgets.
Я не буду вдаваться в подробности просто потому что это не инструкция и не учебное пособие. В любом случае вы сможете ознакомиться с исходным кодом проекта в конце статьи.
Доступ к ChatGPT
Так как доступа к API от OpenAI у меня нет, я решил воспользоваться проектом gpt4free. О нём уже писали на Хабре. Как следует из названия, проект предоставляет доступ к нейросети бесплатно. Опыт использования данной библиотеки схож с использованием официальной от OpenAI, поэтому любой желающий при желании сможет поменять gpt4free на неё, переписав пару строчек кода. Не думаю, что на этом моменте нужно заострять внимание, всё довольно тривиально.
Заставляем нейросеть писать код (и исполняем его)
Для того, чтобы без труда вычленить код из сообщения, заставим нейросеть писать код в виде:
<python>
#Какой-то код...
</python>
Чтобы получить программный код из текста, можно воспользоваться, например, регулярными выражениями.
Итак, у нас есть строка с кодом... А что с ней делать? Воспользоваться функцией exec()? Но иногда нам нужно будет получить именно результат выполнения кода: пользователь может попросить, например, сообщить ему информацию о заряде батареи, о текущей дате, о курсе валют.
Боюсь, моё решение введёт многих опытных разработчиков в недоумение, однако, как я уже говорил, я не претендую на звание Мидл‑Пайтон‑Сеньйор‑СуперПуперРазработчик. Моя цель — показать свою идею, и если она кого‑то зацепит — тот, возможно, сможет найти более правильный и красивый способ её реализации.
Итак... барабанная дробь...
Просим нейросеть форматировать свой код к виду:
def answer():
#какой-то код
return "Ответ"
Записываем код в файл. В моём случае им является execute.py. Заранее импортируем его в самом начале. А затем, когда файл поменялся — делаем реимпорт модуля с помощью библиотеки importlib. Затем вызываем функцию answer() и получаем результат её выполнения. Выглядит это всё как‑то так:
with open("execute.py", "w", encoding='utf-8') as file:
file.write(code)
importlib.reload(execute)
result = execute.answer()
И несмотря на всю «костыльность» этого решения, оно работает и работает так, как я задумал.
Итог
Выводы
Получился интересный эксперимент. Нейросеть сама пишет код, выполнят его. ChatGPT буквально получил доступ к нашему ПК.
С одной стороны, помощник получился достаточно гибким. Он неплохо ориентируется в системе. С другой стороны, иногда результат может получиться не совсем таким, каким мы его ожидали.
Возможно в начальный промпт можно добавить примеры кода. Так можно повысить точность ответов.
А безопасно ли это?
Однозначно НЕТ. Нейросеть даёт неточные ответы, и поэтому всегда есть вероятность того, что она случайно удалит, создаст или изменит что‑то не то. Этот проект — не более чем эксперимент, и поэтому не стоит сразу бежать и пытаться установить это творение на свой ПК. Впрочем, это уже не моё дело — я вас предупредил.
Проект на GitHub, чтобы вы могли посмеяться над качеством моего кода вместе со мной: