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
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for BrCamp/bee-350m-pt-agentico

Adapter
(1)
this model