Детерминизм по построению

Детерминированный AI —
по построению.

Задайте модели один и тот же вопрос дважды — и получите два разных ответа. Это недетерминированный AI: приемлемо для текста, недопустимо для чисел. SQAI забирает число у модели: каждое вычисление выполняется на зафиксированном float64-рантайме, в одном потоке, и выводит хеш, позволяющий воспроизвести его точно.

IIВоспроизведение

Два сертификата с разницей в месяцы.

Одно вычисление — finance.npv при ставке дисконтирования 10% на пяти денежных потоках — выполнено однажды, затем воспроизведено спустя месяцы. Детерминизм как обещание требует доверия. Детерминизм как хеш требует лишь сравнения.

Запуск 001первое выполнение

конверт детерминизма

capability
finance.npv
runtime_bundle
0.1.0 · 4d64142e…
platform
darwin-arm64
precision_mode
float64
thread_count
1
value
505.020148896933

computation_hashb74f67d0d7a594aa…

Запуск 002несколько месяцев спустя

конверт детерминизма

capability
finance.npv
runtime_bundle
0.1.0 · 4d64142e…
platform
darwin-arm64
precision_mode
float64
thread_count
1
value
505.020148896933

computation_hashb74f67d0d7a594aa…

Идентично. Не похоже — идентично.

общий computation_hashb74f67d0d7a594aa7ac91f6291612452aa8ccdf603351ebc8d801a6fddd91bc8

Два языка, один поток байтов

TypeScriptcanonicalJson(result.value)

Pythoncanonical_json(result.value)

одинаковые байты на любом из языков505.020148896933

одни байты на входе → один sha256 на выходе → один сертификат

canonicalJson в TypeScript и canonical_json в Python по конструкции выдают одинаковые байты: −0 становится 0, ключи сортируются, экранирование unicode фиксировано. Совпадение хешей между языками — не удача, на которую остаётся надеяться, а контракт сериализации.

IIIМелкий шрифт

Детерминизм — в пределах заявленной области.

«Детерминизм» легко декларировать и трудно соблюдать. SQAI не утверждает, что результат будет идентичен на любой машине во вселенной. Система объявляет область выполнения, фиксирует её в конверте и гарантирует идентичность внутри этой области.

Фиксировать среду надёжнее, чем делать о ней заявления. Всё, что способно изменить число, либо закреплено, либо записано.

указывается в каждом результатеdeterministic_scope: "local_registered_source"

runtime_bundle_version
сборка движка, выполнившая запрос — сегодня 0.1.0, закреплена
runtime_bundle_sha256
хеш содержимого сборки — проверяется до любого выполнения
platform
где выполнялось — darwin-arm64 или linux-x64, записано, не предполагается
architecture
семейство CPU — зафиксировано по той же причине
precision_mode
float64 — единый числовой режим для каждой возможности
thread_count
1 — никаких гонок планировщика внутри арифметики
seed
опционально — требуется ровно 10 возможностями симуляции
input_hash
данные в том виде, в каком они существовали, — зафиксированы до выполнения

IVРазделение доменов провенанса

Три хеша, три вопроса.

Провенанс здесь — не строка в логе. Это три конструкции sha256, каждая отвечает на отдельный вопрос и вычисляется по каноническим байтам.

plan_hashf87610d8afeb…

Что будет выполнено.

Разрешённый план, хешированный до начала выполнения. Один и тот же вопрос разрешается в один и тот же план — decision_path: exact_spec — поэтому план, проверенный однажды, остаётся проверенным навсегда.

invocation_hash

Что было запрошено.

Идентификатор вызова — возможность плюс её канонизированные аргументы — под собственным префиксом с тегом версии. explainQuery выводит это как предварительный просмотр без выполнения; хеш выполненного вызова фиксируется независимо в момент запуска.

computation_hashb74f67d0d7a594aa…

Что было возвращено.

Включает invocation_hash перед каноническими байтами значения. Ответ криптографически связан со своим вопросом — этот хеш нельзя прикрепить к другому результату.

invocation_hash  = sha256("sqai:invocation:v1\0" + canonicalJson(identity))
computation_hash = sha256("sqai:computation:v1\0" + invocation_hash + canonicalJson(value))

