Determinismo, per costruzione

AI deterministica,
per costruzione.

Poni la stessa domanda a un modello due volte e puoi ottenere due risposte diverse. Questo è l'AI non deterministico — accettabile per la prosa, fatale per i numeri. SQAI sottrae il numero al modello: ogni calcolo gira su un runtime float64 fissato, single-threaded, e stampa l'hash che lo riproduce esattamente.

IIIl replay

Due certificati, a mesi di distanza.

Un calcolo — finance.npv a un tasso di sconto del 10% su cinque flussi di cassa — eseguito una volta, poi riprodotto mesi dopo. Il determinismo come promessa chiede fiducia. Come hash, chiede un confronto.

Run 001prima esecuzione

envelope di determinismo

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

computation_hashb74f67d0d7a594aa…

Run 002mesi dopo

envelope di determinismo

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

computation_hashb74f67d0d7a594aa…

Identici. Non simili — identici.

computation_hash condivisob74f67d0d7a594aa7ac91f6291612452aa8ccdf603351ebc8d801a6fddd91bc8

Due linguaggi, un unico flusso di byte

TypeScriptcanonicalJson(result.value)

Pythoncanonical_json(result.value)

byte identici, in entrambi i linguaggi505.020148896933

stessi byte in entrata → stesso sha256 in uscita → lo stesso certificato

canonicalJson in TypeScript e canonical_json in Python emettono gli stessi byte per costruzione: −0 diventa 0, le chiavi sono ordinate, l'escape unicode è fisso. L'uguaglianza degli hash tra linguaggi non è una coincidenza da sperare — è un contratto di serializzazione.

IIILa clausola fine

Deterministico — nell'ambito dichiarato.

"Deterministico" è facile da scrivere e difficile da mantenere. SQAI non afferma che il risultato sia identico su ogni macchina dell'universo. Dichiara un ambito di esecuzione, lo registra nell'envelope e garantisce l'identità al suo interno.

Registrare l'ambiente vale più che sopravvalutarlo. Tutto ciò che potrebbe alterare il numero è o fissato o documentato.

dichiarato su ogni risultatodeterministic_scope: "local_registered_source"

runtime_bundle_version
la build del motore utilizzata — oggi 0.1.0, fissata
runtime_bundle_sha256
l'hash del contenuto della build — verificato prima di qualsiasi esecuzione
platform
dove ha girato — darwin-arm64 o linux-x64, registrato, mai assunto
architecture
la famiglia di CPU, documentata per la stessa ragione
precision_mode
float64 — un unico regime numerico per ogni capability
thread_count
1 — nessuna race di scheduling all'interno dell'aritmetica
seed
opzionale — richiesto da esattamente 10 capability di simulazione
input_hash
i dati così come erano, marcati prima dell'esecuzione

IVProvenienza a domini separati

Tre hash, tre domande.

La provenienza qui non è una riga di log. Sono tre costruzioni sha256, ciascuna risponde a una domanda diversa, ciascuna calcolata su byte canonici.

plan_hashf87610d8afeb…

Cosa verrà eseguito.

Il piano risolto, sottoposto a hash prima che qualsiasi cosa venga eseguita. La stessa domanda produce lo stesso piano — decision_path: exact_spec — quindi un piano revisionato una volta è revisionato per sempre.

invocation_hash

Cosa è stato richiesto.

L'identità della chiamata — la capability con i suoi argomenti canonicalizzati — dietro il proprio prefisso con versione. explainQuery lo stampa come anteprima dry-run; l'hash eseguito viene marcato indipendentemente a runtime.

computation_hashb74f67d0d7a594aa…

Cosa è tornato.

Incorpora l'invocation_hash prima dei byte canonici del valore. La risposta è crittograficamente concatenata alla sua domanda — questo hash non può essere applicato a un risultato diverso.

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

I prefissi sono il punto. "sqai:invocation:v1" e "sqai:computation:v1" sono universi di byte disgiunti: un'invocazione non può mai collidere con una computation, e una futura v2 non può mai impersonare la v1. La separazione dei domini rende gli hash prove, non decorazioni.

