Задокументировал опыт настройки локальных aux-моделей Hermes (docs/local-aux-models.md) и обновил историю в README
This commit is contained in:
@@ -25,6 +25,13 @@
|
||||
|
||||
## История изменений
|
||||
|
||||
### 30 августа 2026 года
|
||||
|
||||
- Написана и опубликована статья «Как я перевёл aux-задачи Hermes на локальные модели» (пост `20260830 - local aux models hermes`, slug `local-aux-models-hermes-qwen3`)
|
||||
- Исправлена сборка с современными версиями Hugo: добавлен `defaultContentLanguage = 'ru'` в hugo.toml (Hugo 0.123+ требует, чтобы defaultContentLanguage совпадал с одним из `[languages]`, иначе ошибка `config value "en" does not match any language definition`)
|
||||
- Установлен локальный git identity в репозитории: Storozhenko Evgeny <kpa39l@yandex.ru>
|
||||
- Подробный опыт настройки локальных aux-моделей Hermes задокументирован в [docs/local-aux-models.md](docs/local-aux-models.md)
|
||||
|
||||
### 31 января 2026 года
|
||||
|
||||
- Установлена Hugo расширенная версия 0.155.1
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
# Опыт: локальные auxiliary-модели для Hermes (RTX 5060 Ti 16 GB)
|
||||
|
||||
> Дата: 2026-08-30 · Автор: Стороженко Евгений (kpa39l) · Среда: bigbox, RTX 5060 Ti 16 GB, Ubuntu
|
||||
> Связанная статья: [`content/posts/20260830 - local aux models hermes/index.md`](../content/posts/20260830%20-%20local%20aux%20models%20hermes/index.md)
|
||||
|
||||
Этот документ — техническая копия опыта, описанного в статье блога. Здесь — точные конфиги, команды, замеры и грабли, чтобы можно было повторить настройку без повторного исследования.
|
||||
|
||||
## Проблема
|
||||
|
||||
Агент Hermes (`/opt/hermes/.hermes/hermes-agent/`) помимо основной модели вызывает вспомогательные (auxiliary) задачи через `auxiliary_client.py`:
|
||||
|
||||
- `vision` — описание картинок/скриншотов
|
||||
- `title_generation` — генерация заголовков диалогов
|
||||
- `web_extract` — извлечение текста из веб-страниц
|
||||
- `compression` — сжатие истории диалога (context compaction), **жёсткий минимум контекста 64K токенов**
|
||||
- `skills_hub`, `approval`, `mcp`, `triage_specifier`, `kanban_decomposer`, `profile_describer`, `curator` — служебные
|
||||
|
||||
По умолчанию все они резолвятся в облачного провайдера (polza.ai) — тратят токены и деньги. Цель: увести на локальную Ollama то, что не требует 64K контекста.
|
||||
|
||||
## Выбор модели
|
||||
|
||||
Критерии: уметь vision, влезать в 16 GB VRAM вместе с `bge-m3` (эмбеддинги), быстро отвечать (aux-задачи вызываются часто), желательно закрыть и текстовые задачи.
|
||||
|
||||
- **qwen3-vl:8b** (~6.1 GB, контекст 262K, умеет vision) — для `vision`. Проверено: отвечает «red»/«blue» на цветные картинки 256x256 за 1–10 сек.
|
||||
- **qwen3:8b** (~5.2 GB, чисто текстовая) — для текстовых aux (`title_generation`, `web_extract`). На простой вопрос qwen3-vl генерит 3778 токенов reasoning и отвечает 64 сек — для текста непригодна.
|
||||
|
||||
**compression осталась на polza.ai**: ей нужен контекст 64K+, а локальные GGUF не дотягивают:
|
||||
- qwen3-8b: реальный контекст 40960 (тег «64k» в названии — маркетинг)
|
||||
- qwen2.5-coder-14b: реально 32768 (тег «32k» честный)
|
||||
|
||||
## Настройка
|
||||
|
||||
Рабочий конфиг в `/opt/hermes/.hermes/config.yaml`:
|
||||
|
||||
```yaml
|
||||
auxiliary:
|
||||
vision:
|
||||
provider: custom
|
||||
model: qwen3-vl:8b
|
||||
base_url: http://localhost:11434/v1
|
||||
api_key: ollama
|
||||
title_generation:
|
||||
provider: custom
|
||||
model: qwen3:8b
|
||||
base_url: http://localhost:11434/v1
|
||||
api_key: ollama
|
||||
extra_body:
|
||||
think: false
|
||||
web_extract:
|
||||
provider: custom
|
||||
model: qwen3:8b
|
||||
base_url: http://localhost:11434/v1
|
||||
api_key: ollama
|
||||
extra_body:
|
||||
think: false
|
||||
```
|
||||
|
||||
Команды CLI:
|
||||
|
||||
```bash
|
||||
hermes config set auxiliary.vision.provider custom
|
||||
hermes config set auxiliary.vision.model qwen3-vl:8b
|
||||
hermes config set auxiliary.vision.base_url http://localhost:11434/v1
|
||||
hermes config set auxiliary.vision.api_key ollama
|
||||
# ...аналогично для title_generation и web_extract (model qwen3:8b + extra_body think:false)
|
||||
```
|
||||
|
||||
### Грабли
|
||||
|
||||
1. **`api_key` обязан быть непустым.** Пустой `api_key` = «унаследовать ключ основного провайдера» → попытка сходить в polza.ai с локальной моделью. Заглушка `ollama` подходит (Ollama её не проверяет).
|
||||
2. **Ollama подключается через OpenAI-совместимый эндпоинт** `/v1/chat/completions` (именно так Hermes ходит в локальные модели).
|
||||
3. **qwen3-vl:8b: держать `num_ctx` небольшим (8192).** Полный контекст 262K → KV cache ~309 GB, runner падает с EOF (`EOF on 127.0.0.1:45579`).
|
||||
4. **`session_search` — НЕ auxiliary-задача** (это tool). Переопределение `auxiliary.session_search.*` из конфига нужно удалить.
|
||||
|
||||
## Допиливание: отключение режима размышлений (thinking) у Qwen3
|
||||
|
||||
Qwen3-модели по умолчанию генерируют скрытый поток reasoning перед ответом. Для aux это катастрофа: 64 сек на заголовок, пустой `content` при ограниченном `max_tokens` (весь бюджет съедает thinking).
|
||||
|
||||
### Что НЕ работает (проверено на Ollama)
|
||||
|
||||
| Способ | Результат |
|
||||
|---|---|
|
||||
| `/no_think` в начале сообщения | Модель всё равно думает |
|
||||
| `enable_thinking: false` в extra_body | Не работает |
|
||||
| `thinking: {type: disabled}` (как в OpenAI API Qwen) | Не работает — reasoning продолжается |
|
||||
| System prompt «не думай» | Не работает |
|
||||
|
||||
В chat template qwen3 есть команды `/think` и `/no_think`, но в Ollama они не активируются (флаг `IsThinkSet` не выставляется).
|
||||
|
||||
### Что работает
|
||||
|
||||
**Единственный способ — корневой параметр `think: false` в теле запроса** (HTTP-уровень):
|
||||
|
||||
```bash
|
||||
curl http://localhost:11434/api/chat -d '{
|
||||
"model": "qwen3:8b",
|
||||
"messages": [{"role": "user", "content": "Привет!"}],
|
||||
"think": false
|
||||
}'
|
||||
```
|
||||
|
||||
Результат: ответ через **0.7 сек** (вместо 64), `reasoning=false`, `content` заполнен.
|
||||
|
||||
В Hermes это передаётся через `extra_body: {think: false}` в конфиге — в коде `auxiliary_client.py` `effective_extra_body` уходит в корень JSON-тела запроса, ровно туда, куда Ollama ждёт `think`.
|
||||
|
||||
### E2E-замеры (реальные вызовы через Hermes `call_llm`)
|
||||
|
||||
| Задача | Время | Результат |
|
||||
|---|---|---|
|
||||
| `title_generation` | 11.3 сек | «Настройка Ollama: локальные модели» |
|
||||
| `web_extract` | 7.5 сек | Извлёк главную мысль |
|
||||
| `vision` (картинка 256x256) | 7.6 сек | «blue» |
|
||||
|
||||
## VRAM / память
|
||||
|
||||
RTX 5060 Ti 16 GB, держатся одновременно:
|
||||
|
||||
- `qwen3-vl:8b` — ~7.2 GB (vision)
|
||||
- `qwen3:8b` — ~6.1 GB (текст)
|
||||
- `bge-m3` — ~1.2 GB (эмбеддинги)
|
||||
|
||||
Итого ~14.5 GB — влезает, переключение vision↔текст без выгрузки (проверено через `/api/ps`).
|
||||
|
||||
## Откат
|
||||
|
||||
```bash
|
||||
hermes config set auxiliary.<task>.provider auto
|
||||
hermes config set auxiliary.<task>.model ""
|
||||
docker exec ollama ollama stop qwen3-vl:8b
|
||||
docker exec ollama ollama stop qwen3:8b
|
||||
```
|
||||
|
||||
## Сопутствующий фикс Hugo
|
||||
|
||||
При сборке репозитория современным Hugo (0.145+) возникала ошибка:
|
||||
`config value "en" for defaultContentLanguage does not match any language definition`.
|
||||
|
||||
Решение (коммит `1bda9e2`): добавить в `hugo.toml`:
|
||||
```toml
|
||||
defaultContentLanguage = 'ru'
|
||||
```
|
||||
Потому что в `[languages]` объявлен только `ru`, а Hugo по умолчанию считает язык `en`.
|
||||
Reference in New Issue
Block a user