Движок рассуждений, который показывает ход мысли

У большинства деловых решений есть точный ответ. Наш движок находит его рассуждением над вашими фактами и правилами — и к каждому ответу прилагает причины.

Что это за движок

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

Такой выбор даёт три свойства, на которые бизнес может опереться: ответ каждый раз один и тот же, его можно объяснить по шагам, а данным никогда не нужно покидать ваши серверы.

Что он умеет

Планирует путь к цели

Получив цель, движок строит многошаговый путь к ней и ведёт журнал каждого своего действия.

Объясняет — в том числе «почему нет»

Каждое решение объясняется целью, которой оно служит, и фактами, на которые опирается. Спросите, почему не выбран другой вариант, — получите ответ; спросите, откуда взялось число, — увидите шаги, которые его дали.

Ведёт себя одинаково каждый раз

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

Замечает неожиданное и выводит настоящий закон

Когда ожидание не сбывается, движок отмечает это и точно, в рациональных числах, выводит настоящую зависимость. Неверное правило, которое ему сообщили, теряет вес, как только данные ему противоречат.

Репетирует до того, как действовать

Изменение правила можно сначала проиграть по журналу истории. Движок покажет, какие решения изменились бы и почему.

Изменение правила репетируется на истории до включенияИстория прошлого месяцаТекущие правилаТе же правила+ новоеСравнение решенийИзменилось бы одно решение —и видна строка-причинаВ работу — только после одобрения
Одна и та же история проходит через текущие правила и через изменённые; показывается только разница.

Принимает новые правила и цели на ходу

Правила и цели можно менять в работающем экземпляре. Изменения другого рода отклоняются, а не применяются наполовину.

Как задать ему вопрос

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

/// Спрос дня по виду товара: будни и выходные.
/// example: base(Kind.Coffee, 0) == 30
/// example: base(Kind.Pastry, 6) == 20
pub fn base(k: Kind, week_day: u32) -> ratio = match k {
    Coffee => if week_day >= 5 { 40 } else { 30 },
    Pastry => if week_day >= 5 { 20 } else { 10 },
    GiftCard => 5,
};

/// Добавка к продажам от идущей акции и от программы лояльности.
config {
    promo_lift: ratio { default: 4 },
    plan_reach: ratio { default: 40 },
}

/// На подарочные карты акций не бывает.
policy item.promote(i: Item, actor: Actor) {
    i.kind is not GiftCard
}

/// Закон дня: каждый товар продаёт свой спрос, затем день сменяется.
rule sales every day for i in Item {
    when true => sell(i.id, Shop(1).day);
}

rule day every day {
    when true => next_day(Shop(1).day);
}

У менеджера один вопрос: ставить ли выпечку на акцию на этой неделе? Чтобы движок мог его принять, пакет добавляет несколько строк — что подаётся на вход, что возвращается и какими действиями движку можно пользоваться:

struct PromoAsk { item: Id<Item> }
struct RateAsk { rate: ratio }
struct Done { ok: bool }

/// «Поставь товар на акцию»: движок может действовать только через `promote`.
extend mind::GoalKind promote_item {
    inputs: PromoAsk,
    output: Done,
    bounds: { organs: [shop::promote] },
}

/// «Измени ставку лояльности»: тяжёлое действие, оно ждёт слова владельца.
extend mind::GoalKind change_rate {
    inputs: RateAsk,
    output: Done,
    bounds: { organs: [shop::set_bonus_rate], heavy: [shop::set_bonus_rate] },
}

Границы — это предохранитель. Для акции движок может действовать только через действие promote. Ставка лояльности помечена как тяжёлая: движок может предложить новую ставку, но ничего не изменится, пока владелец её не одобрит.

Вопрос — одна строка, а ответ возвращается вместе с причинами:

/// Кнопка менеджера: спросить и сохранить причины рядом с ответом.
pub cmd ask_promote(i: Id<Item>) -> Result<bool,
    mind::err.unavailable | mind::err.goal_unknown | mind::err.inputs_incomplete
    | mind::err.out_of_limits | mind::err.timeout
> permission see idempotent by i {
    let v = mind::ask::<promote_item, Done>(PromoAsk { item: i })?;
    emit advice.given { item: i, trace: v.why.trace };
    Ok(v.answer.ok)
}

Что возвращается

  • Сам ответ — в том типе, который запросил пакет: здесь — запущена ли акция
  • Причины: правила и настройки, на которых стоит ответ, — для выпечки это правила дня sales и day и настройки promo_lift и plan_reach
  • Трасса каждого шага: на тех же фактах она даёт тот же ответ и читается обычными словами на языке читателя
  • Отказ с причиной: попросите акцию на подарочные карты — ответ «нет» и политика, которая это запрещает
  • Отложенное предложение для тяжёлых действий: новая ставка лояльности ждёт одобрения владельца
Вопрос движку: от фактов и правил к ответу с причинамиМенеджер: ставить ливыпечку на акцию?Факты: товары,остатки, планПравила инастройки магазинаРассуждение: шаги,каждый записанОтвет: да,акция запущенаПочему: правила sales, day;настройки promo_lift, plan_reach;трасса повторяется так же
Вопрос встречается с фактами и правилами магазина; каждый шаг рассуждения записан, а ответ несёт свои причины.

Чем это лучше вопроса чат-боту

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

Движок рассуждает над теми же точными данными, что и вся платформа, поэтому его объяснения указывают на настоящие записи, а не на их пересказ.

Следующий шаг

Посмотрите на примере своего бизнеса

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