Google AI Overviews a AI Mode

Vodoznakování textu AI pomocí SynthID: jak funguje generování a detekce

Technický průvodce vodoznakováním textu pomocí SynthID s příklady v Pythonu, skóre detekce, více vodoznaky, limity nahrazení a detekcí bez znalosti klíčů.

10 min čtení 4 zodpovězených otázek

Vodoznak v textu AI je signál, který je do generovaného textu záměrně vložen. Pro vydavatele je užitečná otázka konkrétní: dokážeme později rozpoznat výstup z generovacího systému, který sami ovládáme?

SynthID Text se zabývá právě touto otázkou. Neurčuje, zda libovolný článek napsala AI. Jeho detektor testuje nakonfigurovaný statistický vzorec a neúspěšný test ponechává původ textu nevyřešený. Referenční repozitář SynthID popisuje jak generování vodoznaku, tak jeho detekci.

Tento průvodce prochází lokální příklad v Pythonu a poté se zabývá složitějšími případy: více vodoznaky, přepsáním s novým vodoznakem a kontrolou textu, když původní klíče neznáme.

Co vlastně vodoznak v textu mění

Jazykový model přiřazuje pravděpodobnosti možným dalším tokenům. Tokeny mohou představovat slova, části slov nebo interpunkci. Generativní vodoznak mění způsob výběru dalšího tokenu. Výsledné volby nesou důkazy, které může detektor později změřit.

SynthID používá proces zvaný turnajové vzorkování (tournament sampling). Kandidátní tokeny soutěží podle pseudonáhodných skórovacích funkcí. Skóre určuje nedávný kontext tokenů a klíče vodoznaku. Opakování výběru v několika vrstvách zvýhodňuje tokeny s měřitelným statistickým vzorcem. Detektor tyto skóre rekonstruuje z hotového textu. Nemusí spouštět původní jazykový model. Viz výzkumný článek o SynthID.

1. Predikce možných dalších tokenů

Jazykový model vytvoří rozdělení pravděpodobností nad svým slovníkem.

2. Aplikace nakonfigurovaného vodoznaku

Klíčované skórovací funkce ovlivňují výběr tokenů během generování.

3. Publikování běžného textu

Statistický signál putuje ve zvolené sekvenci tokenů.

4. Rekonstrukce a vyhodnocení

Detektor hledá tento signál pomocí kompatibilní tokenizace a odpovídající konfigurace.

Delší pasáže obvykle poskytují více důkazů. Vysoce předvídatelný výstup ponechává pro vodoznakování méně alternativních tokenů. Více vrstev může pomoci, ale článek uvádí klesající výnosy, protože vrstvy spotřebovávají dostupnou variabilitu ve výběru tokenů.

Statistické vodoznaky a skryté znaky jsou něco jiného

Než zvolíte detektor, určete, jaký signál chcete najít.

MetodaCo nese signál?Co byste měli testovat?
SynthID TextStatistické volby tokenů provedené během generováníDůkazy při odpovídající konfiguraci vodoznaku
Značka tvořená skrytými znakyKonkrétní znaky vložené do řetězceSekvence znaků a její dokumentované kódování
Metadata dokumentuPole připojená k dokumentu nebo kontejneruMetadata, jejich původ a případný podpis
Klasifikátor textu psaného AIVzorce naučené z ukázkových textůGeneralizace a falešně pozitivní výsledky u cílové skupiny

Skener Unicode nemůže nahradit detektor SynthID. Nalezení neobvyklého znaku také neprokazuje autorství AI. Naše představení bezplatných nástrojů AmICited se zabývá vodoznakovými signály založenými na znacích a jejich limity. Následující experiment se týká statistického vodoznakování.

Logo

Chcete sledovat svou viditelnost v AI?

Sledujte, jak AI chatboti zmiňují vaši značku v ChatGPT, Perplexity a dalších platformách.

Generování textu s vodoznakem v Pythonu

Repozitář Google je výzkumná reference a výslovně nedoporučuje používat jeho podtřídy modelů v produkci. Odkazuje na implementaci v Hugging Face Transformers. Reference také nabízí přístupy detekce pomocí průměru, váženého průměru a trénovaného bayesovského přístupu. Poznámky k použití repozitáře

Následující příklad používá Python 3.13, Transformers 4.57.1 a PyTorch 2.8.0. Jde o reprodukovatelné verze příkladu, nikoli o tvrzení, že jde o nejnovější vydání. Běží na CPU a při prvním použití stáhne veřejný model distilbert/distilgpt2. Tento malý model udržuje experiment dostupný; kvalita jeho psaní není reprezentativní pro současné asistenty.

Vytvořte izolované prostředí:

python3.13 -m venv .venv
source .venv/bin/activate
python -m pip install "transformers==4.57.1" "torch==2.8.0"

