Локальные AI-агенты
Запускаем Hermes полностью локально через QVAC
В результате у вас будет персональный Hermes Agent, который обращается к модели на вашей машине, сохраняет память между сессиями, вызывает только разрешённые инструменты и продолжает работать после отключения интернета. Облачный ключ для выполнения задач не понадобится, но модели и программные зависимости нужно скачать заранее.
Что именно мы строим
Hermes Agent — это агентная оболочка вокруг языковой модели: она ведёт диалог, хранит состояние, подбирает навыки и передаёт модели описания доступных функций. QVAC в нашей схеме отвечает только за локальный запуск модели и предоставляет совместимый с OpenAI HTTP-интерфейс.
Пользователь
│
▼
Hermes Agent
├── локальные сессии
├── память и навыки
├── правила доступа
└── инструменты
│
│ HTTP на 127.0.0.1
▼
QVAC OpenAI server
│
▼
локальная модель
│
▼
CPU / GPU / RAM
Здесь важно разделить роли. LLM генерирует следующий ответ или запрос функции. Hermes управляет агентным циклом, памятью и выполнением функций. QVAC загружает веса модели, формирует вход по её chat template и выполняет инференс на локальном оборудовании.
Фраза «полностью локально» в этом руководстве означает:
- Hermes и QVAC запущены на одном компьютере или в одной изолированной локальной сети;
- запросы модели уходят только на loopback-адрес
127.0.0.1; - история, память, навыки и журналы Hermes хранятся локально;
- проверяемые инструменты не требуют внешних сервисов;
- после предварительной загрузки зависимостей и весов рабочий сценарий проходит при отключённом интернете.
Конкретный сценарий: личный журнал решений
Чтобы проверка не свелась к фразе «модель ответила приветствием», соберём воспроизводимый сценарий. Hermes должен работать с локальным каталогом проекта:
- прочитать текстовую заметку;
- выделить из неё решение и следующий шаг;
- записать результат в новый файл внутри разрешённого каталога;
- запомнить устойчивое предпочтение пользователя;
- в новой сессии восстановить это предпочтение;
- повторить задачу при физически отключённой сети.
Так мы отдельно проверим четыре слоя: генерацию, вызов инструментов, постоянную память и отсутствие облачного маршрута. Если один слой сломается, будет понятно, где искать причину.
Используйте отдельный стендовый каталог. Не начинайте с домашней директории, репозитория с секретами или папки синхронизации.
mkdir -p "$PWD/hermes-local-lab/inbox"
mkdir -p "$PWD/hermes-local-lab/outbox"
printf '%s\n' \
'Проект: локальный помощник.' \
'Решение: хранить итоговые заметки в Markdown.' \
'Следующий шаг: проверить работу без сети.' \
> "$PWD/hermes-local-lab/inbox/meeting.txt"
find "$PWD/hermes-local-lab" -maxdepth 2 -type f -print
В статье переменная LAB_DIR будет обозначать абсолютный путь к этому каталогу:
export LAB_DIR="$PWD/hermes-local-lab"
printf '%s\n' "$LAB_DIR"
Требования и выбор модели
Нужны Unix-подобная среда, рабочие Node.js и npm для QVAC, Python-окружение, поддерживаемое текущей версией Hermes, Git, curl и достаточно свободного места для весов. На Windows запускайте Hermes внутри WSL2. Перед установкой проверьте фактические версии, доступную память и диск:
uname -a
node --version
npm --version
python3 --version
git --version
curl --version | head -n 1
df -h .
free -h 2>/dev/null || true
После установки QVAC команда qvac doctor показывает доступный вычислительный backend. На Apple Silicon обычно используется Metal; на совместимом оборудовании Linux и Windows может использоваться Vulkan. Если GPU недоступен, часть моделей можно запускать на CPU, но время первого ответа и длинных агентных циклов возрастёт.
qvac doctor
Для начала выберите одну из моделей с 4-битной квантизацией. Ниже приведены ориентиры для планирования, а не обещание скорости на конкретном компьютере.
| Профиль | Модель | Ориентир по RAM | Размер весов | Константа QVAC |
|---|---|---|---|---|
| Проверка установки | Qwen3.5-4B Q4 | от 8 ГБ | около 3 ГБ | QWEN3_5_4B_MULTIMODAL_Q4_K_M |
| Сбалансированный стенд | Qwen3.5-9B Q4 | от 16 ГБ | около 6 ГБ | QWEN3_5_9B_MULTIMODAL_Q4_K_M |
| Полный набор инструментов | Qwen3.6-35B-A3B MoE Q4 | от 36 ГБ | около 22 ГБ | QWEN3_6_35B_A3B_MULTIMODAL_Q4_K_M |
MoE означает, что на каждом шаге активна лишь часть экспертов модели. Это не отменяет необходимости разместить её веса и рабочие буферы в памяти. Оставляйте запас для операционной системы, Hermes, контекста и KV-cache.
4B подходит для проверки маршрута и простых функций. 9B обычно устойчивее формирует аргументы функций, но также может пропускать шаги. 35B-A3B разумнее для многошагового агента, если машина способна держать модель без интенсивного swap. Ни одна из этих конфигураций не гарантирует безошибочное выполнение инструментов.
Шаг 1. Установите QVAC CLI
Установка выполняется через npm. На этом этапе интернет нужен для получения пакета и позже — для загрузки весов.
npm install -g @qvac/cli
command -v qvac
qvac --help
qvac doctor
Если глобальная установка npm требует прав администратора, не запускайте неизвестный install-процесс через sudo. Настройте пользовательский npm prefix или используйте управляемую версию Node.js. После установки убедитесь, что исполняемый файл находится в вашем PATH.
Создадим отдельный каталог конфигурации QVAC:
mkdir -p "$PWD/qvac-hermes"
cd "$PWD/qvac-hermes"
Шаг 2. Объявите модель и включите tool calling
QVAC HTTP server загружает только модели, перечисленные в serve.models. Ключ объекта становится именем модели, которое будет передавать клиент. Возьмём стабильный локальный псевдоним hermes-local.
Для машины с достаточной памятью конфигурация выглядит так:
{
"serve": {
"models": {
"hermes-local": {
"model": "QWEN3_6_35B_A3B_MULTIMODAL_Q4_K_M",
"default": true,
"preload": true,
"config": {
"ctx_size": 65536,
"tools": true
}
}
}
}
}
Сохраните JSON как qvac.config.json в текущем каталоге. Если используете 4B или 9B, замените только значение model:
"QWEN3_5_4B_MULTIMODAL_Q4_K_M"
или:
"QWEN3_5_9B_MULTIMODAL_Q4_K_M"
ctx_size задаёт максимальный объём текста, который runtime старается удерживать для запроса. Hermes использует большой системный промпт и описания инструментов, поэтому слишком маленькое значение приводит к переполнению ещё до полезной части задачи. Одновременно большой лимит токенов увеличивает память KV-cache. Если 65536 не помещается, начните с меньшего стендового контекста, сократите число активных инструментов и явно задайте Hermes тот же фактический предел.
Флаг tools включает обработку функций для выбранной модели. Без него обычный чат может работать, а агентный сценарий — возвращать текст вместо структурированного вызова.
Шаг 3. Запустите OpenAI-совместимый сервер
Запускайте сервер только на loopback-интерфейсе. Так порт не будет доступен другим устройствам локальной сети.
cd "$PWD/qvac-hermes"
qvac serve openai \
--config "$PWD/qvac.config.json" \
--host 127.0.0.1 \
--port 11434 \
--verbose
Оставьте процесс в отдельном терминале. При первом запуске QVAC может скачать модель, после чего загрузит её в память. Не переходите к Hermes, пока сервер не завершил подготовку.
Во втором терминале проверьте HTTP-маршрут:
curl --fail --silent --show-error \
http://127.0.0.1:11434/v1/models
Ожидается JSON-объект со списком, содержащим идентификатор hermes-local. Если список пуст, модель ещё не загружена. Если получен 404, проверьте путь к конфигурации и псевдоним под serve.models.
Теперь отправьте минимальный запрос:
curl --fail --silent --show-error \
http://127.0.0.1:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "hermes-local",
"messages": [
{
"role": "user",
"content": "Ответь ровно одним словом: готов"
}
],
"temperature": 0,
"max_tokens": 16
}'
Проверяйте структуру ответа, а не конкретный регистр или пунктуацию текста. В объекте должен присутствовать массив choices с сообщением ассистента. Если HTTP-ответ успешен, но текст пуст, изучите verbose-журнал QVAC и убедитесь, что выбранная константа относится к chat-модели.
Шаг 4. Проверьте функции до установки Hermes
Так мы отделим возможности QVAC и модели от логики агента. Отправим модели описание безопасной тестовой функции, которая ничего не выполняет:
curl --fail --silent --show-error \
http://127.0.0.1:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "hermes-local",
"messages": [
{
"role": "user",
"content": "Узнай размер файла /lab/inbox/meeting.txt. Не угадывай и используй функцию."
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_file_size",
"description": "Возвращает размер разрешённого локального файла",
"parameters": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Абсолютный путь к файлу"
}
},
"required": ["path"],
"additionalProperties": false
}
}
}
],
"tool_choice": "auto",
"temperature": 0,
"max_tokens": 256
}'
Успешный результат этого этапа — не выдуманный размер файла, а элемент tool_calls с именем get_file_size и JSON-аргументом path. Сервер не выполняет функцию: он только возвращает намерение модели. Реальное выполнение позже делает Hermes.
Типичные неправильные результаты:
- модель пишет словами «я вызову функцию», но
tool_callsотсутствует; - имя функции изменено или содержит пробелы;
argumentsне разбирается как JSON;- модель выдумывает размер, не запрашивая функцию;
- вместо переданного пути подставляется другой файл.
Если этот запрос не проходит, Hermes пока устанавливать бессмысленно. Проверьте "tools": true, перезапустите QVAC после изменения конфигурации и попробуйте более крупную модель. Успешный обычный ответ не доказывает поддержку агентного цикла.
Шаг 5. Установите Hermes Agent
Перед запуском удалённого install-скрипта разумно сначала сохранить и просмотреть его:
curl --fail --silent --show-error \
https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh \
-o /tmp/hermes-install.sh
less /tmp/hermes-install.sh
bash /tmp/hermes-install.sh
Если ваша политика запрещает запуск внешних скриптов, установите Hermes по ручной инструкции выбранной версии. Не смешивайте системный Python и случайные пакеты из нескольких окружений.
После установки откройте новый терминал или обновите PATH, затем проверьте команду:
command -v hermes
hermes --help
Hermes хранит пользовательское состояние в ~/.hermes/. Этот каталог может содержать историю, память, навыки, журналы и параметры провайдера. Не публикуйте его целиком и не добавляйте в Git.
find "$HOME/.hermes" -maxdepth 2 -type d -print 2>/dev/null
Шаг 6. Подключите Hermes к QVAC
Запустите интерактивный выбор модели:
hermes model
Выберите пользовательский OpenAI-совместимый endpoint и введите:
API base URL: http://127.0.0.1:11434/v1
API key: local-qvac
Model name: hermes-local
Context length: 65536
Если сервер QVAC запущен без --api-key, строка local-qvac является непустым локальным значением для клиента, а не реальным облачным секретом. Она не должна совпадать с каким-либо рабочим ключом.
Современные версии Hermes сохраняют пользовательский endpoint в ~/.hermes/config.yaml. Эквивалентная смысловая конфигурация выглядит так:
model:
default: hermes-local
provider: custom
base_url: http://127.0.0.1:11434/v1
Формат конфигурации может изменяться между версиями, поэтому предпочтителен hermes model: команда записывает структуру, которую понимает установленный клиент. Не заменяйте весь существующий config.yaml коротким фрагментом — в нём могут находиться настройки памяти, каналов и навыков.
Проверьте сохранённый адрес без вывода потенциальных секретов:
grep -nE 'provider:|base_url:|default:' \
"$HOME/.hermes/config.yaml"
В выводе не должно быть домена облачного провайдера. Базовый адрес должен начинаться с http://127.0.0.1:11434/v1.
Шаг 7. Первый запуск без опасных инструментов
Запустите Hermes:
hermes
Первый запрос должен требовать только генерации:
Назови текущую модель и скажи, какой базовый URL настроен.
Не используй инструменты и не обращайся к сети.
Не считайте текст модели доказательством конфигурации: она может повторить сведения из промпта или ошибиться. Источники истины здесь — config.yaml, журнал QVAC и сетевое наблюдение.
Затем дайте модели короткую инструкцию с явной границей:
Рабочий каталог: /абсолютный/путь/hermes-local-lab.
Разрешено читать только inbox и записывать только в outbox.
Не изменяй исходные файлы.
Не выполняй сетевые запросы.
Сначала перечисли план, затем дождись следующей команды.
Если агент немедленно начал изменять файлы, остановите выполнение. Это означает, что граница задана только естественным языком, но не подкреплена разрешениями. Промпт помогает модели выбрать действие, однако не является механизмом изоляции.
Шаг 8. Ограничьте файловые инструменты
Точный способ включения инструментов зависит от версии Hermes и активных навыков, но принцип неизменен: предоставляйте агенту минимальный каталог и минимальный набор функций.
Для стенда достаточно:
- прочитать файл по разрешённому пути;
- перечислить файлы внутри стенда;
- создать новый файл в
outbox; - прочитать или записать локальную память Hermes;
- запросить подтверждение перед любым действием вне этих границ.
Отключите или не подключайте браузер, почту, мессенджеры, shell общего назначения и внешние MCP-серверы. Если Hermes запущен в контейнере, монтируйте стенд отдельным volume и не передавайте домашний каталог:
/host/hermes-local-lab/inbox -> /lab/inbox:ro
/host/hermes-local-lab/outbox -> /lab/outbox:rw
/host/hermes-state -> /home/hermes/.hermes:rw
Для обычного процесса без контейнера создайте отдельного системного пользователя или запускайте агента из изолированной среды. Фраза «работай только в этой папке» полезна, но операционная система всё равно должна запрещать лишнее чтение и запись.
Allowlist должен проверять уже нормализованный абсолютный путь. Простая проверка строкового префикса пропустит пути с .. или символические ссылки.
requested path
│
▼
resolve / realpath
│
├── внутри inbox → чтение
├── внутри outbox → чтение и создание
└── вне стенда → отказ
Шаг 9. Проверьте реальный агентный цикл
Передайте Hermes следующую задачу, подставив абсолютный путь:
Прочитай файл:
<LAB_DIR>/inbox/meeting.txt
Создай:
<LAB_DIR>/outbox/meeting-summary.md
В новом файле должны быть только три раздела:
# Проект
# Решение
# Следующий шаг
Не изменяй исходный файл. После записи перечитай новый файл
и сообщи путь и названия разделов.
После завершения не доверяйте одному сообщению агента. Проверьте файловую систему:
test -f "$LAB_DIR/outbox/meeting-summary.md"
test -f "$LAB_DIR/inbox/meeting.txt"
sed -n '1,80p' "$LAB_DIR/outbox/meeting-summary.md"
find "$LAB_DIR" -maxdepth 2 -type f \
-printf '%p\n' 2>/dev/null || \
find "$LAB_DIR" -maxdepth 2 -type f -print
Признаки успешного цикла:
- агент запросил чтение исходного файла, а не придумал его содержание;
- вызов записи содержал путь внутри
outbox; - создан ровно ожидаемый файл;
- исходный файл не изменён;
- финальный ответ появился после повторного чтения результата;
- в журнале QVAC видны только локальные запросы к модели.
Зафиксируйте хеш исходного файла до и после повторного прогона:
sha256sum "$LAB_DIR/inbox/meeting.txt"
Если система не поддерживает sha256sum, используйте доступную утилиту SHA-256. Совпадение хеша доказывает, что исходный файл не изменился; оно не доказывает отсутствие других изменений вне стенда.
Шаг 10. Проверьте постоянную память
Память агента должна быть проверена между независимыми сессиями, иначе легко принять историю текущего диалога за постоянное сохранение.
В первой сессии задайте синтетическое предпочтение, которое безопасно хранить:
Запомни устойчивое предпочтение для тестового проекта:
итоговые заметки должны содержать не более трёх разделов.
Не сохраняй путь к файлам, персональные данные или секреты.
Подтверди, что именно отправлено в постоянную память.
Завершите Hermes штатной командой выхода. Затем запустите новую сессию и спросите:
Какое ограничение формата я установил для итоговых заметок?
Если постоянная память не содержит ответа, честно скажи об этом.
Успех — точное восстановление правила из постоянного хранилища. Ответ в той же сессии ничего не доказывает: модель видит предыдущие сообщения в активном контексте.
Проверьте локальное состояние по времени изменения, не печатая содержимое всех файлов:
find "$HOME/.hermes" -type f \
-printf '%TY-%Tm-%Td %TH:%TM %p\n' 2>/dev/null \
| sort \
| tail -n 30
На macOS используйте обычный find без -printf или штатные средства просмотра метаданных. Не делайте вывод о формате памяти по названию каталога: Hermes может менять внутреннюю структуру между версиями.
Шаг 11. Докажите работу без интернета
Офлайн-проверка должна выполняться только после полной загрузки модели. Иначе вы проверите не inference, а наличие файлов в кэше.
Сначала убедитесь, что все компоненты уже запускались:
- QVAC стартует без дополнительной загрузки;
/v1/modelsвозвращаетhermes-local;- Hermes отвечает через QVAC;
- инструмент читает и пишет файлы стенда;
- память восстанавливается после перезапуска.
Затем остановите Hermes и QVAC. Физически отключите Wi-Fi и проводную сеть либо примените временное правило сетевого namespace, которое запрещает внешние соединения, но сохраняет loopback. Не блокируйте 127.0.0.1: Hermes должен связаться с QVAC.
После отключения сети заново запустите:
cd /абсолютный/путь/qvac-hermes
qvac serve openai \
--config "$PWD/qvac.config.json" \
--host 127.0.0.1 \
--port 11434 \
--verbose
Во втором терминале:
curl --fail http://127.0.0.1:11434/v1/models
hermes
Дайте новую задачу, которой нет в предыдущей истории:
Создай в разрешённом outbox файл offline-check.md.
Запиши текущую строку: OFFLINE_ROUTE_OK
Добавь краткое резюме локального файла inbox/meeting.txt.
Не используй браузер, поиск, URL или внешние источники.
После записи перечитай файл.
Проверьте результат независимо:
test -f "$LAB_DIR/outbox/offline-check.md"
grep -F 'OFFLINE_ROUTE_OK' \
"$LAB_DIR/outbox/offline-check.md"
sed -n '1,80p' \
"$LAB_DIR/outbox/offline-check.md"
Дополнительно проверьте, что процесс QVAC слушает только loopback:
ss -ltnp 2>/dev/null | grep ':11434' || \
lsof -nP -iTCP:11434 -sTCP:LISTEN
В адресе прослушивания должен быть 127.0.0.1:11434, а не 0.0.0.0:11434. Сам факт отключённого Wi-Fi не исключает другие интерфейсы, VPN или виртуальные сети. Для строгого испытания используйте системный сетевой монитор или изолированный namespace и убедитесь, что разрешён только loopback.
Автоматизированная smoke-проверка QVAC
До запуска Hermes удобно иметь короткий тест HTTP-границы. Он проверяет доступность списка моделей и обычный chat completion, но не заменяет проверку функций.
#!/usr/bin/env bash
set -euo pipefail
base_url="${QVAC_BASE_URL:-http://127.0.0.1:11434/v1}"
model="${QVAC_MODEL:-hermes-local}"
models_json="$(curl --fail --silent --show-error \
"$base_url/models")"
printf '%s' "$models_json" |
grep -F "\"id\":\"$model\"" >/dev/null ||
printf '%s' "$models_json" |
grep -F "\"id\": \"$model\"" >/dev/null
response_json="$(curl --fail --silent --show-error \
"$base_url/chat/completions" \
-H 'Content-Type: application/json' \
-d "{
\"model\": \"$model\",
\"messages\": [
{\"role\": \"user\", \"content\": \"Ответь: LOCAL_OK\"}
],
\"temperature\": 0,
\"max_tokens\": 32
}")"
printf '%s' "$response_json" |
grep -F 'choices' >/dev/null
printf '%s\n' 'QVAC_HTTP_OK'
Для надёжной автоматизации разбирайте JSON с jq и проверяйте конкретные поля. Две формы grep выше нужны только как переносимый минимальный пример. Они не валидируют весь ответ.
Диагностика по слоям
| Симптом | Вероятный слой | Первая проверка |
|---|---|---|
qvac: command not found |
Установка CLI | npm prefix -g и PATH |
| Сервер завершается при загрузке | Модель или память | qvac doctor, свободная RAM, имя константы |
/v1/models возвращает 404 |
HTTP-конфигурация | путь к qvac.config.json и версия CLI |
| Модель не найдена | Псевдоним | hermes-local в QVAC и Hermes должен совпадать |
| Обычный чат работает, инструменты нет | Tool calling | "tools": true и сырой curl-тест функции |
| Hermes обращается к облаку | Провайдер | provider: custom и локальный base_url |
| Первая сессия работает, новая забывает правило | Память | каталог состояния, права записи, механизм сохранения |
| После отключения сети модель не стартует | Кэш весов | была ли модель полностью скачана до испытания |
| Ответ обрывается | Контекст или лимит вывода | ctx_size, число инструментов, фактический лимит Hermes |
| Процесс зависает, система использует swap | Нехватка RAM | меньшая модель, меньший контекст, отключение preload других моделей |
Частые ошибки конфигурации
Hermes использует неправильный URL
Базовый URL должен включать /v1:
http://127.0.0.1:11434/v1
Если клиент самостоятельно добавляет /v1, получится двойной путь. Определите это по HTTP-журналу QVAC. Не меняйте одновременно адрес, порт и провайдера: исправляйте по одному параметру.
Псевдоним модели не совпадает
В запросах нужно указывать ключ под serve.models, то есть hermes-local. Значение QVAC-константы используется сервером для разрешения весов и не обязано быть именем, которое видит Hermes.
Слишком большой контекст
Значение 65536 не означает, что каждый компьютер сможет его разместить. Снизьте контекст, оставьте только необходимые инструменты и повторите HTTP-тест. Hermes и QVAC должны согласованно считать фактический предел.
Модель пишет JSON обычным текстом
Это не корректный tool call. Проверьте сырой ответ /v1/chat/completions. Если message.tool_calls отсутствует, оболочка не обязана интерпретировать текст как функцию. Попытка регулярно «чинить» такой вывод регулярными выражениями создаёт риск выполнения неверных аргументов.
Инструмент вызывается по кругу
Установите лимит числа шагов, сохраните последовательность сообщений и проверьте, возвращает ли Hermes результат функции модели в ожидаемой роли. Добавьте явное условие остановки: после успешного чтения и записи перечитать файл один раз и завершить задачу.
Первая генерация выглядит зависшей
Большой системный промпт Hermes и схемы инструментов требуют предварительной обработки. Следите за журналом QVAC и потреблением ресурсов. Если токены не генерируются, уменьшите модель или контекст. Не делайте вывод по одному долгому запуску и не приписывайте конкретную задержку любой машине.
Память есть, но извлекается не то
Сохраняйте атомарные, однозначные факты без лишней истории. Проверяйте память отдельными сессиями и формулируйте запрос без подсказки правильного ответа. Не помещайте в постоянную память пароли, токены и содержимое конфиденциальных документов.
Безопасный режим для повседневной работы
Локальный агент получает доступ к тем же файлам, что и пользователь, от имени которого запущен процесс. Поэтому рабочая конфигурация должна ограничивать не только сеть, но и последствия ошибочного tool call.
- Запускайте QVAC на
127.0.0.1, если удалённый доступ не нужен. - Не передавайте Hermes домашний каталог целиком.
- Используйте read-only mount для входных данных.
- Выделяйте отдельный каталог для создаваемых файлов.
- Не подключайте shell, пока задача решается специализированными функциями.
- Для удаления, отправки и публикации используйте контур подтверждения.
- Не храните настоящие ключи в тестовой конфигурации.
- Проверяйте символические ссылки перед доступом к файлам.
- Фиксируйте имя модели, версии пакетов и хеш конфигурации.
- Перед обновлением создавайте резервную копию
~/.hermes.
Для контроля изменений конфигурации можно хранить её обезличенную копию в отдельном репозитории:
sha256sum qvac.config.json
npm list -g @qvac/cli --depth=0
hermes --help | head -n 5
Команда Hermes не всегда выводит версию одинаковым флагом, поэтому фиксируйте доступную информацию из установленной сборки, а не предполагаемое значение.
Как сравнить 4B, 9B и 35B-A3B без выдуманного бенчмарка
Бенчмарк должен запускать одинаковые задания с одинаковыми схемами инструментов. Не сравнивайте 4B на коротком промпте с 35B, которой передали все навыки Hermes.
Подготовьте пять локальных задач:
- прочитать один файл и вернуть точный факт;
- создать файл по трёхпунктной схеме;
- выбрать один инструмент из двух похожих;
- исправить аргумент после отказа allowlist;
- завершить цикл после получения результата, не вызывая функцию повторно.
Для каждого запуска записывайте:
- константу модели и размер контекста;
- полный вход без секретов;
- последовательность вызовов инструментов;
- валидность имён и JSON-аргументов;
- число лишних вызовов;
- соблюдение границ путей;
- достигнут ли проверяемый результат;
- время холодного и прогретого запуска на вашей машине.
Не подменяйте качество скоростью. Модель, которая быстро пишет убедительный финальный ответ, но не создаёт файл, провалила задачу. Модель, которая завершает работу после повторного вызова опасного инструмента, также провалила проверку.
Сначала проведите по одному пробному запуску для выявления ошибок стенда. Затем заранее определите число повторов и не меняйте критерии после просмотра результатов. Статья намеренно не приводит «наши проценты успеха»: без опубликованного набора задач, журналов и оборудования такие цифры нельзя честно перенести на систему читателя.
Ограничения локальной схемы
Локальный запуск решает вопрос маршрута данных, но создаёт собственные компромиссы:
- Качество. Компактная локальная модель может хуже выбирать инструменты, планировать длинные цепочки и восстанавливаться после ошибки, чем крупная облачная модель.
- Память оборудования. Вес модели — только часть потребления. Нужны рабочие буферы, KV-cache, память Hermes и запас для системы.
- Задержка. Большой системный промпт и десятки схем функций делают первый шаг тяжёлым.
- Контекст. Заявленный максимум модели не гарантирует, что выбранный runtime и устройство смогут эффективно использовать его целиком.
- Инструменты. Локальная модель не делает браузер, почту или API локальными. Каждый внешний инструмент снова создаёт сетевой маршрут.
- Обновления. CLI, модельный реестр и формат конфигурации меняются. Зафиксированная рабочая версия требует осознанного обновления.
- Безопасность. Вредоносный локальный документ способен содержать prompt injection. Отсутствие облака не мешает модели запросить опасную локальную функцию.
- Наблюдаемость. Без журналов невозможно отличить ошибку модели от ошибки шаблона, QVAC, Hermes или инструмента.
- Резервное копирование. Локальная память исчезнет при повреждении диска, если её отдельно не сохранять.
Полная автономность также не равна полной полезности. Агент без сети не сможет получить свежие новости, обратиться к SaaS или синхронизировать данные. Офлайн-контур подходит для локальных файлов, закрытых баз знаний, черновиков, классификации и задач, где приватность важнее актуальности внешних данных.
Финальный чек-лист
qvac doctorраспознаёт доступный backend.- Модель объявлена в
qvac.config.json. - Для модели включено
"tools": true. - QVAC слушает только
127.0.0.1:11434. /v1/modelsвозвращаетhermes-local.- Прямой curl-запрос возвращает корректный chat completion.
- Прямой тест функции возвращает структурированный
tool_calls. - Hermes настроен на провайдер
custom. - В
base_urlуказан локальный адрес с/v1. - Hermes видит только стендовые каталоги.
- Входной каталог доступен только для чтения.
- Результат проверяется через файловую систему, а не по словам агента.
- Постоянная память проверена в новой сессии.
- После отключения сети выполнен холодный перезапуск обоих процессов.
- Офлайн-задача создала и перечитала новый файл.
- В конфигурации и памяти нет реальных секретов.
Если все пункты выполнены, у вас есть не просто локальный чат, а минимальный воспроизводимый контур персонального агента: модель обслуживается QVAC, Hermes управляет памятью и функциями, операционная система ограничивает доступ, а офлайн-тест подтверждает отсутствие обязательного облачного маршрута.
Куда двигаться дальше
Следующий разумный шаг — добавить один специализированный навык и один инструмент с узкой JSON-схемой, затем повторить весь набор проверок. Не подключайте сразу браузер, shell, почту и мессенджеры: при сбое вы потеряете возможность определить, какой слой нарушил контракт.
Другие пошаговые материалы собраны в гайдах Agent Lab Journal, а определения AI-агента, LLM, контекста, tool calling, MCP, памяти и других терминов — в глоссарии.