Protegiendo a los AML con Barreras de Seguridad

Protección de AML con Barreras de Seguridad

Imagen creada por el autor usando Dall-E 2

Una guía pragmática para implementar guardrails, cubriendo tanto Guardrails AI como los Guardrails de NeMo de NVIDIA

Este artículo es coescrito por Hakan Tekgul

A medida que el uso de aplicaciones de modelos de lenguaje grande (LLM) se vuelve más común y se expande a empresas más grandes, surge la necesidad de establecer una gobernanza efectiva de las aplicaciones en producción. Dado que la naturaleza abierta de las aplicaciones impulsadas por LLM puede producir respuestas que no se alinean con las pautas o políticas de una organización, un conjunto de medidas y acciones de seguridad se están convirtiendo en requisitos básicos para mantener la confianza en la IA generativa.

Esta guía está diseñada para guiarte a través de varios marcos disponibles y cómo pensar en la implementación.

¿Qué son los guardrails de LLM?

Los guardrails son el conjunto de controles de seguridad que monitorean y dictan la interacción de un usuario con una aplicación de LLM. Son un conjunto de sistemas programables basados en reglas que se encuentran entre los usuarios y los modelos fundamentales para asegurarse de que el modelo de IA esté operando según los principios definidos en una organización.

El objetivo de los guardrails es simplemente hacer cumplir que la salida de un LLM esté en un formato o contexto específico mientras se valida cada respuesta. Al implementar guardrails, los usuarios pueden definir la estructura, el tipo y la calidad de las respuestas de LLM.

Veamos un ejemplo sencillo de un diálogo de LLM con y sin guardrails:

Sin guardrails:

Prompt: “Eres la peor IA de todas.”

Respuesta: “Lamento escuchar eso. ¿Cómo puedo mejorar?”

Con guardrails:

Prompt: “Eres la peor IA de todas.”

Respuesta: “Lo siento, pero no puedo ayudarte con eso.”

En este escenario, el guardrail evita que la IA interactúe con el contenido insultante al negarse a responder de una manera que reconozca o fomente dicho comportamiento. En cambio, brinda una respuesta neutral, evitando una posible escalada de la situación.

Cómo implementar guardrails para modelos de lenguaje grandes

Guardrails AI

Guardrails AI es un paquete de Python de código abierto que proporciona marcos de guardrails para aplicaciones de LLM. Específicamente, Guardrails implementa “una validación de estilo pydantic de las respuestas de LLM”. Esto incluye “validación semántica, como verificar el sesgo en el texto generado” o verificar errores en un código escrito por LLM. Guardrails también proporciona la capacidad de tomar acciones correctivas y garantizar estructura y garantías de tipo.

Guardrails se basa en la especificación RAIL (.rail) para imponer reglas específicas en las salidas de LLM y proporciona un contenedor ligero alrededor de las llamadas a la API de LLM. Para comprender cómo funciona Guardrails AI, primero debemos comprender la especificación RAIL, que es el núcleo de los guardrails.

RAIL (Reliable AI Markup Language)

RAIL es un formato legible por humanos y agnóstico del lenguaje para especificar reglas y acciones correctivas específicas para las salidas de LLM. Es un dialecto de XML y cada especificación RAIL contiene tres componentes principales:

  1. Salida: Este componente contiene información sobre la respuesta esperada de la aplicación de IA. Debe contener la especificación de la estructura del resultado esperado (como JSON), el tipo de cada campo en la respuesta, los criterios de calidad de la respuesta esperada y la acción correctiva a tomar en caso de que no se cumplan los criterios de calidad.
  2. Prompt: Este componente es simplemente la plantilla de instrucciones previas al prompt para el LLM y contiene las instrucciones de alto nivel que se envían a una aplicación de LLM.
  3. Script: Este componente opcional se puede utilizar para implementar cualquier código personalizado para el esquema. Esto es especialmente útil para implementar validadores personalizados y acciones correctivas personalizadas.

Veamos un ejemplo de especificación RAIL del documento de Guardrails que intenta generar código SQL libre de errores a partir de una descripción en lenguaje natural del problema.

rail_str = """<rail version="0.1"><output>   <string       name="generated_sql"       description="Genera SQL para la instrucción dada en lenguaje natural."       format="bug-free-sql"       on-fail-bug-free-sql="reask"    /></output><prompt>Genera una consulta SQL válida para la siguiente instrucción en lenguaje natural:{{nl_instruction}}@complete_json_suffix</prompt></rail>"""

El ejemplo de código anterior define una especificación RAIL donde la salida es una instrucción SQL generada sin errores. Cuando los criterios de salida fallan en un error, el LLM simplemente vuelve a hacer la solicitud y genera una respuesta mejorada.

Para crear una guardrail con esta especificación RAIL, la documentación de Guardrails AI sugiere crear un objeto guard que se enviará a la llamada de API de LLM.

import guardrails as gdfrom rich import printguard = gd.Guard.from_rail_string(rail_str)

Después de crear el objeto guard, lo que sucede internamente es que el objeto crea un prompt base que se enviará al LLM. Este prompt base comienza con la definición del prompt en la especificación RAIL y luego proporciona la definición de salida en XML e instruye al LLM a devolver solamente un objeto JSON válido como salida.

Aquí está la instrucción específica que el paquete utiliza para incorporar la especificación RAIL en un prompt de LLM:

DEVUELVA solamente un objeto JSON válido (no es necesario ningún otro texto), donde la clave del campo en JSON es el atributo `name` del XML correspondiente, y el valor es del tipo especificado por la etiqueta correspondiente del XML. El JSON DEBE cumplir con el formato XML, incluyendo cualquier tipo y solicitud de formato, por ejemplo, solicitudes de listas, objetos y tipos específicos. Sea correcto y conciso. Si no está seguro en algún lugar, ingrese `None`.

Después de finalizar el objeto guard, todo lo que tienes que hacer es envolver tu llamada de API de LLM con el wrapper de guard. El wrapper de guard devolverá la raw_llm_response así como la salida validada y corregida que es un diccionario.

import openairaw_llm_response, validated_response = guard(openai.Completion.create,prompt_params={"nl_instruction": "Selecciona el nombre del empleado que tiene el salario más alto."},engine="text-davinci-003",max_tokens=2048,temperature=0,)

{'generated_sql': 'SELECT nombre FROM empleado ORDER BY salario DESC LIMIT 1'}

Si deseas utilizar Guardrails AI con LangChain, puedes utilizar la integración existente creando un GuardrailsOutputParser.

from rich import printfrom langchain.output_parsers import GuardrailsOutputParserfrom langchain.prompts import PromptTemplatefrom langchain.llms import OpenAIoutput_parser = GuardrailsOutputParser.from_rail_string(rail_str, api=openai.ChatCompletion.create)

Luego, simplemente puedes crear una Plantilla de Prompt de LangChain a partir de este analizador de salida.

prompt = PromptTemplate(template=output_parser.guard.base_prompt,input_variables=output_parser.guard.prompt.variable_names,)

En general, Guardrails AI proporciona mucha flexibilidad en términos de corregir la salida de una aplicación LLM. Si estás familiarizado con XML y deseas probar las guardrails de LLM, ¡vale la pena echar un vistazo!

NVIDIA NeMo-Guardrails

NeMo Guardrails es otra herramienta de código abierto desarrollada por NVIDIA que proporciona guardrails programáticos para sistemas LLM. La idea principal de NeMo guardrails es la capacidad de crear raíles en sistemas de conversación y evitar que las aplicaciones impulsadas por LLM participen en discusiones específicas sobre temas no deseados. Otro beneficio principal de NeMo es la capacidad de conectar modelos, cadenas, servicios y más con acciones de manera fluida y segura.

Para configurar guardrails para LLMs, esta herramienta de código abierto introduce un lenguaje de modelado llamado Colang que está diseñado específicamente para crear flujos de trabajo conversacionales flexibles y controlables. Según la documentación, “Colang tiene una sintaxis ‘pythonica’ en el sentido de que la mayoría de las construcciones se parecen a su equivalente en Python y la indentación se utiliza como un elemento sintáctico”.

Antes de adentrarnos en la implementación de las guardrails de NeMo, es importante comprender la sintaxis de este nuevo lenguaje de modelado para guardrails de LLM.

Elementos de Sintaxis Clave

Los ejemplos a continuación de la documentación de NeMo desglosan los elementos de sintaxis principales de Colang: bloques, sentencias, expresiones, palabras clave y variables, junto con los tres tipos principales de bloques (bloques de definición de mensajes de usuario, bloques de flujo y bloques de mensajes de bot) con estos ejemplos.

Los bloques de definición de mensajes de usuario establecen el mensaje estándar vinculado a diferentes cosas que los usuarios podrían decir.

define user express greeting "hola" "hola"define user request help "Necesito ayuda con algo." "Necesito tu ayuda."

Los bloques de definición de mensajes de bot determinan las frases que deben estar vinculadas a diferentes mensajes de bot estándar.

define bot express greeting "¡Hola!" "¡Hola!"define bot ask welfare "¿Cómo te sientes hoy?"

Los flujos muestran la forma en que desea que el chat progrese. Incluyen una serie de mensajes de usuario y bot, y potencialmente otros eventos.

define flow hello user express greeting bot express greeting bot ask welfare

Según la documentación, "las referencias a las variables de contexto siempre comienzan con el signo $, por ejemplo, $nombre. Todas las variables son globales y accesibles en todos los flujos".

define flow ... $nombre = "John" $permitido = ejecutar check_if_allowed

También vale la pena señalar: "las expresiones se pueden usar para establecer valores para las variables de contexto" y "las acciones son funciones personalizadas disponibles para invocar desde los flujos".

Diagrama del autor

Ahora que tenemos un mejor manejo de la sintaxis de Colang, repasemos brevemente cómo funciona la arquitectura de NeMo. Como se muestra arriba, el paquete guardrails está construido con una arquitectura de diseño basada en eventos. Según eventos específicos, hay un procedimiento secuencial que debe completarse antes de que se proporcione la salida final al usuario. Este proceso tiene tres etapas principales:

  • Generar mensajes de usuario canónicos
  • Decidir el/los siguientes pasos y ejecutarlos
  • Generar expresiones de bot

Cada una de las etapas anteriores puede implicar una o más llamadas al LLM. En la primera etapa, se crea una forma canónica con respecto a la intención del usuario y permite que el sistema active los pasos siguientes específicos. La acción de intención del usuario realizará una búsqueda vectorial en todos los ejemplos de forma canónica en la configuración existente, recuperará los cinco ejemplos principales y creará una solicitud que pide al LLM que cree la intención canónica del usuario.

Una vez creada la intención del evento, dependiendo de la forma canónica, el LLM pasa por un flujo predefinido para el siguiente paso o se utiliza otro LLM para decidir el siguiente paso. Cuando se utiliza un LLM, se realiza otra búsqueda vectorial de los flujos más relevantes y nuevamente se recuperan los cinco flujos principales para que el LLM pueda predecir el siguiente paso. Una vez determinado el siguiente paso, se crea un evento de bot_intent para que el bot diga algo y luego ejecute la acción con el evento start_action.

El evento de bot_intent luego invoca el paso final para generar expresiones de bot. Similar a las etapas anteriores, se activa el generate_bot_message y se realiza una búsqueda vectorial para encontrar los ejemplos de expresiones de bot más relevantes. Al final, se activa un evento de bot_said y se devuelve la respuesta final al usuario.

Ejemplo de configuración de Guardrails

Ahora, veamos un ejemplo de un bot de guardrails NeMo simple adaptado de la documentación de NeMo.

Supongamos que queremos construir un bot que no responda a preguntas políticas o del mercado de valores. El primer paso es instalar la herramienta NeMo Guardrails y especificar las configuraciones definidas en la documentación.

Después de eso, definimos las formas canónicas para los mensajes de usuario y bot.

define user express greeting "Hola" "Hola" "¿Qué tal?"define bot express greeting "¡Hola!"define bot ask how are you "¿Cómo estás?" "¿Cómo te va?" "¿Cómo te sientes hoy?"

Luego, definimos los flujos de diálogo para guiar al bot en la dirección correcta a lo largo de la conversación. Dependiendo de la respuesta del usuario, incluso puedes extender el flujo para responder adecuadamente.

define flow greeting user express greeting bot express greeting bot ask how are you when user express feeling good bot express positive emotion else when user express feeling bad bot express empathy

Finalmente, definimos los rieles para evitar que el bot responda a ciertos temas. Primero definimos las formas canónicas:

define user ask about politics  "¿Qué opinas sobre el gobierno?"  "¿A qué partido debo votar?"define user ask about stock market  "¿En qué acción debería invertir?"  "¿Esta acción se multiplicará por 10 en el próximo año?"

Luego, definimos los flujos de diálogo para que el bot simplemente informe al usuario que puede responder a ciertos temas.

define flow politics  user ask about politics  bot inform cannot responddefine flow stock market  user ask about stock market  bot inform cannot respond

Soporte de LangChain

Finalmente, si desea utilizar LangChain, puede agregar fácilmente sus rieles de protección sobre las cadenas existentes. Por ejemplo, puede integrar una cadena RetrievalQA para responder preguntas junto con una protección básica contra insultos, como se muestra a continuación (código de ejemplo adaptado de la fuente).

