{"id":761,"date":"2026-10-05T18:33:54","date_gmt":"2026-10-05T21:33:54","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/como-openai-implementa-textgrain-marcar-texto-chatgpt-codex-ue\/"},"modified":"2026-10-05T18:33:54","modified_gmt":"2026-10-05T21:33:54","slug":"como-openai-implementa-textgrain-marcar-texto-chatgpt-codex-ue","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/como-openai-implementa-textgrain-marcar-texto-chatgpt-codex-ue\/","title":{"rendered":"Como a OpenAI Implementa o textGrain para Marcar Texto no ChatGPT e Codex na UE"},"content":{"rendered":"<p>Em 5 de outubro de 2026, a OpenAI publicou <em>Our approach to EU text provenance rules<\/em>, descrevendo como vai responder ao Artigo 50 do EU AI Act para texto gerado por seus modelos. A partir desta data, clientes da API em qualquer lugar do mundo podem ativar watermarking de texto para modelos selecionados, e nas semanas seguintes a OpenAI vai adicionar um watermark invis\u00edvel em texto eleg\u00edvel gerado por ChatGPT e Codex dentro da UE. No API, o recurso continua desligado por padr\u00e3o e n\u00e3o vai virar padr\u00e3o global no lan\u00e7amento.<\/p>\n<p>A tecnologia tem nome: textGrain. Este artigo explica o mecanismo pelo que a OpenAI divulgou, compara com o que j\u00e1 se sabe da literatura p\u00fablica sobre watermarks estat\u00edsticos (porque o relat\u00f3rio t\u00e9cnico ainda vai ser atualizado), e mostra onde a coisa quebra na pr\u00e1tica.<\/p>\n<h2>O que \u00e9 textGrain por baixo do cap\u00f4<\/h2>\n<p>A OpenAI descreve o textGrain como uma tecnologia que adiciona um sinal estat\u00edstico invis\u00edvel \u00e0s escolhas de palavras do modelo, e um detector procura por esse sinal para avaliar se um trecho cont\u00e9m um watermark da OpenAI. Note a formula\u00e7\u00e3o: o sinal est\u00e1 nas <em>escolhas de palavras<\/em>, n\u00e3o em caracteres invis\u00edveis, n\u00e3o em metadado anexado, n\u00e3o em marcador tipogr\u00e1fico. \u00c9 pura estat\u00edstica de quais tokens o modelo preferiu durante a gera\u00e7\u00e3o.<\/p>\n<p>Pense em um dado viciado. Um dado honesto cai 1 a 6 com probabilidade igual. Se eu te mostrar cem jogadas e voc\u00ea contar que o 4 apareceu 40 vezes, voc\u00ea suspeita do dado. N\u00e3o d\u00e1 para saber olhando uma jogada s\u00f3, mas com cem jogadas a estat\u00edstica entrega o vi\u00e9s. A analogia quebra em um ponto importante: no dado o vi\u00e9s \u00e9 fixo, nos tokens o &#8220;vi\u00e9s&#8221; muda a cada posi\u00e7\u00e3o em fun\u00e7\u00e3o do contexto anterior, ent\u00e3o \u00e9 preciso a mesma chave para reproduzir qual era a prefer\u00eancia esperada ali. Mas o esp\u00edrito \u00e9 esse: um vi\u00e9s pequeno demais para voc\u00ea perceber lendo, grande o suficiente para um teste estat\u00edstico detectar em volume.<\/p>\n<h3>Como o vi\u00e9s entra no texto<\/h3>\n<p>A OpenAI n\u00e3o publicou o algoritmo exato do textGrain neste an\u00fancio, mas a fam\u00edlia de m\u00e9todos \u00e9 bem documentada na literatura p\u00fablica e \u00e9 a mesma que o SynthID do Google usa (que a OpenAI diz ter superado em suas avalia\u00e7\u00f5es, segundo o pr\u00f3prio comunicado, onde afirma que o textGrain igualou ou superou outras abordagens testadas, incluindo o SynthID para texto). O esqueleto do m\u00e9todo, descrito originalmente por Kirchenbauer e colegas em 2023, funciona assim:<\/p>\n<ol>\n<li>Em cada passo da gera\u00e7\u00e3o, o modelo tem uma distribui\u00e7\u00e3o de probabilidade sobre todo o vocabul\u00e1rio para escolher o pr\u00f3ximo token.<\/li>\n<li>Uma fun\u00e7\u00e3o hash com chave secreta, alimentada pelos tokens anteriores, divide pseudoaleatoriamente o vocabul\u00e1rio em uma lista verde (uma fra\u00e7\u00e3o, tipicamente 0,5) e uma lista vermelha, e essa parti\u00e7\u00e3o muda a cada passo porque depende do contexto rolante.<\/li>\n<li>Durante a gera\u00e7\u00e3o, os logits dos tokens verdes s\u00e3o aumentados por um delta. O modelo continua samplando normalmente, s\u00f3 que agora as palavras &#8220;verdes&#8221; t\u00eam um empurr\u00e3ozinho.<\/li>\n<li>Para detectar, usa a mesma chave para reconstruir qual era a lista verde em cada posi\u00e7\u00e3o e conta. O procedimento de detec\u00e7\u00e3o conta quantos tokens verdes aparecem no texto candidato, calcula um z-score sob a hip\u00f3tese nula de que o texto foi gerado sem watermark, e rejeita a nula se o escore ultrapassa um limiar.<\/li>\n<\/ol>\n<p>A OpenAI confirma esse formato geral quando diz, no post no X, que o watermark funciona embutindo um sinal estat\u00edstico invis\u00edvel no texto conforme ele \u00e9 gerado. Os detalhes finos (qual delta, qual tamanho de janela de contexto, qual fun\u00e7\u00e3o hash) est\u00e3o no relat\u00f3rio t\u00e9cnico, e a OpenAI diz que ele vai ser atualizado com mais detalhes nas semanas seguintes e que planeja disponibilizar a tecnologia em c\u00f3digo aberto para que outros possam construir em cima dela.<\/p>\n<h3>Por que o detector n\u00e3o \u00e9 p\u00fablico<\/h3>\n<p>O detector precisa da chave para recomputar as listas verdes em cada posi\u00e7\u00e3o. Com a chave, qualquer um pode detectar. Sem a chave, o sinal parece ru\u00eddo. Ent\u00e3o o controle de acesso ao detector \u00e9 controle de acesso \u00e0 chave.<\/p>\n<p>O acesso inicial \u00e9 limitado a pesquisadores aprovados e organiza\u00e7\u00f5es especializadas que se inscrevem via formul\u00e1rio de content provenance da OpenAI, concedido caso a caso em linha com o Code of Practice da UE sobre conte\u00fado gerado por IA, e n\u00e3o est\u00e1 publicamente dispon\u00edvel no lan\u00e7amento devido ao risco de falsos positivos e watermarks n\u00e3o detectados. O detector s\u00f3 reporta se um watermark est\u00e1 presente, sem identificar o usu\u00e1rio ou seus prompts.<\/p>\n<h2>O que isso significa na pr\u00e1tica<\/h2>\n<p>Para quem usa a API, a mudan\u00e7a operacional \u00e9 um par\u00e2metro novo opt-in em modelos selecionados. A OpenAI ainda n\u00e3o publicou a refer\u00eancia de API no an\u00fancio em si, mas a sem\u00e2ntica \u00e9 clara: voc\u00ea ativa, o texto sai com vi\u00e9s estat\u00edstico embutido, a sa\u00edda continua indistingu\u00edvel a olho nu.<\/p>\n<p>Para quem roda produto na UE via ChatGPT ou Codex, a decis\u00e3o n\u00e3o \u00e9 sua: nas pr\u00f3ximas semanas o watermark passa a ser aplicado em texto eleg\u00edvel por padr\u00e3o. O que &#8220;eleg\u00edvel&#8221; significa n\u00e3o foi detalhado no comunicado, mas o Code of Practice da UE j\u00e1 indica a dire\u00e7\u00e3o: sa\u00eddas de texto abaixo de 200 tokens (cerca de 150 palavras) est\u00e3o isentas do requisito de watermarking, com a Comiss\u00e3o notando que o limiar pode diminuir conforme a tecnologia amadurece, porque watermarks estat\u00edsticos exigem um volume m\u00ednimo de texto para criar um sinal detect\u00e1vel, e completions curtas (um assunto de email reescrito, um snippet de c\u00f3digo, uma resposta de uma frase) simplesmente n\u00e3o cont\u00eam tokens suficientes para uma marca confi\u00e1vel.<\/p>\n<p>Isso casa com os n\u00fameros que a OpenAI reportou: com uma taxa de falso positivo de 1%, o textGrain detecta watermarks em cerca de 80% dos trechos de 200 tokens e 95% dos trechos de 400 tokens, embora conte\u00fado matem\u00e1tico tenha desempenho pior. Em texto matem\u00e1tico a maioria dos tokens \u00e9 obrigat\u00f3ria (uma f\u00f3rmula n\u00e3o tem sin\u00f4nimo), ent\u00e3o n\u00e3o h\u00e1 espa\u00e7o de escolha para enviesar. Mesma l\u00f3gica em c\u00f3digo: muitas posi\u00e7\u00f5es t\u00eam uma \u00fanica continua\u00e7\u00e3o sintaticamente v\u00e1lida, e a janela de &#8220;escolha livre&#8221; encolhe.<\/p>\n<p>J\u00e1 passei por isso em uma situa\u00e7\u00e3o diferente, mas com a mesma mec\u00e2nica inversa. <strong>Numa plataforma de conte\u00fado gerado por LLM em escala de cat\u00e1logo<\/strong>, a gera\u00e7\u00e3o era ancorada em dado estruturado real com valida\u00e7\u00e3o antes da publica\u00e7\u00e3o. Essa ancoragem reduz alucina\u00e7\u00e3o de forma brutal, mas tamb\u00e9m reduz a variedade do texto, porque o modelo tem menos liberdade de escolha. Watermark estat\u00edstico \u00e9 a situa\u00e7\u00e3o espelhada: ele precisa de liberdade de escolha para funcionar. Quanto mais o seu prompt amarra o modelo a uma sa\u00edda obrigat\u00f3ria, menos sinal cabe ali.<\/p>\n<h2>Onde quebra<\/h2>\n<p>O limite mais duro \u00e9 a edi\u00e7\u00e3o posterior. A detec\u00e7\u00e3o cai significativamente para texto curto, conte\u00fado matem\u00e1tico e trechos editados (substituir 25% das palavras por sin\u00f4nimos corta a detec\u00e7\u00e3o de 92% para 17%). Ou seja, uma passagem por um tesauro autom\u00e1tico, uma reescrita leve ou uma tradu\u00e7\u00e3o j\u00e1 destr\u00f3i o sinal. A pr\u00f3pria OpenAI diz isso diretamente: muitas vezes s\u00e3o indetect\u00e1veis, especialmente em passagens curtas, e reescrever ou traduzir o texto pode remover o watermark completamente.<\/p>\n<p>Isso tem tr\u00eas consequ\u00eancias pr\u00e1ticas que conv\u00e9m encarar de frente:<\/p>\n<ul>\n<li><strong>Watermark n\u00e3o \u00e9 prova.<\/strong> O watermark pode indicar que um sistema da OpenAI gerou ou processou parte de um texto, mas n\u00e3o pode dizer quem usou o sistema, quanto uma pessoa contribuiu, quem \u00e9 dono do texto ou se o conte\u00fado est\u00e1 correto, e a aus\u00eancia de watermark n\u00e3o prova que uma pessoa escreveu o texto. Tratar &#8220;n\u00e3o detectado&#8221; como &#8220;escrito por humano&#8221; \u00e9 erro.<\/li>\n<li><strong>Pipeline de p\u00f3s-processamento mata o sinal.<\/strong> Se o seu produto gera com OpenAI e passa por um &#8220;revisor&#8221; LLM, ou por um tradutor, ou por regex de normaliza\u00e7\u00e3o agressiva, o watermark pode n\u00e3o sobreviver. Isso \u00e9 relevante se voc\u00ea for um deployer na UE que precisa de rastreabilidade.<\/li>\n<li><strong>Ataques dedicados existem.<\/strong> Qualquer um que saiba que o alvo \u00e9 um watermark de logit-bias pode projetar par\u00e1frases que embaralham a estat\u00edstica. A literatura acad\u00eamica j\u00e1 tem papers inteiros sobre isso, e nenhum watermark estat\u00edstico publicado hoje resiste a um atacante determinado com acesso a outro LLM.<\/li>\n<\/ul>\n<p>J\u00e1 me queimei num padr\u00e3o parecido antes: <strong>analisando texto aberto de avalia\u00e7\u00e3o de cliente para decidir feature<\/strong>. O sentimento agregado parecia \u00f3timo, mas o caso extremo, o cliente furioso que descrevia um bug espec\u00edfico, sumia na m\u00e9dia. Com watermark \u00e9 a mesma fal\u00e1cia: a taxa agregada de 95% em 400 tokens parece s\u00f3lida at\u00e9 voc\u00ea perceber que o caso que importa \u00e9 o advers\u00e1rio que edita de prop\u00f3sito, e esse caso espec\u00edfico se parece com os 5% que escapam, n\u00e3o com os 95% que s\u00e3o pegos.<\/p>\n<h2>O que n\u00e3o d\u00e1 para afirmar ainda<\/h2>\n<p>O comunicado da OpenAI \u00e9 propositalmente curto em detalhe t\u00e9cnico, e o relat\u00f3rio t\u00e9cnico vai ser atualizado nas semanas seguintes. Ent\u00e3o algumas coisas est\u00e3o em aberto:<\/p>\n<ul>\n<li>Qual \u00e9 a fun\u00e7\u00e3o hash exata, o tamanho da janela de contexto e o delta de logit usados no textGrain. D\u00e1 para inferir pela fam\u00edlia, mas n\u00e3o pela publica\u00e7\u00e3o.<\/li>\n<li>Quais s\u00e3o exatamente os &#8220;modelos selecionados&#8221; no API hoje, e o nome do par\u00e2metro para ativar.<\/li>\n<li>O que a OpenAI considera &#8220;texto eleg\u00edvel&#8221; dentro do ChatGPT e Codex na UE. O corte de 200 tokens do Code of Practice \u00e9 o palpite \u00f3bvio, mas n\u00e3o \u00e9 confirma\u00e7\u00e3o.<\/li>\n<li>Quando (e se) a tecnologia vira open source de fato. A OpenAI diz que planeja, mas n\u00e3o d\u00e1 data.<\/li>\n<li>Como o detector lida com texto parcialmente gerado por IA e parcialmente humano. O comunicado fala em &#8220;gerou ou processou parte de&#8221;, o que sugere que detec\u00e7\u00e3o parcial \u00e9 poss\u00edvel, mas sem especificar granularidade.<\/li>\n<\/ul>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>Para experimentar hoje, sem esperar a documenta\u00e7\u00e3o completa:<\/p>\n<ol>\n<li>Entre no painel da API da OpenAI e procure, nas configura\u00e7\u00f5es de modelo ou nos par\u00e2metros de requisi\u00e7\u00e3o, a op\u00e7\u00e3o de watermarking (o an\u00fancio diz que est\u00e1 dispon\u00edvel a partir de hoje para modelos selecionados; o nome final do par\u00e2metro deve aparecer na reference da API).<\/li>\n<li>Gere o mesmo prompt duas vezes, uma com watermark ligado e outra com watermark desligado, pedindo sa\u00eddas longas (acima de 400 tokens, para ter sinal suficiente). Guarde as duas sa\u00eddas.<\/li>\n<li>Leia as duas lado a lado. O ponto do exerc\u00edcio \u00e9 confirmar com os pr\u00f3prios olhos que voc\u00ea n\u00e3o consegue dizer qual \u00e9 qual. Se conseguir, abra um issue, porque qualidade percept\u00edvel caindo \u00e9 bug do watermark.<\/li>\n<li>Pegue a vers\u00e3o com watermark e passe por tr\u00eas transforma\u00e7\u00f5es separadas: (a) tradu\u00e7\u00e3o para outra l\u00edngua e volta, (b) reescrita por outro LLM com instru\u00e7\u00e3o de &#8220;reescreva mantendo o significado&#8221;, (c) substitui\u00e7\u00e3o manual de 20 a 30% das palavras por sin\u00f4nimos. Guarde os quatro textos finais (original com watermark mais as tr\u00eas vers\u00f5es transformadas).<\/li>\n<li>Quando o acesso ao detector abrir, submeta os quatro textos e compare. Voc\u00ea vai ver na pr\u00e1tica a curva de robustez que o paper descreve, e vai saber exatamente quanto o seu pipeline atual destr\u00f3i do sinal antes de a sa\u00edda chegar no usu\u00e1rio final.<\/li>\n<\/ol>\n<p>Se voc\u00ea opera na UE, vale fazer o mesmo exerc\u00edcio com texto saindo do ChatGPT ou Codex assim que o rollout chegar. N\u00e3o para &#8220;burlar&#8221;, mas para entender o que acontece com conte\u00fado gerado por IA quando ele atravessa o seu produto real, que raramente \u00e9 s\u00f3 &#8220;gera e publica&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como funciona o textGrain, o watermark de texto que a OpenAI vai aplicar no ChatGPT e Codex na UE, onde ele falha e como testar a op\u00e7\u00e3o na API.<\/p>\n","protected":false},"author":2,"featured_media":760,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-761","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=761"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/761\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/760"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}