ИИ-агент для управления компьютером: разработка умного помощника на Python

от автора

Представьте, что вы говорите своему компьютеру «Открой презентацию по проекту и добавь новый слайд с графиком продаж», и компьютер выполняет эту задачу, используя клавиатуру и мышь, как если бы за ним сидел реальный человек. В этой статье я расскажу, как создать ИИ-агента, который может управлять компьютером с помощью голосовых команд, используя современные языковые модели и простые Python-модули. Статья несет в первую очередь познавательную цель, чтобы поделиться опытом разработки.

Архитектура и технический стек

Программа состоит из нескольких ключевых компонентов:

  1. Модуль захвата экрана — делает скриншоты для «зрения» агента

  2. Голосовой интерфейс — распознает команды пользователя в реальном времени

  3. Языковая модель — анализирует скриншоты и команды, принимает решения

  4. Система управления — выполняет действия с курсором и клавиатурой

  5. Модуль извлечения команд — парсит JSON-команды из ответа LLM

Для работы с языковой моделью я использую OpenRouter AI, который предоставляет доступ к различным LLM. Наилучшие результаты показывает Gemini Flash 2.0 благодаря оптимальному балансу скорости и стоимости запросов. Однако для тех, кто предпочитает локальное решение без отправки данных внешним сервисам, есть альтернатива — запустить модель на своем компьютере через LM Studio. Недавно DeepMind выпустили мультимодальные модели Gemma 3 (4b, 12b и 27b), которые отлично подходят для таких задач. Для работы с LM Studio в коде достаточно поменять Base URL клиента.

Особое внимание стоит уделить голосовому интерфейсу. Для распознавания речи я использую локальную модель Whisper, которая обеспечивает высокую точность распознавания без необходимости передачи аудиоданных в облако. Это существенно повышает приватность и снижает задержки при обработке команд. Микрофон активно прослушивается в реальном времени, и как только пользователь начинает говорить, агент переходит в режим приема команды, что отображается в индикаторе состояния в правом верхнем углу экрана.

Принцип работы

Цикл работы агента выглядит следующим образом:

  1. Получение инструкции — пользователь вводит команду текстом или голосом

  2. Обработка инструкции LLM — команда отправляется языковой модели вместе со скриншотом текущего состояния экрана

  3. Извлечение команд — LLM генерирует ответ, содержащий набор команд в JSON-формате

  4. Выполнение команд — извлеченные команды последовательно выполняются, используя соответствующие модули

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

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

Модуль управления курсором

Для точного управления курсором я реализовал специальный модуль, который:

  1. Делит экран на условную сетку координат

  2. Принимает описания UI-элементов в естественном языке (например, «Поисковая строка браузера»)

  3. Анализирует скриншот и определяет, где находится нужный элемент

  4. Перемещает курсор в соответствующую позицию

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

Системный промпт

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

Я начал с анализа типичных задач, которые пользователь может делегировать агенту, и выделил основные сценарии взаимодействия с интерфейсом. На основе этого анализа были сформулированы ключевые принципы, такие как «приоритет клавиатуры» и «визуальная верификация».

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

Особенно полезным оказалось структурирование промпта по принципу «от общего к частному»: сначала определяются фундаментальные принципы работы, затем протоколы выполнения задач, и только потом конкретные команды и технические детали. Такая иерархическая структура помогает модели правильно определять приоритеты и следовать общей стратегии даже в нестандартных ситуациях.

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

Основные принципы

  • Приоритет клавиатуры — использование горячих клавиш для большинства действий

  • Визуальная верификация — проверка результата каждого действия по скриншоту

  • Адаптивное выполнение — быстрая смена стратегии при неудаче

  • Атомарная точность — взаимодействие с элементами интерфейса по их точным названиям

Протокол выполнения задач

  1. Наблюдение и анализ — описание видимых элементов и планирование действий

  2. Составление плана — разбиение задачи на подзадачи с проверкой выполнения

  3. Выполнение команд — генерация и исполнение JSON-команд для управления системой

  4. Восстановление после ошибок — протокол для обработки неудач и изменения стратегии

