Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Fiz usando dois modelos diferentes (grátis)

Eu usei dois modelos do LM-Studio:
.env:

MODEL=google/gemma-3-1b
MODEL_ALTERNATIVO=meta-llama-3.1-8b-instruct

Meu código ficou assim:

from openai import OpenAI
from dotenv import load_dotenv
import os
import tiktoken

load_dotenv()

client = OpenAI(
    base_url=os.getenv("BASE_URL"),
    api_key=os.getenv("API_KEY")
)

MODELO = os.getenv("MODEL")
MODELO_ALTERNATIVO = os.getenv("MODEL_ALTERNATIVO")


def obter_codificador(modelo: str):
    """
    Retorna um codificador para o modelo.
    Caso o modelo não seja conhecido pelo tiktoken,
    utiliza o cl100k_base como aproximação.
    """
    try:
        return tiktoken.encoding_for_model(modelo)
    except KeyError:
        print(f"Modelo '{modelo}' desconhecido pelo tiktoken.")
        print("Utilizando 'cl100k_base' como aproximação.\n")
        return tiktoken.get_encoding("cl100k_base")


def carrega(nome_do_arquivo):
    try:
        with open(nome_do_arquivo, "r", encoding="utf-8") as arquivo:
            return arquivo.read()
    except IOError as e:
        print(f"Erro ao abrir arquivo: {e}")
        return ""


prompt_sistema = """
Identifique o perfil de compra para cada cliente.

Formato da resposta:

cliente - três palavras que descrevam o perfil
"""

prompt_usuario = carrega("pedidos_clientes.txt")

# Obtém o tokenizer
codificador = obter_codificador(MODELO)

# Conta os tokens
lista_de_tokens = codificador.encode(prompt_sistema + prompt_usuario)
numero_de_tokens = len(lista_de_tokens)

print(f"Número de tokens de entrada: {numero_de_tokens}")

# Reserva para a resposta
TOKENS_RESPOSTA = 2048

# Contexto máximo do Gemma 3 1B
LIMITE_GEMMA = 32768

modelo_escolhido = MODELO

if numero_de_tokens + TOKENS_RESPOSTA > LIMITE_GEMMA:
    modelo_escolhido = MODELO_ALTERNATIVO

print(f"Modelo escolhido: {modelo_escolhido}")

lista_mensagens = [
    {
        "role": "system",
        "content": prompt_sistema
    },
    {
        "role": "user",
        "content": prompt_usuario
    }
]

try:
    resposta = client.chat.completions.create(
        model=modelo_escolhido,
        messages=lista_mensagens
    )

    print("\nResposta:\n")
    print(resposta.choices[0].message.content)

    # Se o LM Studio retornar usage, usa a contagem real
    if hasattr(resposta, "usage") and resposta.usage:
        print("\nUso informado pela API:")
        print(f"Prompt tokens: {resposta.usage.prompt_tokens}")
        print(f"Completion tokens: {resposta.usage.completion_tokens}")
        print(f"Total tokens: {resposta.usage.total_tokens}")

except Exception as e:
    print(f"\nErro ao chamar a API:\n{e}")

print("\nEstatísticas")
print("-" * 40)
print(f"Modelo escolhido: {modelo_escolhido}")
print(f"Tokens estimados de entrada: {numero_de_tokens}")

# Valor apenas ilustrativo
CUSTO_1K = 0.03

custo_estimado = (numero_de_tokens / 1000) * CUSTO_1K

print(f"Custo estimado: ${custo_estimado:.6f}")

conteúdo do arquivo carregado:
Cliente: João Silva
Compras:

  • Notebook Gamer
  • Mouse sem fio
  • Teclado mecânico
  • Headset gamer

Cliente: Maria Oliveira
Compras:

  • Vestido social
  • Bolsa de couro
  • Sandália de salto
  • Perfume importado
    Cliente: Pedro Santos
    Compras:
  • Fraldas
  • Leite infantil
  • Lenços umedecidos
  • Carrinho de bebê
    Cliente: Ana Costa
    Compras:
  • Livro de Python
  • Curso de Inteligência Artificial
  • Raspberry Pi
  • Kit Arduino
    Cliente: Carlos Pereira
    Compras:
  • Halteres
  • Whey Protein
  • Creatina
  • Camiseta esportiva
    Cliente: Fernanda Souza
    Compras:
  • Cafeteira
  • Torradeira
  • Liquidificador
  • Conjunto de panelas
    Cliente: Ricardo Almeida
    Compras:
  • Bicicleta
  • Capacete
  • Luvas para ciclismo
  • Garrafa térmica
    Cliente: Juliana Rocha
    Compras:
  • Maquiagem
  • Base líquida
  • Paleta de sombras
  • Batom
    Cliente: Lucas Martins
    Compras:
  • Console de videogame
  • Controle sem fio
  • Jogo de aventura
  • Assinatura online

...

log:
Modelo 'google/gemma-3-1b' desconhecido pelo tiktoken.
Utilizando 'cl100k_base' como aproximação.

Número de tokens de entrada: 355
Modelo escolhido: google/gemma-3-1b

Resposta:

Aqui estão os perfis de compra para cada cliente, com três palavras que os descrevem:

  • João Silva - Gamer/Tecnologia
  • Maria Oliveira - Elegância/Moda
  • Pedro Santos - Bebês/Saúde infantil
  • Ana Costa - Aprendizado/Ciência
  • Carlos Pereira - Fitness/Esportes
  • Fernanda Souza - Culinária/Casa
  • Ricardo Almeida - Esporte/Equipamentos
  • Juliana Rocha - Beleza/Cuidados pessoais
  • Lucas Martins - Jogos/Tecnologia
  • Patrícia Lima - Alimentação/Animais de estimação

Uso informado pela API:
Prompt tokens: 328
Completion tokens: 140
Total tokens: 468

Estatísticas

Modelo escolhido: google/gemma-3-1b
Tokens estimados de entrada: 355
Custo estimado: $0.010650

1 resposta

Olá, Paulo! Como vai?

Parabéns pela realização das atividades!

Vi que você apresentou um código muito bem elaborado para análise de tokens e escolha dinâmica de modelos alternativos, destacou o uso do tiktoken para contagem e fallback para cl100k_base, além de mostrar como integrar a lógica de custo estimado e estatísticas de uso. Essa solução evidencia organização, atenção prática e preocupação em otimizar tanto a performance quanto a eficiência financeira da aplicação.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Gerenciamento de contexto: implementar truncamento inteligente ou sumarização para evitar ultrapassar limites de tokens.
  • Monitoramento de custos: criar logs automáticos que consolidem uso real versus estimado para facilitar análise de viabilidade.
  • Fallback avançado: além de alternar modelos, considerar ajustes de temperatura ou parâmetros para manter consistência nas respostas.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você considera mais estratégico evoluir esse projeto para otimizar custos de execução ou para aumentar a precisão na identificação de perfis de compra dos clientes?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!