Infraestructura para una aplicación de IA generativa compatible con RAG mediante GKE

Last reviewed 2024-04-02 UTC

En este documento, se proporciona una arquitectura de referencia que puedes usar para diseñar la infraestructura para ejecutar una aplicación de IA generativa con generación de aumento de recuperación (RAG) mediante Google Kubernetes Engine (GKE), Cloud SQL y herramientas de código abierto como Ray, Hugging Face y LangChain. Para ayudarte a experimentar con esta arquitectura de referencia, se proporciona una aplicación de muestra y la configuración de Terraform en GitHub.

Este documento está dirigido a desarrolladores que deseen compilar e implementar con rapidez aplicaciones de IA generativa compatibles con RAG mediante herramientas y modelos de código abierto. Se supone que tienes experiencia con el uso de GKE y Cloud SQL, y que tienes una comprensión conceptual de la IA, el aprendizaje automático (AA) y los modelos de lenguaje grande (LLM). En este documento, no se proporciona guía sobre cómo diseñar y desarrollar una aplicación de IA generativa.

Arquitectura

En el siguiente diagrama, se muestra una vista de alto nivel de una arquitectura para una aplicación de IA generativa compatible con RG en Google Cloud:

Una arquitectura de alto nivel para una aplicación de IA generativa compatible con RAG en Google Cloud.

La arquitectura contiene un subsistema de entrega y un subsistema de incorporación.

  • El subsistema de entrega controla el flujo de solicitud y respuesta entre la aplicación y sus usuarios. El subsistema incluye un servidor de frontend, un servidor de inferencia y un servicio de IA responsable (RAI). El subsistema de entrega interactúa con el subsistema de incorporaciones a través de una base de datos vectorial.
  • El subsistema de incorporación habilita la capacidad RAG en la arquitectura. Este subsistema hace lo siguiente:
    • Transfiere datos desde fuentes de datos en Google Cloud, en entornos locales y otras plataformas en la nube.
    • Convierte los datos transferidos en incorporaciones vectoriales.
    • Almacena las incorporaciones en una base de datos vectorial.

En el siguiente diagrama, se muestra una vista detallada de la arquitectura:

Una arquitectura detallada para una aplicación de IA generativa compatible con RAG en Google Cloud.

Como se muestra en el diagrama anterior, el servidor de frontend, el servidor de inferencia y el servicio de incorporación se implementan en un clúster de GKE regional en modo Autopilot. Los datos para RAG se transfieren a través de un bucket de Cloud Storage. La arquitectura usa una instancia de Cloud SQL para PostgreSQL con la extensión pgvector como la base de datos vectorial para almacenar incorporaciones y realizar búsquedas semánticas. Las bases de datos vectoriales están diseñadas para almacenar y recuperar vectores de alta dimensión de forma eficiente.

En las siguientes secciones, se describen los componentes y el flujo de datos dentro de cada subsistema de la arquitectura.

Subsistema de incorporación

A continuación, se muestra el flujo de datos en el subsistema de incorporaciones:

  1. Los usuarios humanos o de manera programática suben los datos de fuentes internas y externas al bucket de Cloud Storage. Los datos subidos pueden estar en archivos, bases de datos o datos transmitidos.
  2. (No se muestra en el diagrama de arquitectura). La actividad de carga de datos activa un evento que se publica en un servicio de mensajería como Pub/Sub. El servicio de mensajería envía una notificación al servicio de incorporaciones.
  3. Cuando el servicio de incorporación recibe una notificación de un evento de carga de datos, hace lo siguiente:
    1. Recupera datos del bucket de Cloud Storage a través del controlador CSI de Cloud Storage FUSE.
    2. Lee los datos subidos y los procesa de forma previa con Ray Data. El procesamiento previo puede incluir la fragmentación de los datos y su transformación a un formato adecuado para la generación de incorporaciones.
    3. Ejecuta un trabajo de Ray para crear incorporaciones vectorizadas de los datos procesados previamente mediante un modelo de código abierto:intfloat/multilingual-e5-small que se implemente en el mismo clúster.
    4. Escribe las incorporaciones vectorizadas en la base de datos vectorial de Cloud SQL para PostgreSQL.

