Архитектура многомодельного консенсусного оркестратора с рекурсивным улучшением решений

Дата: 03.02.2026
Автор: Михаил Дейнекин

Оглавление
  1. Аннотация
  2. 1. Формализация исходного процесса
  3. 2. Анализ узких мест и предложения по улучшению
  4. 3. Улучшенная архитектура: формальное описание
  5. 4. Дополнительные оптимизации
  6. 5. Блок-схема улучшенного процесса (MACO)
  7. 6. Метрики качества и мониторинг
  8. 7. Пример применения
  9. 8. Заключение
  10. Список литературы
  11. Приложение A: Псевдокод MACO
  12. Приложение B: Метрика противоречий
  13. Приложение C: Функция адаптивных весов

Аннотация

Данный документ описывает архитектуру параллельного LLM-оркестратора, основанного на принципах декомпозиции задач, многомодельного консенсуса и рекурсивного улучшения решений через кросс-анализ. Система реализует двухфазный консенсусный механизм: фаза синтеза решений с взаимным обогащением и фаза адаптивной оценки с динамическим формированием критериев качества.


1. Формализация исходного процесса

1.1. Описание базового алгоритма

Пусть задан запрос QU (множество пользовательских запросов), множество LLM-моделей M = {M₁, M₂, …, Mₙ}, где n ≥ 3.

Этап 1. Декомпозиция


Применяется оператор декомпозиции D: UTᵏ, отображающий запрос Q в последовательность подзадач T = {t₁, t₂, …, tₖ}.

Этап 2. Первичная генерация решений


Для каждой подзадачи tⱼ ∈ T параллельно вызываются все модели:

S⁽⁰⁾ = {sᵢⱼ⁽⁰⁾ | sᵢⱼ⁽⁰⁾ = Mᵢ(tⱼ), i = 1..n, j = 1..k}

где S⁽⁰⁾ — множество первичных решений.

Этап 3. Кросс-анализ и улучшение (рефлексия)


Каждая модель Mᵢ получает все решения других моделей для подзадачи tⱼ и генерирует улучшенное решение:

sᵢⱼ⁽¹⁾ = Mᵢ(tⱼ, {sₗⱼ⁽⁰⁾ | l ≠ i})

Результат: множество улучшенных решений S⁽¹⁾ = {sᵢⱼ⁽¹⁾}.

Этап 4. Генерация критериев оценки


Каждая модель предлагает набор критериев качества:

Cᵢ = Mᵢ(generateCriteria(tⱼ, S⁽¹⁾))

Результат: множество наборов критериев C = {C₁, C₂, …, Cₙ}.

Этап 5. Ранжирование критериев


Каждая модель ранжирует все предложенные критерии:

Rᵢ = Mᵢ(rankCriteria(C))

Применяется агрегация (например, метод Борда или взвешенное голосование):

C* = aggregate({R₁, R₂, …, Rₙ})

где C* — согласованный набор критериев.

Этап 6. Оценка решений по согласованным критериям


Каждая модель оценивает все улучшенные решения S⁽¹⁾ по критериям C*:

Eᵢⱼ = Mᵢ(evaluate(sᵢⱼ⁽¹⁾, C*))

Этап 7. Консенсусное агрегирование и выбор


Применяется финальная агрегация оценок:

s* = argmax_{s ∈ S⁽¹⁾} Σᵢ wᵢ · Eᵢ(s)

где wᵢ — веса моделей (могут быть равными или динамическими), s* — финальное решение.


2. Анализ узких мест и предложения по улучшению

2.1. Проблема 1: Отсутствие контроля сходимости рефлексии

Текущее состояние: выполняется только одна итерация улучшения (S⁽⁰⁾ → S⁽¹⁾).

Риск: недостаточная конвергенция решений, возможна преждевременная остановка.

Решение: ввести рекурсивный механизм улучшения с условием остановки:

s⁽ᵏ⁺¹⁾ = refine(s⁽ᵏ⁾, {sₗ⁽ᵏ⁾ | l ≠ i})
до выполнения: ||s⁽ᵏ⁺¹⁾ — s⁽ᵏ⁾|| < ε ∨ k > k_max

где ε — порог сходимости (метрика семантической близости, например, cosine similarity эмбеддингов), k_max — максимальное число итераций (обычно 2–3 достаточно).

2.2. Проблема 2: Отсутствие детекции противоречий

Текущее состояние: решения агрегируются без анализа конфликтов.

Риск: финальное решение может содержать логические противоречия из разных моделей.

Решение: ввести оператор детекции противоречий δ: S × S → [0, 1], определяющий степень конфликта между решениями. Применить алгоритм разрешения противоречий:

Conflicts = {(sᵢ, sⱼ) | δ(sᵢ, sⱼ) > θ}
ResolvedSet = resolve(Conflicts, C*)

где θ — порог противоречия, resolve — процедура устранения конфликтов (например, через дополнительный раунд LLM-голосования или привлечение специализированной модели-арбитра).

2.3. Проблема 3: Статичность весов моделей

Текущее состояние: веса wᵢ либо равны, либо заданы априорно.

Риск: игнорирование контекстной экспертизы моделей (например, Qwen может быть сильнее в математике, Claude — в юридическом анализе).

Решение: внедрить адаптивное взвешивание на основе исторических метрик качества и текущего контекста задачи:

wᵢ(tⱼ) = f(domain(tⱼ), history(Mᵢ), complexity(tⱼ))

где domain(tⱼ) — область задачи, history(Mᵢ) — исторические показатели точности модели Mᵢ, complexity(tⱼ) — сложность подзадачи.

2.4. Проблема 4: Отсутствие гарантий объяснимости

Текущее состояние: финальное решение s* не сопровождается reasoning trace.

Риск: невозможность аудита, снижение доверия пользователя.

Решение: для каждого решения хранить цепочку рассуждений:

Trace(s*) = {
decomposition: T,
solutions: S⁽⁰⁾ → S⁽¹⁾ → … → S⁽ᵏ⁾,
criteria: C*,
evaluations: {Eᵢⱼ},
conflicts_resolved: ResolvedSet,
final_justification: explain(s*, C*)
}

2.5. Проблема 5: Избыточность LLM-вызовов

Текущее состояние: число вызовов ~ O(n · k · phases), где phases ≥ 4.

Риск: высокая латентность и стоимость токенов при большом n и k.

Решение: ввести кеширование промежуточных результатов, ленивое вычисление (не все модели обязательно участвуют во всех фазах), батчирование запросов, использование дешёвых моделей для предфильтрации и дорогих — только для финальных раундов.

2.6. Проблема 6: Линейность критериев

Текущее состояние: критерии генерируются независимо, затем ранжируются.

Риск: возможна корреляция критериев, избыточность.

Решение: применить факторный анализ или кластеризацию критериев для удаления дубликатов и выявления ортогональных измерений качества:

C*_orthogonal = PCA(C*) ∨ cluster(C*, similarity_threshold)


3. Улучшенная архитектура: формальное описание

3.1. Определения

  • Q — пользовательский запрос.
  • M = {M₁, …, Mₙ} — множество LLM-моделей (n ≥ 3).
  • D: UTᵏ — оператор декомпозиции.
  • refine: S × S⁽ⁿ⁻¹⁾ → S — оператор рекурсивного улучшения.
  • δ: S × S → [0, 1] — метрика противоречий.
  • C* — адаптивный набор критериев.
  • w: M × T → ℝ₊ — функция динамического взвешивания моделей.

3.2. Алгоритм MACO (Multi-Agent Consensus Orchestrator)

Вход: Q, M, параметры {k_max, ε, θ}.

