misc
April 22, 2023

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

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

А что, если разработать механизм управления своей операционной системой 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 примерам:

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

Погода:

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

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

Какая сегодня погода в городе Самара (53.2001,50.15)? Используй API: "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&current_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 напиши что мне сегодня надеть по погоде?

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

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

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

list first 10 files from Windows\system32 directory

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

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

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

Рецепт

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

Свободное место на диске С:

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

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

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

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 landfills
Grand 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 Explore
The BBC sent 10 people to B.C. to travel around the province on public transit. It didn't go well
Paul Cattermole, member of U.K. pop group S Club 7, dead at 46
NATO is getting ready to twist Canada's arm on defence spending
He 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 rulings
125-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 can
Criticism mounts for expulsion of Tennessee politicians along racial lines
WATCH: CBC News Network
Critics say new rental regulations do little to help renters
Canada’s infant mortality rate on the rise
Family celebrates first Easter holiday in Canada after escaping war
Edmonton mother 'living in the shadows' as undocumented migrant celebrates residency status
1 tourist killed, 5 wounded in Tel Aviv attack following airstrikes, West Bank violence
Play at Masters halted after storms bring down trees
This B.C. artist's work is the backdrop to Metallica's latest video
This 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 goat
Shadows of the Troubles linger 25 years after Northern Ireland peace deal
‘Doge’ with a bone: Elon Musk and a meme coin
Headlines 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.")

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

ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))

Погуглив я нашел на 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.

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

Как итог:

  1. В целом это круто! Сделает ли подобная автоматизация людей ленивыми? Я не знаю! Но это реальная автоматизация для понимающих что и как можно с этим инструментом сделать.
  2. AGI пока не наступил. Скорее тут подходит определение "умный, но не инициативный" ассистент, которому нужно показать и рассказать как и что сделать и он сделает. Возможно нужно заготавливать пул базовых инструментов и улучшать препромптинг или сделать так, чтобы модель задавала уточняющие вопросы по непонятным ей моментам.
  3. Пока много ошибок и каждый раз инструмент приходится перезапуска заново. Нужен умный хэндлер, и возможно самоисправление ошибок, аля https://github.com/biobootloader/wolverine.
  4. Нужно по идее добавить запрос разрешения на исполнение сгенерированного кода, потому как в код может попасть что угодно от операции форматирования диска или удаления системных файлов до обращения на запрещённые ресурсы со всеми вытекающими.
  5. Я вижу симбиоз от объединения подобных проектов с языковыми ассистентами, для ускорения создания запросов и упрощения взаимодействия с помощью голоса.
  6. Я бы посоветовал всем, кому интересно направление языковых моделей, сделать акцент на анализ и обучение правильным запросам (промптингу), по сути это особая надстройка к языку для общения с нейросетями.