Como se describe en la siguiente sección, cuando el subsistema de entrega procesa solicitudes del usuario, usa las incorporaciones de la base de datos vectorial para recuperar datos específicos del dominio relevantes.

Subsistema de entrega

A continuación, se muestra el flujo de solicitud y respuesta en el subsistema de entrega:

  1. Un usuario envía una solicitud de lenguaje natural a un servidor frontend a través de una interfaz de chat basada en la Web. El servidor de frontend se ejecuta en GKE.
  2. El servidor frontend ejecuta un proceso LangChain que hace lo siguiente:
    1. Convierte la solicitud de lenguaje natural en incorporaciones mediante el uso del mismo modelo y parámetros que usa el servicio de incorporaciones.
    2. Recupera datos de fundamentación relevantes mediante una búsqueda semántica de las incorporaciones en la base de datos vectorial. La búsqueda semántica ayuda a encontrar incorporaciones basadas en la intención de una instrucción en lugar de su contenido textual.
    3. Construye un mensaje contextualizado mediante la combinación de la solicitud original con los datos de fundamentación que se recuperaron.
    4. Envía la instrucción contextualizada al servidor de inferencia, que se ejecuta en GKE.
  3. El servidor de inferencia usa el framework de entrega TGI de Hugging Face para entregar un LLM de código abierto comoMistral-7B-Instruct o un Modelo abierto de Gemma.
  4. El LLM genera una respuesta al mensaje y el servidor de inferencia envía la respuesta al servidor de frontend.

    Puedes almacenar y ver registros de la actividad de solicitud y respuesta en Cloud Logging, y puedes configurar la supervisión basada en registros mediante Cloud Monitoring. También puedes cargar las respuestas generadas en BigQuery para estadísticas sin conexión.

  5. El servidor frontend invoca un servicio de RAI para aplicar los filtros de seguridad necesarios a la respuesta. Puedes usar herramientas como la Sensitive Data Protection y la API de Cloud Natural Language para descubrir, filtrar, clasificar y desidentificar contenido sensible en las respuestas.

  6. El servidor de frontend envía la respuesta filtrada al usuario.

Productos usados

A continuación, se incluye un resumen de los productos de Google Cloud y de código abierto que usa la arquitectura anterior:

Productos de Google Cloud

  • Google Kubernetes Engine (GKE): Un servicio de Kubernetes que puedes usar para implementar y operar aplicaciones en contenedores a gran escala con la infraestructura de Google.
  • Cloud Storage: Un depósito de objetos de bajo costo y sin límites para varios tipos de datos. Se puede acceder a los datos desde y hacia Google Cloud, y estos se replican en las ubicaciones para aumentar la redundancia.
  • Cloud SQL: Un servicio de base de datos relacional completamente administrado que te ayuda a aprovisionar, operar y administrar tus bases de datos MySQL, PostgreSQL y SQL Server en Google Cloud.

Productos de código abierto

  • Inferencia de generación de texto facial (TGI): Un kit de herramientas para implementar y entregar LLM.
  • Ray: Un framework de procesamiento unificado de código abierto que te ayuda a escalar cargas de trabajo de IA y Python.
  • LangChain: Un framework para desarrollar e implementar aplicaciones con la tecnología de LLM.

Casos de uso

RAG es una técnica eficaz para mejorar la calidad del resultado que se genera a partir de un LLM. En esta sección, se proporcionan ejemplos de casos de uso para los que puedes usar aplicaciones de IA generativas compatibles con RAG.

Recomendaciones personalizadas de productos

Un sitio de compras en línea puede usar un chatbot con tecnología de LLM para ayudar a los clientes a encontrar productos o a obtener ayuda relacionada con las compras. Las preguntas de un usuario se pueden aumentar mediante el uso de datos históricos sobre el comportamiento de compra del usuario y los patrones de interacción con el sitio web. Los datos pueden incluir opiniones y comentarios de los usuarios que se almacenan en un almacén de datos no estructurado o métricas relacionadas con la búsqueda que se almacenan en un almacén de datos de estadísticas web. Luego, el LLM puede procesar la pregunta aumentada para generar respuestas personalizadas que el usuario podría considerar más atractivas y atractivas.

Sistemas de asistencia clínica

Los médicos en hospitales deben analizar y diagnosticar con rapidez el estado de la salud de un paciente para tomar decisiones sobre la atención y los medicamentos adecuados. Se puede usar una aplicación de IA generativa que use un LLM médico como Med-PaLM para ayudar a los médicos en su proceso de diagnóstico clínico. Las respuestas que genera la aplicación se pueden basar en registros históricos de pacientes mediante la contextualización de las instrucciones de los médicos con datos de la base de datos del historial clínico electrónico (HCE) del hospital o de una base de conocimiento externa, como PubMed.

La investigación legal impulsada por IA generativa permite a los abogados consultar con rapidez grandes volúmenes de leyes y jurisprudencia para identificar precedentes legales relevantes o resumir conceptos legales complejos. El resultado de esa investigación se puede mejorar mediante la mejora de las indicaciones de un abogado con datos que se recuperan del corpus patentado de contratos, la comunicación legal pasada y los registros de casos internos. Este enfoque de diseño garantiza que las respuestas generadas sean relevantes para el dominio legal en el que se especializa el abogado.

Consideraciones del diseño

En esta sección, se proporciona orientación para ayudarte a desarrollar y ejecutar una arquitectura de IA generativa compatible con RAG alojada en GKE que cumpla con tus requisitos específicos de seguridad y cumplimiento, confiabilidad, costo y rendimiento. La guía de esta sección no está completa. Según los requisitos específicos de tu aplicación y los productos y las funciones de Google Cloud que usas, es posible que debas considerar factores de diseño y compensaciones adicionales.

Para obtener orientación sobre el diseño relacionado con las herramientas de código abierto en esta arquitectura de referencia, como Hugging Face TGI, consulta la documentación de esas herramientas.

Security, privacy, and compliance

En esta sección, se describen los factores que debes tener en cuenta cuando diseñas y compilas una aplicación de IA generativa compatible con RAG en Google Cloud que cumpla con tus requisitos de seguridad, privacidad y cumplimiento.

Producto Consideraciones del diseño
GKE

En el modo de operación Autopilot, GKE preconfigura tu clúster y administra los nodos según las prácticas recomendadas de seguridad, lo que te permite enfocarte en la seguridad específica de la carga de trabajo. Para obtener más información, consulta lo siguiente:

Si deseas garantizar un control de acceso mejorado para tus aplicaciones que se ejecutan en GKE, puedes usar Identity-Aware Proxy (IAP). IAP se integra con el recurso Ingress de GKE y garantiza que solo los usuarios autenticados con la función correcta de administración de identidades y accesos (IAM) puedan acceder a las aplicaciones. Para obtener más información, consulta la página sobre cómo habilitar IAP para GKE.

De forma predeterminada, tus datos en GKE se encriptan en reposo y en tránsito mediante claves de encriptación administradas por Google. Como una capa adicional de seguridad para datos sensibles, puedes encriptar datos en la capa de aplicación mediante una clave que poseas y administres con Cloud KMS. Para obtener más información, consulta Encripta Secrets en la capa de la aplicación.

Si usas un clúster de GKE estándar, puedes usar las siguientes funciones adicionales de encriptación de datos:

Cloud SQL

No es necesario que se pueda acceder a la instancia de Cloud SQL en la arquitectura desde la Internet pública. Si se necesita acceso externo a la instancia de Cloud SQL, puedes encriptar conexiones externas mediante SSL/TLS o el conector Proxy de Cloud SQL Auth. El conector del proxy de autenticación proporciona autorización de conexión mediante IAM. El conector usa una conexión TLS 1.3 con un algoritmo de cifrado AES de 256 bits para verificar las identidades del cliente y del servidor, y encriptar el tráfico de datos. Para las conexiones creadas con Java, Python, Go o Node.js, usa el Conector de lenguaje adecuado en lugar del conector del proxy de autenticación.

De forma predeterminada, Cloud SQL usa claves de encriptación de datos (DEK) administradas por Google y claves de encriptación de claves (KEK) para encriptar datos en reposo. Si necesitas usar las KEK que controlas y administras, puedes usar claves de encriptación administradas por el cliente (CMEK).

Para evitar el acceso no autorizado a la API de Cloud SQL Admin, puedes crear un perímetro de servicio mediante los Controles del servicio de VPC.

Si deseas obtener información para configurar Cloud SQL para cumplir con los requisitos de residencia de datos, consulta Descripción general de la residencia de datos.

Cloud Storage

De forma predeterminada, los datos que se almacenan en Cloud Storage se encriptan mediante claves de encriptación administradas por Google. Si es necesario, puedes usar CMEK o tus propias claves que administres mediante un método de administración externo, como las claves de encriptación proporcionadas por el cliente (CSEKs). Para obtener más información, consulta Opciones de encriptación de datos.

Cloud Storage admite dos sistemas para controlar el acceso de los usuarios a tus buckets y objetos: IAM y las listas de control de acceso (LCA). En la mayoría de los casos, recomendamos usar IAM, que te permite otorgar permisos a nivel de proyecto y de bucket. Para obtener más información, consulta Descripción general del control de acceso.

Los datos que cargas en el subsistema de transferencia de datos a través de Cloud Storage pueden incluir datos sensibles. Para proteger estos datos, puedes usar la Protección de datos sensibles para descubrir, clasificar y desidentificar los datos. Para obtener más información, consulta Usa la protección de datos sensibles con Cloud Storage.

Para mitigar el riesgo de robo de datos de Cloud Storage, puedes crear un perímetro de servicio mediante los Controles del servicio de VPC.

Cloud Storage te ayuda a cumplir con los requisitos de residencia de datos. Los datos se almacenan o replican dentro de las regiones que especifiques.

Todos los productos de esta arquitectura

Los registros de auditoría de actividad del administrador están habilitados de forma predeterminada para todos los servicios de Google Cloud que se usan en esta arquitectura de referencia. Puedes acceder a los registros a través de Cloud Logging y usarlos para supervisar las llamadas a la API y otras acciones que modifiquen la configuración o los metadatos de los recursos de Google Cloud.

Los registros de auditoría de acceso a los datos también están habilitados de forma predeterminada para todos los servicios de Google Cloud en esta arquitectura. Puedes usar estos registros para supervisar lo siguiente:

  • Llamadas a la API que leen la configuración o los metadatos de los recursos.
  • Solicitudes del usuario para crear, modificar o leer datos de los recursos que proporciona el usuario.

Para obtener orientación general sobre los principios de seguridad que debes tener en cuenta para las aplicaciones de IA, consulta Introducción al framework de IA segura de Google.

Confiabilidad

En esta sección, se describen los factores de diseño que debes tener en cuenta para compilar y operar una infraestructura confiable para una aplicación de IA generativa compatible con RAG en Google Cloud.

Producto Consideraciones del diseño
GKE

Con el modo de operación Autopilot que se usa en esta arquitectura, GKE proporciona las siguientes capacidades de confiabilidad integradas:

  • Tu carga de trabajo usa un clúster de GKE regional. El plano de control y los nodos trabajadores se distribuyen en tres zonas diferentes dentro de una región. Tus cargas de trabajo son sólidas contra las interrupciones zonales. Los clústeres de GKE regionales tienen un ANS de tiempo de actividad más alto que los clústeres zonales.
  • No es necesario crear nodos ni administrar grupos de nodos. GKE crea automáticamente los grupos de nodos y los escala de forma automática según los requisitos de tus cargas de trabajo.

Para garantizar que haya suficiente capacidad de GPU disponible cuando sea necesario para el ajuste de escala automático en el clúster de GKE, puedes crear y usar reservas. Una reserva proporciona capacidad garantizada en una zona específica para un recurso específico. Una reserva puede ser específica de un proyecto o compartirse en varios proyectos. Se generarán cargos por los recursos reservados, incluso si no se aprovisionan ni se usan los recursos. Para obtener más información, consulta Consume recursos zonales reservados.

Cloud SQL

Para asegurarte de que la base de datos vectorial sea sólida ante fallas de la base de datos y interrupciones zonales, usa una instancia de Cloud SQL configurada con HA. En caso de que se produzca una falla de la base de datos principal o una interrupción zonal, Cloud SQL realiza una conmutación por error automática a la base de datos en espera en otra zona. No es necesario cambiar la dirección IP para el extremo de la base de datos.

Para asegurarte de que tus instancias de Cloud SQL estén cubiertas por el ANS, sigue los lineamientos operativos recomendados. Por ejemplo, asegúrate de que la CPU y la memoria tengan el tamaño adecuado para la carga de trabajo y habilita los aumentos automáticos de almacenamiento. Para obtener más información, consulta los Lineamientos operativos.

Cloud Storage Puedes crear buckets de Cloud Storage en uno de los tres tipos de ubicación: regional, birregional o multirregión. Los datos que se almacenan en buckets regionales se replican de forma síncrona en varias zonas dentro de una región. Para obtener una mayor disponibilidad, puedes usar buckets birregionales o multirregionales, en los que los datos se replican de manera asíncrona en todas las regiones.

Optimización de costos

En esta sección, se proporciona orientación para ayudarte a optimizar el costo de configurar y operar una aplicación de IA generativa compatible con RAG en Google Cloud.

Producto Consideraciones del diseño
GKE

En el modo Autopilot, GKE optimiza la eficiencia de la infraestructura de tu clúster según los requisitos de carga de trabajo. No necesitas supervisar constantemente el uso de recursos ni administrar la capacidad para controlar los costos.

Si puedes predecir el uso de almacenamiento efímero, memoria y CPU de tu clúster de GKE Autopilot, puedes ahorrar dinero mediante la obtención de descuentos por compromiso de uso. Para obtener más información, consulta Descuentos por compromiso de uso de GKE.

Para reducir el costo de ejecución de tu aplicación, puedes usar las VMs Spot para tus nodos de GKE. Las VMs Spot tienen un precio menor que las VMs estándar, pero no proporcionan garantía de disponibilidad. Para obtener información sobre los beneficios de los nodos que usan VMs Spot, cómo funcionan en GKE y cómo programar cargas de trabajo en esos nodos, consulta VMs Spot.

Si quieres obtener más orientación sobre la optimización de costos, consulta Prácticas recomendadas para ejecutar aplicaciones de Kubernetes con optimización de costos en GKE.

Cloud SQL

Una configuración de alta disponibilidad (HA) ayuda a reducir el tiempo de inactividad de tu base de datos de Cloud SQL cuando la zona o la instancia deja de estar disponible. Sin embargo, el costo de una instancia configurada con HA es mayor que el de una instancia independiente. Si no necesitas alta disponibilidad para la base de datos vectorial, puedes reducir los costos mediante el uso de una instancia independiente, que no es sólida contra las interrupciones zonales.

Puedes detectar si tu instancia de Cloud SQL está aprovisionada en exceso y optimizar la facturación mediante las estadísticas y recomendaciones de costos de Cloud SQL con la tecnología de Active Assist. Para obtener más información, consulta Reduce las instancias de Cloud SQL aprovisionadas en exceso.

Si puedes predecir los requisitos de CPU y memoria de tu instancia de Cloud SQL, puedes ahorrar dinero mediante la obtención de descuentos por compromiso de uso. Para obtener más información, consulta Descuentos por compromiso de uso de Cloud SQL.

