Engshell — автоматизация управления ОС из консоли на базе ИИ

Изображение взято тут https://morioh.com/p/3c422b57e74e

С появлением больших языковых моделей и доступа к ним, у разработчиков с каждым днем появляется всё больше способов их прикладного применения.

А что, если разработать механизм управления своей операционной системой c помощью ИИ?

Легко! Энтузиасты реализовали логику взаимодействия с системой из консоли с помощью нейросети ChatGPT (GPT-3.5\GPT-4), получив ИИ ассистента. Engshell — умный shell, принимает команды на человеческом языке в свободной форме и с помощью ИИ преобразовывает их в понятные компьютеру консольные команды или исполняемый код на Python.

Технически это надстройка над языковой моделью ChatGPT (GPT-3.5\GPT-4), которая взаимодействует с нейросетью по API и осуществляет предварительный «препромптинг» с помощью ролей и инструкций. На основании такого запроса модель генерирует код на Python и исполняет его в системе, выводя результат в консоль. Если запрос достаточно большой, то сначала происходит его «саммаризация», результат которой снова подаётся в качестве запроса.

Запуск


Установить его достаточно просто:

  1. Клонируем репозиторий: git clone https://github.com/emcf/engshell
  2. Устанавливаем зависимости: pip install -r requirements.txt
  3. Создайте файл keys.py и добавьте туда OPENAI_KEY="your_api_key"
  4. Запускаем: python engshell.py --debug --showcode


где:

--debug выводит команды\код для понимания что происходит.
--showcode покажет код перед запуском.
--gpt4 использовать gpt-4 по-умолчанию.
--llm добавляет подсказки в код.
clear очистить консоль.

Команды могут быть любыми и могут ограничиваться по сути только вашей фантазией. Для начала я решил пройтись по предложенным авторами engshell примерам:

image

Важно, что для большинства задач пришлось указывать или предлагать использовать конкретные инструменты и даже подсовывать путь до файлов и примеры использования.


Тестирование


Погода:

Можно узнать погоду в вашем регионе и попросить подсказать, что надеть.

image

Судя по результату исполнения кода, в памяти языковой модели сохранились устаревшие данные по ссылкам и код не сработал. По предложенной ссылке было 404. Погуглив, я нашёл работающий API и сформулировал более точный вопрос:

image

Какая сегодня погода в городе Самара (53.2001,50.15)? Используй API: "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41¤t_weather=true&hourly=temperature_2m,relativehumidity_2m,windspeed_10m". Формат ответа API: "current_weather": { "time": "2022-01-01T15:00" "temperature": 2.4, "weathercode": 3, "windspeed": 11.9, "winddirection": 95.0, }, "hourly": { "time": ["2022-07-01T00:00","2022-07-01T01:00", ...] "windspeed_10m": [3.16,3.02,3.3,3.14,3.2,2.95, ...], "temperature_2m": [13.7,13.3,12.8,12.3,11.8, ...], "relativehumidity_2m": [82,83,86,85,88,88,84,76, ...], }На основании ответа API напиши что мне сегодня надеть по погоде?

image

В результате модель поняла мой запрос, подставила координаты, написала код основываясь на моем примере ответа API, и предложила надеть куртку или свитер. :) Правда на английском, но думаю, можно подкорректировать запрос с указанием языка для ответа. И скажите мне после этого, что нам не нужна профессия инженера промпотов? :)

Листинг файлов:

Можно попросить вывести список файлов в директории:

list first 10 files from Windows\system32 directory

image

image

Ну как бы да. Идём дальше и усложняем задачу:

У меня есть файл C:\Users\user\Desktop\test\Linkin Park — More the Victim.mp4, с помощью ffmpeg (C:\Users\user\Desktop\test\ffmpeg.exe) я хочу сжать его в 2 раза, затем обрезать первые и последние 10 секунд и сохранить измененный файл c нижними прочерками вместо пробелов.

image

Вся происходящая магия заняла бы достаточно много листингов и я закинул её на пастбин, для тех, кому интересно изучить суть происходящего. Как итог, в директории появились новые требуемые файлы. Единственное, «обрезать по 10 секунд до и после» она восприняла как «обрезать первые 10 секунд и сохранить». И компрессия сработала немного не туда. :)

image

Рецепт:

Напиши рецепт торта Наполеон и вычисли количество необходимых для приготовления ингредиентов. Ответ напиши на русском языке.

image

Узнать остаток свободного место на диске С:

image

Странно, что код не заработал, потому что перепроверив предложенный engshell, код заработал:

image

image


Впечатляет? Это еще не всё!

Просим вывести последние новости:

print headlines from CBC

(запрашиваем последние новости с новостного портала CBC)

compiling...
import requests
from bs4 import BeautifulSoup

url = "https://www.cbc.ca/news"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
headlines = soup.find_all("h3", class_="headline")

for headline in headlines:
print(headline.text.strip())

print("Headlines from CBC printed successfully.")