Uložte bloky kódu v Pythonu z tohoto průvodce v uvedeném pořadí do souboru watermark_demo.py. Začněte generováním:

import torch
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    SynthIDTextWatermarkingConfig,
    SynthIDTextWatermarkLogitsProcessor,
    set_seed,
)

MODEL_ID = "distilbert/distilgpt2"
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID, use_safetensors=True
).to("cpu").eval()

# Veřejné demonstrační klíče. Nikdy je nepoužívejte jako soukromou produkční značku.
watermark = SynthIDTextWatermarkingConfig(
    keys=[104729 + 7919 * i for i in range(30)],
    ngram_len=5,
    sampling_table_size=65536,
    sampling_table_seed=42,
    context_history_size=1024,
    skip_first_ngram_calls=True,
)

inputs = tokenizer(
    "A community garden can change a neighborhood in several ways. ",
    return_tensors="pt",
)

def generate(config):
    set_seed(17)
    with torch.inference_mode():
        output = model.generate(
            **inputs,
            watermarking_config=config,
            do_sample=True,
            max_new_tokens=384,
            temperature=0.9,
            top_k=50,
            pad_token_id=tokenizer.eos_token_id,
        )
    # Ponechte pokračování; zadaný prompt nebyl označen vodoznakem.
    return output[:, inputs["input_ids"].shape[1]:]

marked_ids = generate(watermark)
unmarked_ids = generate(None)
print(tokenizer.decode(marked_ids[0], skip_special_tokens=True))

Generování musí nabízet kompatibilní vzorkovací pipeline. Předání hotové odpovědi z hostované API do této konfigurace ji nemůže zpětně označit. Novou verzi by musel vygenerovat samostatný model.

V produkci vytvořte jedinečné náhodné klíče a konfiguraci udržujte v soukromí. Uchovávejte revizi tokenizeru, revizi modelu, verzi konfigurace a související detektor. Rotace klíčů vytváří novou konfiguraci; pokud stále potřebujete rozpoznávat starší výstup, ponechte si starou konfiguraci detekce. Pokyny Google k implementaci

Jak detekce vodoznaku počítá důkazy

Detekce začíná tokenizací kandidátního textu a rekonstrukcí skóre pro každé způsobilé okno tokenů a každou vrstvu vodoznaku. V implementaci použité zde se těmto binárním skóre říká hodnoty g. Zprůměrujeme je po vyloučení opakujících se kontextů a pozic na tokenu pro konec sekvence nebo za ním. První čtyři tokeny pokračování samy o sobě netvoří kompletní okno o pěti tocích.

Následující funkce používá metody skórování a maskování z Transformers. Přijímá vždy jednu sekvenci bez paddingu a vrací surový průměr, nikoli pravděpodobnost autorství.

def score_ids(token_ids, config):
    if token_ids.ndim != 2 or token_ids.shape[0] != 1:
        raise ValueError("Pass one unpadded sequence with shape [1, length].")
    if token_ids.shape[1] < config.ngram_len:
        return {"mean_g": None, "usable_windows": 0}

    processor = SynthIDTextWatermarkLogitsProcessor(
        **config.to_dict(), device=torch.device("cpu")
    )
    with torch.inference_mode():
        values = processor.compute_g_values(token_ids).float()
        unique = processor.compute_context_repetition_mask(token_ids)
        before_eos = processor.compute_eos_token_mask(
            token_ids, tokenizer.eos_token_id
        )[:, config.ngram_len - 1:]
        mask = unique & before_eos.bool()
        usable = int(mask.sum().item())
        if usable == 0:
            return {"mean_g": None, "usable_windows": 0}
        # Booleovské indexování zachovává dimenzi vrstvy.
        mean_g = float(values[mask].mean().item())
    return {"mean_g": mean_g, "usable_windows": usable}

print("marked:", score_ids(marked_ids, watermark))
print("unmarked:", score_ids(unmarked_ids, watermark))

def score_text(text, config):
    ids = tokenizer(
        text, add_special_tokens=False, return_tensors="pt"
    )["input_ids"]
    return score_ids(ids, config)

published_text = tokenizer.decode(
    marked_ids[0],
    skip_special_tokens=True,
    clean_up_tokenization_spaces=False,
)
print("published text:", score_text(published_text, watermark))
print("empty text:", score_text("", watermark))

Přímá kontrola podle ID tokenů izoluje generování od serializace textu. Druhá kontrola procvičuje cestu, kterou detektor vidí po publikaci. Vyhodnoťte svou skutečnou pipeline pro publikování a extrakci textu, protože ta může vstup měnit.

Skóre 0,60 neznamená 60% pravděpodobnost, že text napsala AI. Tato funkce nemá kalibrovaný rozhodovací práh. Krátká pasáž může náhodou dosáhnout vysokého skóre. Pokud jsou důkazy nedostatečné, uveďte neprůkazný výsledek.