Sotto tutti e tre, la superficie stessa è fissata. Il contratto di capability che definisce cosa può essere eseguito viene distribuito con un proprio hash:contract_hash sha256:79f1c5a6c716…

Temperatura 0
non è determinismo.

il campionamento non è esecuzione — il modello non calcola qui

VCampionamento vs esecuzione

Il modello sceglie i token. Il motore calcola.

temperature: 0un'impostazione di decodifica

  • La decodifica greedy restringe quale token viene dopo. Il numero è ancora predetto, non calcolato.
  • La stessa domanda può comunque produrre SQL diverso — e una risposta diversa — senza nulla che lo segnali.
  • Nulla viene registrato: nessun runtime, nessun hash dell'input, nulla da riprodurre.

computation_hashuna proprietà di esecuzione

  • Il modello deposita un piano tipizzato. Il motore lo esegue — float64, un thread, bundle fissato.
  • L'ambiente viaggia con il risultato, all'interno dell'envelope di determinismo.
  • Ogni risposta stampa un computation_hash. Il replay è un confronto, non un'argomentazione.
0/16 → 16/16
lo stesso modello su sedici domande quantitative — prima e dopo che il motore esegue il calcoloIl motore stesso è verificato: 2.744 controlli di correttezza, 0 discrepanze, errore numerico massimo 1,8e-15.

VIDove il determinismo potrebbe cedere

Dieci seed. Un tripwire.

seed_required

Dieci delle 4.574 capability esposte simulano casualità. Senza seed, non vengono eseguite affatto — la chiamata viene rifiutata prima dell'esecuzione. Con seed, si riproducono come tutto il resto. Nessuna entropia nascosta, nessuna eccezione silenziosa.

una delle diecidistributions.sample_normal

schema_revision_mismatch

Ogni sorgente registrata porta una revisione dello schema. Riprodurre un piano su dati che sono cambiati e il motore rifiuta con un errore strutturato — non un numero silenziosamente diverso che nulla segnalerebbe mai.

dichiarato su ogni sorgenteschema_revision

4.564 deterministiche di default · 10 deterministiche una volta con seed · 0 che indovinano

VIIDomande

AI deterministica, spiegata chiaramente.

Cos'è l'AI deterministica?

Un sistema le cui risposte si riproducono esattamente: stesso input, stesso output, in modo dimostrabile. SQAI lo implementa per costruzione — i calcoli vengono eseguiti su un runtime float64 fissato, single-threaded, e ogni risultato porta un computation_hash che lo riproduce byte per byte.

Cos'è l'AI non deterministica?

Un sistema il cui output può variare tra richieste identiche. I modelli linguistici campionano token, quindi la stessa domanda può produrre ragionamenti diversi, SQL diverso e numeri diversi — senza alcun segnale che qualcosa sia cambiato. Un hash riproducibile è l'antidoto a questa deriva.

Temperature 0 non rende deterministico un LLM?

La temperatura restringe solo il modo in cui viene scelto il token successivo. Il modello sta ancora prevedendo il tuo numero anziché calcolarlo, e nulla dell'esecuzione viene registrato o riprodotto. Il determinismo di SQAI è una proprietà dell'esecuzione, non della decodifica: il modello deposita un piano tipizzato e il motore esegue l'aritmetica.

Come verifico che due esecuzioni abbiano restituito la stessa risposta?

Confronta il computation_hash di ciascun risultato. È un sha256 con separazione di dominio sull'identità dell'invocazione e sui byte canonici del valore: hash corrispondenti significano risposte byte-identiche — l'esempio finance.npv stampa b74f67d0… sia in TypeScript che in Python.

Come possono essere deterministiche le simulazioni?

Rifiutando di essere casuali in segreto. Esattamente 10 delle 4.574 capability esposte di SQAI simulano la casualità; chiamate senza seed vengono rifiutate con seed_required, e con un seed si riproducono esattamente come qualsiasi altra capability.

E se i dati fossero cambiati tra la prima esecuzione e la riproduzione?

La riproduzione fallisce in modo esplicito. Ogni sorgente registrata porta una revisione dello schema, e un piano riprodotto su dati modificati restituisce schema_revision_mismatch — un errore strutturato, mai un numero silenziosamente diverso.