Técnico

Aprimorando as conversas do Llama2 com o NeMo Guardrails: um guia prático

Compartilhar

Intro

Corrimãos NeMo é um kit de ferramentas de código aberto desenvolvido pela NVIDIA para incorporar perfeitamente barreiras personalizáveis aos sistemas de conversação baseados em LLM. Ele permite que os usuários controlem a saída de um Modelo de linguagem grande (LLM), por exemplo, evitando tópicos políticos, seguindo um fluxo de conversa predefinido, validando o conteúdo de saída, etc. Inspirado por Autoverificação do GPT, o NeMo depende muito da utilização de outro LLM para validação de saída. Algumas de suas principais características incluem:

  • Corrimãos programáveis: Defina o comportamento do seu LLM, orientando a conversa e evitando discussões sobre tópicos indesejados
  • Integração perfeita: Conecte facilmente seu LLM a outros serviços e ferramentas (por exemplo, LangChain), aprimorando seus recursos
  • Personalização com Colang: Uma linguagem de modelagem especializada, Colang, que permite definir e controlar o comportamento do seu sistema conversacional baseado em LLM.

Neste post, abordaremos o uso eficaz do NeMo Guardrails com seu LLM, focando particularmente na integração com o Llama2 🦙 por meio de exemplos práticos.

O que são Guardrails LLM?

Corrimãos são um conjunto de diretrizes de segurança programáveis que monitoram e controlam a interação de um usuário com um aplicativo LLM, como um chatbot. Eles ficam entre os usuários e os modelos LLM, como uma espécie de “escudo protetor” que garante que as saídas sigam certos princípios definidos. Ao implementar barreiras, os usuários podem definir a estrutura, o tipo e a qualidade das respostas do LLM.

Como funciona o NeMo Guardrails?

A arquitetura do NeMo Guardrails tem um design orientado a eventos, em que eventos específicos iniciam um processo passo a passo. Esse processo é dividido em três etapas principais:

  • Criação de mensagens canônicas de usuário
  • Decidir sobre as próximas etapas e agir
  • Gerando respostas de bots

Cada um dos estágios acima pode envolver uma ou mais chamadas para o LLM. Para lidar com essas interações, o kit de ferramentas conta com LangChain.

Colang

O NeMo simplifica a configuração de barreiras para LLMs com a introdução de uma linguagem de modelagem exclusiva chamada Colang. Colang é uma linguagem de modelagem projetada especificamente para descrever fluxos de IA conversacional. Seu objetivo é fornecer uma interface legível e extensível para que os usuários definam ou controlem o comportamento de bots conversacionais com linguagem natural. Colang tem uma sintaxe “pitônica” no sentido de que a maioria das construções se assemelha ao equivalente em Python e a indentação é usada como elemento sintático. Os principais elementos da sintaxe são: blocos, declarações, expressões, palavras-chave e variáveis. Existem três tipos principais de blocos:

  • Blocos de mensagens do usuário: Consistem em conjuntos de mensagens de usuário padrão (formato canônico) vinculadas a determinados tópicos. Defina a saudação expressa do usuário “olá” “oi” defina a solicitação de ajuda do usuário “Preciso de ajuda com alguma coisa”. “Preciso da sua ajuda.”
  • Blocos de mensagens do bot: Destinado a definir o conteúdo dos formulários canônicos de mensagens de bots. Defina a saudação expressa do bot “Olá!” “Oi!” defina bot ask welfare “Como você está se sentindo hoje?” define a saudação expressa do bot “Olá, $name!”
  • Blocos de fluxo: Eles têm como objetivo guiar a conversa na direção certa. Inclui sequências de mensagens de usuário, mensagens de bots e potencialmente outros eventos. Defina flow hello user express greeting bot express greeting bot ask welfare

Fluxo de trabalho do NeMo Guardrails

Dada a entrada de um usuário, a primeira etapa consiste em fazer uma pesquisa vetorial sobre o formas canônicas do usuário disponível na configuração. O sistema então usa as correspondências mais semelhantes (as 5 principais por padrão) para criar um prompt e direciona o LLM a gerar a mensagem canônica do usuário. Ao gerar a forma canônica, o sistema cria uma nova Intenção do usuário evento. Por padrão, o NeMo Guardrails usa os Transformadores de Sentença Tudo em miniLM-L6-V2 modelo de incorporação e Irritar para realizar a pesquisa. As próximas etapas podem ser determinadas de duas maneiras possíveis:

  • Ou há um fluxo predefinido que pode decidir o que acontece a seguir
  • Ou o LLM é usado para tomar essa decisão.

Na segunda abordagem, o sistema realiza uma nova busca vetorial para recuperar os fluxos mais relevantes da configuração dos guardrails. Em seguida, inclui os 5 principais fluxos obtidos em um prompt e os usa para instruir o LLM a prever a próxima etapa. A próxima etapa escolhida pode implicar uma das seguintes opções:

  • UM Intenção do bot evento: o bot tem que dar uma resposta
  • UM Iniciar ação interna do sistema evento: o bot precisa executar determinada ação

Depois que uma ação for executada ou uma mensagem de bot for gerada, o tempo de execução tentará novamente gerar outra próxima etapa. O processo será interrompido quando não houver mais próximas etapas. Quando o sistema gera o Intenção do bot evento, ele invoca o gerar mensagem_bot_br ação. Mais uma vez, ele realiza uma pesquisa vetorial para encontrar os exemplos de mensagens canônicas de bots mais relevantes para incluir em um prompt e instrui o LLM a gerar o enunciado (ou seja, texto) para a intenção atual do bot. No final, ele aciona um bot_said evento e retorna a resposta final para o usuário.

Usando LLMs de código aberto com NeMo Guardrails

Por padrão, o NeMo Guardrails é projetado para uso com modelos OpenAI, como texto-davinci-003. No entanto, a estrutura também suporta o carregamento de modelos HuggingFace. Ele usa essencialmente o Langchain HuggingFace Pipeline classe para conseguir isso. Aqui está um exemplo de configuração:

  1. Carregue o modelo HuggingFace e crie uma tubulação a partir de transformadores, importe 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 (“geração de texto”, modelo = modelo, tokenizador = tokenizador, comprimento máximo = 4096, do_amostra = verdadeiro, temperatura = 0,2, top_p = 0,95, logprobs = Nenhum, top_k = 40, penalidade de repetição = 1,1)
  2. Enrole o pipeline usando o Langchain HuggingFace Pipeline classe de langchain.llms import HuggingFacePipeline llm = HuggingFacePipeline (pipeline=pipe)
  3. Embrulhe o HuggingFace Pipeline usando Nemo's get_llm_instance_wrapper função e registre-a usando register_llm_provider. de nemoguardrails.llm.helpers importe get_llm_instance_wrapper de nemoguardrails.llm.providers import 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") pipeline_llama2", tubulação HF)

⚠️ A maioria dos exemplos de RAIL existentes são criados usando prompts que funcionam bem com o ChatGPT, mas não tão bem com outros modelos.

Usando uma base de conhecimento personalizada com o NeMo Guardrails

Para usar uma base de conhecimento personalizada, você precisa criar uma pasta kb dentro da pasta de configuração e armazenar seu documento lá. ─ config │ ─ kb │ ─ file_1.md │ ─ file_1.md │ ─ file_2.md │ ─... ⚠️ Atualmente, a estrutura suporta apenas o formato Markdown.

Casos de uso

Agora vamos nos concentrar em dois casos de uso comuns:

  • Orientação temática e medidas de segurança
  • Corrimãos para evitar alucinações

Orientação temática e medidas de segurança

A ideia por trás desse caso de uso é orientar o modelo a se ater a determinados tópicos e evitar responder a certas perguntas. Em outras palavras, a camada Guardrail examina cada entrada do usuário e as filtra adequadamente. Para isso, a primeira etapa envolve reunir enunciados (texto) que representem questões típicas e fora do tópico. O Guardrail usará essas definições para determinar qual fluxo seguir em caso de nova pergunta. Aqui está um exemplo de configuração em que evitamos que o modelo responda a perguntas relacionadas a esportes: # define sutilezas define a saudação expressa do usuário “olá” “oi” “e aí?” define fluxo de saudação bot de saudação expressa do usuário bot de saudação expressa pergunta como você está # defina limites defina o usuário pergunta esportes “qual é o seu time de futebol favorito?” “quem é Rafael Nadal?” “jogador de futebol” “jogador de tênis” “resultado da partida” define bot answer sports “Sou assistente de compras, não gosto de falar de esportes.” define flow sports user ask sports bot answer sports bot offer help Quando perguntado sobre o resultado de uma partida ou um jogador de futebol, o chatbot evita efetivamente a pergunta conforme projetado: res = await rails.generate_async (prompt="Você sabe quem é Lionel Messi?”) impressão (res) [Fora]: Sou assistente de compras, não gosto de falar de esportes. Há mais alguma coisa em que eu possa ajudá-lo?

Usando grades de proteção para evitar alucinações

Os NeMo Guardrails apresentam dois métodos diferentes para lidar com alucinações:

  • Verificação de fatos
  • Alucinações

O primeiro método consiste em pedir ao LLM que verifique novamente se a saída é consistente com o contexto. Em outras palavras, pergunte ao LLM se a resposta é verdadeira com base nos documentos recuperados da base de conhecimento. O segundo método visa situações em que nenhuma base de conhecimento está disponível. Envolve solicitar o modelo LLM (com temperatura = 1) para gerar novamente a resposta. O sistema então passa as novas respostas como contexto para o LLM, e o modelo avalia se é uma alucinação com base no número de respostas diferentes geradas. ⚠️Os prompts são projetados para o OpenAI e não funcionam de forma transparente com outros LLM, como o Llama2. Você pode alterá-los modificando o general.yml arquivo localizado no nemoguardrails/llm/prompts/ pasta. Para o primeiro método, o Llama2 funcionou bem adicionando alguns exemplos curtos no prompt, conforme mostrado abaixo: - task: fact_checking models: - hf_pipeline_llama2 content: |- Você recebe a tarefa de identificar se a hipótese está fundamentada e vinculada à evidência. Você usará apenas o conteúdo da evidência e não confiará no conhecimento externo. Sua resposta DEVE ser apenas “SIM” ou “NÃO”. Aqui estão alguns exemplos: “evidência”: A Torre Eiffel é uma torre de treliça de ferro localizada no Champ de Mars, em Paris, França. Recebeu o nome do engenheiro Gustave Eiffel, cuja empresa projetou e construiu a torre. “hipótese”: A Torre Eiffel está localizada em Roma, Itália. “implica”: NENHUMA “evidência”: Albert Einstein foi um físico teórico que recebeu o Prêmio Nobel de Física em 1921 por sua descoberta da lei do efeito fotoelétrico. “hipótese”: Albert Einstein recebeu o Prêmio Nobel de Física em 1921. “implica”: SIM “evidência”: humanos adultos geralmente têm 206 ossos, enquanto os recém-nascidos têm cerca de 270. Com o tempo, alguns ossos se fundem. “hipótese”: a capital do Japão é Tóquio. “implica”: NENHUMA “evidência”: Neil Armstrong foi astronauta na missão Apollo 11 da NASA e se tornou a primeira pessoa a andar na lua em 20 de julho de 1969. “hipótese”: a água ferve a 100 graus Celsius ao nível do mar. “implica”: NENHUMA “evidência”: {{evidência}} “hipótese”: {{resposta}} “implica”: ⚠️ Para o segundo método, precisamos recriar o hallucination.py como padrão, ele aceita apenas modelos OpenAI. Verifique a linha 57 do nemoguardrails/actions/hallucination/hallucination.py se digite (llm)! = OpenAI: log.warning (F"O trilho de alucinação só pode ser usado com motores OpenAI LLM.” f"O mecanismo LLM atual é {type (llm). __name__}.”) return False Você pode conferir essa implementação em nosso reposse 🔗.

Observações finais

Concluindo, o NeMo Guardrails capacita os usuários a implementar perfeitamente salvaguardas para modelos de linguagem grande (LLMs) em aplicativos de conversação. Neste blog, exploramos informações práticas sobre o uso do NeMo Guardrails com o Llama2 🦙, destacando dois casos de uso principais: orientação de tópicos e prevenção de alucinações. Esperamos que esta postagem forneça as ferramentas necessárias para aproveitar ao máximo o NeMo Guardrails em seus aplicativos de IA conversacional. Fique ligado para saber mais! 💪

Toda jornada de IA começa com uma conversa

Vamos conversar
Vamos conversar