Выбор размера модели-оркестратора для ReAct-агента на llama.cpp | AiManual
AiManual Logo Ai / Manual.
22 Май 2026 Гайд

Не ставьте 70B в оркестратор: как выбрать размер модели для ReAct-агента на llama.cpp

Практические советы по выбору LLM 2-7B для планирования ReAct-агентов. Настройка цикла, сравнение моделей, типичные ошибки для локального запуска через llama.cp

Когда оркестратор жрёт больше, чем генератор

Наблюдал картину: парень поднимает локального ReAct-агента на llama.cpp. В качестве оркестратора — Llama 70B. Результат: агент думает по 3 минуты на шаг, падает контекст, и в итоге он просто пишет «Выполняю...» и зависает. Вопрос: зачем?

Для оркестрации (Thought -> Action -> Observation) не нужна тяжелая артиллерия. Планирование, выбор инструмента, анализ результата — это задачи на логику и следование схеме, а не на генерацию кода. 70B модель в этом случае — как трактор для перевозки одного яблока. Вы не получите прироста качества, а получите тормоза и лишний расход электричества.

В этой статье разберу, какой размер модели реально нужен для оркестратора ReAct-агента, какие модели 2-7B действительно показывают результат, и как настроить llama.cpp, чтобы цикл работал быстро и стабильно. Без воды, с тестами и граблями.

Почему размер имеет значение (и когда он не имеет)

ReAct-агент делает несколько последовательных вызовов LLM за один запрос. Средний цикл: 3-5 итераций. На каждой итерации мы передаём модельке текущий контекст (историю действий и наблюдений) и просим сгенерировать следующее действие. Если модель весит 70B и требует 140GB памяти, то на consumer-железе это будет работать через offloading или с огромным latency. На RTX 4090 24GB вы просто не сможете загрузить 70B целиком — только часть слоёв на GPU, остальное на CPU. Скорость упадёт до 2-3 токенов в секунду. Агент будет думать минутами.

С другой стороны, модели 2-7B спокойно помещаются в VRAM одной видеокарты и дают 20-60 токенов/с. Разница в скорости — порядок. Но не потеряем ли мы в качестве? Тут нюанс: для оркестрации точность нужна не на уровне написания сложной функции, а на уровне: «Какой инструмент выбрать?», «Какой следующий шаг?», «Верный ли ответ получен?». С этим справляются и 3B модели, если они нормально обучены следовать инструкциям.

Проверил на практике: заменил Mistral 7B на Qwen2.5-3B-Instruct в оркестраторе — качество планирования не упало, а скорость выросла в 3 раза. Только не забудьте понизить temperature (0.2-0.4), чтобы модель не фантазировала лишнего.

Что вы реально ждёте от оркестратора

Давайте отделим мух от котлет. Оркестратор — это не кодогенератор. Он не пишет вам деплой-скрипт и не выводит сложную логику. Его задачи:

  • Прочитать prompt с описанием инструментов и текущего состояния.
  • Сгенерировать Thought — текстовое рассуждение, какой инструмент применить.
  • Сгенерировать Action — вызов функции с правильными аргументами.
  • Прочитать Observation (результат), решить, достаточно или продолжать.

Для всего этого нужна способность модели следовать шаблону и держать контекст, а не креативность. Здесь можно смело использовать маленькие модели. Даже 2B модель, если она нормально дообучена на инструкциях, справится.

В качестве примера — проект автоматизированного AI-исследователя, где оркестратор — как раз 3B модель, и это работает. Там не нужно генерировать отчёты — только выбирать поисковые запросы.

Практический выбор: какие модели брать

Ниже таблица с моделями, которые я тестировал для оркестрации в ReAct. Все они работают через llama.cpp, квантизованы в Q4_K_M или Q5_K_M, чтобы уложиться в 8-12GB VRAM.

МодельРазмер параметровРекомендованная квантизацияVRAM (примерно)Качество планирования (субъективно)
Qwen2.5-3B-Instruct3BQ4_K_M~2.2 GB9/10
Phi-4-mini (синтезированный)3.8BQ5_K_M~3.0 GB9/10
Llama-3.2-3B-Instruct3BQ4_K_M~2.0 GB8/10
Gemma-2-2B-it2BQ4_K_M~1.5 GB7/10
Mistral-7B-Instruct-v0.37BQ4_K_M~4.5 GB10/10

Лидер для меня — Qwen2.5-3B. Он отлично держит системный промпт с описанием инструментов, редко сходит с рельсов. Phi-4-mini чуть тяжелее, но тоже хорош, особенно если нужна большая точность в извлечении аргументов. Gemma-2-2B — вариант для совсем слабых машин, но иногда тупит на сложных цепочках действий.

Если у вас больше 12GB VRAM — можете взять Mistral 7B. Но я не вижу в этом необходимости, разве что агент использует много инструментов и требует высокой точности на каждом шаге. Для простых задач (2-3 инструмента) 3B хватает за глаза.

Важно: не путайте оркестратор с моделью, которая генерирует код. Для написания скриптов лучше взять что-то вроде DeepSeek-Coder-6.7B или Qwen2.5-Coder-7B, причём не обязательно через llama.cpp — можно через LM Studio, если вам удобнее графический интерфейс. Но это отдельная тема.

Настройка ReAct цикла с llama.cpp