Pro užitečný detektor shromážděte reprezentativní lidský text, výstup modelu bez vodoznaku a výstup s vodoznakem. Kalibrační data uchovávejte odděleně od dat pro závěrečné vyhodnocení. Zvolte prahovou hodnotu pro přijatelnou míru falešně pozitivních výsledků, vyhodnoťte míry detekce na odložených vzorcích a výsledky rozčleňte podle jazyka, délky a typu obsahu. Jediný pár označený/neoznačený jen ověřuje, že se příklad spustí.

Pro trénovanou alternativu nabízí Hugging Face bayesovský detektor a postup trénování detektoru. Detektor trénovaný pro nesouvisející klíče není přímou náhradou vašeho detektoru. Náhodně inicializovaný nebo demonstrační checkpoint neprokazuje přesnost detekce.

Dokážete detekovat JAKÝKOLI vodoznak SynthID bez jeho klíčů?

Zveřejněný přístup k detekci vyžaduje odpovídající konfiguraci. Potřebujete také kompatibilní tokenizaci. Skutečnost, že poskytovatel používá algoritmus SynthID, vám nedává jeho konfiguraci a veřejný repozitář není detektorem pro výstup všech poskytovatelů.

Google popisuje soukromé detektory, detektory zpřístupněné přes API a veřejně distribuované detektory. Poskytovatel by mohl nabízet ověření, aniž by zveřejnil svou soukromou konfiguraci. Detekce a ověřitelnost

Pro náš vlastní systém můžeme zkontrolovat registr známých konfigurací. Připojte tento příklad pro srovnání správných klíčů s nesouvisejícími demonstračními klíči:

other_settings = watermark.to_dict()
other_settings["keys"] = [key + 1_000_003 for key in watermark.keys]
other_watermark = SynthIDTextWatermarkingConfig(**other_settings)

known_configs = {
    "demo-original-v1": watermark,
    "demo-other-v1": other_watermark,
}
for name, config in known_configs.items():
    print(name, score_text(published_text, config))

Sestavený soubor spusťte pomocí python watermark_demo.py. Toto srovnání vytváří důkazy pro dvě známé konfigurace. Nedokáže objevit libovolný neznámý klíč a záměrně neoznačuje žádné ze skóre jako detekci.

Kontrola mnoha konfigurací také znamená provádění mnoha statistických testů. Pokud každý test připouští falešně pozitivní výsledky, přijetí jakéhokoli pozitivního výsledku může zvýšit celkovou míru falešně pozitivních výsledků. Kalibrujte celý postup hledání. Tam, kde jednotlivé testy poskytují platné p-hodnoty, je konzervativní možností vydělit celkovou povolenou míru falešně pozitivních výsledků počtem testů. Tuto aritmetiku neaplikujte přímo na surové skóre mean_g.

Pokud neodpovídá žádná známá konfigurace, vhodným výsledkem je „Nebyl detekován žádný podporovaný vodoznak.“ Mezi možnostmi stále zůstává lidské psaní, výstup AI bez vodoznaku, neznámý vodoznak a upravená pasáž, jejíž signál je příliš slabý.

Může stejný text nést více vodoznaků SynthID?

Je třeba zvážit dva různé návrhy.

Více vrstev v jedné konfiguraci

SynthID už podporuje seznam klíčů. V příkladu vytváří 30 klíčů 30 vrstev v rámci jednoho nakonfigurovaného vodoznaku. Detektor kombinuje jejich důkazy. Tyto klíče automaticky nepředstavují 30 samostatně přiřaditelných autorů nebo organizací. Konfigurace vodoznaku

Samostatně detekovatelné značky platformy a zákazníka

Předpokládejme, že chcete, aby detektor pro celou platformu a samostatný detektor specifický pro zákazníka rozpoznaly stejnou pasáž. Rozdělení skupin vrstev pro tyto účely je možností experimentálního návrhu, nikoli dokumentovanou zárukou knihovny.

Pouhé zřetězení dvou seznamů klíčů neprokazuje, že oba původní detektory stále fungují. Každý detektor by potřeboval vyhodnocení na kombinovaném procesu generování, včetně své pozice v sekvenci vrstev. Změřte míru detekce každé značky, vzájemné shody s jinými zákazníky a chování po úpravách. Jde o inženýrský návrh, který potřebuje experimenty, nikoli o tvrzení, že SynthID poskytuje nezávislé přiřazení více vlastníků hned po vybalení.

Pokud centrální služba potřebuje pouze identifikovat zákazníka, jednodušším návrhem je jedna konfigurace na zákazníka s interním registrem. I tento návrh vyžaduje kalibraci napříč celým registrem. Neposkytuje samostatnou značku pro celou platformu, kterou lze zkontrolovat bez prohledávání konfigurací zákazníků.

Můžete nahradit existující vodoznak?

SynthID neukládá do textu pole jako watermark_id. Neexistuje žádná hodnota metadat, kterou by šlo přepsat. Původní signál je rozložen mezi volbami tokenů.

Pokud pasáž přepíšete pomocí druhého generátoru s vodoznakem, nový proces generování vnese svůj vlastní signál. Vliv na dřívější signál závisí na výsledné sekvenci tokenů. Google uvádí, že mírné úpravy mohou zachovat detekovatelnost, zatímco důkladné přepsání nebo překlad mohou spolehlivost výrazně snížit. Dokumentované limity transformací

Z toho vyplývá, že druhý vodoznak nezaručuje vymazání prvního. Oba signály mohou zůstat detekovatelné, nebo jeden či oba mohou klesnout pod své prahy detekce. Jde o úsudek o kombinovaném pracovním postupu; citovaná dokumentace neprokazuje míru přežití pro každou dvojici vodoznaků.

Neznámá první konfigurace vytváří praktický limit. Náš vlastní detektor dokáže vyhodnotit naši značku, ale nemůže prokázat, že původní značka zmizela. To vyžaduje přístup k původnímu odpovídajícímu detektoru. I negativní výsledek znamená, že detektor při svém nastavení nenašel dostatek důkazů, nikoli důkaz, že byly odstraněny všechny stopy.

Jak testovat překrývající se vodoznaky

Než prohlásíte, že značky koexistují nebo že jedna nahrazuje druhou, použijte testovací matici. Níže uvedené položky popisují experimenty, které je třeba provést, nikoli naměřené výsledky.

Skupina vzorkůDetektor ADetektor BCo srovnání ověřuje
Lidský text a text AI bez vodoznakuSpustitSpustitZákladní míru falešně pozitivních výsledků
Text vygenerovaný pouze s ASpustitSpustitDetekci A a náhodné shody s B
Text vygenerovaný pouze s BSpustitSpustitDetekci B a náhodné shody s A
Text vygenerovaný experimentální kombinovanou konfiguracíSpustitSpustitZda je každá zamýšlená značka detekovatelná
Text A přepsaný pod BSpustitSpustitPřežití A a detekci B po přepsání
Krátké úryvky a upravené verze každé skupinySpustitSpustitCitlivost na postup publikování

Používejte odložené prompty a uvádějte použitelné délky textu, počty vzorků, verze detektorů, prahové hodnoty a míry falešně pozitivních výsledků. Zahrňte nejistotu kolem uváděných měr. Vyhodnocení opakujte, když změníte klíče, tokenizaci, verze modelu nebo nastavení generování. Dokud tyto kontroly neexistují, popisujte koexistenci a nahrazení jako neověřené.

Co to znamená pro vydavatele a viditelnost v AI

Detekce vodoznaku a monitoring citací v AI odpovídají na různé otázky. Test vodoznaku se ptá, zda pasáž nese důkazy o konkrétní konfiguraci generování. Monitoring citací kontroluje, které zdroje se objevují v odpovědích AI.

Nepředkládejte chybějící vodoznak jako důkaz lidského autorství ani detekovaný vodoznak jako důkaz, že byla citována konkrétní webová stránka. Pro publikační postupy uchovávejte záznamy o generování a redakční přiřazení vedle jakéhokoli statistického detektoru. Každý z nich poskytuje důkazy, které ostatní neposkytují.

Bylo to užitečné? Pošlete to dál.

LinkedIn X

Často kladené otázky

Viktor Zeman je spolumajitel společnosti QualityUnit. I po 20 letech vedení firmy zůstává především softwarovým inženýrem se specializací na AI, programatické SEO a backendový vývoj. Podílel se na řadě projektů, včetně LiveAgent, PostAffiliatePro, FlowHunt, UrlsLab a mnoha dalších.

Viktor Zeman
Viktor Zeman
CEO, AI Engineer

Sledujte, kde AI cituje váš obsah

Využijte monitoring citací k tomu, abyste zjistili, na které stránky se odpovědi AI odkazují. Detekce vodoznaku odpovídá na jinou otázku ohledně původu textu.

Zjistit více

Trénink na syntetických datech
Trénink na syntetických datech: Vývoj AI modelů s umělými daty

Trénink na syntetických datech

Zjistěte více o tréninku na syntetických datech pro AI modely, jeho principu, výhodách pro strojové učení, výzvách jako kolaps modelu a dopadech na reprezentaci...

6 min čtení
Pomáhají odrážky citacím v AI?
Pomáhají odrážky citacím v AI?

Pomáhají odrážky citacím v AI?

Usnadňují odrážkové seznamy citování obsahu pro AI? Diskuze o testech a o tom, jak AmICited ukazuje, které z vašich stránek enginy citují.

6 min čtení
Discussion Content Strategy +1