Перейти к содержимому

Обзор эволюции

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

from mmar_carl import ChainEvolver
evolver = ChainEvolver(
base_chain=chain,
dataset=dataset,
metric=AccuracyMetric(),
population_size=6,
generations=3,
elitism=2,
checkpoint_path="evolution.json", # atomic resume on crash
)
result = await evolver.evolve(
context_factory=lambda case: ReasoningContext(outer_context=case.input, api=client),
)
print(result.best_score, "@ generation", result.best_generation)
best = ReasoningChain.from_dict(result.best_chain_spec) # rehydrate the winner
ПараметрТипПо умолчаниюНазначение
base_chainReasoningChain—Цепочка для эволюции.
datasetAbstractDataset—Кейсы, по которым оценивается каждый вариант.
metricMetricBase | list[MetricBase]—Одна метрика или несколько (многоцелевые).
fitness_fnCallable[[dict], float] | Noneсреднее метрикОбъединяет оценки метрик в одну приспособленность.
mutatorChainMutator | NoneNoneКакие мутации пробовать — см. мутации.
population_sizeint6Вариантов на поколение.
generationsint3Количество поколений.
elitismint2Лучшие варианты, переносимые без изменений.
smoke_checkboolTrueПроверить базовую цепочку перед эволюцией.
max_concurrent_individualsint1Оценивать одновременно столько вариантов.
checkpoint_pathstr | NoneNoneАтомарный файл контрольной точки для безопасного возобновления после сбоя.

evolve(context_factory) асинхронный и возвращает EvolutionResult.

Передайте список метрик и fitness_fn для их взвешивания:

evolver = ChainEvolver(
base_chain=chain,
dataset=dataset,
metric=[AccuracyMetric(), BrevityMetric()],
fitness_fn=lambda s: 0.7 * s["accuracy"] + 0.3 * s["brevity"],
population_size=4, generations=3, elitism=1,
)

Имена метрик должны быть уникальными. Без fitness_fn приспособленность равна среднему по всем метрикам.

Оцените расходы до запуска:

estimate = evolver.estimate_cost(
context_factory,
pricing={"qwen/qwen3-8b": (0.00002, 0.00006)},
)
print(estimate.format_summary()) # smoke + population × generations × cases

Тот же расчёт лежит в основе предпросмотра бюджета в TUI: панель эволюции в MAESTRO CARE показывает эту оценку и счётчик расходов в реальном времени — до запуска и во время него.