Engshell сформировал код на Python для запроса и парсинга новостей с CBC и вывел в консоль:

Код

running...D:\Projects\engshell engshell>Hundreds chant 'we are not trash' in honour of First Nations woman found dead in Winnipeg landfill
Hundreds chant 'we are not trash' in honour of First Nations woman found dead in Winnipeg landfill
Sister of woman found dead in Winnipeg landfill says police 'took advantage of my grief'Advocates renew calls for searches of Winnipeg-area landfillsGrand chief calls for permanent closure of landfill
CRA workers vote for strike mandate during tax season as mediation looms
Family of Indian nationals who died in Quebec shocked by river crossing attempt
Canadian filmmaker Sharmeen Obaid-Chinoy to direct upcoming Star Wars movie
Ex-Theranos president Sunny Balwani will go to prison after losing appeal
CBC News ExploreThe BBC sent 10 people to B.C. to travel around the province on public transit. It didn't go wellPaul Cattermole, member of U.K. pop group S Club 7, dead at 46NATO is getting ready to twist Canada's arm on defence spendingHe tried to get a criminal pardon and lost $1,200 instead
Raptors to face Bulls in play-in after falling to Celtics in penultimate game of season
Abortion pill mifepristone in legal limbo in U.S. after competing rulings125-year-old turtle missing from rural Ontario wetlands#TheMoment a newborn calf is rescued from a ditch in a spring snowstorm
With her on-ice legacy secure, Poulin may now lead women's pro hockey as only she canCriticism mounts for expulsion of Tennessee politicians along racial lines
WATCH: CBC News NetworkCritics say new rental regulations do little to help renters
Canada’s infant mortality rate on the riseFamily celebrates first Easter holiday in Canada after escaping war
Edmonton mother 'living in the shadows' as undocumented migrant celebrates residency status1 tourist killed, 5 wounded in Tel Aviv attack following airstrikes, West Bank violencePlay at Masters halted after storms bring down trees
This B.C. artist's work is the backdrop to Metallica's latest videoThis remote village in Japan sells bear meat from a vending machine
Christians mark Good Friday around the world
Being an outsider has its advantages, especially if you're a camel or a goatShadows of the Troubles linger 25 years after Northern Ireland peace deal‘Doge’ with a bone: Elon Musk and a meme coinHeadlines from CBC printed successfully.


Усложняем задачу:

download and save a $USDT dataset and a $BTC dataset

(просим скачать и сохранить историю торгов тикета USDT по отношению к BTC)

compiling...
import requests

usdt_url = "https://www.cryptodatadownload.com/cdd/Binance_USDT_1h.csv"
btc_url = "https://www.cryptodatadownload.com/cdd/Binance_BTCUSDT_1h.csv"

usdt_file = "Binance_USDT_1h.csv"
btc_file = "Binance_BTCUSDT_1h.csv"

usdt_response = requests.get(usdt_url)
btc_response = requests.get(btc_url)

with open(usdt_file, "wb") as f:
f.write(usdt_response.content)

with open(btc_file, "wb") as f:
f.write(btc_response.content)

print("USDT and BTC datasets downloaded and saved successfully.")


Она написала код, но вероятно в памяти языковой модели сохранились устаревшие данные по ссылкам на историю торгов и код не сработал, но это не страшно.

Погуглив я нашел на GitHub старый датасет и в качестве теста функции уточнил промпт:

download and save $USDT to $BTC dataset from https://github.com/cryptobigbro/binance-BTCUSDT/blob/master/binance-BTCUSDT-1M.csv and show dependency graph as matplotlib. CSV header is: open_timestamp_utc close_timestamp_utc open high low close volume.

image

Как результат:

image

А вот видео с демонстрацией от автора:


Как итог


1. В целом это круто! Сделает ли подобная автоматизация людей ленивыми? Я не знаю! Но это реальный буст в автоматизации многих процессов для понимающих, что и как можно с этим инструментом сделать.

2. AGI пока не наступил. Скорее тут подходит определение «умный, но не инициативный» ассистент, которому нужно показать и рассказать как и что сделать и он сделает. Возможно нужно заготавливать пул базовых инструментов и улучшать препромптинг или сделать так, чтобы модель задавала уточняющие вопросы по непонятным ей моментам.

3. Пока много ошибок и каждый раз инструмент приходится перезапуска заново. Нужен умный хэндлер, и возможно «самоисправление» ошибок, аля wolverine.

4. Нужно, по идее, добавить запрос разрешения на исполнение сгенерированного кода, потому как в код может попасть что угодно от операции форматирования диска или удаления системных файлов до обращения на запрещённые ресурсы со всеми вытекающими.

5. Я вижу симбиоз от объединения подобных проектов с языковыми ассистентами, для ускорения создания запросов и упрощения взаимодействия с помощью голоса.

6. Я бы посоветовал всем, кому интересно направление языковых моделей, сделать акцент на анализ и обучение правильным запросам (промптингу), по сути это особая надстройка к языку для общения с нейросетями.

© Habrahabr.ru