LLM-шаг
LLMStepDescription — тип шага по умолчанию: шаг reasoning по типу chain-of-thought,
подкреплённый вызовом LLM.
| Поле | Тип | По умолчанию | Назначение |
|---|---|---|---|
aim | str | "" (обязательное, непустое) | Основная цель шага. |
reasoning_questions | str | "" | Ключевые вопросы, на которые должен ответить шаг. |
stage_action | str | "" | Конкретное действие для выполнения. |
example_reasoning | str | "" | Пример экспертного рассуждения, которое вы хотите получить. |
step_context_queries | list[ContextQuery | str] | [] | RAG-подобные запросы, извлекающие нужный контекст из outer_context в промпт этого шага. |
llm_config | LLMStepConfig | None | None | Переопределение модели / temperature / режима на уровне шага. |
retry_max | int | None | None | Количество попыток для этого шага (None = значение по умолчанию из контекста). |
timeout | float | None | None | Таймаут шага в секундах. |
Плюс все общие поля.
Базовый пример
Заголовок раздела «Базовый пример»from mmar_carl import LLMStepDescription
LLMStepDescription( number=1, title="Assess data quality", aim="Assess the quality and completeness of the input data.", reasoning_questions="What data patterns and anomalies are present?", step_context_queries=["missing values", "data consistency"], stage_action="Evaluate reliability and flag issues.", example_reasoning="High-quality data enables reliable downstream analysis.",)Конфигурация LLM на уровне шага
Заголовок раздела «Конфигурация LLM на уровне шага»Переопределите модель, температуру или другие параметры для одного шага с помощью
LLMStepConfig:
| Поле | Тип | По умолчанию | Назначение |
|---|---|---|---|
model | str | None | None | Идентификатор модели (например, anthropic/claude-3.5-sonnet). |
temperature | float | None | None | 0.0–2.0. |
max_tokens | int | None | None | Ограничение вывода. |
timeout | float | None | None | Таймаут на уровне шага. |
token_budget_warning | int | None | None | Предупреждение при превышении шагом этого количества токенов. |
execution_mode | ExecutionMode | FAST | FAST или SELF_CRITIC. |
use_message_history | bool | False | Отправлять структурированные многоходовые сообщения вместо плоского промпта. |
from mmar_carl import LLMStepDescription, LLMStepConfig
LLMStepDescription( number=2, title="Deep analysis", aim="Perform a rigorous analysis.", llm_config=LLMStepConfig(model="anthropic/claude-3.5-sonnet", temperature=0.2),)Два параметра стоит выделить отдельно:
token_budget_warning— выдаёт предупреждение, когда суммарное число токенов шага превышает порог. Срабатывает только с клиентом, который сообщает об использовании токенов (например,OpenAICompatibleClient); фактические значения см. в разделе оценка стоимости.use_message_history— отправляет структурированный список сообщенийsystem/user/assistantвместо плоского промпта: системный промпт и внешний контекст становятся первым сообщениемsystem, предыдущие ходы изcontext.messagesвключаются в запрос, а ответ шага дописывается обратно вcontext.messages. Требует клиента, реализующегоget_response_with_messages(например,OpenAICompatibleClient).
Режимы выполнения
Заголовок раздела «Режимы выполнения»FAST(по умолчанию) — один проход LLM.SELF_CRITIC— шаг генерирует ответ, прогоняет его через одного или нескольких оценщиков и перегенерирует доself_critic_max_revisionsраз, пока оценщики не одобрят.
from mmar_carl import ExecutionMode
LLMStepConfig( execution_mode=ExecutionMode.SELF_CRITIC, self_critic_evaluators=["llm"], self_critic_max_revisions=2, self_critic_instruction="Reject answers that aren't backed by the data.",)self_critic_evaluators перечисляет оценщиков по порядку; одобрить должны все.
"llm" — встроенный LLM-рецензент. Зарегистрируйте собственный (не-LLM или
кастомный) оценщик через context.register_self_critic_evaluator(name, evaluator) —
унаследуйтесь от SelfCriticEvaluatorBase и верните
SelfCriticDecision(verdict=..., review_text=...).
Пример режимов выполнения
из репозитория (mock-клиент, без API-ключа) запускает цепочку из 3 шагов: проход
FAST, шаг SELF_CRITIC со встроенным оценщиком "llm" и шаг SELF_CRITIC, в
цепочку оценщиков которого добавлена кастомная проверка на ключевое слово.
class KeywordGuardEvaluator(SelfCriticEvaluatorBase): def __init__(self, required_keyword: str): self.required_keyword = required_keyword.lower()
async def evaluate(self, step, candidate, base_prompt, context, llm_client, retries): if self.required_keyword in candidate.lower(): return SelfCriticDecision(verdict="APPROVE", review_text="found") return SelfCriticDecision(verdict="DISAPPROVE", review_text="missing keyword")
context.register_self_critic_evaluator("keyword_guard", KeywordGuardEvaluator("mitigation"))
LLMStepConfig( execution_mode=ExecutionMode.SELF_CRITIC, self_critic_evaluators=["llm", "keyword_guard"], # both must approve self_critic_max_revisions=2,)Телеметрия режима по каждому шагу (execution_mode, llm_calls, число ревизий
rounds, quality_warning) попадает в
context.metadata["execution_mode_details"].
Смотрите также
Заголовок раздела «Смотрите также»- Динамические ссылки — связывание выводов шагов между собой.
- Извлечение контекста — как работает
step_context_queries.