Delibera
Спор моделей вместо одного ответа: вердикт и полный транскрипт
Одна модель — одна точка отказа: красиво звучащий неверный ответ не отличить от обоснованного. Delibera разбирает вопрос между моделями, выносит вердикт и оставляет полный транскрипт дебата.
Что это
Delibera — фреймворк коллективного принятия решений. Несколько моделей обсуждают вопрос раундами, критикуют ответы друг друга, а председатель (Chairman) взвешивает аргументы и фиксирует вердикт. На выходе — вердикт и полный транскрипт обсуждения.
Работает и как библиотека для .NET, и как сервер с REST, SSE и MCP.
Граница продукта: Delibera не источник истины. Он не проверяет факты и не отвечает за правильность вердикта — он структурирует обсуждение и оставляет след. Замещать агентскую оркестрацию он тоже не берёт на себя: выбор моделей, инструментов и памяти остаётся на стороне интегратора.
Кому это нужно
Тем, кому нужно не «мнение модели», а решение, за которым можно посмотреть.
Одна модель на сложном вопросе — это одна точка отказа. Она склонна давать уверенный и правдоподобный ответ, и отличить хорошо обоснованный вывод от красиво звучащего неверного почти невозможно: обоснования просто нет. Если решение уходит в релиз, в договор, в риск-комплаенс или в чек-лист приёмки, нужен след: кто что сказал, почему именно так и кто за это отвечает.
Delibera даёт четыре вещи:
- Несколько независимых трактовок. Модели видят задачу по-разному, и расхождение видно сразу — это и есть предмет обсуждения.
- Проверяемый след. Транскрипт и вердикт — артефакт: их можно прочитать, оспорить и приложить к решению.
- Повторяемый процесс. Дебат — не ручной спор, а шаблон с ролями, раундами и председателем. Один и тот же вопрос разбирается одинаково каждый раз.
- Свой контур. Self-hosted, MIT, библиотека и сервер на .NET — решение остаётся внутри вашей сети.
Как это работает
graph TD Q[Вопрос] --> C[Председатель] C --> P[Участники] P --> X[Критика] X --> C C --> V[Вердикт] K[Knowledge] --> P O[Operator] -.-> P classDef accent fill:#eef7f0,stroke:#008A2A,stroke-width:1.5px,color:#141616 classDef muted fill:#f7f8f8,stroke:#c8cdcd,stroke-width:1px,color:#505757 class C,V accent class K,O muted
Путь вопроса: вопрос → председатель открывает обсуждение → раунд с параллельными ответами участников → критика ответов друг друга → следующий раунд → вердикт и транскрипт. Knowledge Keeper подключается, когда RAG включён и запрос называет корпус. Operator — роль уровня библиотеки, через серверный API он не подключается; на схеме его ветка пунктирная.
Участники одного раунда отвечают параллельно, и раунд длится столько, сколько самый медленный из них. Упавший участник исключается из раунда, а не подставляется в транскрипт строкой [ERROR: ...], которую председатель прочитал бы как мнение.
Knowledge Keeper вытягивает контекст из корпуса по ходу дебата и отвечает с цитатами. На уровне библиотеки Operator — микро-агент, который во время обсуждения дёргает MCP-инструменты.
Что входит
| Значение | |
|---|---|
| Вход | Вопрос или один из пяти встроенных шаблонов дебата; корпус документов для RAG |
| Выход | Раунды с ответами участников, вердикт, статистика токенов, Markdown-экспорт транскрипта |
| Транспорт | REST и MCP в Delibera.Server, SSE-поток раундов, gRPC-сервисы DebateService / ScenarioService / CorpusService |
| Развёртывание | .NET 10, Docker Compose, Qdrant или PostgreSQL/pgvector, Redis по желанию, Ollama или любой OpenAI-совместимый провайдер |
Шаблоны дебата — это готовые сценарии решения, а не абстракция:
| Шаблон | Раундов | Где применяется |
|---|---|---|
code-review |
4 | Ревью кода: несколько моделей ищут дефекты в диффе |
risk-committee |
5 | Риск-комплаенс: комитет оценивает риск и выносит решение |
requirements-review |
4 | Требования: разбор противоречий и полноты постановки |
legal-contract-review |
4 | Юридическая проверка договора |
architecture-decision |
4 | Архитектурное решение с разбором вариантов |
Шаблон — это набор ролей и стратегия раундов, а не текст промпта: свой сценарий добавляется реализацией IServerTemplate и регистрацией в DI.
Сценарии применения
- Ревью изменений. Дифф уходит в дебат, на выходе — замечания нескольких независимых ревьюеров и сводный вердикт.
- Риск-комплаенс. Решение о риске принимается по шаблону комитета, с протоколом в транскрипте.
- Разбор требований. Противоречия в постановке находят не один человек, а несколько моделей с разными акцентами.
- Архитектурные развилки. Варианты сравниваются в одном формате, и решение остаётся в вашем репозитории.
Что измерено
Замеры сделаны 6 октября 2026 года против Ollama Cloud с реальными ключами и опубликованы в документации проекта.
| Сценарий | Время | Поверхность | Что это |
|---|---|---|---|
| code-review, 3 участника и председатель, 4 раунда | 69,8 с | библиотека | качественный прогон |
| architecture, тот же состав | 119,0 с | библиотека | качественный прогон |
| contested, тот же состав | 238,5 с | библиотека | качественный прогон |
| 5 тем × {2, 4} раунда × {сжатие вкл, выкл} | 32,6 с среднее | библиотека | 20 прогонов на $0,12 |
| retry-policy, cancellation, latency-slo с RAG | 208,7 / 172,9 / 154,3 с | библиотека | дебаты с Knowledge Keeper и Operator |
| Завершённые дебаты через HTTP, n=8 | 125 308 – 601 903 мс | сервер | записи сервера |
| Управляющий контур сервера | 36–321 мс | сервер | health, шаблоны, корпус, MCP |
Замеры делятся на две поверхности, и для ИТ Pro это важнее самих чисел. Библиотека — дебат внутри процесса: без HTTP, без аутентификации, без шлюза, те же числа, что интегратор увидит у себя в тестах. Сервер — Delibera.Server в контейнере: добавляются приём задания, SSE и работа по HTTP, поэтому верхняя граница уезжает за 600 с, тогда как библиотека укладывается в 238 с. Строка про Knowledge Keeper и Operator — библиотечная: через серверный API Operator не подключается, в харнесе его роль была подключена напрямую.
Из этих чисел следует главное: сам фреймворк не узкое место. Времени на объяснение не уходит ни секунды — 0,0 с во всех прогонах, — а пропускная способность держится на 840–1 144 знака в секунду. Время определяется тем, сколько текста пишут модели. Критика и доработка занимают 62–77% каждого дебата, потому что оба раунда несут в промпте накопленный транскрипт.
Два числа, которые нельзя смешивать с остальными.
Сжатие контекста измерено на 11,7–12,1%. До v10.5.0 документация обещала 30–70% экономии; замер HybridCompressor даёт около 40% от прежней нижней границы (30%) — примерно в шесть раз меньше верхних 70%. Сейчас в README и в документации стоят измеренные 11,7–12,1% и прямая оговорка, что прежняя цифра никогда не измерялась, а v10.5.0 её исправил. Здесь стоит то же измеренное число.
6 мс против 2699 мс — это задержка прерывания, а не бенчмарк. Прокси Web UI обрывает upstream SSE при отключении клиента за 6 мс вместо 2699 мс. Метрика отвечает на вопрос «как быстро обрывается поток», и к производительности дебата отношения не имеет.
Кейсы
Delibera — open source: код, документация и замеры открыты, продукт можно развернуть у себя и проверить на своих данных. Кейс в «Портфолио» — он же.
Подтверждённых боевых внедрений с измеренным эффектом у нас нет, и ссылаться на несуществующие мы не будем. Что можно проверить сегодня: 620 тестов .NET (493 Core, 117 Server, 10 gRPC) и 34 теста Web UI, опубликованные замеры, пять готовых шаблонов и API, который вызывается из вашего кода.
Честно о границах
- Аутентификации и троттлинга на HTTP-сервере нет. Любой, кто знает адрес, запускает платные дебаты. Лимиты существуют на уровне библиотеки —
WithRateLimit(n, window),WithCostLimit(decimal, CostLimitBehavior),WithTokenBudget(long)— и аутентификацию они не заменяют. При отказе лимита возвращается деградированный результат с потраченной суммой, а не исключение: потолок, который бросает, оставляет без следа, сколько уже потрачено. - Опубликованные порты слушают только 127.0.0.1. Это привязка, а не украшение: пока перед сервером не стоит аутентифицирующий обратный прокси, выставлять порт наружу нельзя. Раздел «Run with Docker Compose» в
docs/Server.mdотсылает к файлуdocker-compose.server.yml, которого в репозитории нет, — команда не отработает. А сам пример в документе публикуетports: ["8080:8080"]и порт провайдера11434: соберёшь compose по этому примеру, в сеть уйдут и сервер без аутентификации, и модель. - Распределённое исполнение ходов — заглушка.
DebateWorkerServiceостаётся no-op, дебат исполняется в процессе, который его принял. Redis даёт общее состояние и события раундов, но не горизонтальное масштабирование. - Operator через серверный API недоступен — см. раздел «Как это работает».
- Качество вердикта не измеряется ничем. Продукт не заявляет процентов «качество выше». В одном из замеров вердикт выдумал единогласие, которого в транскрипте не было, — такие случаи проверяются чтением транскрипта, а не счётчиком.
- CORS выключен по умолчанию и включается точным списком origin’ов; wildcard-переключателя нет.
- Записи завершённых дебатов вытесняются по времени. Медиана по выборке меняется с каждым новым дебатом, поэтому стабильны только диапазон и разбивка по шаблону.
- Дебат тратит реальные кредиты LLM. Бюджет расхода задаёт интегратор.
Как начать
dotnet add package Delibera.Core # библиотека — с неё начинают
dotnet add package Delibera.Server # хост ASP.NET Core: Minimal API, SSE, MCP
dotnet add package Delibera.Redis # оркестратор Redis и общий кэш результата
Или контейнеры с закреплённой версией:
curl -O https://raw.githubusercontent.com/techbuzzz/Delibera/main/deploy/docker-compose.hub.yml
export DELIBERA_VERSION=10.5.3
docker compose -f docker-compose.hub.yml up -d
Три вещи, на которых спотыкаются интеграторы.
Шаблоны выбирают участников по двум отдельным ключам — Delibera:Models:Fast и Delibera:Models:Strong, — а не по Delibera:Providers:DefaultModel. Задать только провайдера мало: сервер стартует здоровым, а на первом дебате отвечает HTTP 500.
maxRounds на верхнем уровне запроса молча игнорируется — переопределение живёт во вложенном options.maxRounds. Лишний ключ не ошибка, он просто не применяется, и шаблон откатывается к своему DefaultMaxRounds = 4.
SSE отдаёт два разных формата. Подписка до конца дебата даёт по кадру на каждый завершённый раунд плюс heartbeat’ы; подписка после — один кадр со всеми раундами сразу. Это не взаимозаменяемые формы: чтобы видеть прогресс, подписываться надо до финиша.
Статус и лицензия
Delibera выпускается релизно: версия 10.5.3 от 11 октября 2026 года опубликована в NuGet (Delibera.Core, Delibera.Server, Delibera.Redis) и в Docker для amd64 и arm64. Покрытие по замеру релиза 10.5.2 — 620 тестов .NET и 34 теста Web UI, все зелёные.
Статус beta, а не GA, по трём причинам: серверная поверхность выставляется без аутентификации, распределённое исполнение ходов остаётся заглушкой, а качество вердикта ничем не измерено. Всё это перечислено в ограничениях, а не спрятано.
Лицензия MIT: свободное использование, изменение и распространение, включая коммерческое.
Связанные материалы
- Кейс Delibera в «Портфолио»
- MCP для enterprise: протокол, безопасность и границы
- Agentic-пайплайны в enterprise: паттерны и антипаттерны
- RAG на .NET: архитектура, которая переживает продакшн
- Собираем RAG-пайплайн на .NET: практический разбор
CTA
Там, где одной модели нельзя доверить решение, — напишите нам. Посмотрим, какой из пяти встроенных шаблонов дебата ближе к вашей задаче, какие ограничения критичны для вашего контура и как Delibera ложится рядом с агентской оркестрацией.