# Delibera: дебаты LLM-моделей с вердиктом председателя

Delibera — open source фреймворк на .NET 10: модели обсуждают вопрос раундами, председатель выносит вердикт, а транскрипт остаётся на руках. RAG, MCP, SSE, MIT.

> For the index of this section of the site, see [llms.txt](https://anetlab.ru/llms.txt)

betav10.5.3Лицензия: MIT[Документация](https://techbuzzz.github.io/Delibera/)[Репозиторий](https://github.com/techbuzzz/Delibera)

# 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

Схема 01Как проходит дебат

Путь вопроса: вопрос → председатель открывает обсуждение → раунд с параллельными ответами участников → критика ответов друг друга → следующий раунд → вердикт и транскрипт. 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: код, документация и замеры открыты, продукт можно развернуть у себя и проверить на своих данных. Кейс в [«Портфолио»](https://anetlab.ru/projects.md#delibera) — он же.

Подтверждённых боевых внедрений с измеренным эффектом у нас нет, и ссылаться на несуществующие мы не будем. Что можно проверить сегодня: 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 в «Портфолио»](https://anetlab.ru/projects.md#delibera)
*   [MCP для enterprise: протокол, безопасность и границы](https://anetlab.ru/blog/mcp-for-enterprise.md)
*   [Agentic-пайплайны в enterprise: паттерны и антипаттерны](https://anetlab.ru/blog/agentic-workflows-enterprise.md)
*   [RAG на .NET: архитектура, которая переживает продакшн](https://anetlab.ru/blog/rag-na-dotnet.md)
*   [Собираем RAG-пайплайн на .NET: практический разбор](https://anetlab.ru/blog/rag-pipeline-dotnet.md)

## CTA

Там, где одной модели нельзя доверить решение, — [напишите нам](https://anetlab.ru/contact.md). Посмотрим, какой из пяти встроенных шаблонов дебата ближе к вашей задаче, какие ограничения критичны для вашего контура и как Delibera ложится рядом с агентской оркестрацией.

FAQ

## Частые вопросы

Нужна ли своя инфраструктура?+

Обязательной — нет. Это библиотека для .NET 10, сервер — опция. Для полного набора нужен Docker, векторное хранилище (Qdrant или PostgreSQL/pgvector) и любой OpenAI-совместимый провайдер. Redis добавляет общий кэш результата и события раундов, но не горизонтальное масштабирование.

Можно ли запустить у себя?+

Да, продукт self-hosted под MIT: код, документация и замеры открыты. Порт сервера слушает только 127.0.0.1, а на HTTP-сервере нет аутентификации — выставлять его наружу можно только за своим аутентифицирующим прокси.

Сколько стоит один дебат?+

Дебат тратит реальные кредиты LLM, и бюджет задаёт интегратор. На уровне библиотеки есть лимиты: WithRateLimit(n, window), WithCostLimit(decimal, CostLimitBehavior), WithTokenBudget(long). При отказе лимита возвращается деградированный результат с потраченной суммой, а не исключение.

Какие модели подойдут?+

Любой OpenAI-совместимый провайдер — Ollama, YandexGPT, OpenAI. Состав участников, стратегию раундов и их число задаёт шаблон; пять шаблонов встроены.

Что будет, если модель упадёт?+

Участник исключается из раунда, а не подставляется строкой \[ERROR: ...\], которую председатель прочитал бы как мнение. О деградации видно по FailedMembers и IsDegraded.

Кто отвечает за качество вердикта?+

Никто: продукт не измеряет качество вердикта и не заявляет процентов «качество выше». В одном из замеров вердикт выдумал единогласие, которого в транскрипте не было, — такие случаи проверяются чтением транскрипта, а не счётчиком.