Determinismo, por construcción

IA determinista,
por construcción.

Haz la misma pregunta a un modelo dos veces y puedes obtener dos respuestas. Eso es IA no determinista — válida para prosa, fatal para números. SQAI aparta el número del modelo: cada cómputo corre en un runtime float64 fijado, monohilo, e imprime el hash que lo reproduce exactamente.

IIEl replay

Dos certificados, meses después.

Un cómputo — finance.npv a una tasa de descuento del 10% sobre cinco flujos de caja — ejecutado una vez y reproducido meses después. El determinismo como promesa pide tu confianza. Como hash, pide una comparación.

Ejecución 001primera ejecución

envolvente de determinismo

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

computation_hashb74f67d0d7a594aa…

Ejecución 002meses después

envolvente de determinismo

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

computation_hashb74f67d0d7a594aa…

Idéntico. No similar — idéntico.

computation_hash compartidob74f67d0d7a594aa7ac91f6291612452aa8ccdf603351ebc8d801a6fddd91bc8

Dos lenguajes, un flujo de bytes

TypeScriptcanonicalJson(result.value)

Pythoncanonical_json(result.value)

bytes idénticos, en cualquier lenguaje505.020148896933

mismos bytes de entrada → mismo sha256 de salida → el mismo certificado

canonicalJson en TypeScript y canonical_json en Python emiten los mismos bytes por construcción: −0 se convierte en 0, las claves se ordenan, el escapado unicode es fijo. La igualdad de hash entre lenguajes no es una coincidencia que esperar — es un contrato de serialización.

IIILa letra pequeña

Determinista — dentro del ámbito declarado.

"Determinista" es fácil de proclamar y difícil de cumplir. SQAI no afirma que su resultado sea idéntico en todas las máquinas del universo. Declara un ámbito de ejecución, lo registra en la envolvente y garantiza identidad dentro de él.

Registrar el entorno es mejor que exagerarlo. Todo lo que pudiera alterar el número está fijado o documentado.

declarado en cada resultadodeterministic_scope: "local_registered_source"

runtime_bundle_version
la versión del motor que ejecutó — 0.1.0 hoy, fijada
runtime_bundle_sha256
el hash de contenido de la versión — verificado antes de cualquier ejecución
platform
dónde ejecutó — darwin-arm64 o linux-x64, registrado, nunca asumido
architecture
la familia de CPU, documentada por la misma razón
precision_mode
float64 — un único régimen numérico para cada capacidad
thread_count
1 — sin carreras de planificación en la aritmética
seed
opcional — requerido por exactamente 10 capacidades de simulación
input_hash
los datos tal como estaban, sellados antes de la ejecución

IVProcedencia con separación de dominio

Tres hashes, tres preguntas.

La procedencia aquí no es una línea de registro. Son tres construcciones sha256, cada una respondiendo una pregunta distinta, cada una calculada sobre bytes canónicos.

plan_hashf87610d8afeb…

Qué ejecutará.

El plan resuelto, hasheado antes de que nada ejecute. La misma pregunta resuelve al mismo plan — decision_path: exact_spec — de modo que un plan revisado una vez queda revisado para siempre.

invocation_hash

Qué se solicitó.

La identidad de la llamada — la capacidad más sus argumentos canonicalizados — bajo su propio prefijo versionado. explainQuery lo imprime como vista previa en seco; el hash ejecutado se sella de forma independiente en tiempo de ejecución.

computation_hashb74f67d0d7a594aa…

Qué se devolvió.

Incorpora el invocation_hash antes de los bytes canónicos del valor. La respuesta está encadenada criptográficamente a su pregunta — este hash no puede adjuntarse a un resultado diferente.

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

Los prefijos son el punto central. "sqai:invocation:v1" y "sqai:computation:v1" son universos de bytes disjuntos: una invocación nunca puede colisionar con una computación, y un futuro v2 nunca puede suplantar a v1. La separación de dominio convierte los hashes en evidencia, no en decoración.

Bajo los tres, la superficie misma está fijada. El contrato de capacidades que define qué puede ejecutar en absoluto se distribuye con su propio hash:contract_hash sha256:79f1c5a6c716…

