Diseño de aplicaciones para cargas de trabajo de IA en Azure
Hay muchas opciones que se deben tener en cuenta al crear una aplicación que tenga funciones de IA. Sus requisitos funcionales y no funcionales únicos, como si el caso de uso es el aprendizaje automático tradicional, generativo, determinista o una combinación de tipos de inteligencia artificial, le ayudará a reducir las decisiones de alto nivel sobre el diseño. Tendrá en cuenta estas opciones a medida que pasa de áreas de diseño de alto nivel a áreas de diseño de nivel inferior.
Como se describe en el artículo Introducción, si se debe crear su propio modelo o usar un modelo precompilado es una de las primeras decisiones importantes que debe tomar. Al usar un modelo precompilado, tenga en cuenta estos puntos:
Orígenes del catálogo. Explore repositorios como Hugging Face Model Hub, TensorFlow Hub y el catálogo de modelos del portal de Azure AI Foundry para buscar modelos entrenados previamente. Estas plataformas proporcionan un amplio catálogo de modelos para diversas tareas.
Licencias. Asegúrese de que los términos de licencia del modelo se ajustan a los objetivos de seguridad, cumplimiento y aplicación, especialmente si planea distribuir la aplicación o integrarla con otros servicios.
Componentes clave. Examine la arquitectura del modelo, los datos de entrenamiento, el rendimiento y las licencias para determinar si está optimizado para su tarea o dominio.
Para obtener instrucciones sobre cómo elegir una plataforma de hospedaje, consulte Consideraciones para el hospedaje de modelos y la plataforma de inferencia.
En este artículo se describen las áreas de diseño y los factores comunes que se deben tener en cuenta al tomar decisiones sobre la tecnología y el enfoque.
Recomendaciones
En la tabla siguiente se resumen las recomendaciones proporcionadas en este artículo.
Recomendación | Descripción |
---|---|
Priorice las soluciones fuera de la plataforma. | Siempre que sea práctico, use soluciones de plataforma como servicio (PaaS) para controlar las funciones de carga de trabajo. Use modelos precompilados y entrenados previamente siempre que sea posible para minimizar la carga operativa y de desarrollo de los equipos de carga de trabajo y operaciones. |
Funciones y funcionalidades abstractas lejos del cliente. | Mantenga el cliente lo más ligero posible mediante el diseño de servicios back-end para controlar problemas generales, como la limitación de velocidad y las operaciones de conmutación por error. |
Bloquear el acceso a los almacenes de datos. | El código del sistema de inteligencia artificial no debe acceder directamente a los almacenes de datos. Enrutar todas las solicitudes de datos a través de una capa de API. Las API deben compilarse específicamente para la tarea necesaria. |
Aísle los modelos. | Al igual que con los almacenes de datos, use una capa de API para actuar como puerta de enlace para las solicitudes al modelo. Algunas soluciones paaS, como Azure OpenAI Service y Azure Machine Learning, usan SDK para este propósito. Muchas herramientas, como el flujo de mensajes, contienen compatibilidad nativa para propagar las API al servicio. |
Diseñe componentes para que se puedan implementar de forma independiente. | Los modelos de inteligencia artificial, las canalizaciones de datos, los componentes de front-end y los microservicios, como el preprocesamiento de datos, la extracción de características y la inferencia deben implementarse de forma independiente para optimizar la flexibilidad, escalabilidad y operabilidad de la carga de trabajo. |
Contenedores de componentes
Para asegurarse de que los componentes que se pueden implementar de forma independiente son totalmente independientes y para simplificar las implementaciones, considere la posibilidad de incluir la contenedorización como parte de la estrategia de diseño. Los siguientes componentes deben incluirse en contenedores:
Microservicios. Los microservicios individuales que controlan funciones específicas de la aplicación, como el procesamiento de datos, la inferencia del modelo y la autenticación de usuario, deben incluirse en contenedores. Este enfoque permite la implementación y el escalado independientes y facilita actualizaciones y mantenimiento más eficaces.
Modelos de IA. Incluir modelos de IA en contenedores para asegurarse de que todas las dependencias, bibliotecas y configuraciones se agrupan. Este enfoque aísla el entorno del modelo del sistema host para evitar conflictos de versiones y ayudar a garantizar un comportamiento coherente en distintos entornos de implementación.
Canalizaciones de procesamiento de datos. Las tareas de procesamiento de datos que preceden o siguen la inferencia del modelo, como la limpieza de datos, la transformación y la extracción de características, deben incluirse en contenedores. Este enfoque mejora la reproducibilidad y simplifica la administración de dependencias.
Servicios de infraestructura. Los servicios que proporcionan compatibilidad con la infraestructura, como las bases de datos y las capas de almacenamiento en caché, también pueden beneficiarse de la contenedorización. La contenedorización de estos servicios ayuda a mantener la coherencia de las versiones y facilita el escalado y la administración más fáciles de estos componentes.
Colocación de componentes de IA con otros componentes de carga de trabajo
Hay varias razones para colocar los componentes de inteligencia artificial con otros componentes de carga de trabajo, pero hay desventajas asociadas a hacerlo. Puede optar por colocar componentes por estos motivos:
Sensibilidad a la latencia. Coloca los componentes de inteligencia artificial con otros servicios, como el hospedaje de API, cuando es importante una latencia baja. Por ejemplo, si necesita inferencia en tiempo real para mejorar la experiencia del usuario, colocar modelos de IA cerca de la API puede minimizar el tiempo necesario para recuperar los resultados.
Proximidad de datos. Cuando los modelos de inteligencia artificial requieren acceso frecuente a conjuntos de datos específicos, como un índice de búsqueda, la colocación de estos componentes puede mejorar el rendimiento y reducir la sobrecarga de la transferencia de datos para acelerar el procesamiento y la inferencia.
Uso de recursos. Si los componentes específicos tienen necesidades complementarias de recursos, como la CPU y la memoria, colocarlos pueden optimizar el uso de recursos. Por ejemplo, un modelo que requiere un cálculo significativo puede compartir recursos con un servicio que tenga demandas más bajas al mismo tiempo.
Desventaja. Hay desventajas que se deben tener en cuenta al decidir si colocar los componentes. Es posible que pierda la capacidad de implementar o escalar componentes de forma independiente. También puede aumentar el riesgo de mal funcionamiento aumentando el radio potencial de explosión de los incidentes.
Evaluación del uso de orquestadores en soluciones de IA generativas
Un orquestador administra un flujo de trabajo coordinando la comunicación entre los distintos componentes de la solución de inteligencia artificial que, de lo contrario, sería difícil de administrar en cargas de trabajo complejas. Se recomienda compilar un orquestador en el diseño si la carga de trabajo tiene alguna de las siguientes características:
Flujos de trabajo complejos. El flujo de trabajo implica varios pasos, como preprocesamiento, encadenamiento de modelos o postprocesamiento.
lógica condicional. Las decisiones, como el enrutamiento de resultados a diferentes modelos, deben realizarse dinámicamente en función de las salidas del modelo.
Escalado y Administración de Recursos. Debe administrar la asignación de recursos para aplicaciones de gran volumen mediante el escalado de modelos basado en la demanda.
Administración de estado Debe administrar el estado y la memoria de las interacciones del usuario.
Recuperación de datos. Debe poder recuperar los datos de aumento del índice.
Consideraciones para usar varios modelos
Cuando la carga de trabajo usa varios modelos, un orquestador es esencial. El orquestador enruta los datos y las solicitudes al modelo adecuado en función del caso de uso. Planee el flujo de datos entre modelos, asegurándose de que las salidas de un modelo pueden servir como entradas para otra. La planeación puede implicar procesos de transformación o enriquecimiento de datos.
Orquestación y agentes
En el caso de las cargas de trabajo de IA generativas, considere la posibilidad de tomar una estrategia basada en agentes, a veces denominada agentic, al diseño para agregar extensibilidad a la orquestación. Los agentes proporcionan funcionalidad enlazada al contexto. Comparten muchas características con microservicios y realizan tareas junto con un orquestador. El orquestador puede anunciar tareas en un grupo de agentes, o bien los agentes pueden registrar funcionalidades con el orquestador. Ambos enfoques permiten al orquestador determinar dinámicamente cómo fragmentar y enrutar la consulta entre los agentes.
Los enfoques agénticos son ideales cuando se tiene una interfaz de usuario común con varias características en evolución. Estas características pueden integrarse en la experiencia para añadir más funcionalidades y datos de apoyo al flujo con el paso del tiempo.
Para cargas de trabajo complejas que tienen muchos agentes, es más eficaz permitir que los agentes colaboren dinámicamente en lugar de usar un orquestador para dividir las tareas y asignarlas.
La comunicación entre el orquestador y los agentes debe seguir un patrón de cola de temas, donde los agentes son suscriptores a un tema y el orquestador envía tareas a través de una cola.
El uso de un enfoque agente funciona mejor con un patrón de orquestación en lugar de un patrón de coreografía.
Para obtener más información, consulte Consideraciones para la plataforma de orquestación.
Evaluación del uso de puertas de enlace de API
Las puertas de enlace de API como Azure API Management abstraen las funciones de las API, lo que desacopla las dependencias entre el servicio solicitante y la API. Las puertas de enlace de API proporcionan las siguientes ventajas para las cargas de trabajo de IA:
Varios microservicios. Las puertas de enlace le ayudan a administrar varios puntos de conexión del modelo de IA cuando necesite aplicar directivas coherentes, como la limitación de velocidad y la autenticación.
Administración del tráfico. Las puertas de enlace le ayudan a administrar aplicaciones de alto tráfico de forma eficaz mediante la administración de solicitudes, el almacenamiento en caché de respuestas y la distribución de cargas.
Seguridad Las puertas de enlace proporcionan control de acceso centralizado, registro y protección contra amenazas para las API detrás de la puerta de enlace.
Uso de patrones de diseño de aplicaciones de IA
Se han establecido varios patrones de diseño comunes en el sector de las aplicaciones de inteligencia artificial. Puede usarlos para simplificar el diseño y la implementación. Estos patrones de diseño incluyen:
Ensamble de modelos. Este patrón de diseño implica combinar predicciones de varios modelos para mejorar la precisión y la solidez mediante la mitigación de las debilidades de los modelos individuales.
Arquitectura de microservicios. La separación de componentes en servicios que se pueden implementar de forma independiente mejora la escalabilidad y el mantenimiento. Permite a los equipos trabajar en diferentes partes de la aplicación simultáneamente.
arquitectura controlada por eventos. El uso de eventos para desencadenar acciones permite que los componentes desacoplados y el procesamiento en tiempo real hagan que el sistema sea más dinámico y adaptable a los datos cambiantes.
Estrategias de fragmentación y patrón RAG
El patrón Retrieval-Augmented Generation (RAG) combina modelos generativos con sistemas de recuperación, lo que permite al modelo acceder a orígenes de conocimiento externos para mejorar el contexto y la precisión. Consulte la serie de artículos sobre el diseño y desarrollo de una solución RAG para obtener instrucciones detalladas respecto a este patrón. Hay dos enfoques RAG:
Just-in-time. Este enfoque recupera información relevante dinámicamente en el momento de una solicitud para asegurarse de que siempre se usan los datos más recientes. Es beneficioso en escenarios que requieren contexto en tiempo real, pero podría introducir latencia.
calculado previamente (almacenado en caché). Este método implica almacenar en caché los resultados de recuperación para reducir los tiempos de respuesta al servir datos calculados previamente. Es adecuado para escenarios de alta demanda en los que se pueden almacenar datos coherentes. Es posible que los datos no reflejen la información más actual, lo que podría dar lugar a problemas de relevancia.
Cuando se usa un patrón RAG, una estrategia de fragmentación bien definida es fundamental para optimizar la eficiencia del rendimiento de la carga de trabajo. Comience con las instrucciones de la serie Diseño y desarrollo de una solución RAG. Estas son algunas recomendaciones adicionales que se deben tener en cuenta:
Implemente una estrategia de fragmentación dinámica que ajuste los tamaños de fragmentos en función del tipo de datos, la complejidad de las consultas y los requisitos del usuario. Si lo hace, puede mejorar la eficacia de recuperación y la conservación del contexto.
Incorpore bucles de comentarios para refinar las estrategias de fragmentación en función de los datos de rendimiento.
Conserve el linaje de datos de los fragmentos manteniendo los metadatos e identificadores únicos que se vinculan de nuevo al origen de conexión. La documentación de linaje clara ayuda a garantizar que los usuarios comprendan el origen de datos, sus transformaciones y cómo contribuye a la salida.
Cuándo usar patrones de diseño
Considere la posibilidad de usar estos patrones de diseño cuando el caso de uso cumpla la condición que se describe:
Flujos de trabajo complejos. Cuando tiene flujos de trabajo complejos o interacciones entre varios modelos de IA, los patrones como RAG o microservicios pueden ayudar a administrar la complejidad y garantizar una comunicación clara entre los componentes.
requisitos de escalabilidad. Si la demanda de la aplicación fluctúa, un patrón como microservicios permite que los componentes individuales se escalen de forma independiente para acomodar cargas variables sin afectar al rendimiento general del sistema.
aplicaciones controladas por datos. Si la aplicación requiere un amplio control de datos, una arquitectura controlada por eventos puede proporcionar capacidad de respuesta en tiempo real y un procesamiento de datos eficaz.
Nota:
Las aplicaciones más pequeñas o las POC normalmente no se benefician de estos patrones de diseño. Estas aplicaciones deben diseñarse para simplificar. Del mismo modo, si tiene restricciones de recursos (presupuesto, tiempo o recuento), el uso de un diseño sencillo que se puede refactorizar más adelante es un enfoque mejor que adoptar un patrón de diseño complejo.
Elección de los marcos y bibliotecas adecuados
La elección de marcos y bibliotecas está estrechamente entrelazada con el diseño de aplicaciones. Afectan al rendimiento, la escalabilidad y la capacidad de mantenimiento. Sin embargo, los requisitos de diseño pueden limitar las opciones del marco de trabajo. Por ejemplo, el uso del SDK de kernel semántico suele fomentar un diseño basado en microservicios en el que cada agente o función se encapsula dentro de su propio servicio. Tenga en cuenta estos factores al elegir marcos y bibliotecas:
Requisitos de la aplicación. Los requisitos de la aplicación, como el procesamiento en tiempo real o el procesamiento por lotes, pueden limitar la elección del marco de trabajo. Por ejemplo, si la aplicación requiere una latencia baja, es posible que tenga que usar un marco que tenga funcionalidades asincrónicas.
Necesidades de integración. El diseño puede requerir integraciones específicas con otros sistemas o servicios. Si un marco no admite los protocolos o formatos de datos necesarios, es posible que tenga que reconsiderar el diseño o elegir otro marco.
Experiencia del equipo. El conjunto de aptitudes del equipo de desarrollo puede limitar las opciones del marco. Un diseño que se basa en un marco menos familiar podría dar lugar a un aumento del tiempo de desarrollo y la complejidad, por lo que es posible que quiera usar una herramienta más conocida.
Diseñar una estrategia para identidades, autorización y acceso
Por lo general, debe abordar la identidad, la autorización y el acceso de la misma manera que lo haría cuando diseñe normalmente las aplicaciones. Debe usar un proveedor de identidades, como Microsoft Entra ID, para administrar estas áreas tanto como sea posible. Sin embargo, muchas aplicaciones de inteligencia artificial tienen desafíos únicos que requieren una consideración especial. A veces es difícil o incluso imposible conservar listas de control de acceso (ACL) a través del sistema sin nuevo desarrollo.
Consulte la Guía para diseñar una solución de inferencia RAG multiinquilino segura para obtener información sobre cómo agregar metadatos con restricción de seguridad a documentos y fragmentos. Este recorte se puede basar en grupos de seguridad o construcciones organizativas similares.
Considere los requisitos no funcionales
Es posible que la carga de trabajo tenga requisitos no funcionales que supongan desafíos debido a factores inherentes a las tecnologías de inteligencia artificial. A continuación se muestran algunos requisitos no funcionales comunes y sus desafíos:
Latencia de inferencia de modelos o tiempos de espera. Las aplicaciones de inteligencia artificial a menudo requieren respuestas en tiempo real o casi en tiempo real. El diseño de baja latencia es fundamental. Implica optimizar la arquitectura del modelo, las canalizaciones de procesamiento de datos y los recursos de hardware. La implementación de estrategias de almacenamiento en caché y la garantía de una carga eficaz de modelos también son esenciales para evitar tiempos de espera y proporcionar respuestas oportunas.
Limitaciones en el rendimiento de tokens o solicitudes. Muchos servicios de inteligencia artificial imponen límites en el número de tokens o el rendimiento de las solicitudes, especialmente con modelos basados en la nube. El diseño de estas limitaciones requiere una administración cuidadosa de los tamaños de entrada, el procesamiento por lotes de solicitudes cuando sea necesario y la implementación de mecanismos de limitación de velocidad o puesta en cola para administrar las expectativas del usuario y evitar interrupciones del servicio.
Escenarios de coste y contracargo. El diseño de la transparencia de costes implica implementar características de informes y seguimiento de uso que facilitan los modelos de contracargo. Estas características permiten a las organizaciones asignar costos con precisión en todos los departamentos. La gestión de contracargos normalmente se realiza a través de una puerta de enlace de API, como Azure API Management.