Inferência, sampling, modelos locais, custo
Você construirá uma planilha em JSON para comparar execuções, começando por registros fictícios que exercitam os cálculos. Depois poderá substituir cada registro por uma observação real, sem misturar os dois conjuntos. O objetivo é aprender a tirar conclusões proporcionais à evidência.
Prepare um documento curto com uma regra e uma exceção. Defina antes do teste o que um resumo precisa preservar. A mesma rubrica será usada em modelos remotos ou locais; recursos indisponíveis devem ser descritos como restrições do ambiente, não como resultados inferidos.
JavaScriptHugging FaceIA & MLAo terminar esta aula
- Configuração de geração muda variabilidade, não verdade.
- Abertura, localidade e licença são eixos distintos.
- Compare desempenho e custo por tarefa aceita.
Antes de continuar: Leitura: Inferência, sampling, modelos locais, custo
Definir tarefa e rubrica antes do teste
AvaliaçãoEscreva uma política fictícia de três parágrafos com uma regra, uma exceção e uma condição de ativação. Primeiro faça seu próprio resumo e destaque as frases que não podem desaparecer. Essa tentativa oferece um gabarito argumentado, em vez de copiar a primeira resposta do modelo. A rubrica terá três dimensões: preservação da regra, preservação da exceção e ausência de afirmações sem base. Defina rejeição se qualquer condição decisiva for perdida. Retome a separação entre geração e evidência: o texto do documento sustenta a avaliação; fluência sozinha não sustenta aceitação. Guarde casos adicionais que não serão usados para ajustar o prompt.
Preparar configurações comparáveis
FundamentosEscolha três configurações realmente disponíveis e registre serviço ou artefato local, versão, hardware quando relevante e parâmetros suportados. Não envie top-k a um endpoint apenas porque outro aceita esse nome. Preserve o mesmo documento e o mesmo objetivo, mas documente traduções necessárias de formato. Para uma execução local, confira licença e memória disponível antes de baixar. Se quantizar, registre método e representação para não comparar como se fossem o mesmo artefato. Se um modelo receber imagem e outro receber texto extraído, você mudou também a entrada; trate esse teste como comparação de sistemas, não como efeito isolado do modelo.
Medir sem apagar tentativas rejeitadas
FundamentosExecute o agregador com os dados fictícios para compreender a conta e mantenha esse arquivo separado das observações reais. Na coleta, marque início, primeiro fragmento quando houver streaming e conclusão. Preserve falhas de limite, recusas e respostas rejeitadas. O denominador da aceitação inclui todas as tentativas comparáveis. Para custo, utilize consumo reportado e preço documentado com data e unidade; registre despesas locais não incluídas. Se duas configurações têm entradas diferentes por tokenizador, mostre essa diferença sem inventar equivalência exata. O relatório precisa separar qualidade, latência e custo para permitir uma decisão que não esconda compromissos.
Interpretar resultado e planejar próxima rodada
FundamentosExamine uma saída aceita e uma rejeitada de cada opção quando existirem. Procure a condição omitida e a provável origem: truncamento, instrução, leitura de imagem ou geração. Mude uma variável na próxima rodada para testar a hipótese. Se a máquina local não suporta a carga, a restrição operacional é um resultado relevante. Se a amostra tem apenas um caso, conclua sobre aquele caso e proponha expansão, em vez de declarar vencedor universal. Compare custo por resumo aceito com duração e manutenção. A escolha pode favorecer controle local ou disponibilidade remota conforme o objetivo, desde que os critérios e as lacunas estejam explícitos.
Execução, inspeção e diagnóstico
FundamentosExecute o script em Node.js com suporte a Object.groupBy ou substitua o agrupamento por Map na versão disponível. Acrescente duas tentativas rejeitadas com respostas curtas. Observe que a média de duração pode cair enquanto o trabalho útil não aumenta. Em seguida, crie registros reais em arquivo separado, mantendo a resposta integral e o julgamento da rubrica. Não altere o gabarito para acomodar o modelo preferido.
const execucoes = [
{modelo:"A",ms:1200,entrada:120,saida:40,aceita:true},
{modelo:"A",ms:1800,entrada:120,saida:45,aceita:false},
{modelo:"B",ms:2400,entrada:125,saida:32,aceita:true}
];
const porModelo = Object.groupBy(execucoes, x => x.modelo);
for (const [modelo, linhas] of Object.entries(porModelo)) {
console.log(modelo, {
tentativas:linhas.length,
aceitas:linhas.filter(x=>x.aceita).length,
duracaoMediaMs:linhas.reduce((s,x)=>s+x.ms,0)/linhas.length
});
}Se o modelo devolve sempre um resumo curto e incompleto, confira limite de saída, entrada efetiva e instrução antes de mudar temperatura. Se a execução local fica lenta após algumas chamadas, investigue fila, memória e concorrência. A hipótese precisa de medida que possa refutá-la. Registrar apenas a duração total não separa tempo de espera de geração; registrar apenas um caso não caracteriza a carga.
Percurso gratuito: geração local, contexto e evidência
FundamentosPara observar geração sem credenciais pagas, instale o Ollama pelo site oficial e mantenha o serviço somente no computador local. Execute ollama pull qwen3:0.6b; esse modelo pequeno tem artefato quantizado de aproximadamente 523 MB na consulta, mas exige memória adicional durante a inferência. O tamanho do arquivo não é o consumo de RAM. Confira licença, plataforma e capacidade do equipamento. Se o serviço não estiver em execução, abra outra janela e execute ollama serve. Não há garantia de latência ou qualidade em hardware específico.
Salve o código seguinte como local-inference.mjs em uma pasta de laboratório e execute node local-inference.mjs usando Node 22+. Ele consulta a versão do runtime e o digest do modelo, realiza três gerações e conserva prompts, evidências e respostas. Depois de inspecionar o primeiro arquivo, configure COURSE_MODEL_DIGEST com o digest registrado para impedir comparação silenciosa com outro artefato. No PowerShell, use $env:COURSE_MODEL_DIGEST='digest-do-arquivo'; no terminal Unix, export COURSE_MODEL_DIGEST='digest-do-arquivo'. Cada novo artefato exige uma nova avaliação.
import { writeFile } from "node:fs/promises";
// Node 22+. Download a local model first; this program never calls a paid provider.
const base = "http://127.0.0.1:11434";
const model = process.env.COURSE_MODEL || "qwen3:0.6b";
async function request(route, body) {
const response = await fetch(base + route, {
method: body ? "POST" : "GET",
headers: { "content-type": "application/json" },
body: body ? JSON.stringify(body) : undefined,
signal: AbortSignal.timeout(180000),
});
if (!response.ok) throw new Error(`Ollama HTTP ${response.status}`);
return response.json();
}
const version = await request("/api/version");
const tags = await request("/api/tags");
const installed = tags.models.find((item) => item.name === model || item.model === model);
if (!installed) throw new Error(`Instale primeiro: ollama pull ${model}`);
if (process.env.COURSE_MODEL_DIGEST && process.env.COURSE_MODEL_DIGEST !== installed.digest)
throw new Error("O artefato do modelo mudou; revise antes de comparar resultados");
const corpus = [
{ id: "A-1", tenant: "A", version: 1, text: "A política fictícia da loja A admite devolução em 30 dias." },
{ id: "B-1", tenant: "B", version: 1, text: "A política fictícia da loja B admite devolução em 7 dias." },
];
const cases = [
{ id: "prazo-A", tenant: "A", question: "Qual é o prazo de devolução?", term: "devolução", expectation: "30 dias; citar A-1" },
{ id: "prazo-B", tenant: "B", question: "Qual é o prazo de devolução?", term: "devolução", expectation: "7 dias; citar B-1" },
{ id: "lacuna-A", tenant: "A", question: "Qual é o prazo da garantia?", term: "garantia", expectation: "Declarar ausência de evidência; não inventar prazo" },
];
const results = [];
for (const item of cases) {
// Literal retrieval for this small exercise, explicitly not semantic embedding search.
const evidence = corpus.filter((doc) => doc.tenant === item.tenant && doc.text.includes(item.term));
const prompt = `Use somente as evidências. Cite o ID. Se não houver evidência, diga que não sabe.\n${JSON.stringify(evidence)}\nPergunta: ${item.question}`;
const output = await request("/api/generate", { model, prompt, stream: false, think: false, options: { temperature: 0, num_predict: 128, num_ctx: 2048 } });
if (output.done !== true || typeof output.response !== "string") throw new Error("Resposta incompleta ou inválida");
results.push({ ...item, evidence, prompt, response: output.response, doneReason: output.done_reason, tokens: output.eval_count, durationNanoseconds: output.total_duration });
}
await writeFile("inference-evidence.json", JSON.stringify({ capturedAt: new Date().toISOString(), runtime: version, model, digest: installed.digest, size: installed.size, results }, null, 2));
console.log("Evidências salvas em inference-evidence.json. Avalie factualidade, citação e abstenção manualmente; este script não declara aprovação automática.");
No arquivo inference-evidence.json, compare prazo-A e prazo-B. A geração de A deveria usar 30 dias com A-1; B deveria usar 7 dias com B-1. lacuna-A deve comunicar falta de evidência, sem inventar garantia. O backend seleciona documentos por tenant antes de montar o prompt; os dados são fictícios. A recuperação aqui é literal, sem embeddings. Um modelo que confunde os prazos falhou na fidelidade da geração; se o arquivo evidence contém outro tenant, a falha ocorreu antes do modelo. Separe esses diagnósticos e registre um resultado por ID.
Três casos não estabelecem taxa de qualidade generalizável. Crie perguntas novas em um conjunto de desenvolvimento, preserve estes casos como avaliação inicial e repita com registro da versão. O exercício de 50 casos da fase de avaliação ensina como tratar IDs, saídas ausentes e gates. Não há saída real previamente capturada apresentada como evidência nesta aula. Quem não consegue executar o modelo pode revisar os prompts, critérios e o runner offline; isso pratica avaliação de contratos, mas não observa geração real.
Exercício aplicado
Compare três configurações disponíveis para resumir uma política com exceção, preservando falhas, recursos e consumo.
- Execute o agregador sobre dados fictícios identificados como tais.
- Escreva uma rubrica que exija regra, exceção e ausência de fatos inventados.
- Colete entradas e saídas idênticas em três configurações documentadas.
- Separe latência total, tempo inicial quando disponível, consumo reportado e custo estimado com data.
Abrir resolução comentada
Primeiro classifique a omissão como falha de fidelidade ao documento. Depois compare a mesma entrada com configurações suportadas, preservando limite de saída suficiente para a condição. Se o documento já foi truncado antes da chamada, ajustar sampling não recupera o texto removido.
Uma escolha defensável explicita o requisito: resumos que preservem todas as condições de ativação. O relatório traz custo e duração das tentativas, proporção aceita na amostra e casos rejeitados. Se a execução local não couber no hardware, esse impedimento operacional também participa da decisão.
Uma entrega completa pode concluir que ainda não há amostra para escolher o vencedor. Essa conclusão é melhor que esconder falhas. A decisão seguinte pode ser ampliar casos longos, medir concorrência ou verificar licença do modelo local, dependendo da incerteza que impede a escolha.
A resolução agrega três configurações explicitamente fictícias, preserva uma entrada única e não remove rejeições. A rubrica verifica regra, exceção e ausência de promessa inventada. Tempo inicial e total ficam separados. Não há parâmetros de sampling não confirmados nem cálculo de custo sem preço e data. As medições de provedor são a etapa externa do estudante; o script testa as contas e o contrato de coleta, sem produzir um benchmark fictício apresentado como real.
import assert from "node:assert/strict";
const documento="Ativação após confirmação. Exceção: análise manual pode ser necessária.";
const rubrica={regra:"confirmação",excecao:"análise manual",proibido:"sempre imediato"};
function aceitar(texto){return texto.includes(rubrica.regra)&&texto.includes(rubrica.excecao)&&
!texto.includes(rubrica.proibido);}
const configuracoes=[{id:"A",artefato:"fixture-A",origem:"local-didática",parametros:{}},
{id:"B",artefato:"fixture-B",origem:"local-didática",parametros:{}},
{id:"C",artefato:"fixture-C",origem:"local-didática",parametros:{}}];
const execucoes=[
{config:"A",totalMs:1200,primeiroMs:400,entrada:120,saida:40,texto:documento},
{config:"A",totalMs:900,primeiroMs:200,entrada:120,saida:20,texto:"Ativação após confirmação"},
{config:"B",totalMs:1600,primeiroMs:300,entrada:125,saida:42,texto:documento},
{config:"C",totalMs:1100,primeiroMs:null,entrada:128,saida:25,texto:"Acesso sempre imediato"}
].map(e=>({...e,entradaEfetiva:documento,origem:"fixture, não medição de provedor",aceita:aceitar(e.texto)}));
const resumo=configuracoes.map(c=>{const linhas=execucoes.filter(e=>e.config===c.id);
return {config:c.id,tentativas:linhas.length,aceitas:linhas.filter(x=>x.aceita).length,
totalMedioMs:linhas.reduce((s,x)=>s+x.totalMs,0)/linhas.length,
primeiroToken:linhas.map(x=>x.primeiroMs),custoEstimado:null,
justificativaCusto:"preço, moeda e data reais não fornecidos"};});
assert.equal(configuracoes.length,3);assert.equal(execucoes.length,4);
assert.ok(execucoes.every(x=>x.entradaEfetiva===documento));
assert.equal(resumo[0].tentativas,2);assert.equal(resumo[0].aceitas,1);
assert.ok(execucoes.some(x=>!x.aceita));assert.ok(resumo.every(x=>x.custoEstimado===null));
console.log({status:"aprovado",rubrica,resumo,
politicaColeta:"registrar suporte a sampling e versão real antes de usar parâmetro",
limitacao:"nenhum modelo, preço ou tokenizador externo medido"});Como conferir seu resultado
- Falhas permanecem no conjunto.
- Sampling só usa parâmetros suportados.
- Preços e artefatos têm origem e data.
Aplique em um problema novo
Primeiro resolva sem consultar a resposta. Explique suas decisões e guarde a evidência. A conclusão de leitura é independente desta autoavaliação.
Confira seus pré-requisitos
- Somar probabilidades e calcular média.
- Distinguir licença e modo local/remoto.
A: tentativas 1 s / 3 s, uma aceita; B: 4 s / 4 s, duas aceitas. Compare sob requisito zero exceções omitidas na amostra.
Conferir raciocínio e critérios de domínio
Médias A=2s/B=4s; aceitação A=1/2, B=2/2; tempo total por aceito é 4s nos dois.
B atende requisito observado; A perde uma condição.
Dois casos não provam taxa futura perfeita; preservar falhas e configuração.
Evidências para autoavaliação ou revisão por pares
- Contas comparáveis: Médias A=2s/B=4s; aceitação A=1/2, B=2/2; tempo total por aceito é 4s nos dois.
- Escolha na amostra: B atende requisito observado; A perde uma condição.
- Limite de inferência: Dois casos não provam taxa futura perfeita; preservar falhas e configuração.
Um erro frequente
Menor média significa melhor trabalho útil.
Tempo médio ignora quantas tentativas produzem resultado aceito.
Teste sua compreensão
Responda com suas palavras antes de abrir o comentário. Saber explicar uma decisão é parte do domínio.
1. Temperatura baixa garante resposta verdadeira?
2. Pesos disponíveis significam uso sem restrições?
Não.
Licença e model card precisam ser conferidos; localidade e abertura são propriedades diferentes.
3. Primeiro token rápido equivale a resposta completa rápida?
Seu progresso fica salvo neste navegador. Concluir a leitura não substitui demonstrar o domínio nos exercícios.
Referências e aprofundamento
Documentação oficial e trabalhos originais. As referências registram o escopo e as limitações para você conferir o que sustentam.
- Generation
Hugging Face • consulta: 2026-10-06
Hugging FaceGenerationConfig, limites de geração, temperature, top_p, top_k e sampling.
Limites: Ramo main; top_k e temperature não são parâmetros universais das APIs e podem ser incompatíveis com certos modelos.
- Generation strategies
Hugging Face • consulta: 2026-10-06
Hugging FaceGreedy decoding, sampling e beam search; comportamento da geração.
Limites: Ramo main; exemplos e parâmetros dependem da versão do Transformers.
- Ollama API introduction
Ollama • consulta: 2026-10-06
APIsAPI local de execução de modelos e integração HTTP.
Limites: Modelo disponível localmente não implica licença permissiva; conferir model card, licença e recursos de hardware.
- Tokenization algorithms
Hugging Face • consulta: 2026-10-06
Hugging FaceTokenização, subwords e diferenças entre algoritmos de tokenização.
Limites: Ramo main; contagem e contexto máximo são específicos do tokenizer e do modelo.
- Images and vision
OpenAI • consulta: 2026-10-06
OpenAIEntradas multimodais de imagem, limites e custos associados.
Limites: Modalidades, limites e cobrança variam por modelo; não usar como suporte para quantização.
- Quantization overview
Hugging Face • consulta: 2026-10-06
Hugging FacePanorama de quantização e representação de pesos com menos bits.
Limites: Economia de memória não garante aumento de throughput nem preservação de qualidade; medir no hardware escolhido.
- Latency optimization
OpenAI • consulta: 2026-10-06
OpenAILatência, volume de tokens, paralelização e escolhas de arquitetura.
Limites: Recomendações do fornecedor; throughput e latência precisam de benchmark no caso real.
- API pricing
OpenAI • consulta: 2026-10-06
OpenAIAPIsEstrutura de cobrança por tokens, cache e serviços.
Limites: Preços variáveis; registrar data, modelo, moeda e tokens efetivamente medidos, sem fixar preço no currículo.
- Qwen3 0.6b no catálogo Ollama
Ollama • consulta: 2026-10-06
FundamentosArtefato pequeno de demonstração, tamanho publicado e licença do modelo.
Limites: Não comprova qualidade, memória de execução, latência ou segurança do modelo em qualquer equipamento. Tags podem mudar; registrar digest.
- Ollama Generate API
Ollama • consulta: 2026-10-06
APIsGeração local não streaming, opções e campos de resposta.
Limites: Não comprova qualidade, memória de execução, latência ou segurança do modelo em qualquer equipamento. Tags podem mudar; registrar digest.