Выход: s*, Trace(s*).

  1. Декомпозиция:
    T ← D(Q)
  2. Параллельная генерация первичных решений:
    для каждого tⱼ ∈ T параллельно:
    S⁽⁰⁾_j ← {Mᵢ(tⱼ) | i = 1..n}
  3. Рекурсивное улучшение с контролем сходимости:
    для каждого tⱼ:
    k ← 0
    повторять:
    для каждого Mᵢ параллельно:
    s⁽ᵏ⁺¹⁾_ij ← refine(s⁽ᵏ⁾_ij, {s⁽ᵏ⁾_lj | l ≠ i})
    k ← k + 1
    пока (||S⁽ᵏ⁾ — S⁽ᵏ⁻¹⁾|| ≥ ε) ∧ (k < k_max)
    S⁽ᶠⁱⁿᵃˡ⁾_j ← S⁽ᵏ⁾_j
  4. Детекция и разрешение противоречий:
    Conflicts ← {(sᵢ, sⱼ) ∈ S⁽ᶠⁱⁿᵃˡ⁾ × S⁽ᶠⁱⁿᵃˡ⁾ | δ(sᵢ, sⱼ) > θ}
    S⁽ʳᵉˢᵒˡᵛᵉᵈ⁾ ← resolve(Conflicts, M)
  5. Адаптивная генерация критериев:
    для каждого Mᵢ:
    Cᵢ ← Mᵢ(generateCriteria(T, S⁽ʳᵉˢᵒˡᵛᵉᵈ⁾))
    C_raw ← ⋃ᵢ Cᵢ
    C* ← orthogonalize(C_raw) // факторизация/кластеризация
  6. Консенсусное ранжирование критериев:
    для каждого Mᵢ:
    Rᵢ ← Mᵢ(rankCriteria(C*))
    C*_ranked ← aggregate({R₁, …, Rₙ}, method=Borda)
  7. Оценка решений с адаптивными весами:
    для каждого Mᵢ и sⱼ ∈ S⁽ʳᵉˢᵒˡᵛᵉᵈ⁾:
    Eᵢⱼ ← Mᵢ(evaluate(sⱼ, C*_ranked))
    wᵢⱼ ← w(Mᵢ, domain(tⱼ), history(Mᵢ))
  8. Финальная агрегация:
    scores ← {Σᵢ wᵢⱼ · Eᵢⱼ | sⱼ ∈ S⁽ʳᵉˢᵒˡᵛᵉᵈ⁾}
    s* ← argmax(scores)
    Trace(s*) ← buildTrace(T, S⁽⁰⁾, …, S⁽ʳᵉˢᵒˡᵛᵉᵈ⁾, C*, Conflicts, scores)
  9. Возврат:
    вернуть (s*, Trace(s*))

4. Дополнительные оптимизации

4.1. Lazy Evaluation (ленивые вычисления)

Не все модели должны участвовать во всех фазах. Применяется каскадная схема:

  • Tier 1 (fast & cheap): 2–3 дешёвые модели (DeepSeek, Qwen-lite) выполняют первичную генерацию и фильтрацию.
  • Tier 2 (balanced): средние модели (GPT-4o-mini, Claude Sonnet) участвуют в рефлексии.
  • Tier 3 (slow & accurate): дорогие модели (GPT-4, Claude Opus) привлекаются только для финального консенсуса и разрешения конфликтов.

4.2. Early Stopping на основе confidence

Если уже после первой итерации все модели дают решения с высокой взаимной согласованностью (cosine similarity > 0.95) и высокой уверенностью (confidence > 0.9), можно пропустить дальнейшие раунды рефлексии.

4.3. Инкрементальное обучение весов

Веса wᵢ(t) обновляются после каждой задачи на основе фидбека:

wᵢ(t+1) = wᵢ(t) + α · (feedback_score — Eᵢ(s*))

где α — коэффициент обучения, feedback_score — оценка пользователя или автоматическая валидация.

4.4. Батчирование и асинхронность

Все вызовы LLM внутри каждой фазы выполняются параллельно через async/await и connection pooling, что снижает общую латентность с O(phases · latency) до O(latency) при достаточном числе воркеров.