Cloud Storage Para el bucket de Cloud Storage que usas para cargar datos en el subsistema de transferencia de datos, elige una clase de almacenamiento adecuada. Cuando elijas la clase de almacenamiento, ten en cuenta los requisitos de retención de datos y frecuencia de acceso de tus cargas de trabajo. Por ejemplo, para controlar los costos de almacenamiento, puedes elegir la clase Standard y usar Administración del ciclo de vida de los objetos. Esto permite cambiar de forma automática a una versión inferior de objetos a una clase de almacenamiento de menor costo o a borrar objetos según las condiciones que establezcas.

Para estimar el costo de tus recursos de Google Cloud, usa la calculadora de precios de Google Cloud.

Optimización del rendimiento

En esta sección, se describen los factores que debes tener en cuenta cuando diseñas y compilas una aplicación de IA generativa compatible con RAG en Google Cloud que cumpla con tus requisitos de rendimiento.

Producto Consideraciones del diseño
GKE Elige las clases de procesamiento adecuadas para tus Pods según los requisitos de rendimiento de las cargas de trabajo. Para los Pods que ejecutan el servidor de inferencia y el servicio de incorporaciones, te recomendamos que uses un tipo de máquina de GPU como nvidia-l4.
Cloud SQL

Si quieres optimizar el rendimiento de la instancia de Cloud SQL, asegúrate de que la CPU y la memoria asignadas a la instancia sean adecuadas para la carga de trabajo. Para obtener más información, consulta Optimiza las instancias de Cloud SQL con aprovisionamiento insuficiente.

Para mejorar el tiempo de respuesta de la búsqueda vectorial de vecino más cercano aproximado (ANN), usa el Archivo invertido con compresión plana (IVFFlat) index o el índice Hierarchical Navigable Small World (HNSW)

Para ayudarte a analizar y mejorar el rendimiento de las consultas de las bases de datos, Cloud SQL proporciona una herramienta de estadísticas de consultas. Puedes usar esta herramienta para supervisar el rendimiento y realizar un seguimiento de la fuente de una consulta problemática. Si deseas obtener más información, consulta Usa las estadísticas de consultas para mejorar el rendimiento de las consultas.

Para obtener una descripción general del estado y el rendimiento de las bases de datos y ver métricas detalladas, como las conexiones máximas y el uso del disco, puedes usar el panel de estadísticas del sistema. Si deseas obtener más información, consulta Cómo usar las estadísticas del sistema para mejorar el rendimiento del sistema.

Cloud Storage Para subir archivos grandes, puedes usar un método llamado cargas compuestas en paralelo. Con esta estrategia, el archivo grande se divide en fragmentos. Los fragmentos se suben a Cloud Storage en paralelo y, luego, los datos se recomponen en la nube. Cuando el ancho de banda de la red y la velocidad del disco no son factores limitantes, las cargas compuestas paralelas pueden ser más rápidas que las operaciones de carga normales. Sin embargo, esta estrategia tiene algunas implicaciones de costos y limitaciones. Para obtener más información, consulta la sección sobre cargas compuestas paralelas.

Deployment

Para implementar una topología basada en esta arquitectura de referencia, puedes descargar y usar el código de muestra de código abierto que está disponible en un repositorio en GitHub. El código de muestra no está diseñado para casos de uso de producción. Puedes usar el código para experimentar con la configuración de la infraestructura de IA para una aplicación de IA generativa habilitada para RAG.

El código de muestra hace lo siguiente:

  1. Aprovisiona una instancia de Cloud SQL para PostgreSQL que funcione como base de datos vectorial
  2. Implementa Ray, JupyterHub y Hugging Face TGI en un clúster de GKE que especifiques.
  3. Implementa una aplicación de chatbot basada en la Web de muestra en tu clúster de GKE para que puedas verificar la capacidad de RAG.

Si deseas obtener instrucciones para usar el código de muestra, consulta el archivo README para el código. Si se produce algún error cuando usas el código de muestra y los problemas de GitHub abiertos no existen para los errores, crea problemas en GitHub.

El código de muestra implementa recursos facturables de Google Cloud. Cuando termines de usar el código, quita los recursos que ya no necesites.

¿Qué sigue?

Colaboradores

Autor: Kumar Dhanagopal | Desarrollador de soluciones entre productos

Otros colaboradores: