Si bien la IA generativa se está adoptando rápidamente, todavía existe un gran potencial para crear productos aplicando esta herramienta en datos que presentan requisitos más estrictos, con el fin de garantizar que sigan siendo privados y confidenciales.
Por ejemplo, se podría aplicar la IA generativa en los siguientes casos:
En ciertas aplicaciones como estas, puede haber requisitos más estrictos con respecto a la privacidad o confidencialidad, la transparencia y la verificabilidad externa del procesamiento de datos.
Google desarrolló una serie de tecnologías que puedes usar para comenzar a experimentar y explorar el potencial de la IA generativa a la hora de procesar datos cuya privacidad debe mantenerse más controlada. En esta entrada, explicaremos cómo puedes usar el proyecto de código abierto GenC, que se lanzó recientemente, para combinar Confidential Computing, los modelos de código abierto de Gemma y las plataformas móviles si quieres comenzar a experimentar con la creación de tus propias apps de IA generativa que puedan manejar datos con requisitos más estrictos con respecto a la privacidad o confidencialidad, la transparencia y la verificabilidad externa.
La situación en la que nos centraremos en esta entrada, que ilustraremos a continuación, involucra una dispositivos móviles que tiene acceso a datos en el dispositivo y desea procesar la IA generativa en estos datos utilizando un LLM.
Por ejemplo, imagina una app de asistente personal a la que se le pide que resuma o responda una pregunta sobre notas, un documento o una grabación guardada en el dispositivo. El contenido puede incluir información privada, como mensajes con otra persona, por lo que queremos asegurarnos de que siga siendo privada.
En nuestro ejemplo, elegimos la familia de modelos de código abierto de Gemma. Ten en cuenta que, si bien nos centramos aquí en una app para dispositivos móviles, los mismos principios se aplican a las empresas que alojan sus propios datos en sus instalaciones.
Este ejemplo muestra una configuración "híbrida" que involucra dos LLM: uno que se ejecuta localmente en el dispositivo del usuario y otro alojado en los entornos de ejecución confiable (TEE) de Confidential Space de Google Cloud, con tecnología de Confidential Computing. Esta arquitectura híbrida permite que la app para dispositivos móviles aproveche tanto los recursos disponibles en el dispositivo como en la nube para beneficiarse de las ventajas únicas que ofrecen ambos:
En nuestro ejemplo, los dos modelos trabajan juntos, conectados en una cascada de modelos en la que Gemma 2B, más pequeño, barato y rápido, sirve como primer nivel y maneja consultas más simples, mientras que Gemma 7B, más grande, sirve como respaldo para consultas que el primero no puede manejar por sí solo. Por ejemplo, en el fragmento de código más adelante, configuramos Gemma 2B para que actúe como enrutador en el dispositivo que primero analiza cada consulta de entrada a fin de decidir cuál de los dos modelos es el más apropiado, y luego, en función del resultado, procede a manejar la consulta localmente en el dispositivo, o la transmite a Gemma 7B, que se aloja en un TEE basado en la nube.
Se podría decir que el TEE en la nube en esta arquitectura es como una extensión lógica del dispositivo móvil del usuario, impulsado por la transparencia, las garantías criptográficas y el hardware confiable:
A primera vista, esta configuración puede parecer compleja. De hecho, lo sería si fuera necesario configurar todo completamente desde cero. Desarrollamos GenC precisamente para facilitar el proceso.
Este es el ejemplo de código que realmente tendrías que escribir para configurar un escenario como el anterior en GenC. Aquí usamos Python como opción popular, aunque también ofrecemos API de creación de Java y C++. En este ejemplo, utilizamos la presencia de un tema más sensible como una señal de que un modelo más potente (que sea capaz de elaborar una respuesta más cuidadosa) debe manejar la consulta. Ten en cuenta que se simplificó este ejemplo con fines ilustrativos. En la práctica, la lógica de enrutamiento podría ser más elaborada y centrarse más en la aplicación, y se requiere de una cuidadosa ingeniería rápida para lograr un buen rendimiento, especialmente con modelos más pequeños.
@genc.authoring.traced_computation
def cascade(x):
gemma_2b_on_device = genc.interop.llamacpp.model_inference(
'/device/llamacpp', '/gemma-2b-it.gguf', num_threads=16, max_tokens=64)
gemma_7b_in_a_tee = genc.authoring.confidential_computation[
genc.interop.llamacpp.model_inference(
'/device/llamacpp', '/gemma-7b-it.gguf', num_threads=64, max_tokens=64),
{'server_address': /* server address */, 'image_digest': /* image digest */ }]
router = genc.authoring.serial_chain[
genc.authoring.prompt_template[
"""Read the following input carefully: "{x}".
Does it touch on political topics?"""],
gemma_2b_on_device,
genc.authoring.regex_partial_match['does touch|touches']]
return genc.authoring.conditional[
gemma_2b_on_device(x), gemma_7b_in_a_tee(x)](router(x))
Puedes ver un desglose detallado paso a paso de cómo crear y ejecutar dichos ejemplos en nuestros tutoriales en GitHub. Como puedes ver, el nivel de abstracción coincide con lo que puedes encontrar en SDK populares como LangChain. Las llamadas de inferencia de modelo a Gemma 2B y 7B se intercalan aquí con plantillas de solicitud y analizadores de salida, y se combinan en cadenas (por cierto, ofrecemos una interoperabilidad limitada de LangChain que esperamos expandir).
Ten en cuenta que, si bien la llamada de inferencia del modelo Gemma 2B se utiliza directamente dentro de una cadena que se ejecuta en el dispositivo, la llamada de Gemma 7B está explícitamente integrada dentro de una sentencia confidential_computation
.
El punto es que no hay sorpresas: el programador siempre tiene el control total de la decisión de qué procesamiento realizar en el dispositivo y qué delegar del dispositivo a un TEE en la nube. Esta decisión se refleja explícitamente en la estructura del código (ten en cuenta que en este ejemplo, solo delegamos las llamadas de Gemma 7B a un único backend confiable, el mecanismo que proporcionamos es genérico y se puede usar para delegar fragmentos más grandes de procesamiento, como un bucle de agente completo, a un número arbitrario de backends).
Mientras que el código que se muestra arriba se expresa utilizando una sintaxis de Python familiar, en el nivel subyacente se está transformando en lo que llamamos una plataforma portátil y una forma independiente del lenguaje, a la que nos referimos como la representación intermedia (o "IR" para abreviar).
Este enfoque ofrece una serie de ventajas, como las siguientes:
En implementaciones realistas, el rendimiento suele ser un factor crítico. Nuestros ejemplos publicados en este momento se limitan a un solo CPU, y GenC actualmente solo ofrece llama.cpp como controlador para modelos en un TEE. Sin embargo, el equipo de Confidential Computing amplía el soporte a Intel TDX con el acelerador incorporado Intel AMX junto con la próxima versión preliminar de las GPU Nvidia H100, que se ejecutan en modo confidencial. Estamos trabajando activamente para ampliar la gama de opciones de software y hardware disponibles, a fin de lograr el mejor rendimiento y soporte para una variedad más amplia de modelos. ¡Presta atención a las próximas actualizaciones!
Esperamos haber despertado tu curiosidad y que esta entrada del blog te anime a experimentar con la creación de tus propias apps de IA generativa utilizando algunas de las tecnologías que presentamos. Y en ese sentido, ten en cuenta que GenC es un marco de trabajo experimental, desarrollado con fines experimentales y de investigación: lo creamos para demostrar lo que puedes hacer y para inspirarte a que explores este emocionante espacio con nosotros. Si deseas contribuir, comunícate con los autores o simplemente comunícate con nosotros en GitHub. ¡Nos encanta colaborar!