mirror of
https://gitverse.ru/kpa39l/hermes-auxiliary-local-models.git
synced 2026-09-29 10:05:02 +00:00
100 lines
5.9 KiB
Markdown
100 lines
5.9 KiB
Markdown
# Текстовые aux на локальной Ollama (qwen3:8b) + отключение thinking
|
||
|
||
Дата: 2026-08-30. Продолжение `qwen3-vl-ollama-setup.md`: после vision переведены
|
||
текстовые auxiliary-задачи (title_generation, web_extract) на локальную qwen3:8b.
|
||
Хост: RTX 5060 Ti 16 GB VRAM, Ollama в Docker, main-модель — polza.ai.
|
||
|
||
## Итоговая конфигурация
|
||
|
||
```yaml
|
||
auxiliary:
|
||
vision: # qwen3-vl:8b (мультимодальная)
|
||
provider: custom
|
||
model: qwen3-vl:8b
|
||
base_url: http://localhost:11434/v1
|
||
api_key: ollama
|
||
title_generation: # qwen3:8b (текстовая)
|
||
provider: custom
|
||
model: qwen3:8b
|
||
base_url: http://localhost:11434/v1
|
||
api_key: ollama
|
||
extra_body:
|
||
think: false
|
||
web_extract: # qwen3:8b
|
||
provider: custom
|
||
model: qwen3:8b
|
||
base_url: http://localhost:11434/v1
|
||
api_key: ollama
|
||
extra_body:
|
||
think: false
|
||
compression: # остаётся в облаке (нужен 64K+ контекст)
|
||
provider: auto
|
||
```
|
||
|
||
Проверено E2E через `from agent.auxiliary_client import call_llm`:
|
||
- title_generation: "Настройка Ollama: локальные модели" — 11.3 сек (на qwen3-vl было 109 сек)
|
||
- web_extract: нормальный пересказ — 7.5 сек
|
||
- compression резолвится на auto → polza, не тронута
|
||
|
||
## Почему qwen3-vl НЕ годится для текстовых aux
|
||
|
||
На простой вопрос ("какой сегодня день недели?") qwen3-vl:8b сгенерила 3778 токенов
|
||
(eval_ms 54 сек) и отвечала 64 сек. reasoning=false в ответе, но content огромный —
|
||
модель "растекается". Для быстрых aux (заголовки, извлечение) непригодна.
|
||
|
||
## Ключевая находка: отключение thinking у qwen3 в Ollama
|
||
|
||
**ВАЖНО (2026-09-04, Ollama 0.22.1):** `think: false` через OpenAI `/v1/chat/completions` НЕ работает
|
||
для qwen3 — модель все равно думает, content пуст, `finish: length` (reasoning съел лимит).
|
||
Через нативный `/api/chat` + `think: false` думание выключается корректно (но Hermes ходит через /v1).
|
||
|
||
**Решение для Hermes/aux — собрать тег с вырезанным reasoning** (никакие опции не помогают):
|
||
|
||
```bash
|
||
# 1. Получить modelfile (docker):
|
||
docker exec ollama ollama show qwen3:8b # или GET /api/show -> поле "modelfile"
|
||
# 2. В TEMPLATE заменить все $.IsThinkSet -> false (ветки thinking навсегда выключены)
|
||
# 3. Собрать (переиспользует blob, без скачивания):
|
||
docker cp /tmp/qwen3-nothink-Modelfile ollama:/root/
|
||
docker exec ollama ollama create qwen3:8b-nothink -f /root/qwen3-nothink-Modelfile
|
||
```
|
||
Ключ: `$.IsThinkSet` управляет думанием (вставляет `/think`/`/no_think` в user msg и `thinking{{ .Thinking }}`
|
||
в assistant). При `false` модель просто отвечает. Проверено: `qwen3:8b-nothink` через /v1 отвечает
|
||
мгновенно (finish: stop), E2E через `call_llm(task=...)` в Hermes — корректный content
|
||
(title_generation, web_extract). Оригинальный `qwen3:8b` не трогаем (откат — 1 строка в config).
|
||
|
||
Затем в config.yaml (вручную, т.к. `hermes config set` не правит dict extra_body; порядок полей в
|
||
файле: provider, model, base_url, api_key, timeout, extra_body): model для
|
||
`auxiliary.title_generation` и `auxiliary.web_extract` := `qwen3:8b-nothink`.
|
||
|
||
**ОПРОВЕРГНУТЫЕ способы (не работают — модель все равно генерит reasoning первыми токенами):**
|
||
- `enable_thinking: false` в options (`/api/chat`) — таймаут
|
||
- `enable_thinking: false` в extra_body (`/v1/chat/completions`) — content пустой
|
||
- `/no_think` в начале user-сообщения — reasoning=True, content пустой
|
||
- system prompt "don't think" — не помогает
|
||
- корневой `think: false` в /v1 — НЕ работает в Ollama 0.22 (работает только native /api/chat)
|
||
|
||
Симптом при неотключённом thinking: **content = ''**, `usage.completion_tokens == max_tokens`
|
||
(весь бюджет съело reasoning), время ответа большое. Диагностика: смотреть поле
|
||
`reasoning`/`reasoning_content` в ответе.
|
||
|
||
## Полный список auxiliary-задач (из config.yaml)
|
||
|
||
vision, web_extract, compression, skills_hub, approval, mcp, title_generation,
|
||
triage_specifier, kanban_decomposer, profile_describer, curator.
|
||
|
||
`session_search` — НЕ auxiliary-задача: `hermes config set auxiliary.session_search.provider`
|
||
даёт warning "not a recognized config key" (в конфиге у неё только extra_body/max_concurrency/
|
||
timeout). Не настраивать как auxiliary.
|
||
|
||
## VRAM (обе модели одновременно)
|
||
|
||
qwen3:8b 6.13 GB + qwen3-vl:8b 7.19 GB + bge-m3 1.21 GB ≈ 14.5 GB — влезают в 16 GB,
|
||
переключение vision↔текст без выгрузки (keep_alive по умолчанию). При нехватке Ollama
|
||
выгружает LRU-модель и перезагружает при следующем вызове (+5-15 сек).
|
||
|
||
## Нюанс `hermes config set`
|
||
|
||
`hermes config set auxiliary.<task>.extra_body` не пройдёт (extra_body — dict, не скаляр) —
|
||
править YAML вручную (python+yaml.safe_dump). Остальные ключи (provider/model/base_url/
|
||
api_key) ставятся через `hermes config set` с `--force` если ключ не в schema. |