Em 11 de agosto de 2026 a Anthropic anunciou que o texto gerado pelo Claude sai com uma marca d'água invisível, e três dias depois publicou um post explicando por quê. A explicação é longa em motivação e curta em mecanismo, e nessa lacuna se instalaram três leituras erradas: que o modelo foi retreinado, que o texto piorou, que existe um caractere escondido na saída removível com um regex.

O mecanismo é pequeno e fica numa etapa pouco discutida do funcionamento de um LLM. Entendida essa etapa, as consequências práticas seguem sozinhas. A seção 5 reproduz o esquema num modelo de 0,5B, com os números medidos.


Resumo

  • A marca é aplicada na amostragem, a etapa que escolhe qual token sai, e essa etapa roda fora da rede neural. Nenhum peso é alterado.
  • O que ela altera é a origem da semente do sorteio: em vez do relógio do sistema, uma chave secreta combinada com os tokens anteriores.
  • A detecção exige a chave. Não há como verificar um texto sem ela, e a API de detecção prometida ainda não existe.
  • Reproduzido num modelo local: texto sem marca pontua 0,50, texto marcado pontua 0,63, e 30% de edição apaga a marca. Os números estão na seção 5.
  • Quem serve modelo open source próprio — com ou sem fine-tune — para o mercado europeu tem a obrigação de marcar, e a marca se aplica sem tocar nos pesos. A recomendação formal está na seção 6.

1. O que foi anunciado

O gatilho é regulatório: o Artigo 50 do AI Act europeu passou a valer em 2 de agosto de 2026 para sistemas recém-lançados, e exige que provedores de IA generativa embutam marcas legíveis por máquina na saída, texto incluído. A Anthropic optou por aplicar globalmente.

A cobertura vai da Claude Platform API ao claude.ai, Claude Code, Claude Cowork, Claude Tag e ao Claude acessado via AWS, Google Cloud e Microsoft Foundry. Modelos lançados a partir de 2 de agosto já saem com a marca; os anteriores entram nos meses seguintes.

O método é uma versão do SynthID-Text, publicado pelo time do Google DeepMind na Nature em 2024. A descrição da própria Anthropic resume o mecanismo: o que se altera é "a fonte da aleatoriedade usada para escolher entre as palavras". As três seções seguintes detalham essa frase.

2. Como um token é escolhido

A marca é aplicada nesta etapa, e por isso ela precisa estar clara antes do resto.

Do prompt ao token gerado: o texto vira IDs, o modelo devolve um score para cada token do vocabulário, os scores viram probabilidades e uma etapa de amostragem sorteia uma palavra.

O prompt vira IDs de token e passa pelo modelo. O que sai é um score para cada token do vocabulário — cerca de 250 mil, chamados logits. Uma função chamada softmax transforma esses scores em probabilidades que somam 100%, e só então uma etapa separada sorteia uma palavra, com peso proporcional.

Esse sorteio é o motivo de o mesmo prompt devolver respostas diferentes a cada chamada. Ele é proposital, porque em muitas posições de uma frase existe mais de uma resposta boa. Depois de "essa reunião podia ter sido um", tanto e-mail quanto áudio servem. O modelo distribui 50% e 30% entre elas, e o sorteio decide.

O sorteio acontece depois do modelo. Quando ele começa, os pesos já fizeram o trabalho deles.

3. A semente do sorteio

O resto do post depende de um conceito: a semente.

Computador não sorteia de verdade. Todo número "aleatório" sai de um gerador pseudoaleatório, que recebe um valor inicial — a semente — e a partir dele produz uma sequência que parece aleatória, tem todas as propriedades estatísticas de aleatória, e é inteiramente determinada por aquele valor inicial. Duas execuções com a semente 42 produzem exatamente os mesmos números, na mesma ordem.

É por isso que random.seed(42) aparece no começo de todo script que precisa ser reproduzível. Os números continuam se comportando como aleatórios; o que se ganha é a capacidade de repetir o experimento.

