Diseño de aplicaciones para cargas de trabajo de IA en Azure
Hay muchas opciones disponibles para que tenga en cuenta al planear la compilación de una aplicación con funciones de IA. Los requisitos funcionales y no funcionales únicos le ayudan a reducir las decisiones de alto nivel sobre el diseño, como si el caso de uso es el aprendizaje automático tradicional, generativo, determinista o una combinación de tipos de inteligencia artificial. A medida que se mueve de áreas de diseño de alto nivel a áreas de diseño de nivel inferior, hay varias opciones que se deben tener en cuenta a lo largo del camino.
Como se describe en el artículo Introducción , elegir si desea crear su propio modelo o usar un modelo precompilado es una de las primeras decisiones importantes que debe tomar. Al elegir un modelo precompilado, tenga en cuenta estos puntos:
Orígenes del catálogo. Explore repositorios como Hugging Face Model Hub, TensorFlow Hub o el catálogo de modelos de Azure AI Studio para buscar modelos entrenados previamente. Estas plataformas proporcionan un amplio catálogo de modelos en varias 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 la tarea o dominio.
Para obtener instrucciones sobre cómo elegir una plataforma de hospedaje, consulte Consideraciones sobre la plataforma de hospedaje de modelos.
En este artículo se exploran muchas áreas de diseño comunes y factores que se deben tener en cuenta al tomar decisiones importantes sobre la tecnología y el enfoque.
Recomendaciones
Este es el resumen de 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 fino posible mediante el diseño de servicios back-end para controlar problemas transversales, 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 tocar directamente los almacenes de datos. Enrutar todas las solicitudes de datos a través de una capa de API. Las API deben crearse específicamente para la tarea específica necesaria. |
Aísle los modelos. | Al igual que 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 PromptFlow, 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 o la autenticación de usuario, deben incluirse en contenedores. Este enfoque permite la implementación y el escalado independientes, lo que facilita actualizaciones y mantenimiento más eficaces.
Modelos de IA: contenedorice modelos de IA para asegurarse de que todas las dependencias, bibliotecas y configuraciones se agrupan. Este enfoque aísla el entorno del modelo del sistema host, evitando conflictos de versiones y garantizando 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 bases de datos o capas de almacenamiento en caché, también pueden beneficiarse de la contenedorización. Este enfoque 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 inconvenientes con hacerlo. Las razones por las que podría colocar son:
Sensibilidad de latencia: coloca componentes de IA con otros servicios, como el hospedaje de API, cuando es importante una latencia baja. Por ejemplo, si se requiere la 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 un procesamiento e inferencia más rápidos.
Uso de recursos: si ciertos componentes tienen necesidades complementarias de recursos, como cpu y memoria, colocarlos puede 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.
Compensación. Hay inconvenientes con los componentes de colocación que se deben tener en cuenta. Puede perder 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 incidentes.
Evaluación del uso de orquestadores en soluciones de IA generativas
Un orquestador administra el flujo de trabajo que coordina 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 se deben tomar dinámicamente en función de las salidas del modelo, como enrutar los resultados a diferentes modelos.
Escalado y administración de recursos: debe administrar la asignación de recursos para aplicaciones de gran volumen mediante el escalado de modelos en función de 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, el uso de un orquestador es esencial. El orquestador es responsable de enrutar datos y 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 hacen referencia a la funcionalidad enlazada al contexto y comparten muchas características de estilo de microservicio que realizan tareas junto con un orquestador. El orquestador puede anunciar tareas a un grupo de agentes o agentes puede registrar funcionalidades con el orquestador. Ambos enfoques permiten al orquestador decidir dinámicamente cómo dividir y enrutar la consulta entre los agentes.
Los enfoques agentísticos son ideales cuando se tiene una superficie de interfaz de usuario común con varias características en evolución que se pueden conectar a esa experiencia para agregar más aptitudes y datos de base al flujo a lo largo del tiempo.
Para cargas de trabajo complejas con 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 que desacoplan 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: le ayudan a administrar varios puntos de conexión del modelo de IA y necesita aplicar directivas coherentes, como la limitación de velocidad y la autenticación.
Administración del tráfico: 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: proporcionan control de acceso centralizado, registro y protección contra amenazas para las API detrás de la puerta de enlace.
Aprovechar los patrones de diseño de aplicaciones de IA
Hay varios patrones de diseño comunes que se han establecido en el sector para las aplicaciones de inteligencia artificial que puede usar para simplificar el diseño y la implementación. Estos patrones de diseño incluyen:
Ensamblado de modelos: este patrón de diseño implica combinar predicciones de varios modelos para mejorar la precisión y la solidez, mitigando las debilidades de los modelos individuales.
Arquitectura de microservicios: separar los componentes en servicios que se pueden implementar de forma independiente mejora la escalabilidad y el mantenimiento, lo que 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 componentes desacoplados y procesamiento en tiempo real, lo que hace que el sistema sea más dinámico y adaptable a los cambios de datos.
Estrategias de fragmentación y patrón RAG
El patrón de generación aumentada de recuperación (RAG) combina modelos generativos con sistemas de recuperación, lo que permite que el modelo acceda a orígenes de conocimiento externos para mejorar el contexto y la precisión. Consulte diseño y desarrollo de una serie de soluciones RAG para obtener instrucciones detalladas sobre este patrón. Hay dos enfoques RAG:
Just-In-Time: este enfoque recupera información relevante dinámicamente en el momento de una solicitud, lo que garantiza que siempre se usan los datos más recientes. Es beneficioso en escenarios que requieren contexto en tiempo real, pero puede introducir latencia.
Calculado previamente (almacenado en caché): este método implica almacenar en caché los resultados de recuperación, lo que reduce los tiempos de respuesta al servir datos calculados previamente. Es adecuado para escenarios de alta demanda en los que se pueden almacenar datos coherentes, pero puede que no reflejen la información más actual, lo que conduce a posibles problemas de relevancia.
Al usar 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 proporcionadas en diseño y desarrollo de una serie de soluciones RAG. Las recomendaciones adicionales que se deben tener en cuenta son:
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. Esto 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 los 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 una de las condiciones:
Flujos de trabajo complejos: al tratar con 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, el uso de un patrón como microservicios permite que los componentes individuales se escalen de forma independiente, adaptando 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 los POC normalmente no se beneficiarán de adoptar uno de estos patrones de diseño y deben crearse con un diseño simplista. Del mismo modo, si tiene restricciones de recursos (presupuesto, tiempo o recuento), el uso de un diseño simplista 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, lo que afecta no solo a la arquitectura, sino también al rendimiento, la escalabilidad y el mantenimiento. Por el contrario, los requisitos de diseño pueden limitar las opciones de marco, creando una interacción dinámica entre los dos. Por ejemplo, el uso del SDK de kernel semántico (SK) suele fomentar un diseño basado en microservicios en el que cada agente o funcionalidad se encapsula dentro de su propio servicio. Los factores que se deben tener en cuenta al elegir marcos y bibliotecas son:
Requisitos de la aplicación: los requisitos específicos de la aplicación, como el procesamiento en tiempo real o el procesamiento por lotes, pueden limitar la elección del marco. Por ejemplo, si la aplicación requiere baja latencia, puede ser necesario un marco con 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, podría requerir la reconsideración del diseño o la selección de otro marco.
Experiencia en 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, lo que requiere una selección de 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 normalmente diseña aplicaciones. Debe usar un proveedor de identidades, como Microsoft Entra ID, para administrar estas áreas tanto como sea posible. Sin embargo, hay desafíos únicos para muchas aplicaciones de inteligencia artificial que necesitan tener en cuenta especial. La conservación de listas de control de acceso (ACL) a través del sistema a veces es difícil o incluso imposible sin introducir un desarrollo nuevo.
Revise las instrucciones que se encuentran en la solución RAG multiinquilino segura para aprender a agregar metadatos de recorte de seguridad a documentos y fragmentos. Este recorte se puede basar en grupos de seguridad o construcciones organizativas similares.
Tenga en cuenta los requisitos no funcionales
Es posible que tenga requisitos no funcionales para la carga de trabajo que son difíciles debido a factores inherentes a las tecnologías de inteligencia artificial. Entre los requisitos no funcionales comunes y sus desafíos se incluyen:
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, lo que 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 de rendimiento de tokens o solicitudes: muchos servicios de IA imponen límites en el número de tokens o el rendimiento de las solicitudes, especialmente cuando se usan modelos basados en la nube. El diseño de estas limitaciones requiere una administración cuidadosa de los tamaños de entrada, las solicitudes de procesamiento por lotes cuando sea necesario y la implementación de mecanismos de limitación o puesta en cola de velocidad para administrar las expectativas del usuario y evitar interrupciones del servicio.
Escenarios de costo y contracargo: el diseño de transparencia de costos implica implementar características de informes y seguimiento de uso que facilitan los modelos de contracargo, lo que permite a las organizaciones asignar costos con precisión entre los departamentos. La administración de contracargo normalmente se controla mediante una puerta de enlace de API, como Azure API Management.