Представьте, что вы говорите своему компьютеру «Открой презентацию по проекту и добавь новый слайд с графиком продаж», и компьютер выполняет эту задачу, используя клавиатуру и мышь, как если бы за ним сидел реальный человек. В этой статье я расскажу, как создать ИИ-агента, который может управлять компьютером с помощью голосовых команд, используя современные языковые модели и простые Python-модули. Статья несет в первую очередь познавательную цель, чтобы поделиться опытом разработки.
Архитектура и технический стек
Программа состоит из нескольких ключевых компонентов:
-
Модуль захвата экрана — делает скриншоты для «зрения» агента
-
Голосовой интерфейс — распознает команды пользователя в реальном времени
-
Языковая модель — анализирует скриншоты и команды, принимает решения
-
Система управления — выполняет действия с курсором и клавиатурой
-
Модуль извлечения команд — парсит JSON-команды из ответа LLM
Для работы с языковой моделью я использую OpenRouter AI, который предоставляет доступ к различным LLM. Наилучшие результаты показывает Gemini Flash 2.0 благодаря оптимальному балансу скорости и стоимости запросов. Однако для тех, кто предпочитает локальное решение без отправки данных внешним сервисам, есть альтернатива — запустить модель на своем компьютере через LM Studio. Недавно DeepMind выпустили мультимодальные модели Gemma 3 (4b, 12b и 27b), которые отлично подходят для таких задач. Для работы с LM Studio в коде достаточно поменять Base URL клиента.
Особое внимание стоит уделить голосовому интерфейсу. Для распознавания речи я использую локальную модель Whisper, которая обеспечивает высокую точность распознавания без необходимости передачи аудиоданных в облако. Это существенно повышает приватность и снижает задержки при обработке команд. Микрофон активно прослушивается в реальном времени, и как только пользователь начинает говорить, агент переходит в режим приема команды, что отображается в индикаторе состояния в правом верхнем углу экрана.
Принцип работы
Цикл работы агента выглядит следующим образом:
-
Получение инструкции — пользователь вводит команду текстом или голосом
-
Обработка инструкции LLM — команда отправляется языковой модели вместе со скриншотом текущего состояния экрана
-
Извлечение команд — LLM генерирует ответ, содержащий набор команд в JSON-формате
-
Выполнение команд — извлеченные команды последовательно выполняются, используя соответствующие модули
-
Обратная связь — агент предоставляет отчет о выполнении каждой команды и делает новый скриншот для контроля результата
Интересной особенностью системы является то, что она работает в соответствии с принципом «клавиатура прежде всего». Это значит, что агент в первую очередь пытается использовать горячие клавиши и текстовый ввод, а не перемещение мыши. Такой подход значительно ускоряет выполнение большинства задач.
Модуль управления курсором
Для точного управления курсором я реализовал специальный модуль, который:
-
Делит экран на условную сетку координат
-
Принимает описания UI-элементов в естественном языке (например, «Поисковая строка браузера»)
-
Анализирует скриншот и определяет, где находится нужный элемент
-
Перемещает курсор в соответствующую позицию

На протяжении всего процесса в правом верхнем углу экрана отображается текущее состояние агента: «Слушаю» при активном распознавании речи, «Анализирую» при обработке команды языковой моделью, «Выполняю» при исполнении действий, и «Ожидаю» в режиме ожидания новых инструкций. Это позволяет пользователю всегда понимать, на каком этапе находится обработка его запроса.
Системный промпт
Разработка эффективного системного промпта стала одним из наиболее сложных и интересных этапов создания проекта. Первая версия промпта была достаточно простой и содержала лишь базовые инструкции для модели. Однако быстро стало ясно, что без детальных указаний небольшая языковая модель не способна последовательно и эффективно управлять компьютером.
Я начал с анализа типичных задач, которые пользователь может делегировать агенту, и выделил основные сценарии взаимодействия с интерфейсом. На основе этого анализа были сформулированы ключевые принципы, такие как «приоритет клавиатуры» и «визуальная верификация».
Затем я итеративно тестировал промпт на различных задачах, фиксируя типичные ошибки и недопонимания со стороны модели. Каждая итерация приводила к уточнению инструкций и добавлению новых разделов. Например, после того как я заметил, что модель часто «предполагает» успешность выполнения команд без проверки, я добавил раздел о необходимости визуальной верификации каждого действия.
Особенно полезным оказалось структурирование промпта по принципу «от общего к частному»: сначала определяются фундаментальные принципы работы, затем протоколы выполнения задач, и только потом конкретные команды и технические детали. Такая иерархическая структура помогает модели правильно определять приоритеты и следовать общей стратегии даже в нестандартных ситуациях.
Финальная версия системного промпта включает в себя основные принципы, протокол выполнения задач, правила планирования действий, приоритеты команд и протокол восстановления после ошибок. Это позволяет модели действовать последовательно, предсказуемо и эффективно в различных сценариях использования.
Основные принципы
-
Приоритет клавиатуры — использование горячих клавиш для большинства действий
-
Визуальная верификация — проверка результата каждого действия по скриншоту
-
Адаптивное выполнение — быстрая смена стратегии при неудаче
-
Атомарная точность — взаимодействие с элементами интерфейса по их точным названиям
Протокол выполнения задач
-
Наблюдение и анализ — описание видимых элементов и планирование действий
-
Составление плана — разбиение задачи на подзадачи с проверкой выполнения
-
Выполнение команд — генерация и исполнение JSON-команд для управления системой
-
Восстановление после ошибок — протокол для обработки неудач и изменения стратегии
Разработка программы
Для голосового управления агентом мы используем модель 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 = []
Модуль голосового ввода:
-
Захватывает аудио с микрофона
-
Определяет момент начала и окончания речи
-
Отправляет записанные аудиофрагменты на распознавание
-
Предоставляет распознанный текст основному модулю
Теперь нам нужен модуль, который будет анализировать ответы от языковой модели и выполнять команды. Этот модуль извлекает 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/
Добавить комментарий