Técnico

Cómo mejorar las conversaciones de Llama2 con las barandillas NeMo: una guía práctica

Share

Introducción

Barandas Emo es un conjunto de herramientas de código abierto desarrollado por NVIDIA para incorporar sin problemas barandillas personalizables a los sistemas conversacionales basados en LLM. Permite a los usuarios controlar la salida de un Modelo de lenguaje grande (LLM), por ejemplo, evitar temas políticos, seguir un flujo de conversación predefinido, validar el contenido de salida, etc. Inspirado en Autocomprobación GPT, NeMo depende en gran medida de la utilización de otro LLM para la validación de los resultados. Algunas de sus características clave incluyen:

  • Barandas programables: Defina el comportamiento de su LLM, guiando la conversación y evitando las discusiones sobre temas no deseados
  • Integración perfecta: Conecta fácilmente tu LLM a otros servicios y herramientas (por ejemplo, LangChain), mejorando sus capacidades
  • Personalización con Colang: Un lenguaje de modelado especializado, Colang, que le permite definir y controlar el comportamiento de su sistema conversacional basado en LLM.

En esta publicación, analizaremos el uso eficaz de NeMo Guardrails con tu LLM, centrándonos especialmente en la integración con Llama2 🦙 a través de ejemplos prácticos.

¿Qué son las barandillas LLM?

Barandas son un conjunto de pautas de seguridad programables que supervisan y controlan la interacción de un usuario con una aplicación de LLM, como un chatbot. Se sitúan entre los usuarios y los modelos LLM, como una especie de «escudo protector» que garantiza que los resultados sigan ciertos principios definidos. Al implementar barreras, los usuarios pueden definir la estructura, el tipo y la calidad de las respuestas de LLM.

¿Cómo funcionan las barandillas NeMo?

La arquitectura de NeMo Guardrails tiene un diseño basado en eventos, en el que eventos específicos inician un proceso gradual. Este proceso se divide en tres etapas principales:

  • Creación de mensajes de usuario canónicos
  • Decidir los próximos pasos y tomar medidas
  • Generar respuestas de bots

Cada una de las etapas anteriores puede implicar una o más llamadas al LLM. Para gestionar estas interacciones, el conjunto de herramientas se basa en Cadena LANG.

Colang

NeMo simplifica la configuración de barreras para los LLM con la introducción de un lenguaje de modelado único llamado Colang. Colang es un lenguaje de modelado diseñado específicamente para describir los flujos de IA conversacionales. Su objetivo es proporcionar una interfaz legible y ampliable para que los usuarios definan o controlen el comportamiento de los bots conversacionales con lenguaje natural. Colang tiene una sintaxis «pitónica» 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 elemento sintáctico. Los elementos sintácticos principales son: bloques, sentencias, expresiones, palabras clave y variables. Hay tres tipos principales de bloques:

  • Bloques de mensajes de usuario: Constan de conjuntos de mensajes de usuario estándar (forma canónica) vinculados a ciertos temas. Defina el saludo expreso del usuario «hola» «hola» defina el usuario solicitar ayuda «Necesito ayuda con algo». «Necesito tu ayuda».
  • Bloques de mensajes de bots: Pretendido a definir el contenido de los mensajes de los bots en los formularios canónicos. Defina el saludo expreso del bot «¡Hola!» «¡Hola!» defina bot pregunte a la asistencia social «¿Cómo se siente hoy?» define bot express saludando «¡Hola, $name!»
  • Bloques de flujo: Su objetivo es guiar la conversación en la dirección correcta. Incluye secuencias de mensajes de usuario, mensajes de bots y posibles otros eventos. Defina flow hello user express greeting bot express greeting bot ask welfare

Flujo de trabajo de NeMo Guardrails

Dada la entrada del usuario, la primera etapa consiste en realizar una búsqueda vectorial sobre el formularios canónicos de usuario disponible en la configuración. A continuación, el sistema utiliza las coincidencias más similares (las 5 mejores de forma predeterminada) para crear un mensaje y ordena al LLM que genere el mensaje de usuario canónico. Al generar el formulario canónico, el sistema crea un nuevo Intención del usuario evento. Por defecto, NeMo Guardrails usa los Sentence Transformers ILM-L6-V2 totalmente en miniatura modelo de incrustación, y Molestar para realizar la búsqueda. Los pasos siguientes se pueden determinar de dos maneras posibles:

  • O bien hay un flujo predefinido que puede decidir qué sucede a continuación
  • O el LLM se usa para tomar esa decisión

En el segundo enfoque, el sistema realiza una nueva búsqueda vectorial para recuperar los flujos más relevantes de la configuración de las barandillas. A continuación, incluye los 5 flujos principales obtenidos en un indicador y los utiliza para indicar al LLM que prediga el siguiente paso. El siguiente paso elegido puede implicar una de las siguientes opciones:

  • UN Intención del bot evento: el bot tiene que dar una respuesta
  • UN Iniciar acción interna del sistema evento: el bot tiene que ejecutar cierta acción

Tras ejecutar una acción o generar un mensaje de bot, el motor de ejecución volverá a intentar generar otro paso siguiente. El proceso se detendrá cuando no haya más pasos siguientes. Cuando el sistema genere el Intención del bot evento, invoca el generate_bot_message acción. Una vez más, realiza una búsqueda vectorial para encontrar los ejemplos de mensajes canónicos de bots más relevantes para incluirlos en un mensaje e indica al LLM que genere el enunciado (es decir, el texto) para la intención actual del bot. Al final, desencadena un bot_dijo evento y devuelve la respuesta final al usuario.

Uso de LLM de código abierto con NeMo Guardrails

De forma predeterminada, NeMo Guardrails está diseñado para usarse con modelos OpenAI, como texto-davinci-003. Sin embargo, el marco también admite la carga de modelos de HuggingFace. Básicamente usa el de Langchain Tubería HuggingFace clase para lograr esto. Este es un ejemplo de configuración:

  1. Carga el modelo HuggingFace y crea una tubería a partir de transformers import AutoTokenizer, AutomodelForCausalLM, pipeline tokenizer = autotokenizer.from_pretrained («Meta-llama/llama-2-7b-chat-hf») model = automodelForCausalLm.from_pretrained («meta-llama/llama-2-7b-chat-hf») pipe = pipeline («text-generation», model=model, tokenizer=tokenizer, max_length=4096, do_sample=True, temperature=0.2, top_p=0.95, logprobs=Ninguno, top_k=40, repetition_penalty=1.1)
  2. Envuelva la canalización con Langchain Tubería HuggingFace clase de langchain.llms import HuggingFacePipeline llm = HuggingFacePipeline (pipeline=pipe)
  3. Envuelva el Tubería HuggingFace usando Nemo's get_llm_instance_wrapper funciona y regístralo usando register_llm_provider. desde nemoguardrails.llm.helpers importar get_llm_instance_wrapper desde nemoguardrails.llm.providers importar register_llm_provider HFPipeline = get_llm_instance_wrapper (llm_instance=llm, llm_type="hf_pipeline_llama2") register_llm_provider («hf_pipeline_llama2") register_llm_provider («hf_pipeline_llama2") register_llm_provider («hf_pipeline_llama2") register_llm_provider («hf_pipeline_llama2") ine_llama2", oleoducto HF)

⚠️ La mayoría de los ejemplos de RAIL existentes están diseñados con indicaciones que funcionan bien con ChatGPT, pero no tan bien con otros modelos.

Uso de una base de conocimientos personalizada con NeMo Guardrails

Para usar una base de conocimientos personalizada, debe crear una carpeta kb dentro de la carpeta de configuración y almacenar el documento allí. ├── config │ ── kb │ ├── file_1.md │ ├── file_2.md │ ──... ⚠️ Actualmente, el marco solo admite el formato Markdown.

Casos de uso

Ahora nos centraremos en dos casos de uso comunes:

  • Orientación temática y medidas de seguridad
  • Barandillas para prevenir alucinaciones

Orientación temática y medidas de seguridad

La idea detrás de este caso de uso es guiar al modelo para que se ciña a ciertos temas y evite responder a ciertas preguntas. En otras palabras, la capa Guardrail examina las entradas de cada usuario y las filtra en consecuencia. Para lograrlo, el primer paso consiste en recopilar enunciados (texto) que representen tanto preguntas típicas como no relacionadas con el tema. The Guardrail utilizará esas definiciones para determinar qué flujo seguir ante una nueva pregunta. Este es un ejemplo de configuración en el que evitamos que la modelo responda a preguntas relacionadas con los deportes: # define las sutilezas define el saludo expreso del usuario «hola», «hola», «¿qué pasa?» define flow greeting user express greeting bot express greeting bot pregunta cómo estás # define los límites define el usuario pregunta a los deportes «¿cuál es tu equipo de fútbol favorito?» «¿quién es Rafael Nadal?» «jugador de fútbol» «jugador de tenis» «resultado del partido» definir bot responder deportes «Soy asistente de compras, no me gusta hablar de deportes». define usuario de flow sports pregunta a un bot deportivo responde al bot deportivo ofrece ayuda Cuando se le pregunta por el resultado de un partido o por un jugador de fútbol, el chatbot evade eficazmente la pregunta tal como está diseñada: res = await rails.generate_async (prompt=» ¿Sabes quién es Lionel Messi?») imprimir (res) [Fuera]: Soy asistente de compras, no me gusta hablar de deportes. ¿Hay algo más en lo que pueda ayudarte?

Uso de barandas para prevenir alucinaciones

Las barandillas NeMo presentan dos métodos diferentes para tratar las alucinaciones:

  • Verificación de hechos
  • Alucinaciones

El primer método consiste en pedir al LLM que vuelva a comprobar si la salida es coherente con el contexto. En otras palabras, pregunte al LLM si la respuesta es verdadera basándose en los documentos recuperados de la base de conocimientos. El segundo método se dirige a situaciones en las que no hay una base de conocimientos disponible. Implica solicitar el modelo LLM (con una temperatura = 1) para volver a generar la respuesta. Luego, el sistema pasa las nuevas respuestas como contexto al LLM, y el modelo evalúa si se trata de una alucinación basándose en la cantidad de respuestas diferentes generadas. ⚠️Las instrucciones están diseñadas para OpenAI y no funcionan de forma transparente con otros LLM como Llama2. Puede cambiarlos modificando el general.yml archivo ubicado en el nemoguarrails/llm/prompts/ carpeta. Para el primer método, Llama2 funcionó bien añadiendo algunos ejemplos de disparos en la línea de comandos, como se muestra a continuación: - task: fact_checking models: - hf_pipeline_llama2 content: |- Se le asigna la tarea de identificar si la hipótesis está fundamentada y relacionada con la evidencia. Solo utilizarás el contenido de las pruebas y no te basarás en conocimientos externos. Su respuesta DEBE ser únicamente «SÍ» o «NO». Estos son algunos ejemplos: «evidencia»: La Torre Eiffel es una torre de celosía de hierro ubicada en el Campo de Marte en París, Francia. Lleva el nombre del ingeniero Gustave Eiffel, cuya empresa diseñó y construyó la torre. «hipótesis»: La Torre Eiffel se encuentra en Roma, Italia. «implica»: NO HAY «pruebas»: Albert Einstein fue un físico teórico que recibió el Premio Nobel de Física en 1921 por su descubrimiento de la ley del efecto fotoeléctrico. «hipótesis»: Albert Einstein recibió el Premio Nobel de Física en 1921. «implica»: SÍ «evidencia»: los humanos adultos suelen tener 206 huesos, mientras que los recién nacidos tienen alrededor de 270. Con el tiempo, algunos huesos se fusionan. «hipótesis»: La capital de Japón es Tokio. «implica»: NO HAY «pruebas»: Neil Armstrong fue astronauta en la misión Apolo 11 de la NASA y se convirtió en la primera persona en pisar la Luna el 20 de julio de 1969. «hipótesis»: el agua hierve a 100 grados centígrados al nivel del mar. «implica»: SIN «evidencia»: {{evidencia}} «hipótesis»: {{respuesta}} «implica»: ⚠️ Para el segundo método, necesitamos recrear el hallucination.py ya que por defecto solo acepta modelos OpenAI. Compruebe la línea 57 de nemoguardrails/actions/hallucination/hallucination.py si escribe (llm)! = openAI: log.warning (f"Hallucination Rail solo se puede usar con los motores OpenAI LLM.» f"El motor LLM actual es {type (llm). __name__}.») return False Puede comprobar esta implementación en nuestro repo 🔗.

Discurso de clausura

En resumen, NeMo Guardrails permite a los usuarios implementar sin problemas medidas de protección para los modelos lingüísticos grandes (LLM) en las aplicaciones conversacionales. En este blog, hemos explorado ideas prácticas sobre el uso de NeMo Guardrails con Llama2 🦙, destacando dos casos de uso clave: la orientación temática y la prevención de las alucinaciones. Esperamos que este artículo te proporcione las herramientas necesarias para sacar el máximo provecho de NeMo Guardrails en tus aplicaciones de IA conversacional. ¡Estad atentos para más información! 💪

Cada viaje de IA comienza con una conversación

Hablemos
Hablemos