Bash es una de las interfaces más flexibles y potentes disponibles para agentes de inteligencia artificial. En sistemas adecuados, un modelo que genera grep, curl, tar o tuberías de shell produce acciones ejecutables que pueden leer archivos, modificar el espacio de trabajo, abrir conexiones de red y encadenar herramientas. Para el equipo de IA de NVIDIA, esto convierte la generación de comandos en un objetivo de investigación útil.
Si se puede guiar a modelos de lenguaje más pequeños hacia estructuras de comando válidas y conscientes de políticas, estos se convierten en componentes más fiables para flujos de trabajo que pueden desplegarse en una gama más amplia de entornos. La decodificación restringida es una técnica que modifica el proceso de muestreo en la generación de modelos de lenguaje autorregresivos. En cada paso de generación, el modelo produce logits como de costumbre, pero antes de seleccionar un token, se aplica una gramática para cambiar la distribución, bloqueando efectivamente ciertos tokens.
Mejora en la generación de Bash
Por ejemplo, PICARD utilizó esta técnica para mejorar la generación de SQL. El equipo de IA de NVIDIA aplicó el mismo concepto a Bash para mejorar la capacidad de modelos pequeños de lograr tareas en la línea de comandos.
Este artículo describe un pipeline experimental para generar gramáticas de comandos de Bash y aplicarlas durante la decodificación. Se evaluaron 13 modelos pequeños de lenguaje en 299 tareas, mejorando la tasa de éxito promedio del 62.5% al 75.2%. El resultado más destacado fue en Qwen3-0.6B, donde la tasa de éxito aumentó del 16.7% al 59.2%.
Generación de gramáticas
Crear a mano una gramática para cada comando es frágil. Los comandos de Bash tienen muchas banderas, alias, valores opcionales, argumentos posicionales y variaciones de sintaxis. En su lugar, grammargen transforma evidencia de comandos estructurados en gramáticas Lark.
La representación intermedia captura los elementos necesarios para la decodificación restringida, como:
- Nombres de comandos y alias.
- Banderas cortas y largas booleanas.
- Banderas valoradas, como
-A 3o--max-count=10. - Argumentos posicionales como rutas, patrones, palabras e enteros.
- Repetición limitada para mantener el estado de decodificación finito.
Por ejemplo, una gramática generada para grep incluye una regla de inicio a nivel de comando, una repetición de opciones limitada, combinaciones de banderas cortas y alternativas de banderas largas, valores tipados y terminales compartidos.
Aplicando gramáticas durante la decodificación
Estas gramáticas pueden aplicarse a la inferencia de llama.cpp a través de llguidance. Nuestra evaluación se centró en comparar el rendimiento del modelo nativo con un modo de “reintento restringido” que utilizaba decodificación restringida, y luego comprobaba la salida con tree-sitter-bash antes de ejecutar.
Si tree-sitter lanzaba un error, pasábamos el error como contexto al modo nativo para poder tener al menos un rendimiento a nivel nativo. De esta forma, podíamos mejorar el rendimiento del modelo mientras solo ejecutábamos un comando en el entorno de prueba.
Implicaciones de seguridad
La decodificación restringida cambia la distribución de probabilidad de la salida del modelo antes de la ejecución. Esto la hace útil, pero solo como una capa en un sistema de control de IA agentiva. Las propiedades de seguridad interesantes son:
- Confiabilidad como propiedad de seguridad. Restringir la superficie de acción puede disminuir la incertidumbre en el espacio de acciones.
- Política codificada como sintaxis. Las gramáticas pueden prohibir o requerir formas y argumentos, como excluir banderas inseguras o requerir tiempos de espera.
Recomendamos que los equipos que experimentan con generación restringida de gramáticas comiencen con un benchmark estrecho, validen las gramáticas estructural y comportamentalmente, y registren regresiones, no solo mejoras. Un comando sintácticamente válido puede seguir siendo semánticamente incorrecto o operacionalmente inseguro.


