Зачем собирать этот Франкенштейн?
Вы устали от дюжины разных приложений? Голосовой ассистент в одном месте, управление домом в другом, генерация картинок в третьем, а контекст из ваших документов вообще живёт отдельной жизнью. И всё это стучится в облака, передавая ваши разговоры о включении света неизвестно куда.
Локальный AI-ассистент "всё в одном" — это не просто игрушка для гиков. Это полный цифровой суверенитет. Ваши данные никуда не уходят. Система работает, даже если интернет отрубили. И самое главное — вы контролируете каждую деталь.
Ключевой принцип: если что-то можно запустить локально — запускаем локально. Если нужно выбирать между удобством и приватностью — выбираем приватность, а потом делаем удобным.
Архитектурная карта: что и где живёт
Представьте многоэтажный дом. На первом этаже — железо и операционка. На втором — базовые сервисы. На третьем — AI-компоненты. На четвёртом — интеграции. На крыше — мониторинг. Каждый этаж зависит от нижнего, но не знает деталей реализации.
| Уровень | Компоненты | Зачем нужен |
|---|---|---|
| L0: Инфраструктура | Docker, Docker Compose, Nginx, PostgreSQL, Redis | Контейнеризация, маршрутизация, хранение данных, кэширование |
| L1: Ядро ассистента | LocalAI, Ollama, текстовый LLM (Qwen2.5-7B) | Мозг системы, обработка запросов, планирование |
| L2: Голосовой интерфейс | Whisper.cpp (STT), Piper или Coqui TTS | Преобразование речь-текст и текст-речь |
| L3: Память и контекст | ChromaDB + LangChain, RAG-пайплайн | Доступ к документам, долгосрочная память |
| L4: Интеграции | n8n, Home Assistant, MCP-серверы | Управление домом, автоматизация, внешние API |
| L5: Дополнительные AI-сервисы | Stable Diffusion, контрольные панели | Генерация изображений, мониторинг состояния |
1 Выбираем железо: от Raspberry Pi до серверной стойки
Здесь всё зависит от бюджета и амбиций. Хотите просто голосового помощника для включения света? Raspberry Pi 5 с Coral USB-ускорителем хватит. Хотите всё из заголовка статьи? Готовьтесь к серьёзным вложениям.
- Бюджетный вариант (до 50к рублей): Intel NUC с Core i7, 32GB RAM, без дискретной видеокарты. STT/TTS будут работать, LLM — маленькие (до 7B параметров), Stable Diffusion — только txt2img в низком разрешении.
- Оптимальный вариант (150-200к рублей): Десктоп с RTX 4070 Ti (12GB VRAM), 64GB RAM, Core i5. Потянет LLM до 13B в 4-битном квантовании, SDXL, все голосовые компоненты одновременно.
- Монстр (от 500к рублей): Сервер с 2x RTX 4090, 128GB RAM, Xeon. Здесь можно развернуть агента на стероидах с большими моделями и параллельной обработкой запросов.
Не экономьте на оперативной памяти. Когда одновременно работают LLM, векторная БД, STT/TTS и ещё что-то — 16GB съедаются мгновенно. 32GB — минимум для комфортной работы.
2 Собираем голосовой контур: когда микрофон умнее вас
STT (Speech-to-Text) — самая простая часть. Whisper.cpp работает на процессоре, не требует GPU, и точность у него близка к оригинальному Whisper от OpenAI. Но есть нюанс: фоновый шум.
Если просто запустить Whisper в комнате с работающим телевизором, получите транскрипцию телепередачи, а не вашу команду. Решение — VAD (Voice Activity Detection). Мы используем Silero VAD, который определяет, когда говорите именно вы, и только тогда включает запись.
# Пример конфигурации Whisper.cpp с VAD
import whisper_cpp
# Инициализация с параметрами
model = whisper_cpp.Whisper(
model_path="ggml-base.bin",
language="ru",
vad_threshold=0.5, # Порог активации голоса
vad_min_silence_duration_ms=500 # Минимальная тишина для остановки
)
# Обработка аудиопотока
audio = capture_audio()
text = model.transcribe(audio)
print(f"Распознано: {text}")
TTS (Text-to-Speech) сложнее. Piper — быстрый, но голоса звучат как роботы из 90-х. Coqui TTS с моделями XTTS v2 — качественнее, но требует GPU и ест 2-3GB VRAM. Выбор зависит от того, готовы ли вы ждать 2 секунды вместо 200 миллисекунд ради естественного голоса.
3 Мозг системы: выбираем LLM, которая не будет галлюцинировать
Здесь ошибка стоит дорого. Поставите маленькую модель — будет постоянно "не понимать" запросы. Поставите большую — упрётесь в ограничения железа. Поставите неподходящую — получите галлюцинации вроде "включил свет в комнате, которой нет".
Для управления домом нужна модель с хорошим пониманием инструментов (function calling). Qwen2.5-7B-Instruct справляется отлично, требует около 8GB RAM в 4-битном формате. Если хватит ресурсов — Qwen2.5-14B будет ещё стабильнее.
Системный промпт — вот где магия. Вы должны явно описать модельке её возможности и ограничения:
Ты — домашний ассистент Алиса. У тебя есть доступ к:
1. Управлению умным домом через Home Assistant
2. База знаний с документами (RAG)
3. Генерации изображений по запросу
Ты НЕ МОЖЕШЬ:
- Совершать покупки
- Звонить по телефону
- Отправлять email
Формат ответа: сначала думай (Reasoning), потом действуй (Action).
Если запрос требует доступа к документам — используй search_documents().
Если нужно включить/выключить устройство — используй home_assistant_action().
4 RAG-система: когда ассистент помнит ваши документы
Без RAG ваш ассистент — просто голосовой интерфейс к API. С RAG он может ответить на вопрос "Что написано в моём договоре аренды?" или "Когда у жены день рождения?".
Архитектура простая, но капризная:
- Загрузка документов: PDF, Word, TXT, даже скриншоты через OCR
- Чанкинг: Разбиваем на перекрывающиеся отрезки по 500-1000 символов
- Эмбеддинг: Преобразуем в векторы с помощью модели all-MiniLM-L6-v2
- Поиск: Semantic search в ChromaDB по косинусной близости
- Контекстуализация: Добавляем найденные чанки в промпт к LLM
Ошибка, которую делают все: хранить всё в одной коллекции. Договоры, рецепты, заметки — всё вместе. Когда спрашиваете про рецепт борща, система находит и отрывок из договора, и рецепт, и ещё какую-то ерунду. Решение — namespaces в ChromaDB. Отдельно "документы", отдельно "личное", отдельно "дом".
5 Интеграция с умным домом: когда голос заменяет 10 приложений
Home Assistant — король локальных умных домов. Но заставить LLM работать с ним напрямую — боль. API Home Assistant RESTful, но модель должна понимать структуру: какие устройства есть, какие атрибуты, какие сервисы.
Правильный путь — MCP-сервер (Model Context Protocol). Он выступает переводчиком между LLM и Home Assistant. Вы описываете инструменты в JSON Schema, MCP-сервер предоставляет их модели как "функции", которые можно вызывать.
{
"tools": [
{
"name": "control_light",
"description": "Включить или выключить свет",
"parameters": {
"entity_id": {
"type": "string",
"enum": ["light.living_room", "light.bedroom"]
},
"action": {
"type": "string",
"enum": ["on", "off", "toggle"]
}
}
}
]
}
Когда вы говорите "Включи свет в гостиной", STT преобразует в текст, LLM определяет, что нужно вызвать control_light с параметрами entity_id="light.living_room", action="on", MCP-сервер выполняет вызов Home Assistant API, и свет включается.
n8n добавляет сюда суперсилу — визуальное программирование автоматизаций. Хотите, чтобы при команде "Я дома" включался свет, запускался чайник и играла музыка? Собираете workflow в n8n, экспортируете как инструмент в MCP, и модель получает новую "функцию".
6 Генерация изображений: Stable Diffusion без облаков
"Нарисуй кота в космосе в стиле Ван Гога". Запрос, который отправляет 99% пользователей в облачные сервисы. А зря. Stable Diffusion 1.5 работает на 6GB VRAM. SDXL — на 8-10GB. Комфортно — на 12GB+.
Устанавливаем Automatic1111 или ComfyUI в Docker-контейнере. Настраиваем API. Интегрируем через MCP-сервер как ещё один инструмент. Теперь модель может не только отвечать текстом, но и генерировать изображения по запросу.
Внимание с промптами! LLM будет пытаться сгенерировать промпт для Stable Diffusion, но её представление о "красивом изображении" может не совпадать с вашим. Лучше ограничить генерацию конкретными сценариями: "иллюстрация для истории", "мем по теме", "схема процесса".
7 Мониторинг: знать, что система не умерла
Самая скучная часть, без которой всё развалится через неделю. Вам нужно знать:
- Работают ли контейнеры (Docker stats)
- Не перегревается ли GPU (nvidia-smi)
- Хватает ли памяти (особенно важно для оптимизации LLM)
- Корректно ли работает распознавание речи (лог ошибок Whisper)
Собираем всё в Grafana. Prometheus для метрик, Loki для логов, Alertmanager для уведомлений. Когда система начинает тормозить — вы видите это на дашборде до того, как пользователь (вы же) начинает ругаться.
Собираем пазл: docker-compose.yml для всего сразу
Теперь самое интересное — как всё это заставить работать вместе. Docker Compose — ваш лучший друг.
version: '3.8'
services:
# LLM сервер
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
# Векторная БД
chromadb:
image: chromadb/chroma:latest
ports:
- "8000:8000"
volumes:
- chroma_data:/chroma/chroma
# Голосовой интерфейс
whisper-api:
build: ./whisper-service
ports:
- "9000:9000"
volumes:
- ./models:/models
# Home Assistant
homeassistant:
image: homeassistant/home-assistant:stable
ports:
- "8123:8123"
volumes:
- ha_data:/config
# n8n для автоматизаций
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=секретный_пароль
# MCP-сервер для интеграций
mcp-server:
build: ./mcp-server
ports:
- "3000:3000"
depends_on:
- homeassistant
- n8n
- chromadb
# Stable Diffusion
stable-diffusion:
image: ghcr.io/automatic1111/stable-diffusion-webui:latest
ports:
- "7860:7860"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
# Мониторинг
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana:latest
ports:
- "3001:3000"
volumes:
ollama_data:
chroma_data:
ha_data:
Тёмная сторона: интерфейс, который не слепит глаза
Всё это богатство нужно как-то контролировать. Веб-интерфейс — очевидный выбор. Но если вы работаете ночью, белый экран Home Assistant или Grafana выжжет глаза.
Решение — тёмная тема везде. Но не просто invert colors, а продуманный dark mode:
- Home Assistant: HACS → Frontend Themes → Midnight
- Grafana: Built-in Dark theme
- n8n: Settings → Personalization → Theme Dark
- Свой фронтенд для ассистента: Tailwind CSS с классом "dark"
Единая панель управления — отдельный фронтенд на React/Vue, который агрегирует все компоненты. Кнопка "Разбудить ассистента", список последних команд, быстрый доступ к настройкам устройств, предпросмотр сгенерированных изображений.
Что пойдёт не так (спойлер: почти всё)
| Проблема | Причина | Решение |
|---|---|---|
| Ассистент не слышит команды | VAD слишком чувствительный или фоновый шум | Настроить vad_threshold, добавить шумоподавление на уровне микрофона |
| LLM медленно отвечает | Модель слишком большая или контекст переполнен | Уменьшить размер контекста, использовать кэширование, перейти на более лёгкую модель |
| RAG находит нерелевантные документы | Плохие эмбеддинги или слишком большие чанки | Использовать другую модель для эмбеддингов, настроить чанкинг с перекрытием |
| Home Assistant не отвечает | Проблемы с сетью или API-токеном | Проверить long-lived access token, убедиться что сервисы в одной сети |
| Генерация изображений падает | Нехватка VRAM или неправильные промпты | Использовать --medvram флаг, ограничить разрешение, валидировать промпты |
Стоит ли игра свеч?
Абсолютно. Да, это сложно. Да, придётся потратить недели на настройку. Да, что-то будет ломаться. Но когда вы впервые скажете "Привет, включи свет на кухне и найди рецепт пасты" — и система выполнит оба действия, не спросив пароль от Google и не отправив аудиозапись в Калифорнию — вы поймёте, зачем всё это.
Это не просто ассистент. Это ваша цифровая крепость. Каждый компонент вы контролируете. Каждая модель — ваша. Каждый байт данных остаётся дома. В мире, где большие компании перекраивают себя под аудио и собирают ваши разговоры — такая система становится не игрушкой, а необходимостью.
Начните с малого. Сначала голосовой интерфейс к Home Assistant. Потом добавьте RAG с вашими документами. Потом генерацию изображений. Каждый шаг — новый уровень контроля. И через месяц вы будете смеяться над теми, кто всё ещё говорит "Окей, Google".