Instructions to use BrCamp/bee-350m-pt-agentico with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use BrCamp/bee-350m-pt-agentico with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
Bee-350M PT — adapter agêntico (chamada de ferramenta)
Adapter LoRA sobre BrCamp/bee-350m-pt-base,
treinado para selecionar uma ferramenta de um catálogo e emitir a chamada em JSON, em
português. Três sementes publicadas (seed-42/, seed-43/, seed-44/) — ver §Ressalvas
para saber por que as três importam.
Código, dados e o relatório completo: brcampidelli/llm-ptbr
Desempenho medido
Holdout de 536 casos, com ferramentas que o modelo nunca viu no treino (separação por raiz semântica: nem o nome nem quase-sinônimos), catálogo de 1 a 6 ferramentas, posição da correta sorteada.
| s42 | s43 | s44 | média | |
|---|---|---|---|---|
| ferramenta correta | 80,0% | 84,1% | 83,8% | 82,6% |
| executou e cumpriu | 70,1% | 74,4% | 74,6% | 73,1% |
| over-calling (chamou quando não devia) | 17,5% | 16,0% | 18,3% | 17,3% |
Desvio-padrão entre sementes: 2,53 pp — da mesma ordem do erro amostral esperado em n=536 (1,92 pp). Não há variância de treino anômala.
⚠️ Ressalvas — leia antes de usar o número
1. A folga sobre a versão anterior é +3,7 pp, e não a chamo de significativa — ela é medida contra um modelo de 2 sementes, e comparar média de 3 com média de 2 é assimétrico.
⚠️ E vale como aviso de método: com duas sementes este modelo dava 70,1% e 74,4%, e eu reportei que a folga (+2,9 pp) cabia dentro da própria amplitude. A terceira deu 74,6% — a s42 era a ponta baixa de três, não instabilidade. Duas sementes não estimam variância, só produzem uma diferença. É por isso que as três estão publicadas: para quem baixar verificar, em vez de acreditar numa média.
2. Catálogo acima de 6 ferramentas é extrapolação. O treino não contém catálogos maiores.
3. O holdout tem 0,5% de e-mail e por isso quase não mede cópia de cadeia densa em pedido natural. Esse eixo foi medido por sonda sintética, separadamente.
4. Argumentos de texto livre (assunto, corpo de mensagem, título) não entram no escore — não há critério exato para julgá-los. A cobertura da pontuação vai impressa no avaliador.
O que este adapter conserta em relação ao anterior
Diversificação de cadeias arbitrárias no treino: os endereços de e-mail do corpus tinham
724 ocorrências e apenas 22 valores distintos (boss@company.com em 47%). O modelo não
aprendera a copiar — decorara. Trocando por 868 endereços inéditos, sem um exemplo novo:
| cópia de e-mail inédito | |
|---|---|
| antes (22 distintos) | 41,7% |
| depois (868 distintos) | 53,7% nas duas sementes |
Pareado: +15/−2, McNemar p = 0,0024.
Uso
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = "BrCamp/bee-350m-pt-base"
tok = AutoTokenizer.from_pretrained(base)
modelo = AutoModelForCausalLM.from_pretrained(base, dtype="bfloat16")
modelo = PeftModel.from_pretrained(modelo, "BrCamp/bee-350m-pt-agentico", subfolder="seed-42")
sistema = """Você é um assistente AGÊNTICO. Você tem acesso às ferramentas abaixo.
FERRAMENTAS DISPONÍVEIS:
- send_email: Envie um email para um destinatário.
args: recipient (O endereço de e-mail do destinatário.), subject (O assunto.), content (O conteúdo.)
obrigatorios: recipient, subject, content
Responda com UM objeto JSON: {"tool": "<nome>", "args": {...}}. Se nenhuma ferramenta servir, responda em texto normal."""
msgs = [{"role": "system", "content": sistema},
{"role": "user", "content": "Envie um e-mail para ana@contoso.com com o assunto Reunião."}]
ent = tok(tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True),
return_tensors="pt")
saida = modelo.generate(**ent, max_new_tokens=320, do_sample=False,
eos_token_id=tok.convert_tokens_to_ids("<|im_end|>"))
print(tok.decode(saida[0][ent["input_ids"].shape[1]:], skip_special_tokens=True))
⚠️ Duas coisas que mudam muito o resultado
O token de parada tem de estar ligado. Sem eos_token_id apontando para <|im_end|>, a
geração vai até o teto e o parser recebe várias chamadas concatenadas — o que se lê como 0% de
acerto num modelo que acerta.
Decodificação restrita ao esquema vale +16,4 pp. Obrigar a chave do argumento a vir do
catálogo do prompt (o modelo às vezes escreve receptor onde o esquema diz recipient)
rendeu +144 casos e −0 no holdout. A implementação está em
comeia/eval/esquema.py.
⚠️ Restringir o VALOR, não. Duas versões foram medidas e reprovadas (−9,0 pp e −15,8 pp): o modelo não deixa de copiar por escolha, e restrição de decodificação não conserta incapacidade — só troca a forma do erro.
Treino
| base | BrCamp/bee-350m-pt-base (345M, pré-treinado do zero em PT) |
| método | LoRA r=16 α=32, 1 época, lr 1,2e-3, batch efetivo 16 |
| dados | 11.160 exemplos (6.739 com chamada · 4.421 negativos) |
| hardware | RTX 5070 Laptop 8 GB · ~90 min por semente |
O corpus vem do gigaverbo e derivados, com separação treino/teste por componente conexo de tudo que é compartilhado (pedido ou tupla de argumentos) e verificação posterior sobre os arquivos finais.
Licença
Apache-2.0, como o modelo base.
- Downloads last month
- -
Model tree for BrCamp/bee-350m-pt-agentico
Base model
BrCamp/bee-350m-pt-base