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

LLM-шаг

LLMStepDescription — тип шага по умолчанию: шаг reasoning по типу chain-of-thought, подкреплённый вызовом LLM.

ПолеТипПо умолчаниюНазначение
aimstr"" (обязательное, непустое)Основная цель шага.
reasoning_questionsstr""Ключевые вопросы, на которые должен ответить шаг.
stage_actionstr""Конкретное действие для выполнения.
example_reasoningstr""Пример экспертного рассуждения, которое вы хотите получить.
step_context_querieslist[ContextQuery | str][]RAG-подобные запросы, извлекающие нужный контекст из outer_context в промпт этого шага.
llm_configLLMStepConfig | NoneNoneПереопределение модели / temperature / режима на уровне шага.
retry_maxint | NoneNoneКоличество попыток для этого шага (None = значение по умолчанию из контекста).
timeoutfloat | NoneNoneТаймаут шага в секундах.

Плюс все общие поля.

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.",
)

Переопределите модель, температуру или другие параметры для одного шага с помощью LLMStepConfig:

ПолеТипПо умолчаниюНазначение
modelstr | NoneNoneИдентификатор модели (например, anthropic/claude-3.5-sonnet).
temperaturefloat | NoneNone0.0–2.0.
max_tokensint | NoneNoneОграничение вывода.
timeoutfloat | NoneNoneТаймаут на уровне шага.
token_budget_warningint | NoneNoneПредупреждение при превышении шагом этого количества токенов.
execution_modeExecutionModeFASTFAST или SELF_CRITIC.
use_message_historyboolFalseОтправлять структурированные многоходовые сообщения вместо плоского промпта.
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"].