Fixar a semente não deixa o sorteio menos aleatório; só o torna reproduzível para quem conhece a semente.

A marca d'água é aplicada nesse ponto. Em vez de a semente vir do relógio do sistema, ela vem de uma conta: a chave secreta da Anthropic, combinada com os últimos tokens gerados, passa por uma função de hash. Cada posição do texto recebe uma semente diferente, porque o contexto anterior muda a cada palavra. E quem tem a chave consegue recalcular todas elas depois.

Mesmo modelo, mesmos pesos. A diferença está em de onde vem a semente do sorteio: do relógio do sistema, ou de um hash da chave secreta com os últimos tokens gerados.

O diagrama resume a ideia. A seção 4 mostra como ela é implementada de fato, e por que de um jeito mais elaborado. Mas três consequências já seguem daqui, e respondem às três leituras erradas do início:

Nenhum peso é alterado. A marca é aplicada numa etapa que roda fora da rede. Os mesmos pesos que rodavam antes do anúncio rodam depois dele; nenhum retreino foi necessário.

Não existe caractere escondido para remover. A marca vive no padrão das escolhas — qual de várias palavras igualmente plausíveis saiu em cada posição. Nada foi acrescentado ao texto, e por isso não há o que achar com regex.

O argumento de qualidade se sustenta. A Anthropic afirma que a marca não teve efeito mensurável em conteúdo, criatividade ou legibilidade, e o mecanismo explica por quê: ela só age onde o modelo já estava indiferente. Quando a pergunta é a capital da Alemanha, não há segundo candidato para promover, e aquela posição fica sem marca. A objeção "piora o texto" é a fraca.

4. Tournament sampling e detecção sem o modelo

A ideia da seção 3 bastaria para marcar: semear o gerador com a chave, sortear normalmente. Só que conferir um texto exigiria rodar o modelo de novo — saber qual modelo gerou aquilo, ter o prompt original e pagar a inferência, para cada texto a verificar. Para texto solto na internet isso é inviável, e detecção inviável não detecta nada.

O sorteio é então substituído por uma construção que pode ser refeita sem o modelo: o tournament sampling. O diagrama mostra uma rodada inteira, e o texto segue a numeração dele.

Uma rodada do torneio com M=2: sorteiam-se 4 candidatos da distribuição do modelo, cada um recebe um bit por camada, e o mata-mata decide o token.

Passos 0 e 1: os candidatos saem da distribuição do modelo. É o passo mais importante e o mais omitido nas explicações. Com M camadas, sorteiam-se 2^M candidatos de p(próximo token), com peso proporcional e repetição permitida — no exemplo, M=2, quatro candidatos, e e-mail saiu duas vezes. Memo, com 15%, não saiu nesta rodada, e por isso não pode vencer: só o que o modelo sorteou disputa.

A função G, de onde saem os bits

Cada bit do diagrama vem de uma função G. Ela é a única peça nova do esquema — todo o resto é amostragem comum — e por isso merece detalhe.

G recebe quatro entradas: a chave secreta, os H tokens anteriores, o candidato e o número da camada. Concatena tudo, passa por uma função de hash criptográfica e devolve o primeiro bit do resultado. Na implementação de referência da seção 5, é literalmente isso:

g(candidato, camada) = primeiro bit de SHA-256(chave ‖ camada ‖ tokens anteriores ‖ candidato)

É a semente da seção 3 em operação: o mesmo hash(chave, contexto), só que em vez de alimentar um gerador de números ele produz diretamente os bits da disputa. Quatro propriedades do hash fazem o esquema funcionar:

  • Determinística. Mesma chave, mesmo contexto, mesmo candidato, mesma camada: o mesmo bit, sempre. É o que permite recalcular tudo na detecção.
  • Imprevisível sem a chave. Para quem não tem a chave, cada bit é indistinguível de uma moeda honesta — metade 0, metade 1, sem padrão. É por isso que a marca é invisível e não pode ser forjada.
  • Barata. Um hash por candidato por camada, em qualquer CPU, sem modelo. É a razão de a detecção não precisar de inferência.
  • Sensível ao contexto. Trocar qualquer um dos H tokens anteriores muda a entrada, logo muda o bit. Daí vêm tanto a especificidade da marca quanto a fragilidade dela: editar uma palavra apaga a marca das H posições seguintes.

No paper, a exigência sobre G é que as saídas sejam estatisticamente indistinguíveis de moedas independentes para quem não tem a chave. Um hash com chave é a forma mais simples de obter isso, e é o que as implementações usam.

Passos 2 e 3: o mata-mata. Na camada 1 os candidatos se enfrentam aos pares e o bit de G1 decide quem passa; empate é moeda. Na camada 2 é a G2. O último de pé é o token gerado.

Essa ordem — sortear primeiro, ranquear depois — sustenta o argumento de qualidade. Uma palavra que o modelo jamais escolheria não pode vencer o torneio, porque ela nunca entra nele. O torneio só reordena entre sorteios que o próprio modelo fez, e por isso o esquema é descrito como não distorcivo: a distribuição de saída agregada se mantém.

É na detecção que a construção se justifica.

O texto passa pelas mesmas funções G com a mesma chave; conta-se a fração de bits acesos e compara-se com 0,5, que é o que o acaso produz.

Para conferir um texto, passa-se cada posição pelas mesmas funções G com a mesma chave e contam-se os bits acesos. A média é o score: no paper, MS(x) = 1/(T·M) · Σ g(x_t).

Texto que ninguém marcou pontua 0,5, porque cada bit é uma moeda honesta. Texto marcado pontua acima, porque o vencedor de cada torneio teve de ter bit 1 em cada camada para passar. No exemplo do diagrama, 11 de 14 bits acesos dão 0,79; trocando três palavras, 7 de 14 dão 0,50 — as trocas apagam também os bits das posições seguintes, porque mudam a semente delas. Compara-se com um limiar e sai a resposta, sem modelo, sem prompt e sem custo de inferência. Esse era o objetivo do torneio.

Os limites, declarados pela própria Anthropic:

  • Funciona mal em texto curto. Menos posições, média mais ruidosa, decisão de limiar pouco confiável. Não há marca d'água num tweet.
  • Edição leve provavelmente sobrevive; reescrita completa, não. Cada posição sobrescrita remove evidência, e leva junto o contexto das posições seguintes.
  • Ela indica que o Claude esteve envolvido. A marca não separa texto que o Claude gerou de texto que o Claude editou pesado — é sinal sobre processamento; autoria fica fora do alcance dela.
  • Só a Anthropic consegue conferir. A API de detecção está prometida, sem data. Até ela existir, "isto está marcado?" é pergunta que ninguém fora da Anthropic responde.

O esquema também tem literatura de ataque: um paper de 2026 mostra que essa média simples é vulnerável a inflação de camadas, e propõe um score bayesiano no lugar.

A limitação mais importante é a assimetria: a ausência da marca não prova nada. Outro modelo, um Claude mais antigo, uma reescrita, uma tradução por um segundo modelo — tudo isso produz texto sem marca. Ela é evidência quando presente e silêncio quando ausente, o que é ferramenta mais fraca do que a cobertura sugeriu.

5. Implementação de referência e resultados medidos

Como a marca vive na amostragem, ela não depende de um modelo de fronteira. Qualquer modelo cujo laço de geração esteja sob controle serve.

A implementação de referência, candidomark, tem cerca de 150 linhas de Python, sem dependência além de torch e transformers, e roda um Qwen2.5 de 0,5B num Mac. O núcleo:

def g_bit(ctx_ids, layer, token_id, key=KEY):
    """Bit pseudoaleatório para (token, camada), semeado pela chave + contexto."""
    h = hashlib.sha256()
    h.update(key)
    h.update(struct.pack("<I", layer))
    for t in ctx_ids:
        h.update(struct.pack("<I", int(t)))
    h.update(struct.pack("<I", int(token_id)))
    return h.digest()[0] & 1


def tournament(cands, ctx_ids, rng, m):
    """Em cada camada os candidatos se enfrentam aos pares; quem tem o bit maior passa."""
    cur = list(cands)
    for layer in range(m):
        nxt = []
        for i in range(0, len(cur), 2):
            a, b = cur[i], cur[i + 1]
            ga, gb = g_bit(ctx_ids, layer, a), g_bit(ctx_ids, layer, b)
            nxt.append(a if ga > gb else b if gb > ga else
                       (a if rng.random() < 0.5 else b))
        cur = nxt
    return cur[0]

E o laço de geração, com a única linha que separa o marcado do não marcado:

p = top_p_probs(logits, temp, top_p)
if watermark:
    cands = rng.choice(len(p), size=2 ** m, p=p)   # candidatos saem da distribuição
    nxt = int(tournament(cands, ctx_tail[-hh:], rng, m))
else:
    nxt = int(rng.choice(len(p), p=p))

Doze textos de 160 tokens, cada um gerado duas vezes a partir do mesmo prompt — uma vez com o torneio, uma vez com amostragem comum — e depois pontuados pela função de detecção.

Score medido em cinco condições — sem marca em 0,50, com marca em 0,63, e a edição derrubando o score — e, embaixo, um dos textos gerados com marca, que lê como qualquer saída do modelo.

O texto sem marca pontua 0,4973. É o que a teoria prevê: cada bit é uma moeda honesta, e a média de moedas honestas é meio. O texto marcado pontua 0,6327 — onze desvios-padrão acima, sem sobreposição entre as duas distribuições nas doze amostras.

O ataque por edição se comporta como descrito. Trocando 5% das posições, o score cai para 0,6062 e o texto continua claramente detectável. Com 15%, cai para 0,5585 e chega à borda do ruído. Com 30%, 0,5240: a média ainda fica acima do acaso, mas as distribuições já se sobrepõem, e com um único texto não há decisão possível.

M e H

M é a profundidade do torneio: 2^M candidatos, M disputas, M bits por posição. O teto por bit é 0,75 — numa disputa entre dois bits independentes, o vencedor tem bit 1 em três dos quatro casos, (1,1), (1,0) e (0,1). Os 0,63 medidos são essa mistura com as posições em que o modelo tinha certeza: ali os 2^M sorteios são quase todos a mesma palavra, não há o que escolher, e o bit fica em 0,5.

Mais camadas não sobem esse teto; só põem mais bits na média. Com M=8:

M=4 M=8
sem marca 0,4973 ± 0,0121 0,5000 ± 0,0089
com marca 0,6327 ± 0,0218 0,6225 ± 0,0218
separação 11,2 σ 13,7 σ

A média do marcado ficou onde estava; o desvio do sem marca encolheu. A separação melhor vem de uma medida mais precisa; a marca em si não ficou mais forte. Por isso a referência recomenda de 20 a 30 camadas.

H é quantos tokens anteriores entram na semente. Mais contexto deixa a marca mais específica e mais detectável, e também mais frágil: uma edição muda a semente das H posições seguintes. A referência usa 5.

A qualidade do texto aqui é a de um modelo de 0,5B, e isso não tem relação com a marca. A comparação que vale é marcado contra não marcado no mesmo modelo, e nela nada se degrada de forma perceptível.

O resultado confirma o ponto central: a marca d'água não pede nada do modelo. Ela pede o laço de amostragem, uma chave e uma função de hash. É por isso que a Anthropic a ativou sem retreinar nada, e por isso ela é reproduzível em qualquer modelo em poucas horas.

6. Recomendação