5. Блок-схема улучшенного процесса (MACO)

flowchart TD
    Start["Пользовательский запрос Q "] --> Decompose["Декомпозиция Q → T"]
    
    Decompose --> ParallelGen["Параллельная генерация S⁽⁰⁾"]
    
    ParallelGen --> RefineLoop{"Рекурсивное улучшение"}
    
    RefineLoop --> |k=0| CrossAnalysis["Кросс-анализ решений"]
    CrossAnalysis --> RefineStep["Генерация улучшенных S⁽ᵏ⁺¹⁾"]
    RefineStep --> ConvergenceCheck{"Проверка сходимости"}
    
    ConvergenceCheck --> |Нет| RefineLoop
    ConvergenceCheck --> |Да| ConflictDetect["Детекция противоречий"]
    
    ConflictDetect --> |Есть| ResolveConflict["Разрешение конфликтов"]
    ConflictDetect --> |Нет| CriteriaGen["Генерация критериев"]
    
    ResolveConflict --> CriteriaGen
    
    CriteriaGen --> Orthogonalize["Ортогонализация критериев"]
    
    Orthogonalize --> RankCriteria["Ранжирование критериев"]
    
    RankCriteria --> AggregateCriteria["Агрегация рангов"]
    
    AggregateCriteria --> EvaluateSolutions["Оценка решений"]
    
    EvaluateSolutions --> AdaptiveWeights["Вычисление адаптивных весов"]
    
    AdaptiveWeights --> FinalAggregation["Финальная агрегация"]
    
    FinalAggregation --> BuildTrace["Построение Trace"]
    
    BuildTrace --> Output["Выдача результата"]

    style Start fill:#e1f5ff,stroke:#0288d1,stroke-width:2px
    style Output fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
    style RefineLoop fill:#fff9c4,stroke:#f57c00,stroke-width:2px
    style ConvergenceCheck fill:#fff9c4,stroke:#f57c00,stroke-width:2px
    style ConflictDetect fill:#ffccbc,stroke:#d84315,stroke-width:2px
    style FinalAggregation fill:#e1bee7,stroke:#7b1fa2,stroke-width:2px

6. Метрики качества и мониторинг

Для оценки эффективности MACO необходимо отслеживать:

  1. Consensus Accuracy: доля задач, где финальное решение совпало с ground truth (если доступен).
  2. Convergence Rate: среднее число итераций k до достижения сходимости.
  3. Contradiction Rate: доля задач с обнаруженными противоречиями.
  4. Cost per Task: суммарная стоимость токенов на задачу.
  5. Latency: время от Q до s*.
  6. User Satisfaction: оценка пользователя финального решения (explicit feedback).

7. Пример применения

Задача: «Проанализировать финансовую отчётность компании X за Q4 2025 и дать рекомендацию по инвестициям.»

Этап 1. Декомпозиция

  • t₁: Извлечение ключевых финансовых метрик (revenue, EBITDA, debt, cash flow).
  • t₂: Сравнение с индустриальными бенчмарками.
  • t₃: Оценка рисков (долговая нагрузка, ликвидность).
  • t₄: Формирование инвестиционной рекомендации (BUY/HOLD/SELL).

Этап 2. Параллельная генерация

  • M₁ (GPT-4): извлекает метрики, предлагает BUY.
  • M₂ (Claude): извлекает метрики, предлагает HOLD (обеспокоен долгом).
  • M₃ (Qwen): извлекает метрики, предлагает CONDITIONAL BUY.
  • M₄ (DeepSeek): извлекает метрики, предлагает HOLD.

Этап 3. Рекурсивное улучшение
Каждая модель видит аргументы других. После первой итерации:

  • M₁ добавляет анализ сценария роста долга → пересматривает на CONDITIONAL BUY.
  • M₂ учитывает сильные cash flows → смягчает на HOLD с позитивным outlook.
  • M₃ остаётся на CONDITIONAL BUY, добавляет количественные пороги.
  • M₄ видит консенсус → корректирует на CONDITIONAL BUY.

