Допустим, мы делаем тренажёр IELTS и упираемся в оценку устного ответа.
Допустим, грамматика, беглость и связность это независимые критерии, и считать их можно параллельно.
Допустим, запустить три вызова разом мы могли бы и сами, но тогда при странной оценке мы видим только итог, а не то, что получил и вернул каждый оценщик.
Допустим, берём LangGraph: состояние описано схемой, и каждый узел возвращает только свою часть, поэтому затереть чужой результат физически не может.
Допустим, распознавание речи делаем узлом, а не подготовкой перед графом, транскрипт это первое, куда смотрим, когда результат странный.
Допустим, из одного узла выходят три ребра, и LangGraph разводит их сам, без нашего оркестратора.
Допустим, три оценщика получают разное: беглость про темп и паузы, грамматика и связность только про текст.
Допустим, мы дадим оценщику грамматики цифры про паузы, он на них сошлётся, потому что они лежат перед ним.
Допустим, сбор ветвей это массив на входе ребра, то есть дожидаемся всех, а не кто первый.
Допустим, сведение это тоже вызов модели, потому что определение достаточности доказательств для вердикта это суждение.
Допустим, мы захотели от него размеченное объединение: либо уверенность, либо причины отказа.
Допустим, Structured Outputs так не умеет, т.к. юнион даёт oneOf на корне схемы, а провайдеру нужен объект.
Допустим, мы сделали плоский объект с nullable-полями, а инвариант "sufficient обязан нести уверенность" проверяем в узле.
Допустим, провайдер отвечает за форму, а узел за смысл.
Допустим, валидация это отдельный узел, который у модели не спрашивает ничего, а заново парсит собранный объект доменной схемой.
Допустим, каждое наблюдение несёт id того вызова, который его произвёл, любую находку можно свести обратно.
Допустим, один прогон это пять вызовов модели, и в
Studio видно каждый вместе с состоянием до и после него.
А теперь убираем слово "допустим" и получаем граф, который расшифровывает запись и оценивает беглость, грамматику и связность тремя независимыми ветвями, сходящимися в один вердикт. 😵