Forge: гарантии надёжности поднимают 8B-модель с 53% до 99%
Открытый инструмент Forge добавляет слой надёжности к локальным LLM и поднимает точность 8B-модели на агентных задачах с 53% до 99%.
Локальная 8B-модель как полноценный агент — теперь реально
Forge — это слой надёжности для self-hosted (локального) вызова инструментов LLM. Инструмент поднимает 8B-модель до уровня лучших в своём классе на многошаговых агентных задачах через систему guardrails (защитных барьеров) — rescue parsing (восстановление сломанного парсинга), retry nudges (подсказки при повторных попытках) и step enforcement (контроль шагов) — плюс управление контекстом с VRAM-aware budgets (бюджетами памяти GPU) и tiered compaction (многоуровневым сжатием).
Автор проекта признаётся, что строил Forge для собственных всегда-включённых агентных систем, не желая платить за облачные frontier-модели, — и сразу столкнулся с математикой накопленных ошибок: при точности 90% на каждом шаге 5-шаговый воркфлоу даёт 40% вероятность отказа.
Маленькие локальные модели (~8B) нельзя доверить самостоятельному выбору между текстом и вызовом инструмента — их нужно направлять.
Результаты: цифры говорят сами за себя
Лучшая конфигурация на сегодняшний день — Ministral-3 8B Instruct Q8 на llama-server — набирает 86,5% в наборе из 26 сценариев eval-набора Forge и 76% на наиболее сложном уровне.
Это впечатляет на фоне исходных 53% у той же модели без Forge — рост почти вдвое.
Как устроен Forge
graph TD
A[Запрос пользователя] --> B[WorkflowRunner]
B --> C[Guardrails middleware]
C --> D{Ответ корректен?}
D -->|Да| E[Выполнить tool call]
D -->|Нет| F[Rescue parsing / Retry nudge]
F --> C
E --> G[Context Manager]
G --> H[Ответ пользователю]
Forge предлагает четыре способа использования:
WorkflowRunner — определяешь инструменты, выбираешь бэкенд, запускаешь структурированные агентные циклы. Forge управляет всем жизненным циклом: системными промптами, выполнением инструментов, сжатием контекста и guardrails.
SlotWorker — добавляет доступ с приоритетной очередью к общему inference-слоту с авто-вытеснением — для мультиагентных архитектур, где специализированные воркфлоу делят GPU-слот.
Guardrails middleware — используй стек надёжности Forge внутри собственного цикла оркестрации через composable middleware (составные компоненты промежуточного ПО).
Proxy server — дроп-ин замена для локального сервера: любой OpenAI-совместимый клиент (opencode, Continue, aider) получает guardrails «прозрачно».
Ключевой трюк прокси
Прокси автоматически подставляет синтетический инструмент respond, когда в запросе есть tools. Модель вызывает respond(message="...") вместо того, чтобы генерировать голый текст, оставаясь в режиме tool-calling, где работает весь стек guardrails. Вызов respond удаляется из исходящего ответа — клиент видит обычный текстовый ответ и ничего не знает о существовании инструмента.
Это принципиально для небольших локальных моделей (~8B), которым нельзя доверять самостоятельный выбор между текстом и вызовом инструментов.
Поддерживаемые бэкенды
| Бэкенд | Лучше всего для | Native tool calling |
|---|---|---|
| llama-server | Максимальная производительность, полный контроль | Да (с --jinja) |
| Ollama | Простейшая установка, встроенное управление моделями | Да |
| Llamafile | Один бинарник, ноль зависимостей | Нет (через промпт) |
| Anthropic | Frontier-baseline, гибридные воркфлоу | Да |
Быстрый старт
Установка одной командой:
pip install forge-guardrails
Запуск бэкенда (llama-server — рекомендуется):
llama-server -m path/to/Ministral-3-8B-Instruct-2512-Q8_0.gguf --jinja -ngl 999 --port 8080
Простейший пример агента на Python:
import asyncio
from pydantic import BaseModel, Field
from forge import (
Workflow, ToolDef, ToolSpec, WorkflowRunner,
OllamaClient, ContextManager, TieredCompact,
)
def get_weather(city: str) -> str:
return f"72°F and sunny in {city}"
class GetWeatherParams(BaseModel):
city: str = Field(description="City name")
workflow = Workflow(
name="weather",
description="Look up weather for a city.",
tools={
"get_weather": ToolDef(
spec=ToolSpec(name="get_weather", description="Get current weather", parameters=GetWeatherParams),
callable=get_weather,
),
},
required_steps=[],
terminal_tool="get_weather",
system_prompt_template="You are a helpful assistant. Use the available tools to answer the user.",
)
async def main():
client = OllamaClient(model="ministral-3:8b-instruct-2512-q4_K_M", recommended_sampling=True)
ctx = ContextManager(strategy=TieredCompact(keep_recent=2), budget_tokens=8192)
runner = WorkflowRunner(client=client, context_manager=ctx)
await runner.run(workflow, "What's the weather in Paris?")
asyncio.run(main())
Eval-харнесс: как измеряется качество
26 сценариев измеряют, насколько надёжно пара модель+бэкенд проходит многошаговые воркфлоу с вызовом инструментов — разбитые на базовый уровень OG-18 и продвинутый. Eval поддерживает пакетный режим с JSONL-выводом и автоматическим продолжением с места остановки, а отчёты генерируются в форматах ASCII, HTML и Markdown.
Почему это важно для рынка
Логика накопленных ошибок — принципиальная проблема: 90% точности на шаг звучит хорошо, но на 5-шаговом воркфлоу это уже 40% отказов. И ни один существующий фреймворк не решал эту механическую проблему надёжности — все они созданы под облачные frontier-модели.
Forge переворачивает подход: вместо того чтобы брать более мощную (и дорогую) модель, он делает надёжной ту, что уже есть. Это открывает реальную возможность строить production-агентов на локальном железе — без абонентской платы за API и без отправки данных в облако.
Проект доступен на GitHub: github.com/antoinezambelli/forge