Salida estructurada
Impón la salida del agente según el esquema proporcionado.
Hay muchos casos de uso en los que necesitamos que los agentes entiendan el lenguaje natural, pero produzcan una formato estructurado. Un caso de uso común es extraer datos de texto para insertarlos en una base de datos o usarlos con algún otro sistema posterior. Esta guía cubre cómo Neuron permite imponer salidas estructuradas desde el agente.

Cómo usar la salida estructurada
El concepto central es que la estructura de salida de las respuestas del LLM necesita representarse de alguna manera. El esquema contra el que Neuron valida se define mediante anotaciones de tipos de PHP. Básicamente, tienes que definir una clase con propiedades estrictamente tipadas:
Neuron genera el esquema JSON correspondiente a partir del objeto PHP para instruir al modelo subyacente sobre el formato de datos que necesitas. Luego, el agente analiza la salida del LLM para extraer los datos y devuelve una instancia del objeto rellenada con los valores adecuados:
Clase de salida predeterminada
También puedes encapsular el formato de salida dentro de la implementación del Agente, de modo que sea el formato de salida estándar del Agente. Siempre necesitas llamar al structured() método para exigir una salida estricta.
Controlar la generación de salida
Neuron requiere que definas dos capas de reglas para crear la clase de salida estructurada.
La primera es el SchemaProperty atributo que te permite controlar el esquema JSON enviado al LLM para entender el formato de datos requerido.
La segunda capa es la validación. Los atributos de validación garantizarán que los datos obtenidos de la respuesta del LLM sean coherentes con tus requisitos.

SchemaProperty
El SchemaProperty atributo te permite definir los parámetros del esquema JSON de cada propiedad:
Clase anidada
Puedes construir estructuras de salida complejas usando otros objetos PHP como tipo de propiedad. Siguiendo el ejemplo de la Person clase, podemos añadir la dirección propiedad tipada como otra clase estructurada.
En el Address En esta definición requerimos solo las propiedades de calle y código postal, y permitimos que la ciudad esté vacía.
Ahora, cuando pidas al agente la salida estructurada, obtendrás de vuelta la instancia rellenada:
Array
Si declaras una propiedad como un array, Neuron asume que la lista de elementos es una lista de cadenas. Si quieres que el array contenga una lista de otros objetos estructurados, puedes especificarlo usando el anyOf argumento:
Y aquí está la implementación hipotética de la Tag clase con sus propias reglas de validación e información de propiedades:
Array con múltiples tipos
Como puedes notar en el ejemplo anterior, el argumento anyOf es un array. Neuron también admite la composición de arrays con múltiples tipos de objetos. Solo enumera los objetos estructurados que el array puede contener y Neuron incluirá todas sus especificaciones en el esquema JSON para el LLM.
Máximo de reintentos
Dado que los LLM no son perfectamente deterministas, es obligatorio contar con un mecanismo de reintento si falta algo en la respuesta del LLM.
Por defecto, Neuron extrae y valida los datos de la respuesta del LLM y, si hay uno o más errores de validación, reintenta automáticamente la solicitud una sola vez más, informando al LLM de lo que salió mal y para qué propiedades.
Eventualmente puedes personalizar cuántas veces el agente debe reintentar para obtener una respuesta correcta del LLM:
Si trabajas con un LLM menos capaz, considera usar un número de reintentos que equilibre la probabilidad de obtener una respuesta válida y el consumo potencial de tokens.
Puedes desactivar los reintentos simplemente pasando cero. Será un intento de una sola vez:
Monitorización y depuración
Muchas de las aplicaciones que construyas con Neuron contendrán varios pasos con múltiples invocaciones de llamadas a LLM. A medida que estas aplicaciones se vuelven cada vez más complejas, resulta crucial poder inspeccionar exactamente qué está ocurriendo dentro de tu sistema agéntico. La mejor manera de hacerlo es con Inspector.

Cada segmento aporta su propia información de depuración para seguir la ejecución del agente en tiempo real:

Reglas de validación
Dado que los LLM son sistemas no deterministas y la coherencia de su salida puede verse muy influida por la calidad del contexto que tienen como entrada, y aún pueden alucinar, proporcionamos un conjunto de reglas de validación que puedes añadir a las propiedades de clases estructuradas para instruir a Neuron a verificar el conjunto final de datos generado por el LLM.
Las reglas de validación permiten a Neuron reenviar la solicitud de generación al LLM varias veces con un informe detallado de lo que estaba mal si una o más propiedades no son válidas, hasta que alcanza el maxRetries valor.
Si no defines ninguna regla de validación, los datos extraídos de la respuesta del LLM se rellenarán directamente en la clase de salida estructurada.
#[NotBlank]
La propiedad bajo validación no puede estar vacía. Acepta la allowNull indicador para tratar explícitamente el valor null como equivalente a vacío o no.
#[Length]
Determina si la longitud de una cadena coincide con los criterios dados:
#[WordsCount]
Determina si el número de palabras en una cadena coincide con los criterios dados:
#[Count]
Determina si el tamaño de un array coincide con los criterios dados:
#[EqualTo] - #[NotEqualTo]
Estas reglas tienen la misma estructura y significado, y aceptan un solo argumento para definir el valor con el que comparar. La propiedad bajo validación debe ser estrictamente igual (#[EqualTo]) o diferente (#[NotEqualTo]) que el valor de referencia:
#[GreaterThan] - #[GreaterThanEqual]
Estas reglas tienen la misma estructura y significado, y aceptan un solo argumento para definir el valor con el que comparar. La propiedad bajo validación debe ser estrictamente mayor (#[GreaterThan]) o igual (#[GreaterThanEqual]) que el valor de referencia:
#[LowerThan] - #[LowerThanEqual]
Estas reglas tienen la misma estructura y significado, y aceptan un solo argumento para definir el valor con el que comparar. La propiedad bajo validación debe ser estrictamente menor (#[LowerThan]) o igual (#[LowerThanEqual]) que el valor de referencia:
#[OutOfRange]
Determina si un número está fuera del rango dado:
#[IsFalse] - #[IsTrue]
La propiedad bajo validación debe tener exactamente el valor booleano definido por la regla:
#[IsNull] - #[IsNotNull]
La propiedad bajo validación debe respetar la condición de nullable definida por la regla:
#[Json]
La propiedad bajo validación debe contener una cadena JSON válida:
#[Url]
La propiedad bajo validación debe contener una URL válida:
#[Email]
La propiedad bajo validación debe contener una dirección de correo electrónico válida:
#[IpAddress]
La propiedad bajo validación debe contener una dirección IP válida:
#[ArrayOf]
La propiedad bajo validación debe ser un array que contenga todos los objetos del tipo dado.
#[Regex]
La propiedad bajo validación debe respetar la expresión regular dada.
Reglas de validación personalizadas
Las reglas de validación son atributos de PHP, así que para crear una nueva debes extender la clase AbstractValidationRule del framework y marcar la clase como un atributo de PHP:
Ahora puedes usar la regla en tu clase de salida estructurada:
Última actualización