O anúncio foi lido como notícia sobre a Anthropic. Mas o Artigo 50 do AI Act não fala de laboratório de fronteira: fala de provedor de sistema de IA generativa — quem coloca o sistema no mercado europeu sob o próprio nome ou marca. Modelo aberto e auto-hospedado não está isento, e ninguém marca a saída do Llama, do Qwen ou de um fine-tune por conta de quem os serve.

A recomendação depende do papel de cada empresa.

Quem consome modelo por API — Claude, GPT, Gemini — recebe a saída já marcada pelo provedor e herda a conformidade. A única verificação que vale é se existe um segundo passo de reescrita no pipeline, como ajuste de tom, corte por limite de caracteres ou tradução por outro modelo, porque esse passo apaga a marca sem que ninguém tenha decidido isso. Fora isso, não há ação: nem frente de trabalho, nem item de roadmap.

Quem serve modelo próprio — open source auto-hospedado, com ou sem fine-tune — para o mercado europeu, sob a própria marca, é o provedor. A obrigação de marcar é dessa empresa, e hoje ninguém no caminho está cumprindo. A recomendação formal:

  1. Aplicar a marca na camada de amostragem. É o que este post mostra: tournament sampling com uma função G de hash com chave. Não exige retreino nem troca de modelo — o fine-tune existente continua servindo igual. O algoritmo cabe em 150 linhas; a seção 5 é a prova.
  2. Tratar a chave como segredo de produção. Ela é a única coisa que separa a marca de ruído: se vaza, qualquer um forja; se é perdida, nada do que foi publicado pode mais ser verificado. Cofre, rotação planejada e uma chave que atravessa versões do modelo — senão cada deploy apaga a capacidade de verificar o histórico.
  3. Subir o serviço de verificação junto com a marca. Marcar sem conseguir checar depois não serve para nada, nem internamente nem para um auditor. Endpoint, limiar calibrado nos textos do próprio sistema (a seção 5 mostra como: mede-se a distribuição sem marca e fixa-se o limiar acima dela) e uma decisão sobre quem pode consultar.
  4. Escolher o ponto de inserção no servidor de inferência. vLLM, TGI, Ollama e llama.cpp expõem o laço de amostragem em lugares diferentes, com custos de latência diferentes. Medir antes de prometer latência.
  5. Produzir evidência para auditoria. Ter a marca e conseguir provar que ela está lá são dois trabalhos. Uma amostra periódica de saídas passada pelo verificador, com o resultado guardado, resolve os dois.

É esse trabalho que a candido.ai faz com times que servem modelo próprio: do ponto de inserção no servidor de inferência ao serviço de verificação e à evidência de auditoria, em semanas, sem tocar nos pesos. Ele começa pela pergunta mais barata: quantas das saídas de texto da empresa hoje sairiam sem marca nenhuma? Para essa resposta num caso concreto, fale com a gente.

Uma ressalva: o que está acima é leitura de engenharia do regulamento; não substitui parecer jurídico. Se uma empresa é provedora no seu caso concreto é pergunta para o jurídico dela. A pergunta de engenharia — conseguir marcar quando a resposta for sim — é a que pode ser resolvida antes.


Fontes: o post da Anthropic sobre a marca, o paper do SynthID-Text na Nature, a análise teórica do esquema e a explicação do mecanismo por Sebastian Raschka.

Como ajudamos times a adotar IA

Trabalhamos com times de engenharia que buscam incorporar IA ao dia a dia de desenvolvimento — não como experimento, mas como parte real do fluxo de trabalho.

Isso passa por escolher as ferramentas certas para o contexto do time, configurá-las de forma que façam sentido para a política de dados da empresa e garantir que os desenvolvedores saibam usá-las de um jeito que realmente aumente a produtividade, em vez de gerar mais fricção.

Se você tem um time de desenvolvimento e está tentando colocar IA para trabalhar de forma séria, fale com a gente.