IA pra contabilidade: classificar 1000 notas fiscais por dia gastando R$ 4 em IA
Como um escritório contábil de Goiânia automatizou classificação de NF-e por CFOP/CST usando deepseek-v3 via Tokia. Setup técnico, custo real BRL e os 4 erros comuns que travam acurácia.
Caso real (sob NDA): escritório contábil em Goiânia-GO, 14 funcionários, 800-1200 NF-e/dia processadas em janeiro/abril. Antes: 3 estagiários classificando manualmente (~R$ 4.500/mês de custo). Depois: agente Tokia + deepseek-v3 classificando 95% sem revisão por R$ 120/mês (~R$ 4/dia em IA). Quote do sócio: "Estagiário virou revisor. Mesmo headcount, 3x mais clientes atendidos."
Esse post mostra a stack técnica que destrava o gargalo #1 do escritório contábil pequeno/médio: classificação de NF-e por CFOP/CST/NCM.
Por que contabilidade é o caso de IA com maior ROI imediato no Brasil
3 razões matemáticas:
- Volume alto + tarefa repetitiva: cada NF-e precisa CFOP (saída/entrada), CST (substituição tributária) e categoria contábil. Trabalho de operário que estagiário faz olhando descrição do produto.
- Erro custa caro: classificação errada vira retificação SPED, multa Receita ou crédito ICMS perdido. Mas erro de IA é igual ou menor que de estagiário cansado.
- Pico sazonal brutal: janeiro (fechamento ano) e abril (IRPF) explodem. Bot escala instantâneo, estagiário precisa ser treinado por 2 semanas.
A arquitetura simples (funciona pra 95% dos escritórios)
NF-e XML → Parser → Tokia API (deepseek-v3) → JSON estruturado → ERP/SPED
↓
Confiança < 0.85 → fila de revisão humana
Não precisa de RAG, fine-tuning ou agent framework. Um único prompt estruturado já resolve se você passar contexto certo.
O prompt que funciona (testado em 50k NF-e reais)
SYSTEM = """Você é um contador especialista em classificação fiscal BR.
Dado uma descrição de produto/serviço de NF-e, retorne JSON com:
- cfop_sugerido (4 dígitos, ex: 5102 venda mercadoria estado)
- cst_icms (3 dígitos, ex: 000 tributação integral)
- ncm_sugerido (8 dígitos quando produto físico, null pra serviço)
- categoria_contabil (uma de: revenda, materia-prima, ativo-imobilizado,
servico-prestado, despesa-operacional, despesa-administrativa)
- confianca (0.0 a 1.0)
- justificativa (1 frase curta)
REGRAS:
- Use APENAS códigos válidos do RICMS-GO e tabela CFOP nacional 2024
- Se descrição ambígua, retorne confianca <= 0.7
- NÃO invente NCM — se não tiver certeza, retorne null
- Retorne JSON puro, sem markdown
"""
USER = f"""Descrição produto NF-e:
"{descricao_produto}"
Valor: R$ {valor}
Emitente: {cnpj_emitente} ({razao_emitente})
Destinatário: {cnpj_dest} ({uf_dest})"""
Implementação em produção (Node.js + fila Redis)
import OpenAI from "openai";
import { z } from "zod";
const client = new OpenAI({
apiKey: process.env.TOKIA_KEY!,
baseURL: "https://api.usetokia.com/v1",
});
const ResultSchema = z.object({
cfop_sugerido: z.string().regex(/^\d{4}$/),
cst_icms: z.string().regex(/^\d{3}$/),
ncm_sugerido: z.string().regex(/^\d{8}$/).nullable(),
categoria_contabil: z.enum([
"revenda", "materia-prima", "ativo-imobilizado",
"servico-prestado", "despesa-operacional", "despesa-administrativa",
]),
confianca: z.number().min(0).max(1),
justificativa: z.string(),
});
export async function classificarNotaFiscal(nf: NFEData) {
const completion = await client.chat.completions.create({
model: "deepseek-v3",
response_format: { type: "json_object" },
temperature: 0.1, // baixa pra ser determinístico
messages: [
{ role: "system", content: SYSTEM_PROMPT },
{ role: "user", content: buildUserPrompt(nf) },
],
});
const raw = completion.choices[0]!.message.content!;
const parsed = ResultSchema.parse(JSON.parse(raw));
if (parsed.confianca < 0.85) {
await enviarParaFilaRevisao(nf.id, parsed);
return { status: "needs_review" as const, ...parsed };
}
await persistirClassificacao(nf.id, parsed);
return { status: "auto_approved" as const, ...parsed };
}
Custo real por nota fiscal
Para o escritório de Goiânia (1.000 NF-e/dia em média):
| Item | Valor | Detalhe | |---|---|---| | Tokens prompt | ~400 | system + dados NF-e | | Tokens completion | ~150 | JSON estruturado | | Modelo | deepseek-v3 | $0.27/M input · $1.10/M output | | Custo USD por nota | $0.000273 | (400×0.27 + 150×1.10) / 1M | | Custo BRL por nota | R$ 0,0014 | fx 5.10 + markup Tokia 2.5x | | 1000 notas/dia | R$ 1,40/dia | ~R$ 42/mês |
Mais R$ 78/mês de revisão humana (10% × 1000 = 100 notas/dia revisadas por estagiário em 30s cada = ~50min/dia). Total: R$ 120/mês vs R$ 4.500 de 3 estagiários full-time.
Os 4 erros comuns que destroem a acurácia
1. Não normalizar a descrição antes
NF-e brasileira tem descrição em CAIXA ALTA, abreviações, códigos internos do fornecedor. Pré-processe:
function normalizar(d: string): string {
return d
.toLowerCase()
.replace(/\bunidade\b|\bun\b|\bund\b/g, "")
.replace(/\bpc\b|\bpct\b|\bcx\b/g, "")
.replace(/\s+/g, " ")
.trim();
}
Reduz token count em 20% e melhora classificação porque o modelo entende melhor texto natural.
2. Passar a NF-e XML inteira
Tentação de devs: "vou mandar o XML, deixa a IA pensar". Não. Custa 10x mais e confunde o modelo com namespaces XML. Extraia só os campos relevantes: produto, valor, CFOP atual (se houver), CNPJ emitente, UF destinatário.
3. Não fazer dedup de produtos repetidos
Cliente do contabilista compra mesma matéria-prima 200x/mês. Classificar todas é desperdício. Implemente cache por hash da descrição:
import crypto from "node:crypto";
const cache = new Map<string, ClassificacaoResult>();
function descKey(desc: string, cnpjEmitente: string) {
const h = crypto.createHash("sha1");
h.update(normalizar(desc) + ":" + cnpjEmitente);
return h.digest("hex");
}
if (cache.has(key)) return cache.get(key)!;
No escritório de Goiânia, 76% das NF-e batem no cache (compras recorrentes). Custo real cai pra R$ 10/dia.
4. Não medir acurácia em produção
Estagiário revisor classifica 100/dia. Compare contra o que a IA sugeriu ANTES da revisão. Mede:
- Agreement rate: % de classificações IA aceitas sem mudança
- Top-N accuracy: % de vezes que CFOP correto está nos top-3 da IA
- Confidence calibration: quando IA diz 0.95, ela acerta 95%?
Tracking em /dashboard/usage Tokia mostra gasto, mas você precisa medir
acurácia no SEU lado. Sugestão: tabela nfe_classifications com colunas
ia_sugestao, humano_aceitou, humano_corrigiu_para, revisor_id.
Quando NÃO usar IA pra isso
- Volume < 200 NF/dia: contador único classifica mais rápido que setup do bot. ROI só faz sentido a partir de ~500/dia.
- Cliente com NF muito específica (indústria química, farmacêutica regulada): NCM exige conhecimento de Anvisa/RFB que modelo genérico não tem. Cliente paga consultor.
- Auditoria fiscal aberta: durante fiscalização, qualquer classificação divergente vira lavratura. Suspenda IA e classifique 100% humano até fechar o auto.
Compliance e LGPD
- NF-e contém CNPJ/CPF do destinatário. Dado pessoal sob LGPD se for PF. Tokia tem acordo de processamento de dados padrão.
- Logs Tokia retêm requests por 90 dias (prompt + completion). Pra
contabilidade conservadora, desabilite logging via header
X-Tokia-No-Log: 1(em consideração — vote no roadmap). - Modelo upstream (deepseek-v3 via OpenRouter) é AWS US-east. Pra cliente Bacen-regulado ou exigência de data residency BR, use modelo brasileiro (Maritalk, sabiá) com base_url diferente — Tokia roteia também.
Próximo passo
Cria sua key gratuita e testa com 10 NF-e de exemplo no /playground. Modelos com badge FREE custam R$ 0 — perfeito pra validar o prompt antes de gastar.
Se tem caso real e quer comparar abordagem: contato@usetokia.com — founder responde pessoalmente.
Links
Quer testar Tokia com R$ 10 via PIX?
Criar conta grátis →