Explorando o LLaMa 3 com LangChain
O LLaMA 3, desenvolvido pela Meta AI, representa um avanço significativo na série de modelos de linguagem LLaMA. A versão mais recente inclui dois modelos principais com 8 bilhões (8B) e 70 bilhões (70B) de parâmetros, projetados para suportar diversos tipos de casos de uso.
De acordo com experimentos, o LLaMA 3 destaca-se especialmente em tarefas que envolvem raciocínio aprimorado e geração de código. As melhorias no processo de pré-treino (que utilizou mais de 15T de tokens; 7 vezes maior que do LLaMA 2) resultaram em modelos que não apenas são mais precisos, mas também oferecem maior diversidade de respostas e melhor alinhamento com as expectativas dos usuários.
O LLaMA 3 segue abordagem do LLaMA 2, de ser aberto para sua comunidade. Essa estratégia visa estimular a inovação em IA, permitindo que desenvolvedores, pesquisadores e empresas explorem e aprimorem a tecnologia. Dessa forma, os custos envolvidos com o uso do modelo se restringem aos custos de processamento, memória e energia, gastos durante o processo de inferência.
Nesse texto, vamos experimentar um pouco com esse modelo!
📚 Você é dev e quer criar aplicações baseadas em LLMs?
No próximo dia 15/06/2024 (sábado), vai rolar um bootcamp online de 3h:30m de duração, sobre desenvolvimento de aplicações baseadas em LLMs. Vai ser super hands on!
Alguns dos tópicos abordados:
🟠 Entendendo sobre LLMs
🟣 Testando prompts e engenharia de prompts
🔵 Entendendo de embeddings
🟢 Comparando dados por similaridade
🟡 Conectando com um banco vetorial
E tem mais! Se inscrevendo no bootcamp, você ganha acesso a três cursos sobre LLMs.
Interessou? Clique aqui e saiba mais:
Detalhes do modelo
O LLaMA 3 é fornecido em duas configurações de parâmetros: 8B e 70B. É um modelo que recebe texto como entrada, e fornece como saída ou texto ou trechos de código. A data de lançamento foi 18 de abril de 2024, embora detenha conhecimento até Março de 2023 (para a versão de 8B de parâmetros) e Dezembro de 2023 (para a versão de 70B de parâmetros).
O tamanho da janela de contexto do modelo LLaMA 3 é de 8.000 tokens. Isso significa que o modelo pode considerar até 8.000 tokens de texto ao gerar respostas ou realizar previsões. Na prática, a janela de contexto determina a quantidade de texto que o modelo pode "lembrar" e usar como referência ao processar novas entradas. Um tamanho maior de janela de contexto permite que o modelo mantenha mais informações relevantes, melhorando sua capacidade de compreender e gerar respostas coerentes em textos mais longos ou complexos.
O LLaMa 3 é disponibilizado através de uma nova licença, chamada “Meta Llama 3 Community License Agreement”, que se assemelha a licenças permissivas, como a MIT ou Apache 2, uma vez que concede permissão para usar, reproduzir, distribuir, criar trabalhos derivados e fazer modificações nos materiais do LlaMa.
Mais detalhes técnicos sobre o modelo podem ser consultados na página oficial, ou no model card, no GitHub do projeto.
Instalações e downloads
Para nosso primeiro exemplo, utilizaremos também o LangChain, que é um framework que auxilia na criação de aplicações baseadas em LLMs.
Podemos instalar o LangChain com um comando pip:
pip install langchain langchain_community
Precisamos também isntalar o langchain_community, pois este fornece interfaces com os mais diversos modelos e conectores, incluindo o LLaMa, através da biblioteca llama-cpp-python.
Após a instalação das bibliotecas, precisamos também baixar o modelo. O download pode ser feito de várias fontes, incluindo do site oficial da Meta e do perfil da Meta do HuggingFace. Dentre as mais varias versões de modelos disponíveis, para esse texto, utilizaremos a Meta-Llama-3-8B-Instruct-Q3_K_L.gguf
. O nome do modelo fornece informações específicas sobre suas características. Por exemplo:
Meta: Indica que o modelo foi desenvolvido pela Meta.
Llama: Refere-se à família de modelos de linguagem LLaMA.
3: Denota que é a terceira versão da série LLaMA.
8B: Indica o tamanho do modelo em termos de parâmetros.
Instruct: Significa que o modelo foi ajustado por instrução, otimizado para seguir comandos e gerar respostas úteis em contextos de diálogo e outras interações.
Q3_K_L: Se refere a uma técnica específica de quantização aplicada ao modelo.
.gguf: É a extensão do arquivo, indicando o formato no qual o modelo está armazenado.
Hello world no langchain
Uma vez com o ambiente instalado e configurado, podemos fazer nosso hello world, usando a classe LlamaCpp
. Por exemplo:
from langchain_community.llms import LlamaCpp
llm = LlamaCpp(model_path="models/Meta-Llama-3-8B-Instruct-Q3_K_L.gguf", max_tokens=100,n_ctx=512)
response = llm.invoke("Quais são os melhores amigos do Mickey Mouse?")
print(response)
Perceba que a classe LlamaCpp
recebe dois outros parâmetros: o max_tokens
e o n_ctx
. O n_ctx
define o tamanho da janela de contexto.
A janela de contexto determina o número máximo de tokens que podem ser processados de uma vez — considerando tanto a entrada do usuário quanto a resposta do modelo. Por padrão, no LLaMa3 este valor é definido para 512 tokens, mas pode ser ajustado com base em suas necessidades, até o limite máximo de 8k tokens.
O max_tokens
, por outro lado, ajuda a definir o limite de tokens gerados como resposta. Perceba, no entanto, que se o modelo gerar mais tokens do que o limite definido, a resposta do usuário será cortada. Defina max_tokens = None
para gerar até o final da janela de contexto.
Além desses três parâmetros, há vários outros que podem ser configurados e estão documentados na classe LlamaCpp, como a possibilidade de carregar somente o vocabulário (sem os pesos), a possibilidade de rodar o processo de inferência em paralelo, a temperatura do modelo, além de vários outros.
Tokens especiais
Há alguns tokens especiais usados para interagir via prompt com o Meta Llama 3:
<|begin_of_text|>: Isso é equivalente ao token BOS (Beginning of String), indicando o início de uma nova sequência de texto.
<|eot_id|>: Isso indica o fim de uma mensagem.
<|start_header_id|>{role}<|end_header_id|>: Esses tokens envolvem o papel de uma mensagem específica. Os papéis possíveis são: system, user e assistant.
<|end_of_text|>: Isso é equivalente ao token EOS (End of String). Ao gerar esse token, o Llama 3 deixará de gerar mais tokens.
Um prompt pode opcionalmente conter uma única mensagem do sistema, ou múltiplas mensagens alternadas de usuário e assistente, mas deve sempre terminar com a mensagem do usuário, seguida pelo cabeçalho do assistente. Por exemplo:
from langchain_community.llms import LlamaCpp
from langchain_core.prompts import PromptTemplate
llm = LlamaCpp(model_path="models/Meta-Llama-3-8B-Instruct-Q3_K_L.gguf",
max_tokens=None,
n_ctx=512,
stop=["<|eot_id|>"])
template = """
<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
{system_prompt}
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
{user_prompt}
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
"""
def get_response(user_prompt):
sys_template_str = "You are a helpful AI bot, named Bob. You are specialized in Disney movies. Give a one or two sentences only."
human_template_str = "{user_prompt}"
prompt = PromptTemplate.from_template(template.format(system_prompt = sys_template_str, user_prompt = human_template_str))
session = prompt | llm
return session.invoke({"user_prompt" : user_prompt})
response = get_response("Who is Mickey Mouse best friend?")
print(response)
No passo a passo:
<|begin_of_text|>: Especifica o começo de um prompt
<|start_header_id|>system<|end_header_id|>: Especifica o papel do usuário da mensagem seguinte, neste caso, o “system”
{system_prompt}: A mensagem de sistema a ser enviada
<|eot_id|>: Especifica o fim da mensagem de sistema
<|start_header_id|>user<|end_header_id|>: Especifica o papel do usuário da mensagem seguinte, neste caso, o “user”
{user_prompt}: A mensagem de usuário a ser enviada
<|start_header_id|>assistant<|end_header_id|>: Termina com o cabeçalho do assistente, para solicitar ao modelo que inicie a geração.
Seguindo este prompt, o Llama 3 o completa gerando a {assistant_message}. Ele sinaliza o fim da {assistant_message} ao gerar o token EOS, de fim da string.
Conclusão
O LLaMA 3, desenvolvido pela Meta AI, representa um avanço significativo na série de modelos de linguagem LLaMA, oferecendo modelos com 8 bilhões (8B) e 70 bilhões (70B) de parâmetros para suportar diversos casos de uso.
Estes modelos destacam-se em tarefas que envolvem raciocínio aprimorado e geração de código, resultando em modelos mais precisos, com maior diversidade de respostas e melhor alinhamento com as expectativas dos usuários. Seguindo a abordagem do LLaMA 2, o modelo LLaMA 3 é disponibilizado para a comunidade, através da sua própria licença “Meta Llama 3 Community License Agreement”.
Há algumas formas de se utiliza ro LLaMA 3. Nesse texto, usamos o LangChain, que é um framework popular para criar aplicações baseadas em modelos de linguagem. Com o langchain, pudemos criar nosso hello world, com poucas linhas de código.