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-decodingSalta 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
-infa 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¶
theory/00-motivation.md— por qué la salida en formato libre es fundamentalmente poco fiable para tooling downstream, y qué nos compra el enmascarado.theory/01-jsonmode-vs-grammar.md— el espectro desde "pedirlo amablemente" hasta "JSON mode" hasta "grammar GBNF"; qué cede cada uno.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.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.lab/00-regex-mask.md— calentamiento: enmascarar una sola regex (solo dígitos, longitud fija).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).lab/02-end-to-end-conjugate.md— cablear máscara + MiniGPT + sampler enscripts/conjugate_structured.py. (El archivolab/02-end-to-end-audit.mdes el stub reemplazado de §A1; ver su contenido para el puntero.)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.pyse ejecuta end-to-end.- Coste por paso documentado (objetivo: < 2× respecto a la decodificación no restringida).
src/ministruct/{mask,dfa,schemas}.pyimplementado, 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.mdsin 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.
- 📄 Efficient Guided Generation for LLMs (Outlines) — Willard & Louf · 2023. decodificación restringida como máquina de estados finitos.