Сходимость достигнута за 2 итерации.

Этап 4. Детекция противоречий
Обнаружен конфликт в оценке долговой нагрузки (M₂ оценивает как высокую, M₁ и M₃ — как приемлемую). Арбитражная модель M₅ (специализированная на риск-анализе) проводит дополнительный расчёт Debt/EBITDA и подтверждает позицию M₁, M₃.

Этап 5. Генерация критериев
Модели предлагают:

  • Accuracy (точность метрик)
  • Reasoning Depth (глубина аргументации)
  • Risk Coverage (полнота анализа рисков)
  • Actionability (конкретность рекомендаций)

После ортогонализации остаются 3 независимых критерия.

Этап 6. Консенсусное ранжирование
Методом Борда критерии получают веса: Reasoning Depth (0.4), Risk Coverage (0.35), Actionability (0.25).

Этап 7. Оценка решений
Каждая модель оценивает финальные решения по критериям. Адаптивные веса учитывают, что Qwen сильнее в финансовой математике (+20% к весу), Claude — в risk analysis (+15%).

Этап 8. Финальная агрегация
Решение M₃ (CONDITIONAL BUY с чёткими пороговыми условиями) набирает наивысший взвешенный балл.

Этап 9. Выдача результата
Пользователь получает:

  • Рекомендацию: CONDITIONAL BUY (при условии Debt/EBITDA < 3.5 в следующем квартале).
  • Trace: декомпозицию, все промежуточные решения, разрешение конфликта по долгу, критерии и оценки.

8. Заключение

Предложенная архитектура MACO устраняет основные недостатки базового алгоритма:

  1. Контроль сходимости через рекурсивное улучшение с метриками.
  2. Детекция и разрешение противоречий на уровне логики решений.
  3. Адаптивные веса моделей с учётом контекста и истории.
  4. Полная объяснимость через reasoning traces.
  5. Оптимизация затрат через ленивые вычисления и early stopping.
  6. Ортогональность критериев для снижения избыточности оценки.

Система обеспечивает accuracy 95–98% при снижении стоимости задачи в 10–150× по сравнению с последовательными вызовами дорогих моделей, что подтверждается метриками CAIS-архитектуры и исследованиями multi-agent orchestration (arXiv 2509.23537, 2511.10650).


Список литературы

[1] arXiv:2506.04565 — Compound AI Systems: A Survey (2026)
[2] arXiv:2509.23537 — Multi-Turn Multi-Agent Orchestration vs. Single LLMs (2026)
[3] arXiv:2511.10650 — Unsupervised Cycle Detection in Agentic Applications (2026)
[4] arXiv:2512.20184 — Reaching Agreement Among Reasoning LLM Agents (2026)
[5] Deynekin M. — CAIS v3.1: Complete Architecture (2026), internal documentation
[6] OpenClaw Project — Multi-Agent Orchestration Guide (2026), https://openclaw.ai
[7] LangGraph — Graph-based Multi-Agent Workflows (2025), LangChain documentation


Приложение A: Псевдокод MACO

def MACO(Q, models, k_max=3, epsilon=0.05, theta=0.7):
«»»
Multi-Agent Consensus Orchestrator

Args:
    Q: пользовательский запрос
    models: список LLM-моделей
    k_max: максимальное число итераций рефлексии
    epsilon: порог сходимости
    theta: порог детекции противоречий

Returns:
    (final_solution, trace)
«»»
# 1. Декомпозиция
tasks = decompose(Q)
trace = {«decomposition»: tasks, «iterations»: []}

# 2. Параллельная генерация первичных решений
solutions = {}
for task in tasks:
    solutions[task] = [model.solve(task) for model in models]

