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