Presentación de la conversación de varios turnos con un nodo de agente para Amazon Bedrock Flows (versión preliminar)

Flujos de lecho rocoso del Amazonas ofrece un generador visual intuitivo y un conjunto de API para vincular perfectamente los modelos básicos (FM), Roca Amazónica funciones y servicios de AWS para crear y automatizar flujos de trabajo de IA generativos definidos por el usuario a escala. Agentes de Amazon Bedrock ofrece una solución totalmente administrada para crear, implementar y escalar agentes de IA en AWS. Con Flujos, puede proporcionar una lógica de decisión definida explícitamente por el usuario para ejecutar flujos de trabajo y agregar Agentes como un nodo en un flujo para usar FM para interpretar y ejecutar tareas dinámicamente basándose en el razonamiento contextual para ciertos pasos de su flujo de trabajo.

Hoy, nos complace anunciar la conversación de múltiples turnos con un nodo de agente (vista previa), una nueva y poderosa capacidad en Flows. Esta nueva capacidad mejora la funcionalidad del nodo del agente, permitiendo conversaciones dinámicas de ida y vuelta entre usuarios y flujos, similar a un diálogo natural en una ejecución de flujo.

Con esta nueva característica, cuando un nodo de agente requiere aclaración o contexto adicional por parte del usuario antes de poder continuar, puede pausar de manera inteligente la ejecución del flujo y solicitar información específica del usuario. Después de que el usuario envía la información solicitada, el flujo reanuda sin problemas la ejecución con la entrada enriquecida, manteniendo la executionId de la conversación.

Esto crea una experiencia más interactiva y consciente del contexto, porque el nodo puede adaptar su comportamiento en función de las respuestas del usuario. El siguiente diagrama de secuencia muestra los pasos del flujo.

Las conversaciones de varios turnos facilitan a los desarrolladores la creación de flujos de trabajo agentes que pueden adaptarse y razonar dinámicamente. Esto es particularmente valioso para escenarios complejos donde una sola interacción podría no ser suficiente para comprender y abordar completamente las necesidades del usuario.

En esta publicación, analizamos cómo crear una conversación de varios turnos y exploramos cómo esta función puede transformar sus aplicaciones de IA.

Descripción general de la solución

Considere ACME Corp, una importante agencia de viajes ficticia en línea que desarrolla un planificador de viajes de vacaciones impulsado por inteligencia artificial utilizando Flows. Se enfrentan a varios desafíos en su implementación:

  • Su planificador no puede entablar conversaciones dinámicas y exige todos los detalles del viaje por adelantado en lugar de hacer preguntas de seguimiento.
  • Se enfrentan a desafíos para orquestar procesos complejos de planificación de viajes de varios pasos que requieren coordinar vuelos, alojamiento, actividades y transporte a través de múltiples destinos, lo que a menudo genera ineficiencias y experiencias de clientes subóptimas.
  • Su aplicación no puede adaptar dinámicamente sus recomendaciones cuando los usuarios modifican sus preferencias o introducen nuevas restricciones durante el proceso de planificación.

Exploremos cómo la nueva capacidad de conversación de múltiples turnos en Flows aborda estos desafíos y permite a ACME Corp crear un planificador de viajes de vacaciones más inteligente, eficiente y consciente del contexto que realmente mejora la experiencia de planificación de viajes del cliente.

El flujo ofrece dos caminos de interacción distintos. Para consultas generales sobre viajes, los usuarios reciben respuestas instantáneas impulsadas por un LLM. Sin embargo, cuando los usuarios quieren buscar o reservar vuelos y hoteles, se conectan con un agente que los guía a través del proceso, recopilando información esencial mientras mantienen la sesión hasta su finalización. El flujo de trabajo se ilustra en el siguiente diagrama.

Requisitos previos

Para este ejemplo, necesita lo siguiente:

Cree un flujo de conversación de varios turnos

Para crear un flujo de conversación de varios turnos, complete los siguientes pasos:

  1. En la consola Bedrock, elija Flujos bajo Herramientas de construcción en el panel de navegación.
  2. Comience a crear un nuevo flujo llamado ACME-Corp-trip-planner.

Para obtener instrucciones detalladas sobre cómo crear un flujo, consulte Amazon Bedrock Flows ahora está disponible de forma generalizada con seguridad y trazabilidad mejoradas.

Bedrock ofrece diferentes tipos de nodos para construir su flujo rápido.

  1. Elija el nodo de solicitud para evaluar la intención de entrada. Clasificará las intenciones como categoryLetter=A si el usuario desea buscar o reservar un hotel o vuelo y categoryLetter=B si el usuario solicita información de destino. Si estas usando Gestión rápida de Amazon Bedrockpuede seleccionar el mensaje desde allí.

