Uso de IA no trabalho

Oculte nomes, e-mails e telefones antes de colar texto em uma ferramenta de IA

Remova ou substitua dados pessoais evidentes antes de enviar texto a um assistente de chat com IA e revise tanto o texto mascarado quanto o relatório de detecção para encontrar o que foi deixado para trás. Este tutorial usa um pequeno exemplo sintético e mantém o arquivo original inalterado.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English

Para quem éPara quem quer fazer uma verificação prática antes de enviar a uma IA textos de trabalho que possam conter nomes, endereços de e-mail ou números de telefone.

Preparação
  • Python 3.12
  • Um editor de texto e um assistente de chat com IA

01Comece com uma pequena mensagem sintética

Este exemplo é totalmente sintético. Os nomes, endereços de e-mail, números de telefone, informações de empresa e o conteúdo da mensagem foram inventados para o tutorial. O objetivo é praticar a remoção de dados pessoais evidentes antes de o texto sair do seu ambiente local.

Salve o texto a seguir como message.txt. Ele contém dois nomes, dois endereços de e-mail, dois números de telefone e uma referência deliberadamente ambígua que uma regra simples de mascaramento não detectará.

text
Project review notes

Alice Kim asked us to send the revised table to alice.kim@example.com.
If the file is delayed, call Alice at 010-1234-5678.

Bob Lee will review the second draft. His email is bob.lee@example.com and his office number is 02-345-6789.

The final approval should also be checked with A. Kim before Friday.

02Peça à IA um plano de mascaramento, não o texto sensível

Você pode perguntar a um assistente de IA como projetar regras de mascaramento sem enviar o documento sensível real. Descreva as categorias e use exemplos inventados.

Uma resposta útil deve distinguir identificadores estruturados de linguagem não estruturada. Endereços de e-mail e números de telefone costumam apresentar padrões reconhecíveis. Nomes de pessoas são mais difíceis: palavras comuns podem ser nomes, podem aparecer iniciais ou diferentes sistemas de escrita, e a mesma pessoa pode ser mencionada de várias formas.

03Transforme a resposta da IA em regras explícitas de mascaramento

Para este exemplo sintético, use uma pequena lista aprovada para nomes e expressões regulares para e-mails e telefones. Essa abordagem é intencionalmente mais restrita do que um detector geral de dados pessoais.

Tipo de dadoRegraMarcador
Nome completoSubstituir apenas os nomes exatos aprovados Alice Kim e Bob Lee[NAME_1], [NAME_2]
E-mailDetectar padrões comuns com parte local, @ e domínio[EMAIL_1], [EMAIL_2]
TelefoneDetectar os dois formatos de telefone presentes neste exemplo[PHONE_1], [PHONE_2]
Outro textoManter inalterado para revisão manualSem substituição automática

Marcadores consistentes ajudam a manter compreensíveis as referências repetidas sem preservar o identificador original. O script abaixo atribui o mesmo marcador às ocorrências repetidas do mesmo valor detectado.

04Aplique as regras a uma cópia local

O script Python a seguir lê message.txt, aplica as regras aprovadas e grava os resultados em uma nova pasta outputs. Ele também cria um relatório replacements.csv com cada valor original detectado e seu marcador. O script para se outputs já existir e nunca sobrescreve message.txt.

python
import csv
import re
import sys
from pathlib import Path

INPUT = Path("message.txt")
OUTPUT_DIR = Path("outputs")
MASKED_FILE = OUTPUT_DIR / "message_masked.txt"
REPORT_FILE = OUTPUT_DIR / "replacements.csv"

KNOWN_NAMES = ["Alice Kim", "Bob Lee"]

EMAIL_RE = re.compile(
    r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
)
PHONE_RE = re.compile(
    r"(?<!\d)(?:010-\d{4}-\d{4}|02-\d{3}-\d{4})(?!\d)"
)


def make_replacer(kind, mapping, rows):
    def replace(match):
        original = match.group(0)
        if original not in mapping:
            placeholder = f"[{kind}_{len(mapping) + 1}]"
            mapping[original] = placeholder
            rows.append(
                {
                    "type": kind,
                    "original": original,
                    "replacement": placeholder,
                }
            )
        return mapping[original]

    return replace


def mask_known_names(text, mapping, rows):
    for name in KNOWN_NAMES:
        if name not in text:
            continue
        if name not in mapping:
            placeholder = f"[NAME_{len(mapping) + 1}]"
            mapping[name] = placeholder
            rows.append(
                {
                    "type": "NAME",
                    "original": name,
                    "replacement": placeholder,
                }
            )
        text = text.replace(name, mapping[name])
    return text


def main():
    if not INPUT.is_file():
        sys.exit(f"Input file not found: {INPUT}")

    if OUTPUT_DIR.exists():
        sys.exit(f"Stop: {OUTPUT_DIR} already exists. Review or rename it first.")

    original = INPUT.read_text(encoding="utf-8")
    rows = []

    name_map = {}
    email_map = {}
    phone_map = {}

    masked = mask_known_names(original, name_map, rows)
    masked = EMAIL_RE.sub(make_replacer("EMAIL", email_map, rows), masked)
    masked = PHONE_RE.sub(make_replacer("PHONE", phone_map, rows), masked)

    OUTPUT_DIR.mkdir()
    MASKED_FILE.write_text(masked, encoding="utf-8")

    with REPORT_FILE.open("x", encoding="utf-8", newline="") as target:
        writer = csv.DictWriter(
            target,
            fieldnames=["type", "original", "replacement"],
        )
        writer.writeheader()
        writer.writerows(rows)

    print(f"Unique names masked: {len(name_map)}")
    print(f"Unique emails masked: {len(email_map)}")
    print(f"Unique phones masked: {len(phone_map)}")
    print(f"Masked copy: {MASKED_FILE}")
    print(f"Replacement report: {REPORT_FILE}")


