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