Para este nodo, utilizamos el siguiente mensaje en la configuración del mensaje:

You are a query classifier. Analyze the {{input}} and respond with a single letter:

A: Travel planning/booking queries for hotel and flights Example: "Find flights to London"
B: Destination information queries Example: "What's the weather in Paris?"

Return only 'A' or 'B' based on the primary intent.

Para nuestro ejemplo, elegimos Amazon Nova Lite modele y establezca el parámetro de inferencia de temperatura en 0,1 para minimizar las alucinaciones y mejorar la confiabilidad de la salida. Puedes seleccionar otros Modelos disponibles de Amazon Bedrock.

  1. Cree el nodo Condición con la siguiente información y conéctese con el nodo Clasificador de consultas. Para este nodo, el valor de la condición es:
    Name: Booking
    Condition: categoryLetter=="A"

  2. Cree un segundo nodo de aviso para la invocación de la guía LLM. La entrada del nodo es la salida del nodo Condición “Si todas las condiciones son falsas”. Para finalizar esta rama de flujo, agregue un nodo de salida de flujo y conecte la salida del nodo de solicitud a él.
    You are AcmeGuide, an enthusiastic and knowledgeable travel guide. 
    Your task is to provide accurate and comprehensive information about travel destinations to users. 
    When answering a user's query, cover the following key aspects:
    
    - Weather and best times to visit
    - Famous local figures and celebrities
    - Major attractions and landmarks
    - Local culture and cuisine
    - Essential travel tips
    
    Answer the user's question {{query}}. 
    
    Present the information in a clear and engaging manner. 
    If you are unsure about specific details, acknowledge this and provide the most reliable information available. 
    Avoid any hallucinations or fabricated content. 
    Provide your response immediately after these instructions, without any preamble or additional text.

Para nuestro ejemplo, elegimos el modelo Nova Lite de Amazon y configuramos el parámetro de inferencia de temperatura en 0,1 para minimizar las alucinaciones y mejorar la confiabilidad de la salida.

  1. Finalmente, cree el nodo del agente y configúrelo para usar el agente que se creó anteriormente. La entrada del nodo es la salida del nodo Condición “Reserva de condiciones”. Para finalizar esta rama de flujo, agregue un nodo de salida de flujo y conecte la salida del nodo del agente a él.
  2. Elegir Ahorrar para guardar su flujo.

Pruebe el flujo

Ahora estás listo para probar el flujo a través de la consola o API de Amazon Bedrock. Primero, pedimos información sobre París. En la respuesta, puede revisar los seguimientos de flujo, que brindan visibilidad detallada del proceso de ejecución. Estos seguimientos lo ayudan a monitorear y depurar los tiempos de respuesta para cada paso, rastrear el procesamiento de las entradas de los clientes, verificar si las barreras de seguridad se aplican correctamente e identificar cualquier cuello de botella en el sistema. Los seguimientos de flujo ofrecen una descripción general completa de todo el proceso de generación de respuesta, lo que permite una resolución de problemas y una optimización del rendimiento más eficientes.

A continuación, continuamos nuestra conversación y solicitamos reservar un viaje a París. Como puede ver, ahora con el soporte de múltiples turnos en Flows, nuestro nodo de agente puede hacer preguntas de seguimiento para recopilar toda la información y realizar la reserva.

Seguimos hablando con nuestro agente, brindándole toda la información requerida y finalmente, el agente realiza la reserva por nosotros. En las trazas se puede comprobar el ExecutionId que mantiene la sesión para las solicitudes de múltiples turnos.

Después de la confirmación, el agente completó con éxito la solicitud del usuario.

Utilice las API de Amazon Bedrock Flows

También puede interactuar con flujos mediante programación utilizando el API de flujo de invocacióncomo se muestra en el siguiente código. Durante la invocación inicial, el sistema genera automáticamente un código único executionIdque mantiene la sesión durante 1 hora. Este executionId es esencial para posteriores InvokeFlow Llamadas API, porque proporciona al agente la información contextual necesaria para mantener el historial de conversaciones y completar acciones.

{
  "flowIdentifier": " MQM2RM1ORA",
  "flowAliasIdentifier": "T00ZXPGI35",
  "inputs": [
    {
      "content": {
        "document": "Book a flight to paris"
      },
      "nodeName": "FlowInputNode",
      "nodeOutputName": "document"
    }
  ]
}

Si el nodo agente en el flujo decide que necesita más información del usuario, el flujo de respuesta (responseStream) de InvokeFlow incluye un FlowMultiTurnInputRequestEvent objeto del evento. El evento tiene la información solicitada en el contenido(FlowMultiTurnInputContent) campo.

El siguiente es un ejemplo FlowMultiTurnInputRequestEvent Objeto JSON:

{
  "nodeName": "Trip_planner",
  "nodeType": "AgentNode",
  "content": {
      "document": "Certainly! I'd be happy to help you book a flight to Paris. 
To get started, I need some more information:
1. What is your departure airport (please provide the IATA airport code if possible)?
2. What date would you like to travel (in YYYYMMDD format)?
3. Do you have a preferred time for the flight (in HHMM format)?
Once I have these details, I can search for available flights for you."
  }
}

Debido a que el flujo no puede continuar hasta que se reciban más entradas, el flujo también emite un FlowCompletionEvent evento. Un flujo siempre emite la FlowMultiTurnInputRequestEvent antes del FlowCompletionEvent. Si el valor de completionReason en el FlowCompletionEvent evento es INPUT_REQUIREDel flujo necesita más información antes de poder continuar.

El siguiente es un ejemplo FlowCompletionEvent Objeto JSON:

{
  "completionReason": "INPUT_REQUIRED"
}

Envíe la respuesta del usuario al flujo llamando al InvokeFlow API de nuevo. Asegúrese de incluir el executionId para la conversación.

El siguiente es un ejemplo de solicitud JSON para el InvokeFlow API, que proporciona información adicional requerida por un nodo de agente:

{
  "flowIdentifier": "MQM2RM1ORA",
  "flowAliasIdentifier": "T00ZXPGI35",
  "executionId": "b6450554-f8cc-4934-bf46-f66ed89b60a0",
  "inputs": [
    {
      "content": {
        "document": "Madrid on Valentine's day 2025"
      },
      "nodeName": "Trip_planner",
      "nodeInputName": "agentInputText"
    }
  ]
}

Este ida y vuelta continúa hasta que no se necesita más información y el agente tiene todo lo necesario para completar la solicitud del usuario. Cuando no se necesita más información, el flujo emite un FlowOutputEvent evento, que contiene la respuesta final.

El siguiente es un ejemplo FlowOutputEvent Objeto JSON:

{
  "nodeName": "FlowOutputNode",
  "content": {
      "document": "Great news! I've successfully booked your flight to Paris. Here are the details:

- Date: February 14, 2025 (Valentine's Day)
- Departure: Madrid (MAD) at 20:43 (8:43 PM)
- Arrival: Paris (CDG)

Your flight is confirmed."
  }
}

El flujo también emite un FlowCompletionEvent evento. el valor de completionReason es SUCCESS.

El siguiente es un ejemplo FlowCompletionEvent Objeto JSON:

{
  "completionReason": "SUCCESS"
}

Para comenzar con la invocación de varios turnos, utilice el siguiente código de ejemplo. Maneja interacciones posteriores utilizando el mismo executionId y mantiene el contexto durante toda la conversación. Debes especificar el ID de tu flujo en FLOW_ID y su ID de alias en FLOW_ALIAS_ID (referirse a Ver información sobre flujos en Amazon Bedrock para obtener instrucciones sobre cómo obtener estas identificaciones).

El sistema solicitará información adicional según sea necesario, utilizando el executionId para mantener el contexto en múltiples interacciones, proporcionando un flujo de conversación coherente y continuo mientras se ejecutan las acciones solicitadas.

"""
Runs an Amazon Bedrock flow and handles multi-turn interactions
"""
import boto3
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def invoke_flow(client, flow_id, flow_alias_id, input_data, execution_id=None):
    """
    Invoke an Amazon Bedrock flow and handle the response stream.

    Args:
        client: Boto3 client for Bedrock
        flow_id: The ID of the flow to invoke
        flow_alias_id: The alias ID of the flow
        input_data: Input data for the flow
        execution_id: Execution ID for continuing a flow. Defaults to None for first run.

    Returns:
        Dict containing flow_complete status, input_required info, and execution_id
    """
    request_params = {
        "flowIdentifier": flow_id,
        "flowAliasIdentifier": flow_alias_id,
        "inputs": [input_data]
    }
    
    if execution_id:
        request_params["executionId"] = execution_id

    response = client.invoke_flow(**request_params)
    execution_id = response.get('executionId', execution_id)
    
    input_required = None
    flow_status = ""

    for event in response['responseStream']:
        if 'flowCompletionEvent' in event:
            flow_status = event['flowCompletionEvent']['completionReason']
        elif 'flowMultiTurnInputRequestEvent' in event:
            input_required = event
        elif 'flowOutputEvent' in event:
            print(event['flowOutputEvent']['content']['document'])
        elif 'flowTraceEvent' in event:
            print("Flow trace:", event['flowTraceEvent'])

    return {
        "flow_status": flow_status,
        "input_required": input_required,
        "execution_id": execution_id
    }

def create_input_data(text, node_name="FlowInputNode", is_initial_input=True):
    """
    Create formatted input data dictionary.
    
    Args:
        text: The input text
        node_name: Name of the node (defaults to "FlowInputNode")
        is_initial_input: Boolean indicating if this is the first input (defaults to True)
    
    Returns:
        Dict containing the formatted input data
    """
    input_data = {
        "content": {"document": text},
        "nodeName": node_name
    }

    if is_initial_input:
        input_data["nodeOutputName"] = "document"
    else:
        input_data["nodeInputName"] = "agentInputText"

    return input_data

def main():
    FLOW_ID = "MQM2RM1ORA"
    FLOW_ALIAS_ID = "T00ZXPGI35"
    
    session = boto3.Session(
        region_name="us-east-1"
    )
    bedrock_agent_client = session.client(
        'bedrock-multi-turn', 
    )

    execution_id = None

    try:
        # Initial input
        user_input = input("Enter input: ")
        input_data = create_input_data(user_input, is_initial_input=True)

        while True:
            result = invoke_flow(
                bedrock_agent_client, 
                FLOW_ID, 
                FLOW_ALIAS_ID, 
                input_data, 
                execution_id
            )
        
            if result['flow_status'] == "SUCCESS":
                break
            
            if result['flow_status'] == "INPUT_REQUIRED":
                more_input = result['input_required']
                prompt = f"{more_input['flowMultiTurnInputRequestEvent']['content']['document']}: "
                user_input = input(prompt)
                # Subsequent inputs
                input_data = create_input_data(
                    user_input,
                    more_input['flowMultiTurnInputRequestEvent']['nodeName'],
                    is_initial_input=False
                )
            
            execution_id = result['execution_id']

    except Exception as e:
        logger.error(f"Error occurred: {str(e)}", exc_info=True)

if __name__ == "__main__":
    main()

Limpiar

Para limpiar sus recursos, elimine el flujo, el agente, AWS Lambda funciones creadas para el agente y base de conocimientos.

Conclusión

La introducción de la capacidad de conversación en múltiples turnos en Flows marca un avance significativo en la creación de aplicaciones sofisticadas de IA conversacional. En esta publicación, demostramos cómo esta característica permite a los desarrolladores crear flujos de trabajo dinámicos y sensibles al contexto que pueden manejar interacciones complejas mientras mantienen el historial y el estado de la conversación. La combinación de la interfaz del creador visual de Flows y las API con potentes capacidades de agente hace que sea sencillo desarrollar e implementar aplicaciones inteligentes que puedan entablar conversaciones naturales de varios pasos.

Con esta nueva capacidad, las empresas pueden crear soluciones de IA más intuitivas y con mayor capacidad de respuesta que satisfagan mejor las necesidades de sus clientes. Ya sea que esté desarrollando un sistema de reserva de viajes, servicio al cliente u otra aplicación conversacional, la conversación multiturno con Flows proporciona las herramientas necesarias para crear flujos de trabajo de IA sofisticados con una complejidad mínima.

Lo alentamos a explorar estas capacidades en la consola Bedrock y comenzar a crear sus propias aplicaciones conversacionales de múltiples turnos hoy. Para obtener más información y documentación detallada, visite el Guía del usuario de Amazon Bedrock. Esperamos ver las soluciones innovadoras que creará con estas nuevas y potentes funciones.


Acerca de los autores

Christian Kamwangala es un arquitecto de soluciones especializado en IA/ML e IA generativa en AWS, con sede en París, Francia. Ayuda a los clientes empresariales a diseñar e implementar soluciones de IA de vanguardia utilizando el conjunto completo de herramientas de AWS, centrándose en sistemas listos para producción que siguen las mejores prácticas de la industria. En su tiempo libre, Christian disfruta explorar la naturaleza y pasar tiempo con familiares y amigos.

Irene Arroyo Delgado es arquitecto de soluciones especializado en IA/ML y GenAI en AWS. Se centra en aprovechar el potencial de la IA generativa para cada caso de uso y en producir cargas de trabajo de ML para lograr los resultados comerciales deseados por los clientes mediante la automatización de los ciclos de vida de ML de un extremo a otro. En su tiempo libre, a Irene le gusta viajar y hacer senderismo.