if __name__ == "__main__":
    main()

Coloque mask_personal_data.py ao lado de message.txt e execute python mask_personal_data.py. Para este exemplo exato, o resultado esperado é o mascaramento de 2 nomes únicos, 2 e-mails únicos e 2 telefones únicos.

05Compare as substituições com o texto original

Calcule manualmente as substituições esperadas antes de confiar no resultado. O script deve registrar seis valores únicos detectados.

TipoOriginalSubstituição
NAMEAlice Kim[NAME_1]
NAMEBob Lee[NAME_2]
EMAILalice.kim@example.com[EMAIL_1]
EMAILbob.lee@example.com[EMAIL_2]
PHONE010-1234-5678[PHONE_1]
PHONE02-345-6789[PHONE_2]

O nome completo exato Alice Kim aparece uma vez no texto de origem e é substituído por [NAME_1]. A referência posterior mais curta Alice não corresponde exatamente à lista aprovada de nomes completos, portanto permanece sem mascaramento e deve ser identificada durante a revisão manual. O relatório contém valores únicos detectados, em vez de uma linha para cada ocorrência.

06Revise o que as regras automáticas não detectaram

A substituição automática é apenas a primeira etapa. Abra outputs/message_masked.txt e leia todo o resultado antes de colá-lo em qualquer lugar. Neste exemplo, o último parágrafo ainda contém A. Kim. O script não consegue saber, com base apenas na lista aprovada, que essa referência pode corresponder a Alice Kim.

  1. Pesquise por @ no arquivo mascarado e confirme que nenhum endereço de e-mail permanece.
  2. Pesquise por 010- e 02- e confirme que os dois formatos de telefone esperados desapareceram.
  3. Pesquise por Alice Kim e Bob Lee e confirme que os nomes completos aprovados não aparecem mais.
  4. Leia cada linha manualmente procurando iniciais, apelidos, assinaturas, endereços, identificadores de funcionário, números de conta, identificadores específicos do projeto ou outros contextos identificáveis.
  5. Observe que A. Kim permanece. Decida manualmente se isso identifica uma pessoa no documento real e masque a referência se necessário.
  6. Compare replacements.csv com o texto original e confirme que cada substituição corresponde ao trecho pretendido.

07Erros comuns e limites

  • Não cole o texto sensível original em uma ferramenta de IA apenas para perguntar o que deve ser mascarado.
  • Não suponha que uma expressão regular consegue identificar com segurança qualquer nome de pessoa.
  • Não dependa de um único padrão de telefone se a fonte puder conter espaços, códigos internacionais, ramais, parênteses ou outros formatos.
  • Não exclua o relatório de correspondências antes de terminar a revisão do texto mascarado, mas proteja esse relatório porque ele contém os identificadores originais.
  • Não sobrescreva o arquivo de origem. Mantenha o original separado da cópia mascarada.
  • Não suponha que mascarar três categorias remova informações empresariais confidenciais, credenciais, dados financeiros, informações de saúde ou outros conteúdos sensíveis.

Em fluxos de trabalho reais, defina o que deve ser removido com base no documento, na política aplicável e no objetivo da tarefa com IA. Quando possível, forneça apenas o mínimo de texto necessário para a tarefa em vez de mascarar um documento grande e enviá-lo por completo.

Registro de execução e verificação

ChatGPT Python tool · Python 3.x · standard library only

  • A primeira execução foi concluída com sucesso.
  • O console informou que 2 nomes únicos, 2 emails únicos e 2 números de telefone únicos foram mascarados.
  • replacements.csv continha exatamente 6 linhas: Alice Kim -> [NAME_1], Bob Lee -> [NAME_2], duas substituições de email e duas substituições de telefone.
  • outputs/message_masked.txt substituiu os dois nomes completos aprovados, os dois emails e os dois números de telefone.
  • A referência abreviada 'Alice' permaneceu sem mascaramento porque o código substitui apenas o nome aprovado exato 'Alice Kim'.
  • A referência deliberadamente abreviada 'A. Kim' também permaneceu sem mascaramento, como esperado.
  • message.txt não foi modificado.
  • Uma segunda execução foi interrompida porque outputs já existia, confirmando o comportamento de não sobrescrita.
  • Verificação local em 2026-09-21 com Python 3.12.14: o exemplo corrigido passou, assim como a preservação dos originais e a proteção contra sobrescrita.
Limites da verificação
  • A lógica de full-name é intencionalmente uma allowlist de correspondência exata com apenas dois nomes e não é um detector geral de dados pessoais.
  • O ambiente Python emitiu um aviso não relacionado de aquecimento do ambiente de planilhas; isso não afetou a execução do script nem os arquivos gerados.

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.