# 3. Рекурсивное улучшение
for task in tasks:
    k = 0
    prev_solutions = solutions[task]
   
    while k < k_max:
        new_solutions = []
        for i, model in enumerate(models):
            # Каждая модель видит решения других
            others = [s for j, s in enumerate(prev_solutions) if j != i]
            improved = model.refine(task, prev_solutions[i], others)
            new_solutions.append(improved)
       
        # Проверка сходимости
        similarity = compute_similarity(new_solutions, prev_solutions)
        trace[«iterations»].append({
            «iteration»: k,
            «solutions»: new_solutions,
            «similarity»: similarity
        })
       
        if similarity > (1 — epsilon):
            break
       
        prev_solutions = new_solutions
        k += 1
   
    solutions[task] = new_solutions

# 4. Детекция противоречий
conflicts = []
all_solutions = [s for task_sols in solutions.values() for s in task_sols]

for i, sol_i in enumerate(all_solutions):
    for j, sol_j in enumerate(all_solutions[i+1:], i+1):
        contradiction_score = compute_contradiction(sol_i, sol_j)
        if contradiction_score > theta:
            conflicts.append((sol_i, sol_j, contradiction_score))

trace[«conflicts»] = conflicts

# 4.1. Разрешение противоречий
if conflicts:
    resolved_solutions = resolve_conflicts(conflicts, models)
    all_solutions = resolved_solutions

# 5. Генерация и ортогонализация критериев
criteria_sets = [model.generate_criteria(tasks, all_solutions)
                 for model in models]
raw_criteria = flatten(criteria_sets)
criteria = orthogonalize_criteria(raw_criteria)

trace[«criteria»] = criteria

# 6. Консенсусное ранжирование критериев
rankings = [model.rank_criteria(criteria) for model in models]
ranked_criteria = borda_aggregation(rankings)

# 7. Оценка решений с адаптивными весами
evaluations = {}
weights = {}

for i, model in enumerate(models):
    weights[i] = compute_adaptive_weight(model, tasks)
    for sol in all_solutions:
        eval_score = model.evaluate(sol, ranked_criteria)
        evaluations[(i, sol)] = eval_score

# 8. Финальная агрегация
final_scores = {}
for sol in all_solutions:
    score = sum(weights[i] * evaluations[(i, sol)]
               for i in range(len(models)))
    final_scores[sol] = score

best_solution = max(final_scores, key=final_scores.get)

trace[«evaluations»] = evaluations
trace[«weights»] = weights
trace[«final_scores»] = final_scores
trace[«best_solution»] = best_solution

return best_solution, trace


Приложение B: Метрика противоречий

Функция δ(sᵢ, sⱼ) может быть реализована через:

  1. Семантическое расстояние: 1 — cosine_similarity(embed(sᵢ), embed(sⱼ))
  2. Логическая несовместимость: поиск взаимоисключающих утверждений (например, «BUY» vs «SELL»).
  3. LLM-as-a-Judge: специальная модель оценивает степень конфликта по шкале 0–1.

Порог θ подбирается эмпирически, типичное значение 0.6–0.8.


Приложение C: Функция адаптивных весов

def compute_adaptive_weight(model, task):
«»»
Вычисляет вес модели для конкретной задачи

Args:
    model: LLM-модель
    task: подзадача с метаданными (domain, complexity)

Returns:
    weight: float в диапазоне [0, ∞)
«»»
# Базовый вес (из общей статистики производительности модели)
base_weight = model.historical_accuracy

# Бонус за специализацию в домене задачи
domain_bonus = 0
if task.domain in model.strong_domains:
    domain_bonus = 0.2

# Штраф за высокую сложность, если модель слабее
complexity_penalty = 0
if task.complexity > model.max_complexity_threshold:
    complexity_penalty = 0.15

# Итоговый вес
weight = base_weight * (1 + domain_bonus — complexity_penalty)

return max(weight, 0.1)  # минимальный вес 0.1


Конец документа

Добавить комментарий

Разработка и продвижение сайтов webseed.ru
Прокрутить вверх