Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

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

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

Коротко

Что будет в материале

  1. 01

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

  2. 02

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

  3. 03

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

  4. 04

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

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

Наблюдал картину: парень поднимает локального 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, которые, возможно, сделают планирование ещё точнее. Держите руку на пульсе — ваш оркестратор должен быть лёгким.

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