Как стать автором
Обновить

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

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.5K

Представьте, что вы говорите своему компьютеру "Открой презентацию по проекту и добавь новый слайд с графиком продаж", и компьютер выполняет эту задачу, используя клавиатуру и мышь, как если бы за ним сидел реальный человек. В этой статье я расскажу, как создать ИИ-агента, который может управлять компьютером с помощью голосовых команд, используя современные языковые модели и простые 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. Буду рад обратной связи и предложениям по улучшению!

Теги:
Хабы:
+14
Комментарии4

Публикации

Истории

Ближайшие события

25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область