Skip to content

English · Español

Fase 30 — Generación estructurada (structured generation) y constrained decoding

Requiere: 21 — Internals de inferencia y sampling · 29 — Retrieval-Augmented Generation (RAG) Enseña: structured-generation · json-mode · logit-masking · grammar-constrained-decoding Salta a cualquier capítulo desde el índice de referencia de fases.

Mapa del capítulo

Pre-escrita según §A12. Esta entrada de fase existe antes de que Borja empiece a estudiar. La teoría y los enunciados de los laboratorios son borradores estables; las soluciones se escriben justo a tiempo al abrir la fase.

Las palabras "JSON mode" son marketing; la mecánica subyacente es enmascarar logits. En cada paso, ponemos -inf a los tokens que romperían el esquema y dejamos al softmax repartir la masa entre los legales. Eso es todo.


Objetivo

Hacer que MiniGPT emita JSON válido y conforme al esquema siempre, restringiendo la distribución por paso de tokens a un conjunto precomputado de tokens legales como siguiente paso. La fase termina con una CLI que toma una frase en inglés y emite la tripla canónica de conjugación {verb, tense, person} — el contrato que consumirán las fases 31 (herramientas), 32 (agente) y 33 (serving).

Esta fase introduce el nuevo módulo src/ministruct/ — la primitiva de generación estructurada (structured generation) que usará cada fase posterior.

Orden de lectura

  1. theory/00-motivation.md — por qué la salida en formato libre es fundamentalmente poco fiable para tooling downstream, y qué nos compra el enmascarado.
  2. theory/01-jsonmode-vs-grammar.md — el espectro desde "pedirlo amablemente" hasta "JSON mode" hasta "grammar GBNF"; qué cede cada uno.
  3. theory/02-logit-masks.md — la derivación: muestreo restringido = muestreo no restringido con una máscara de -inf. Matemáticas, KL, composición con perillas de muestreo.
  4. theory/03-grammar-as-dfa.md — las implementaciones de producción precompilan el grammar en un autómata; derivamos por qué y describimos la estructura para el esquema de conjugación.
  5. lab/00-regex-mask.md — calentamiento: enmascarar una sola regex (solo dígitos, longitud fija).
  6. lab/01-json-schema-mask.md — escalada al JSON Schema de conjugación (verb ∈ enum-of-20, tense ∈ enum-of-5, person ∈ enum-of-3).
  7. lab/02-end-to-end-conjugate.md — cablear máscara + MiniGPT + sampler en scripts/conjugate_structured.py. (El archivo lab/02-end-to-end-audit.md es el stub reemplazado de §A1; ver su contenido para el puntero.)
  8. lab/03-mask-overhead.md — medir el coste de enmascarar por paso.

solutions/ está vacío durante la pre-escritura — se rellena al abrir la fase, cuando ya es visible la API del sampler de la Fase 21 de Borja.

Definition of Done

Ver PHASE_30_PLAN.md §6. Brevemente:

  • 100% de tasa de parseo sobre el conjunto eval probe de conjugación de §A13.
  • scripts/conjugate_structured.py se ejecuta end-to-end.
  • Coste por paso documentado (objetivo: < 2× respecto a la decodificación no restringida).
  • src/ministruct/{mask,dfa,schemas}.py implementado, tipado, testeado.

Lo que esta fase intencionadamente NO cubre

  • Constrained beam search. La interacción beam × máscara se menciona, no se implementa.
  • Parser de grammar GBNF. Describimos el formato; no escribimos un parser. (llama.cpp tiene uno; leer su código fuente es un objetivo de ampliación, no un requisito de DoD.)
  • Precompilación de grammar consciente del tokenizer a través de tokenizers arbitrarios. La versión de producción de Outlines lo hace; explicamos el algoritmo en theory/03-grammar-as-dfa.md sin codificar el caso general. Nuestro FSM apunta solo al vocabulario BPE de §A13.
  • Enmascarado de token parcial (mid-BPE). Solo máscara por token.
  • Máscaras en streaming bajo SSE / WebSocket. Eso es asunto de la Fase 33 (serving). La máscara de la Fase 30 es por compleción.
  • Restricciones sobre los esquemas de argumentos de llamada a herramientas. Eso es territorio de la Fase 31; el mecanismo es idéntico, así que lo apuntamos y seguimos.
  • Corrección de la conjugación en sí. La Fase 30 garantiza la forma de la salida. Si "verb": "goed" es la respuesta correcta para "He went home" es un asunto de la Fase 32 (agente) y de la Fase 20 (eval), no de la Fase 30.

El alcance de la Fase 30 es: enmascarado de logits, salida JSON restringida por esquema, CLI de conjugación end-to-end, el módulo src/ministruct/. Nada más.

Lecturas recomendadas

Opcional — enriquece pero no es necesario para aprobar la fase.