Префиксы — это и есть суть. «sqai:invocation:v1» и «sqai:computation:v1» — непересекающиеся пространства байтов: вызов никогда не столкнётся с вычислением, а будущий v2 никогда не выдаст себя за v1. Разделение доменов делает хеши доказательством, а не украшением.

В основе всех трёх — сам интерфейс закреплён. Контракт возможностей, определяющий, что вообще может выполняться, поставляется со своим собственным хешем:contract_hash sha256:79f1c5a6c716…

Температура 0
— не детерминизм.

сэмплирование — не выполнение: модель здесь ничего не вычисляет

VСэмплирование vs выполнение

Модель выбирает токены. Движок вычисляет.

temperature: 0настройка декодирования

  • Жадное декодирование сужает выбор следующего токена. Число по-прежнему предсказывается, а не вычисляется.
  • Один и тот же вопрос может породить разный SQL — и разный ответ — без каких-либо признаков расхождения.
  • Ничего не фиксируется: ни среда выполнения, ни хеш входных данных — воспроизвести нечего.

computation_hashсвойство выполнения

  • Модель формирует типизированный план. Движок выполняет его — float64, один поток, закреплённый пакет.
  • Среда передаётся вместе с результатом, внутри конверта детерминизма.
  • Каждый ответ содержит computation_hash. Воспроизведение — это сравнение, а не предположение.
0/16 → 16/16
одна и та же модель на шестнадцати количественных вопросах — до и после того, как вычисления берёт на себя движокДвижок прошёл аудит: 2 744 проверки корректности, 0 несовпадений, максимальная числовая погрешность 1.8e-15.

VIГде детерминизм может нарушиться

Десять сидов. Один предохранитель.

seed_required

Десять из 4 574 доступных возможностей симулируют случайность. Без сида они не выполняются вовсе — вызов отклоняется до начала выполнения. С сидом воспроизводятся так же, как всё остальное. Никакой скрытой энтропии, никаких тихих исключений.

одна из десятиdistributions.sample_normal

schema_revision_mismatch

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

указывается для каждого источникаschema_revision

4 564 детерминированы по умолчанию · 10 детерминированы при наличии сида · 0 угадывают

VIIВопросы

Детерминированный AI — без обиняков.

Что такое детерминированный AI?

Система, чьи ответы воспроизводятся точно: одинаковый ввод — одинаковый вывод, доказуемо. SQAI реализует это конструктивно: вычисления выполняются на зафиксированном float64-рантайме, в одном потоке, и каждый результат несёт computation_hash, позволяющий воспроизвести его побайтово.

Что такое недетерминированный AI?

Система, чей вывод может различаться при идентичных запросах. Языковые модели сэмплируют токены, поэтому один и тот же вопрос может порождать разные рассуждения, разный SQL и разные числа — без какого-либо сигнала об изменении. Воспроизводимый хеш — противоядие от этого дрейфа.

Разве temperature 0 не делает LLM детерминированной?

Temperature лишь сужает выбор следующего токена. Модель по-прежнему предсказывает ваше число, а не вычисляет его, и ничего о прогоне не фиксируется и не воспроизводится. Детерминизм SQAI — свойство исполнения, а не декодирования: модель формирует типизированный план, а движок выполняет арифметику.

Как убедиться, что два прогона вернули одинаковый ответ?

Сравните computation_hash каждого результата. Это domain-separated sha256 по идентификатору вызова и каноническим байтам значения: совпадающие хеши означают побайтово идентичные ответы — пример finance.npv выводит b74f67d0… и в TypeScript, и в Python.

Как симуляции могут быть детерминированными?

За счёт отказа от скрытой случайности. Ровно 10 из 4 574 доступных возможностей SQAI симулируют случайность; вызванные без seed они отклоняются с seed_required, а с seed воспроизводятся точно так же, как любая другая возможность.

Что если данные изменились между первым прогоном и воспроизведением?

Воспроизведение завершается с явной ошибкой. Каждый зарегистрированный источник несёт ревизию схемы, и план, воспроизведённый против изменившихся данных, возвращает schema_revision_mismatch — структурированную ошибку, а не молчаливо другое число.