Разработка программы

Для голосового управления агентом мы используем модель Whisper от OpenAI, которая предоставляет высококачественное распознавание речи:

class VoiceInputProcessor:     def __init__(self, model_name="tiny", language="ru", sample_rate=16000,                   device=None, vad_threshold=0.05, callback=None):         # Инициализация модели Whisper         self.model_name = model_name         self.language = language         self.device = device if device else ("cuda" if torch.cuda.is_available() else "cpu")         self.model = whisper.load_model(model_name, device=self.device)                  # Параметры для обнаружения голосовой активности         self.vad_threshold = vad_threshold         self.silence_duration = 0.3         self.max_record_duration = 3.0         self.min_speech_duration = 0.2                  # Очереди и буферы         self.audio_queue = queue.Queue()         self.text_queue = queue.Queue()         self.audio_buffer = [] 

Модуль голосового ввода:

  1. Захватывает аудио с микрофона

  2. Определяет момент начала и окончания речи

  3. Отправляет записанные аудиофрагменты на распознавание

  4. Предоставляет распознанный текст основному модулю

Теперь нам нужен модуль, который будет анализировать ответы от языковой модели и выполнять команды. Этот модуль извлекает JSON-команды из текстового ответа языковой модели, обрабатывает различные типы команд (перемещение курсора, клики, ввод текста), выполняет команды и возвращает результаты выполнения.

Основной цикл работы агента выглядит так:

def run_desktop_agent(task, max_iterations=15, use_voice=True, voice_model="tiny", voice_language="ru"):     messages = [{'role': 'user', 'content': [{"type": "text", "text": f"New task: {task}"}]}]          # Инициализация голосового ввода     voice_processor = None     if use_voice and VOICE_AVAILABLE:         voice_processor = VoiceInputProcessor(             model_name=voice_model,             language=voice_language         )         voice_processor.start()          i = 0     while i < max_iterations and agent_running:         # Обработка голосового ввода         voice_feedback = process_voice_input()                  # Захват скриншота         save_screenshot()         fullscreen_img = convert_to_base64('screenshots/fullscreen.jpg')                  # Подготовка сообщения для языковой модели         message_content = [             {"type": "text", "text": "Fullscreen screenshot:"},             {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{fullscreen_img}"}}         ]                  if voice_feedback:             message_content.append({"type": "text", "text": f"Voice feedback: {voice_feedback}"})                  # Генерация ответа от LLM         generated_text = generate(list(temp_messages), SYSTEM_PROMPT)                  # Извлечение команд и текста из ответа         commands, text = extract_json(generated_text)                  # Выполнение команд         if commands:             command_results = process_commands(commands)                      i += 1 

Для запуска агента используется командная строка с различными параметрами:

python main.py "Открой браузер и перейди на youtube.com" --voice-model tiny --voice-language ru 

Параметры запуска:

  • Текст задачи, которую должен выполнить агент

  • —no-voice — отключить голосовой ввод

  • —voice-model — размер модели Whisper (tiny, base, small, medium, large)

  • —voice-language — язык распознавания речи

  • —max-iterations — максимальное число итераций агента

Заключение

Разработанный ИИ-агент представляет собой шаг к созданию действительно полезных цифровых ассистентов, которые могут выполнять реальные задачи в интерфейсе компьютера. Благодаря использованию языковых моделей и модульной архитектуре, система получилась гибкой и расширяемой. Конечно, сейчас этот проект далёк от реального использования в работе, однако новые языковые модели выходят практически каждую неделю — LLM становятся быстрее и лучше. С каждой новой языковой моделью такие агенты будут становиться всё практичнее и удобнее.

Исходный код проекта доступен на GitHub. Больше о развитии этого проекта можете прочитать в моем Telegram канале. По всем вопросам пишите мне в Telegram. Буду рад обратной связи и предложениям по улучшению!


ссылка на оригинал статьи https://habr.com/ru/articles/891266/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *