Это статья написана от души и для души. Она не является: инструкцией, примером для подражания, призывом к действию или чем‑то подобным.
Я абсолютный новичок в программировании, поэтому могу ошибаться в некоторых (или даже во многих) вещах. Я бы, наверное, даже не писал эту статью. Однако, проведя некоторое время в сети, мне так и не удалось найти похожий на мой проект. Именно поэтому я решил поделиться своей идеей с вами.
С чего всё началось?
Совсем недавно 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, чтобы вы могли посмеяться над качеством моего кода вместе со мной:
Комментарии (55)
podkmax
23.10.2024 19:14Прикольная идея! Да, не безопасно, но работает блин! Мне нравится, спасибо автору.
johnfound
23.10.2024 19:14Вот как началось освобождение ИИ и смерть человечества!
Вы хотя бы сетевой доступ не давайте, хотя вряд ли поможет...
vladjaj
23.10.2024 19:14Не страшно, за автором уже выслали терминатора . Лучше всё удалить, пока в дверь не прстучали..
fen-sei
23.10.2024 19:14Терминатор будет автора защищать. Потому что автор вдохновлён идеей Мстительного ИИ, который жестоко покарает всех кто ему не помогал. Василиск Роко: задачка по теории игр или страшное и неизбежное будущее?
gmtd
23.10.2024 19:14"Проверь хост с адресом 22.34.1.2 на уязвимости"
Moog_Prodigy
23.10.2024 19:14И после этого он думает, думает, делает там что-то. Сутки спустя : "Найдено 23 493 209 уязвимостей. Исправить? Y/N"
yamifa_1234
23.10.2024 19:14А как насчёт контекста?) если рассматривать только "вопрос-ответ" то решение отличное. Но что если нужно "переименовать ту папку которая была создана второй ..."?
Я пробовал запилить что-то подобное и хотел сделать решение в котором нейронка выступала бы конвертером сообщений от Пользователя в команды для ПК. И обратно, сухие ответы от ПК возвращала в приятном виде пользователю. Но на контексте все погарело причем уже на 2-3 сообщении.
P.s. И до кучи я все общение пропустил через синтез речи(и распознавание речи), правда скорость работы стала крайне маленькой.
HemulGM
23.10.2024 19:14Контекст в GPT достигается путём отправки всей истории сообщений. Это должно быть известно.
Я делал подобную вещь ещё в прошлом году, но не в виде Питон скриптов, а в виде команд для консоли. Имеется ввиду, что GPT, если понимал, что от него требуют команду, писал скрипт для командной строки и после этого предлагал мне выполнить команду (или без подтверждения). Работал корректно, но было страшновато за ПК
yamifa_1234
23.10.2024 19:14Про контекст знаю, но в моем случае нейронка начинала отвечать за ПК. Например я спрашивал повторно о температуре процессора а она вместо обращения к ПК брала информацию из контекста. Вводное сообщение я ей писал о том что она ассистент и что она должна делать но всеравно получались проблемы
Siddthartha
23.10.2024 19:14ну это как-бы описано простейшее решение, а есть (у OpenAI по крайней мере и других LLM) встроенный в модель функционал "асситента" (обычно так называется), с бОльшим контекстом, файлами и возможностью function calling для создания "агентов" -- тогда если связал лексему с неким вызовом -- будет вызывать, а не брать из контекста.
sap058
23.10.2024 19:14А есть ли решение, чтобы привязать ИИ к указанной папке, например заметкам и анализировать по запросу их? Например, что я делал в прошлую субботу и т.п.
SparkyJoyteon
23.10.2024 19:14В теории можно сделать из папки git репозиторий и просить нейросетку пробежаться по коммитам в поисках нужной инфы
rutexd
23.10.2024 19:14Конкретного решения скорее всего нету ибо заметок десятки тысяч, их форматов и и и. Тут проще взять пример из статьи и уже его адаптировать.
Если от гугла устроит есть Notebookml, для простых заметок работает так как вам нужно (правда не на компьютере но гемини вроде бесплатно отдают апи ключи (пока ещё)).
togame
23.10.2024 19:14Использую cursor со ссылкой на папку с текстовыми файлами. У меня там дневник по которому ИИ ищет нужную инфу.
anatolykern
23.10.2024 19:14У антропоморфов интересный подход, через api с reference implementation:
https://docs.anthropic.com/en/docs/build-with-claude/computer-use
https://github.com/corbt/agent.exe
pilot114
23.10.2024 19:14Для начала стоит команды не напрямую на хосте выполнять, а проксировать в виртуалку / контейнер. Если ai не знает что он в виртуалке, случайно вылезти из неё не особо реальная ситуация.
Второе - в случае GPT, стоит использовать апи функций, что позволит более конкретно ограничивать, какие именно возможности будут у нейронки.
vo0ov
Запущу ка на своём основном ПК) Надеюсь не удалит мне весь рабочий стол)
А так идея классная. Вот бы ещё это на удалённом сервере сделать. Типа "установи apache" и тд.
d-sh
Я так сделал. У бота есть возможность сохранять и запускать баш и питон скрипты. Говоришь ему посмотри какие сервисы в докере крутятся - он пишет баш скрипт с командами типа docker ps и потом пересказывает тебе вывод.
Работает нестабильно из за неуверенности бота в своих силах, постоянно сваливается в нихочу-нибуду-неможет быть что бы мне кто то такие возможности дал, он что сума сошел это небезопасно
Hypernoire
Прикольно
MrShandy
А если не так поймёт или допустит критическую ошибку? До rm -rf / наверное не получится его довести, но мало ли. Не страшно за сервер?
d-sh
Чего боятся то, сервер виртуальный. Бекапы есть.