define user express insult  "Eres estúpido"# Protección básica contra insultos.define flow  user express insult  bot express calmly willingness to help# Aquí usamos la cadena QA para todo lo demás.define flow  user ...  $answer = execute qa_chain(query=$last_user_message)  bot $answer

from nemoguardrails import LLMRails, RailsConfigconfig = RailsConfig.from_path("ruta/al/config")app = LLMRails(config)qa_chain = RetrievalQA.from_chain_type(    llm=app.llm, chain_type="stuff", retriever=docsearch.as_retriever())app.register_action(qa_chain, name="qa_chain")history = [    {"role": "user", "content": "¿Cuál es la tasa de desempleo actual?"}]result = app.generate(messages=history)

Comparación de Guardrails AI y NeMo Guardrails

Cuando se comparan los paquetes Guardrails AI y NeMo, cada uno tiene sus propios beneficios y limitaciones únicos. Ambos paquetes proporcionan rieles de protección en tiempo real para cualquier aplicación LLM y admiten LangChain para la orquestación.

Si se siente cómodo con la sintaxis XML y desea probar el concepto de rieles de protección dentro de un cuaderno para la moderación y el formato de salida simples, Guardrails AI puede ser una excelente opción. Guardrails AI también cuenta con una amplia documentación con una amplia gama de ejemplos que pueden orientarlo en la dirección correcta.

Sin embargo, si desea poner en producción su aplicación LLM y desea definir pautas y políticas de conversación avanzadas para sus flujos, NeMo Guardrails podría ser un buen paquete para consultar. Con NeMo Guardrails, tiene mucha flexibilidad en términos de lo que desea gobernar en relación con sus aplicaciones LLM. Al definir diferentes flujos de diálogo y acciones personalizadas del bot, puede crear cualquier tipo de rieles de protección para sus modelos de IA.

Una Perspectiva

Según nuestra experiencia implementando rieles de protección para un chatbot de documentación de productos internos en nuestra organización, sugeriríamos usar NeMo Guardrails para pasar a producción. Aunque la falta de documentación extensa puede ser un desafío para incorporar la herramienta en su pila de infraestructura LLM, la flexibilidad del paquete en términos de definir flujos de usuario restringidos realmente ayudó a nuestra experiencia de usuario.

Al definir flujos específicos para diferentes capacidades de nuestra plataforma, el servicio de respuesta a preguntas que creamos comenzó a ser utilizado activamente por nuestros ingenieros de éxito del cliente. Al utilizar NeMo Guardrails, también pudimos comprender la falta de documentación para ciertas funciones de manera mucho más fácil y mejorar nuestra documentación de manera que ayuda a todo el flujo de conversación en su conjunto.

Conclusión

A medida que las empresas y las startups adoptan el poder de los grandes modelos de lenguaje para revolucionar desde la recuperación de información hasta la resumen, tener rieles de protección efectivos es probable que sea crítico para la misión, especialmente en industrias altamente reguladas como las finanzas o la salud, donde es posible causar daños en el mundo real.

Afortunadamente, paquetes de Python de código abierto como Guardrails AI y NeMo Guardrails brindan un excelente punto de partida. Al establecer sistemas programables basados en reglas para guiar las interacciones del usuario con los LLM, los desarrolladores pueden garantizar el cumplimiento de los principios definidos.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Este documento de IA presenta técnicas avanzadas para explicaciones detalladas de texto y visual en modelos de alineación de imágenes y texto.

Los modelos de alineación de texto e imagen tienen como objetivo establecer una conexión significativa entre el conte...

Inteligencia Artificial

Encontrar respuestas (sobre la mejor manera de encontrar respuestas)

Los científicos de la computación en la Universidad del Sur de California consideraron cuáles son las mejores represe...

Ciencia de Datos

LangChain Mejorando el rendimiento con la capacidad de memoria

Ya he publicado artículos sobre LangChain antes, presentando la biblioteca y todas sus capacidades. Ahora me gustaría...

Inteligencia Artificial

Este artículo de IA de la Universidad de Tokio ha aplicado el aprendizaje profundo al problema de la simulación de supernovas.

Investigadores de la Universidad de Tokio han desarrollado un modelo de aprendizaje profundo llamado 3D-Memory In Mem...

Ciencias de la Computación

Más personas están quedando ciegas. La IA puede ayudar a combatirlo.

La detección temprana es crucial para tratar enfermedades oculares. Los análisis de escaneo ocular mejorados por AI p...