Desarrollo de un flujo

El flujo de avisos es una herramienta de desarrollo diseñada para simplificar todo el ciclo de desarrollo de aplicaciones de inteligencia artificial con tecnología de modelos de lenguaje grandes (LLM). A medida que el impulso de las aplicaciones de inteligencia artificial basadas en LLM sigue creciendo en todo el mundo, el flujo de avisos proporciona una solución completa que simplifica el proceso de creación de prototipos, experimentación, iteraciones e implementación de las aplicaciones de inteligencia artificial.

Con el flujo de avisos, podrá:

  • Orquestar flujos ejecutables con LLM, avisos y herramientas de Python mediante un grafo visualizado.
  • Probar, depurar e iterar por los flujos con facilidad.
  • Crear variantes de avisos y comparar su rendimiento.

En este artículo, aprenderá a crear y desarrollar el primer flujo de avisos en Estudio de Azure Machine Learning.

Creación y desarrollo del flujo de avisos

En Studio, seleccione la pestaña Flujo de avisos en la barra de navegación de la izquierda. Seleccione Crear para crear el primer flujo de avisos. Puede crear un flujo mediante la clonación de los ejemplos disponibles en la galería o bien hacerlo desde cero. Si ya tiene archivos de flujo en un recurso compartido de archivos o local, también puede importarlos para crear un flujo.

Screenshot of prompt flow creation from scratch or gallery.

Creación del flujo

A la izquierda, está la vista plana, el área de trabajo principal donde puede crear el flujo. Por ejemplo: agregar herramientas en el flujo, editar la solicitud, establecer los datos de entrada del flujo, ejecutar el flujo, ver la salida, etc.

Screenshot of the prompt flow main working area.

En la parte superior derecha aparece la vista de archivos de flujo. Cada flujo se puede representar mediante una carpeta que contiene un archivo "flow.dag.yaml", archivos de código fuente y carpetas del sistema. Puede agregar nuevos archivos, editar los archivos existentes y eliminar archivos. También puede exportar los archivos al entorno local o importarlos desde el entorno local.

Además de la edición directa del nodo en la vista plana, también puede activar el botón de alternancia Modo de archivo sin formato y seleccionar el nombre del archivo para editarlo en la pestaña de abrir archivo.

En la parte inferior derecha está la vista de gráfico solo para visualización. Muestra la estructura de flujo que va a desarrollar. Puede acercar, alejar, establecer el diseño automático, etc.

Nota:

No se puede editar la vista de grafo directamente, pero puede seleccionar el nodo para buscar en la tarjeta de nodo correspondiente en la vista plana y, después, realizar la edición directa.

Runtime: seleccione el runtime existente o cree uno

Antes de empezar a crear, primero debe seleccionar un runtime. Runtime actúa como el recurso de proceso necesario para que ejecutar el flujo de avisos, que incluye una imagen de Docker que contiene todos los paquetes de dependencia necesarios. Es un elemento necesario para la ejecución del flujo.

Puede seleccionar un runtime existente en la lista desplegable, o bien seleccionar el botón Agregar runtime. Se abrirá un Asistente para la creación de runtime. Seleccione una instancia de proceso existente en la lista desplegable o cree una. Después, tendrá que seleccionar un entorno para crear el runtime. Se recomienda usar el entorno predeterminado para empezar a trabajar rápidamente.

Screenshot of runtime creation in studio.

Entrada y salida de flujo

La entrada del flujo son los datos que se pasan al flujo en su conjunto. Para definir el esquema de entrada, especifique el nombre y el tipo. Establezca el valor de entrada de cada entrada para probar el flujo. Puede hacer referencia a la entrada del flujo más adelante en los nodos del flujo mediante la sintaxis ${input.[input name]}.

La salida del flujo son los datos generados por el flujo en su conjunto, y resume los resultados de la ejecución de flujo. Puede ver y exportar la tabla de salida una vez que se complete la ejecución de flujo o la ejecución por lotes. Para definir el valor de salida del flujo, haga referencia a la salida de un solo nodo de flujo mediante la sintaxis ${[node name].output} o ${[node name].output.[field name]}.

 Screenshot of flow input and output.

Desarrollo del flujo mediante distintas herramientas

En un flujo, puede consumir diferentes tipos de herramientas, por ejemplo, LLM, Python, Serp API, Content Safety, etc.

Al seleccionar una herramienta, agregará un nuevo nodo al flujo. Debe especificar el nombre del nodo y establecer las configuraciones necesarias para el nodo.

Por ejemplo, para el nodo LLM, debe seleccionar una conexión, una implementación, establecer el aviso, etc. La conexión ayuda a almacenar y administrar de forma segura las claves secretas u otras credenciales confidenciales necesarias para interactuar con Azure OpenAI. Si aún no tiene una conexión, primero debe crearla y asegurarse de que el recurso de Azure OpenAI tenga las implementaciones de chat o finalización. La herramienta LLM y Prompt le permite usar Jinja como lenguaje de plantillas para generar dinámicamente el aviso. Por ejemplo, puede usar {{}} para incluir el nombre de entrada, en lugar de texto fijo, para que se pueda reemplazar sobre la marcha.

Para usar la herramienta Python, debe establecer el script de Python, establecer el valor de entrada, etc. Debe definir una función de Python con entradas y salidas como se indica a continuación.

 Screenshot of writing a Python script for Python node.

Cuando termine de redactar el mensaje o el script de Python, puede seleccionar Validar y analizar la entrada para que el sistema analice automáticamente la entrada del nodo en función de la plantilla de aviso y la entrada de la función de Python. El valor de entrada del nodo se puede establecer de las maneras siguientes:

  • Establecer el valor directamente en el cuadro de entrada
  • Hacer referencia a la entrada de flujo mediante la sintaxis ${input.[input name]}
  • Hacer referencia a la salida de flujo mediante la sintaxis ${[node name].output} o ${[node name].output.[field name]}

Al hacer referencia a la salida del nodo, puede vincular los nodos de forma conjunta. Por ejemplo, puede hacer referencia a la salida del nodo LLM en la entrada del nodo de Python, para que el nodo de Python pueda consumir la salida del nodo LLM y, en la vista de gráfico, puede ver que los dos nodos están vinculados de forma conjunta.

Habilitación del control condicional en el flujo

El flujo de avisos no solo ofrece una manera simplificada de ejecutar el flujo, sino que también aporta una característica eficaz para los desarrolladores, el control condicional, que permite a los usuarios establecer condiciones para la ejecución de cualquier nodo de un flujo.

En su núcleo, el control condicional proporciona la capacidad de asociar cada nodo de un flujo a una configuración de activación. Esta configuración es básicamente una instrucción "when" que determina cuándo se debe ejecutar un nodo. La eficacia de esta característica se materializa cuando tiene flujos complejos en los que la ejecución de determinadas tareas depende del resultado de las tareas anteriores. Al aprovechar el control condicional, puede configurar los nodos específicos para que se ejecuten solo cuando se cumplan las condiciones especificadas.

En concreto, puede establecer la configuración de activación de un nodo si selecciona el botón Activar configuración en la tarjeta de nodo. Puede agregar la instrucción "when" y establecer la condición. Para establecer las condiciones, haga referencia a la entrada del flujo o a la salida del nodo. Por ejemplo, puede establecer la condición ${input.[input name]} como valor específico o ${[node name].output} como valor específico.

Si no se cumple la condición, se omitirá el nodo. El estado del nodo se muestra como "Omitido".

Screenshot of setting activate config to enable conditional control.

Prueba del flujo

Puede probar el flujo de dos maneras: ejecutar un solo nodo o ejecutar todo el flujo.

Para ejecutar un único nodo, seleccione el icono Ejecutar en el nodo en la vista aplanada. Una vez que se complete la ejecución, compruebe la salida en la sección de salida del nodo.

Para ejecutar todo el flujo, seleccione el botón Ejecutar situado en la parte superior derecha. Después, puede comprobar el estado de ejecución y la salida de cada nodo, así como los resultados de las salidas de flujo definidas en el flujo. Siempre puede cambiar el valor de entrada del flujo y volver a ejecutarlo.

 Screenshot of view output button in two locations.

Screenshot of outputs on the output tab.

Desarrollo de un flujo de chat

El flujo de chat está diseñado para el desarrollo de aplicaciones conversacionales, compila las funcionalidades del flujo estándar y proporciona una mayor capacidad para las entradas/salidas de chat y la administración del historial de chat. Con el flujo de chat, puede crear fácilmente un bot de chat que controle la entrada y salida del chat.

En la página de creación del flujo de chat, el flujo de chat se etiqueta con "chat" para distinguirlo del flujo estándar y del flujo de evaluación. Para probar el flujo de chat, seleccione el botón "Chat" para activar un cuadro de chat para la conversación.

Screenshot of chat flow authoring page.

Entrada y salida de chat, e historial de chat

Los elementos más importantes que diferencian un flujo de chat de un flujo estándar son Entrada de chat, Historial de chat y Salida de chat.

  • Entrada de chat: se refiere a los mensajes o consultas enviados por los usuarios al bot de chat. Controlar eficazmente las entradas del chat es crucial para el éxito de una conversación, ya que implica comprender las intenciones del usuario, extraer la información relevante y desencadenar las respuestas adecuadas.
  • Historial de chat: es el registro de todas las interacciones entre el usuario y el bot de chat, incluidas tanto las entradas del usuario como las salidas generadas por la IA. Mantener el historial de chat es esencial para hacer un seguimiento del contexto de la conversación y garantizar que la IA pueda generar respuestas contextualmente relevantes.
  • Salida de chat: se refiere a los mensajes generados por la IA que se envían al usuario en respuesta a sus entradas. La generación de salidas de chat contextualmente apropiadas y que fomenten la interacción es vital para que la experiencia del usuario sea positiva.

Un flujo de chat puede tener varias entradas, pero el historial de chat y la entrada de chat son obligatorias en el flujo de chat.

  • En la sección de entradas del flujo de chat, una entrada de flujo se puede marcar como entrada de chat. Después, puede rellenar el valor de la entrada de chat si escribe en el cuadro de chat.

  • El flujo de avisos puede ayudar al usuario a administrar el historial de chat. El valor chat_history de la sección Entradas está reservado para representar el Historial de chat. Todas las interacciones en el cuadro de chat, incluidas las entradas de chat del usuario, las salidas de chat generadas y las entradas y salidas de otros flujos, se almacenan de forma automática en el historial de chat. El usuario no puede establecer manualmente el valor de chat_history en la sección Entradas. Está estructurado como una lista de entradas y salidas:

    [
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    },
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    }
    ]
    

Nota:

La capacidad de guardar o administrar automáticamente el historial de chat es una característica de la página de creación al realizar pruebas en el cuadro de chat. Para las ejecuciones por lotes, es necesario que los usuarios incluyan el historial de chat en el conjunto de datos de la ejecución por lotes. Si no hay ningún historial de chat disponible para las pruebas, simplemente establezca el valor de chat_history en una lista vacía [] dentro del conjunto de datos de la ejecución por lotes.

Creación de avisos con el historial de chat

La incorporación del historial de chat a los avisos es esencial para crear respuestas de bot de chat atractivas y que reconozcan el contexto. En los avisos, puede hacer referencia a chat_history para recuperar interacciones pasadas. Esto le permite hacer referencia a entradas y salidas anteriores para crear respuestas contextualmente relevantes.

Use la gramática for-loop del lenguaje Jinja para enumerar una lista de entradas y salidas de chat_history.

{% for item in chat_history %}
user:
{{item.inputs.question}}
assistant:
{{item.outputs.answer}}
{% endfor %}

Prueba con el cuadro de chat

El cuadro de chat proporciona una manera interactiva de probar el flujo de chat simulando una conversación con el bot de chat. Para probar el flujo de chat mediante el cuadro de chat, siga estos pasos:

  1. Seleccione el botón "Chat" para abrir el cuadro de chat.
  2. Escriba las entradas de prueba en el cuadro de chat y presione Entrar para enviarlas al bot de chat.
  3. Revise las respuestas del bot de chat para asegurarse de que son contextualmente adecuadas y precisas.

 Screenshot of Chat flow chat box experience.

Pasos siguientes