tutorial

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:

  1. 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.
  2. 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.
  3. 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

#contabilidade#nfe#cfop#deepseek#classificacao#pme

Quer testar Tokia com R$ 10 via PIX?

Criar conta grátis →