Temperatura 0
no es determinismo.

el muestreo no es ejecución — el modelo nunca computa aquí

VMuestreo vs. ejecución

El modelo elige tokens. El motor computa.

temperature: 0un parámetro de decodificación

  • La decodificación voraz acota qué token sigue. El número sigue siendo predicho, no calculado.
  • La misma pregunta puede producir SQL diferente — y una respuesta diferente — sin nada que lo señale.
  • Nada queda registrado: ni el entorno, ni el hash de entrada, nada que reproducir.

computation_hashuna propiedad de ejecución

  • El modelo presenta un plan tipado. El motor lo ejecuta — float64, un hilo, bundle fijado.
  • El entorno viaja con el resultado, dentro de la envolvente de determinismo.
  • Cada respuesta imprime un computation_hash. La reproducción es una comparación, no un argumento.
0/16 → 16/16
el mismo modelo sobre dieciséis preguntas cuantitativas — antes y después de que el motor realice el cálculoEl motor en sí está auditado: 2.744 verificaciones de corrección, 0 discrepancias, error numérico máximo 1,8e-15.

VIDónde podría romperse el determinismo

Diez semillas. Un disparador.

seed_required

Diez de las 4.574 capacidades expuestas simulan aleatoriedad. Sin semilla, no ejecutan en absoluto — la llamada se rechaza antes de la ejecución. Con semilla, se reproducen como todo lo demás. Sin entropía oculta, sin excepciones silenciosas.

una de las diezdistributions.sample_normal

schema_revision_mismatch

Cada fuente registrada lleva una revisión de esquema. Reproduzca un plan contra datos que han cambiado y el motor rechaza con un error estructurado — no un número silenciosamente distinto que nada detectaría jamás.

declarado en cada fuenteschema_revision

4.564 deterministas tal cual · 10 deterministas una vez sembradas · 0 que especulan

VIIPreguntas

IA determinista, explicada sin rodeos.

¿Qué es la IA determinista?

Un sistema cuyas respuestas se reproducen con exactitud: misma entrada, misma salida, de forma demostrable. SQAI lo implementa por construcción — los cálculos se ejecutan en un runtime float64 fijado, monohilo, y cada resultado lleva un computation_hash que lo reproduce byte a byte.

¿Qué es la IA no determinista?

Un sistema cuya salida puede variar entre solicitudes idénticas. Los modelos de lenguaje muestrean tokens, de modo que la misma pregunta puede producir razonamientos distintos, SQL distinto y números distintos — sin ninguna señal de que algo cambió. Un hash reproducible es el antídoto a esa deriva.

¿No hace determinista a un LLM la temperatura 0?

La temperatura solo acota cómo se elige el siguiente token. El modelo sigue prediciendo tu número en lugar de calcularlo, y nada de la ejecución queda registrado ni es reproducible. El determinismo de SQAI es una propiedad de la ejecución, no de la decodificación: el modelo presenta un plan tipado y el motor realiza la aritmética.

¿Cómo verifico que dos ejecuciones devolvieron realmente la misma respuesta?

Compara el computation_hash de cada resultado. Es un sha256 con separación de dominio sobre la identidad de la invocación y los bytes canónicos del valor, de modo que hashes coincidentes implican respuestas byte a byte idénticas — el ejemplo finance.npv imprime b74f67d0… tanto en TypeScript como en Python.

¿Cómo pueden ser deterministas las simulaciones?

Negándose a ser aleatorias en secreto. Exactamente 10 de las 4.574 capacidades expuestas de SQAI simulan aleatoriedad; invocadas sin semilla se rechazan con seed_required, y con semilla se reproducen exactamente igual que cualquier otra capacidad.

¿Qué ocurre si los datos cambiaron entre la primera ejecución y la reproducción?

La reproducción falla de forma explícita. Cada fuente registrada lleva una revisión de esquema, y un plan reproducido contra datos modificados devuelve schema_revision_mismatch — un error estructurado, nunca un número silenciosamente distinto.