Producción de salidas estructuradas a partir de LLMs con muestreo restringido
Los modelos de lenguaje grandes (LLMs) han transformado la forma en que interactuamos con datos no estructurados, permitiendo sistemas que generan texto creativo, extraen conocimientos y automatizan tareas. Sin embargo, aunque estos modelos producen contenido de formato libre, a menudo se quedan cortos cuando la salida debe seguir formatos específicos, como JSON, XML o esquemas predefinidos. Esta limitación es fundamental para casos de uso del mundo real donde la precisión importa, como asistentes de codificación, agentes de toma de decisiones y sistemas de extracción de información estructurada.
En un reciente Unstructured Data Meetup en South Bay, Stefan Webb de Zilliz presentó una solución práctica a este desafío: muestreo restringido. En este artículo, exploraremos ideas clave de su charla, incluido el papel de la búsqueda semántica en el procesamiento de datos no estructurados, cómo las máquinas de estados finitos permiten una generación fiable y las implementaciones prácticas utilizando herramientas modernas. También examinaremos cómo estas técnicas se integran con bases de datos vectoriales para crear aplicaciones de IA robustas que manejan tanto el procesamiento de datos no estructurados como la generación de salidas estructuradas.
Qué es la búsqueda semántica y por qué es importante
La búsqueda semántica difiere de la búsqueda tradicional basada en palabras clave al centrarse en el significado y el contexto detrás de las consultas. En lugar de hacer coincidir palabras exactas, la búsqueda semántica procesa las relaciones entre términos para ofrecer resultados más relevantes. Esta capacidad es esencial en un mundo donde la mayoría de los datos no están estructurados, incluidos texto, imágenes, audio y videos. Así es como los datos no estructurados se convierten en conocimientos accionables.
Figura: Canalización para convertir datos no estructurados en conocimientos accionables
Esta canalización comienza ingiriendo datos sin procesar, incluidos documentos, imágenes, grabaciones de audio y videos. Los datos pasan por modelos de aprendizaje profundo que generan incrustaciones vectoriales, que son representaciones numéricas de alta dimensión de las propiedades semánticas de los datos. Estas incrustaciones se almacenan en bases de datos vectoriales como Milvus para una recuperación eficiente. Finalmente, los algoritmos de búsqueda semántica operan sobre estas incrustaciones para identificar y clasificar resultados según su relevancia. Ahora, veamos cómo se ve el espacio vectorial.
Figura: Visualización del espacio de incrustaciones agrupando conceptos similares
En la visualización de los espacios de incrustaciones, los conceptos similares se agrupan. Por ejemplo, frases como perro feliz moviendo la cola y un perro con una sonrisa se agrupan estrechamente porque transmiten significados similares. Por otro lado, temas no relacionados como un edificio grande se posicionan lejos en el espacio. Esta agrupación permite a los sistemas recuperar resultados semánticamente relevantes incluso cuando las consultas usan una redacción diferente.
La búsqueda semántica es cada vez más vital a medida que crece el volumen de datos no estructurados. Para 2025, se estima que más del 90% de los datos generados serán no estructurados, lo que subraya la necesidad de sistemas capaces de comprensión semántica.
Figura: Más del 90% de los datos recién generados en 2025 serán no estructurados.
Muestreo multinomial: la base de la generación de texto
La generación de texto en los LLMs funciona mediante el muestreo multinomial, un proceso que genera secuencias token por token basándose en probabilidades aprendidas a partir de datos de entrenamiento. Cada token podría representar una palabra, un carácter o una parte de una palabra, y el modelo selecciona el siguiente token mediante muestreo a partir de una distribución de probabilidad.
Figura: Muestreo multinomial básico de LLMs
El algoritmo comienza con una secuencia vacía y añade tokens iterativamente hasta que la secuencia está completa o se cumple una condición de parada. En cada paso, el modelo calcula probabilidades para todos los posibles tokens siguientes y muestrea uno basándose en estas probabilidades. Aunque este método destaca en la producción de texto de formato libre, carece de mecanismos para hacer cumplir reglas estructurales. Por ejemplo, generar JSON válido o código bien formado a menudo requiere posprocesamiento para corregir errores estructurales.
Esta limitación pone de relieve la necesidad del muestreo guiado, que incorpora restricciones en el proceso de generación para garantizar que las salidas se ajusten a estructuras predefinidas.
Muestreo guiado: hacer cumplir reglas estructurales durante la generación
El muestreo guiado mejora el proceso básico de muestreo multinomial aplicando restricciones que guían la generación. Estas restricciones se hacen cumplir mediante máscaras binarias, que filtran los tokens no válidos en cada paso. Las máscaras se adaptan dinámicamente según el contexto actual de la salida, garantizando que la secuencia generada siga siendo válida.
Figura: Salida estructurada mediante muestreo guiado
Por ejemplo, al generar JSON, el sistema podría restringir el siguiente token a un nombre de campo después de una llave de apertura {. De manera similar, en la generación de código, las restricciones podrían hacer cumplir la sintaxis adecuada bloqueando caracteres no válidos o sentencias incompletas. Este enfoque elimina la necesidad de una validación o corrección extensas después de la generación, lo que lo hace particularmente útil para aplicaciones como la extracción de información y agentes de toma de decisiones.
Al introducir estructura directamente en el proceso de generación, el muestreo guiado cierra la brecha entre las capacidades creativas de los LLMs y la precisión requerida para salidas estructuradas. Este método es la base para implementar máquinas de estados finitos (FSMs) en la generación de texto.
Máquinas de estados finitos: hacer cumplir la coherencia estructural
Las máquinas de estados finitos (FSMs) llevan el concepto de muestreo guiado más allá al proporcionar un marco formal para hacer cumplir restricciones. Una FSM es un modelo computacional con un número finito de estados y transiciones entre ellos. Cada estado representa un punto en el proceso de generación de la salida, y las transiciones definen rutas válidas basadas en el contexto actual. Al integrar FSMs en la canalización de generación, se vuelve posible hacer cumplir dinámicamente reglas estructurales estrictas.
En una FSM, los estados están predefinidos, y cada uno representa una condición o etapa específica en el proceso de generación. Las transiciones entre estados ocurren basándose en la entrada o el token que se está generando. Al definir transiciones permitidas, las FSMs guían dinámicamente al modelo para producir salidas que se ajusten a una estructura determinada.
Por ejemplo, una FSM que genera JSON podría incluir estados para abrir un corchete, escribir una clave, escribir un valor y cerrar el corchete. La FSM garantiza que las transiciones ocurran en una secuencia lógica, como no cerrar un corchete antes de escribir un valor. Esto garantiza la integridad estructural de la salida sin requerir posprocesamiento.
Las FSM son particularmente valiosas en aplicaciones como la extracción de datos estructurados, la generación de código y el formateo de respuestas. Al precomputar las transiciones válidas para cada estado, las FSM pueden implementarse de manera eficiente, minimizando la sobrecarga en tiempo de ejecución. Esta eficiencia, junto con la aplicación de restricciones en tiempo real, permite que las FSM generen salidas que sean tanto válidas como contextualmente precisas.
Ejemplo: Generación de números válidos
Para ilustrar la generación guiada por FSM, veamos un ejemplo práctico donde la tarea consiste en generar un número válido. Las reglas especifican que el número debe contener solo dígitos y, opcionalmente, un único punto decimal.
Figura: FSM de generación de números válidos
La FSM comienza en State 0, donde los tokens válidos incluyen cualquier dígito o un punto decimal. Si el sistema genera un dígito, como 1, transiciona a State 1. Desde este estado, se permiten dígitos adicionales, o la FSM puede transicionar a State 2 si se genera un punto decimal. En State 2, solo los dígitos son válidos, ya que múltiples puntos decimales violarían las reglas. La FSM ajusta dinámicamente su estado y los tokens válidos según la secuencia generada, asegurando que la salida se adhiera al formato especificado.
Este ejemplo destaca cómo las FSM aplican restricciones en tiempo real. Al definir los estados y las transiciones para una tarea determinada, podemos crear sistemas robustos capaces de generar salidas estructuradas sin requerir posprocesamiento ni validación manual.
Combinación del muestreo guiado con bases de datos vectoriales
El muestreo guiado alcanza todo su potencial cuando se combina con bases de datos vectoriales. Estas bases de datos especializadas, como Milvus, están diseñadas para almacenar, gestionar y recuperar embeddings vectoriales de alta dimensionalidad de manera eficiente. Juntos, el muestreo guiado y las bases de datos vectoriales crean un marco potente para manejar datos no estructurados mientras producen salidas semánticamente relevantes y estructuralmente precisas. Exploremos cómo estos dos componentes trabajan juntos para mejorar las aplicaciones de IA.
Bases de datos vectoriales como columna vertebral semántica
Las bases de datos vectoriales sirven como la capa fundamental en aplicaciones que implican búsquedas semánticas. Los embeddings generados por modelos de aprendizaje profundo se almacenan en un espacio de alta dimensionalidad dentro de la base de datos vectorial, donde las distancias entre puntos significan sus relaciones semánticas, como vimos anteriormente.
Cuando un usuario realiza una consulta, esta se transforma en un embedding usando el mismo modelo que creó los embeddings de la base de datos. Luego, la base de datos realiza una búsqueda por similitud para encontrar los embeddings más relevantes para la consulta. Este proceso de recuperación permite que los sistemas proporcionen resultados contextualmente significativos, incluso cuando la consulta no utiliza palabras clave exactas.
Añadir estructura con muestreo guiado
Mientras que las bases de datos vectoriales recuperan información semánticamente relevante, el muestreo guiado asegura que la salida se adhiera a formatos o restricciones específicos. Después de recuperar los embeddings relevantes, se pasan como entrada a un modelo de lenguaje grande (LLM). Sin muestreo guiado, el LLM podría generar respuestas que se desvíen de la estructura requerida, como JSON mal formateado o XML inválido. El muestreo guiado aborda este problema aplicando reglas dinámicamente durante el proceso de selección de tokens.
Aplicaciones reales de esta integración
La combinación de bases de datos vectoriales y muestreo guiado tiene amplias aplicaciones en diversas industrias:
Asistentes de codificación: Cuando un desarrollador consulta a un asistente de codificación impulsado por IA, el sistema recupera fragmentos de código relevantes o embeddings de documentación. El muestreo guiado garantiza que el código generado se adhiera a la sintaxis y el formato correctos, reduciendo la necesidad de corrección manual.
Sistemas de extracción de información: Estos sistemas analizan grandes conjuntos de datos, extrayendo información estructurada como nombres, fechas o ubicaciones. Las bases de datos vectoriales recuperan segmentos relevantes de datos, mientras que el muestreo guiado formatea la salida en esquemas predefinidos como JSON.
Chatbots para dominios especializados: En dominios de salud o legales, por ejemplo, los chatbots recuperan estudios de caso o documentos semánticamente similares. El muestreo guiado garantiza que las respuestas generadas cumplan con estrictos estándares de formato legales o médicos.
Herramientas para implementar muestreo restringido: Outlines y BAML
Varias herramientas simplifican la implementación de técnicas de muestreo restringido. La biblioteca Outlines, por ejemplo, proporciona un framework basado en Python para definir restricciones y generar salidas estructuradas. Permite a los desarrolladores aplicar reglas como esquemas JSON o patrones regex directamente durante la generación de texto. De manera similar, BAML ofrece un lenguaje específico de dominio para escribir y probar aplicaciones basadas en LLM, agilizando el proceso de definir restricciones y validar salidas.
Veamos cómo podemos usar la biblioteca Outlines para aplicar muestreo restringido:
Comienza instalando las bibliotecas requeridas:
pip install outlines transformers datasets
La biblioteca outlines nos permitirá generar salidas estructuradas. La biblioteca transformers nos permitirá cargar modelos preentrenados . La biblioteca datasets es una dependencia de la biblioteca outlines.
Con el entorno listo, empecemos a programar.
import outlines
import transformers
# Load the model
model = outlines.models.transformers("gpt2-medium")
# For text generation
generator = outlines.generate.text(model)
# Example 1: Basic Continuation
prompt = "Is 1+1=2? "
result = generator(prompt, max_tokens=30)
print("Unguided output:", result)
# Example 2: Structured Generation with Regex
guided_output = outlines.generate.regex(model, r"([Yy]es|[Nn]o|[Nn]ever|[Aa]lways)")(
prompt, max_tokens=30
)
print("Guided output:", guided_output)
# Example 3: Numerical Regex Constraint
prompt = "In what year was Noam Chomsky born?n"
guided_output_year = outlines.generate.regex(model, r"19[0-9]{2}")(
prompt, max_tokens=30
)
print("Guided output (year):", guided_output_year)
En el código anterior, comenzamos importando las bibliotecas que instalamos, luego cargamos el modelo GPT-2 medium para generar texto. Inicialmente, generamos una respuesta no guiada al prompt Is 1+1=2? que muestra la generación básica de texto. A continuación, usamos una regex para guiar al modelo a producir solo respuestas como Yes, No, Never o Always, asegurando que las salidas se ajusten a formatos de respuesta específicos. Finalmente, implementamos una restricción regex r"19[0-9]{2}" para extraer un año de cuatro dígitos, apuntando al año de nacimiento de Noam Chomsky. Aquí hay una salida de muestra:
Figura: Salida del muestreo restringido usando la biblioteca Outlines
Esto demuestra la capacidad del modelo tanto para la generación de texto de forma libre como estructurada, adaptada a tareas específicas de extracción de información.
Conclusión
Stefan hizo un gran trabajo mostrándonos cómo el muestreo restringido y las FSM representan avances significativos para hacer que los modelos de lenguaje grandes sean más fiables para aplicaciones del mundo real. Al imponer consistencia estructural y aprovechar herramientas como Outlines y bases de datos vectoriales, ahora podemos construir sistemas que combinan flexibilidad con precisión. A medida que el campo evoluciona, estas técnicas desempeñarán un papel fundamental para cerrar la brecha entre el procesamiento de datos no estructurados y la generación de salidas estructuradas, desbloqueando nuevas posibilidades para aplicaciones impulsadas por IA.
Para más información, mira la charla de Stefan en YouTube.
Sigue leyendo

A Developer's Guide to Exploring Milvus 2.6 Features on Zilliz Cloud
Milvus 2.6 marks a shift from “vector search + glue code” to a more advanced retrieval engine, and it is now Generally Available (GA) on Zilliz Cloud (a managed Milvus service).

Creating Collections in Zilliz Cloud Just Got Way Easier
We've enhanced the entire collection creation experience to bring advanced capabilities directly into the interface, making it faster and easier to build production-ready schemas without switching tools.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.