Допустим, выбрали модель. Теперь нужно правильно организовать цикл. Я использую llama.cpp в режиме сервера, через HTTP-запросы. Так можно легко переиспользовать модель для нескольких агентов и контролировать контекст.

Пример запуска сервера (версия b4371+ на момент мая 2026):

./server -m models/qwen2.5-3b-instruct-q4_k_m.gguf 
          --host 127.0.0.1 --port 8080 
          --ctx-size 8192 --batch-size 512 
          --no-mmap --temp 0.3 --top-p 0.95 
          --repeat-penalty 1.1

Обратите внимание: --temp 0.3. Если оставить 0.8, модель начнёт придумывать несуществующие действия. Для оркестрации нужно детерминированное поведение, поэтому temperature низкий. --ctx-size 8192 — запас на историю итераций. Если агент делает 5 шагов по ~1000 токенов контекста, этого хватит.

Теперь Python-код для звонка к агенту. Минимальный цикл:

import requests, json

def call_llm(prompt):
    r = requests.post('http://127.0.0.1:8080/completion', 
        json={"prompt": prompt, "n_predict": 512, "stop": ["Observation:", "\n\n"]})
    return r.json()['content']

# System prompt с описанием инструментов
system = """You are an agent. You have tools: 
- read_file(path) -> content
- search(query) -> results
Respond with Thought: ... If you need to act, write Action: tool_name(input)"""

state = "User: Find the file config.yaml and show its content."
for _ in range(5):
    full_prompt = f"<|im_start|>system\n{system}\n<|im_end|>\n<|im_start|>user\n{state}\n<|im_end|>\n<|im_start|>assistant\n"
    answer = call_llm(full_prompt)
    if 'Final Answer:' in answer:
        print(answer)
        break
    # парсим Action, выполняем, обновляем state
    # ...

Важно: стоп-слова stop: ["Observation:", "\n\n"] — это не даёт модели галлюцинировать продолжение. Она вынуждена остановиться после генерации одного Thought-Action.

Для ещё большей скорости используйте обзор фреймворков, где сравнивается производительность. Если железо слабое, можно задействовать RPC-сервер на старом железе для распределения нагрузки.

Ошибки, которые я видел (и совершал сам)

Ошибка 1: Гигантский контекст

ReAct-агент может бесконечно накапливать историю. Если не чистить старые шаги, контекст распухнет до 16K+ токенов, и модель 3B начнёт «забывать» начальные инструкции. Решение: ограничьте количество итераций (например, 10 максимум) и обрезайте историю до последних N шагов.

Ошибка 2: Высокая температура

При temp=0.7 модель может решить, что вместо вызова инструмента нужно просто написать «Я подумаю об этом позже». Это беда для оркестрации. Ставьте 0.1-0.3.

Ошибка 3: Одна модель на всё

Многие пытаются использовать одну и ту же сущность и как оркестратор, и как генератор контента, и как переводчик. Для перевода есть специализированные модели — сравнение локальных LLM и машинного перевода показывает, что LLM проигрывает для перевода. Для генерации кода — отдельные модели. Разделяйте.

Ошибка 4: Игнорирование llama-eval

В llama.cpp есть инструмент llama-eval, который помогает оценить качество и скорость. Используйте его, чтобы подобрать оптимальную квантизацию и размер контекста.

Ошибка 5: Запуск оркестратора на CPU, если есть GPU

Маленькие модели типа 3B отлично бегут на GPU. Если у вас всего 4GB VRAM — можно всё равно запустить на GPU с offloading большей части слоёв. На CPU та же Qwen2.5-3B будет выдавать 5 токенов/с, на GPU — 50+. В LXC-контейнере Proxmox это легко настроить.

FAQ: быстрые ответы

💡
Стоит ли использовать одну модель для оркестрации и генерации? Лучше нет. Для генерации кода или текста нужна большая модель (7-14B). Для планирования хватит 3B. Разделите роли — это ускорит агента в разы.

Можно ли запустить оркестратор на 32GB RAM без GPU? Да, Qwen2.5-3B или Llama-3.2-3B в Q5_K_M будут работать на CPU с приемлемой скоростью (8-12 токенов/с). Главное — много ядер и хорошая частота RAM.

Что делать, если модель постоянно выбирает неправильный инструмент? Проверьте описания инструментов в системном промпте. Они должны быть чёткими и однозначными. Также попробуйте модель с бОльшим количеством параметров — например, Mistral 7B.

Как увеличить пропускную способность для нескольких агентов? Используйте туториал по запуску 70B — он описывает batch-режим и shared context. Для маленьких моделей можно запустить несколько инстансов llama.cpp на разных портах.

Подойдёт ли модель для управления ПК через Show UI Aloha? Да, этот проект использует оркестратор 3B, и всё работает.

Не гонитесь за размером. Для оркестрации ReAct-агента на llama.cpp 3B-модель — золотая середина. Быстро, дёшево, эффективно. А если нужна максимальная надёжность на сложных инструментах — поднимите Mistral 7B, но не ждите чуда. Тестируйте, замеряйте лучшие LLM для кодирования — для оркестрации они избыточны.

Следующие пару лет нас ждёт появление маленьких специализированных моделей, обученных именно на трейсах ReAct-агентов. Уже сейчас оцениваю Qwen2.5-3B как основной, а к концу 2026 появятся Phi-5 и Gemma-3, которые, возможно, сделают планирование ещё точнее. Держите руку на пульсе — ваш оркестратор должен быть лёгким.

Подписаться на канал