AI वॉटरमार्किंग की हथियारों की दौड़
यह अंग्रेज़ी मूल लेख का मशीनी अनुवाद है। कुछ बारीकियाँ छूट सकती हैं, इसलिए संदर्भ के लिए अंग्रेज़ी संस्करण ही मान्य है। अंग्रेज़ी में मूल लेख पढ़ें
संक्षेप में
मैंने Anthropic की घोषणा पढ़ी और ज़ीरो-विड्थ कैरेक्टर ढूँढने के लिए एक टेक्स्ट एडिटर खोला। कोई नहीं मिला। वॉटरमार्क अक्षरों के बीच छिपा नहीं है, वह इसमें है कि मॉडल ने कौन-से शब्द चुने, और इसे मानने में मुझे जितना लगना चाहिए था उससे ज़्यादा समय लगा। इसका मतलब यह भी है कि “वॉटरमार्क रिमूवर” के पास हटाने को कुछ है ही नहीं।
वे तीन चीज़ें जिन्हें लोग वॉटरमार्क कहते हैं
तीन अलग-अलग तंत्रों को वॉटरमार्क कहा जाता है। उनमें आपस में लगभग कुछ भी साझा नहीं है।
| तंत्र | संकेत कहाँ रहता है | किससे हटता है | तीसरे पक्ष से पहचाना जा सकता है |
|---|---|---|---|
| छिपा हुआ Unicode | ज़ीरो-विड्थ कैरेक्टर, Tag ब्लॉक (U+E0000-E007F) | कोई भी खोजो-और-बदलो | हाँ, बिल्कुल आसानी से |
| C2PA मेटाडेटा | फ़ाइल कंटेनर में हस्ताक्षरित मैनिफ़ेस्ट | स्क्रीनशॉट, दोबारा सेव, फ़ॉर्मैट बदलना | हाँ, मौजूदगी जाँची जा सकती है |
| सांख्यिकीय वॉटरमार्क | मॉडल के टोकन चयन | भारी पैराफ़्रेज़ या अनुवाद | नहीं, वेंडर की कुंजी चाहिए |
Anthropic इनमें से दो लगाता है। फ़ाइलों में .svg, .png और .jpg पर C2PA हस्ताक्षरित प्रोवेनेंस मेटाडेटा आता है, वही Content Credentials मानक जो इमेजिंग उद्योग इस्तेमाल करता है। टेक्स्ट को तीसरी पंक्ति मिलती है। Anthropic के दस्तावेज़ इसे “सीधे टेक्स्ट के भीतर एक अदृश्य वॉटरमार्क” कहते हैं, जो “Claude के जवाब का अर्थ, गुणवत्ता या पठनीयता नहीं बदलता”।
रोलआउट सुर्ख़ियों में दिखे दायरे से सीमित है। Anthropic के शब्दों में, “2 अगस्त 2026 को या उसके बाद लॉन्च हुए Claude मॉडल लॉन्च के समय से मशीन-पठनीय चिह्न सपोर्ट करेंगे”, और मौजूदा मॉडलों के लिए सपोर्ट को जारी काम बताया गया है। सीमा-रेखा मॉडल के हिसाब से खिंचती है, देश के हिसाब से नहीं। उसी पेज पर लिखा है कि जहाँ भी Claude उपलब्ध है, सपोर्टेड मॉडलों के आउटपुट पर चिह्न लगाना लागू होता है, दुनिया भर में। इसके पीछे EU AI Act के अनुच्छेद 50(2) की AI-जनित सामग्री की पारदर्शिता पर आचार संहिता है, जिस पर Anthropic ने मॉडल प्रदाता और जनरेटिव AI सिस्टम प्रदाता, दोनों रूपों में हस्ताक्षर किए। तो यह मॉडल-दर-मॉडल आता है, और किसी मॉडल में आ जाने के बाद सबको मिलता है।
Google काफ़ी समय से Gemini में SynthID-Text चला रहा है, और तरीक़ा Nature में प्रकाशित है। यह केवल सैंपलिंग का चरण बदलता है। हर टोकन पर यह पिछले k टोकनों से एक छद्म-यादृच्छिक फ़ंक्शन को सीड करता है, शब्दावली को m परतों वाले टूर्नामेंट ब्रैकेट में बाँटता है, और उन टोकनों की सैंपलिंग प्रायिकता बढ़ाता है जो अपने मुक़ाबले जीतते रहते हैं। इसे पर्याप्त परतों और पर्याप्त टोकनों में फैला दें तो एक मापने-योग्य सांख्यिकीय झुकाव मिलता है, जबकि पाठक को कोई एक शब्द ग़लत नहीं लगता।
पहचान के लिए मूल मॉडल की ज़रूरत नहीं होती। उसे कुंजी वाला छद्म-यादृच्छिक फ़ंक्शन और उम्मीदवार टेक्स्ट पर एक स्कोरिंग पास चाहिए। वॉटरमार्क वाले टेक्स्ट में बिना वॉटरमार्क वाले टेक्स्ट से व्यवस्थित रूप से ऊँचे g-मान होते हैं, और वह अंतर एक परिकल्पना परीक्षण है।
यहीं मैं अटका।
Signal Verifiable in a browser? Why
------ ------------------------ ---
Zero-width chars Yes Codepoint scan
Unicode Tag block Yes Codepoint scan, decodes to ASCII
C2PA manifest Presence, not signature JUMBF box / PNG caBX chunk markers
Claude watermark NO Keyed detector, method unpublished
SynthID-Text NO Keyed detector, Google-side API
Anthropic का सहायता पेज इस पर सीधा है। वे कहते हैं कि वे “उपयोगकर्ताओं और अन्य तीसरे पक्षों को Claude के एम्बेडेड वॉटरमार्क और प्रोवेनेंस मेटाडेटा की पहचान करने लायक़ बनाने पर काम कर रहे हैं” और कि वे “आगामी तकनीकी दस्तावेज़ीकरण में पहचान तंत्रों का ब्योरा साझा करेंगे”। आगामी का मतलब है कि अभी वह मौजूद नहीं है। जब तक वह नहीं आता, Anthropic के बाहर कोई टेक्स्ट वॉटरमार्क नहीं जाँच सकता। जो भी टूल जाँचने का दावा करता है, वह किसी और नाम से एक आम AI-टेक्स्ट क्लासिफ़ायर चला रहा है, और उनकी त्रुटि-प्रोफ़ाइल कहीं ख़राब है, ख़ासकर दूसरी भाषा में लिखने वालों के मामले में।
इंस्पेक्टर बनाना
इसलिए मैंने वह संस्करण बनाया जो सिर्फ़ वही दावा करता है जो जाँच सकता है।
C2PA वाले हिस्से में सबसे ज़्यादा कोड लगा। Content Credentials का मैनिफ़ेस्ट एक JUMBF बॉक्स में रहता है, और वह बॉक्स कहाँ मिलेगा यह कंटेनर पर निर्भर है। PNG उसे caBX चंक में रखता है, JPEG उसे APP11 सेगमेंट में ले जाता है, SVG उसे XML मेटाडेटा में रखता है। उसे ढूँढने का मतलब है कच्चे बाइट्स में उन मार्करों को स्कैन करना:
const scanC2PA = (buf: ArrayBuffer) => {
const bytes = new Uint8Array(buf);
const find = (needle: string): boolean => {
const n = needle.length;
const limit = bytes.length - n;
for (let i = 0; i <= limit; i++) {
let ok = true;
for (let j = 0; j < n; j++) {
if (bytes[i + j] !== needle.charCodeAt(j)) { ok = false; break; }
}
if (ok) return true;
}
return false;
};
const isPng = bytes[0] === 0x89 &&
String.fromCharCode(bytes[1], bytes[2], bytes[3]) === 'PNG';
const hasJumbf = find('jumb') || find('jumd');
const hasC2pa = find('c2pa');
const hasPngBox = isPng && find('caBX');
return { found: hasC2pa || hasPngBox, hasJumbf, isPng };
};
इससे मैनिफ़ेस्ट मिलता है। इससे उसका सत्यापन नहीं होता। सत्यापन का मतलब है सर्टिफ़िकेट चेन और क्रिप्टोग्राफ़िक हस्ताक्षर की जाँच, और मैं उसे ब्राउज़र टैब में हाथ से लिखकर प्रामाणिक बताकर पेश नहीं करने वाला। टूल यह कहता है और आधिकारिक वेरिफ़ायर की ओर इशारा करता है।
स्कैन की एक विफलता-स्थिति है जिसका नाम मुझे लेना चाहिए, दबाना नहीं। कच्चे बाइट्स में चार अक्षरों का मार्कर खोजने पर ग़लत पॉज़िटिव मिल सकता है, क्योंकि संपीड़ित इमेज डेटा के अंदर c2pa बाइट्स आ जाने से कुछ नहीं रोकता। फिर भी मैंने इसे रखा। तीन फ़ॉर्मैट में कंटेनर की संरचना ठीक से पार्स करना उस टूल के लिए बहुत मेहनत है जिसका पूरा दावा बस “यहाँ कुछ है, कहीं और जाकर जाँचो” है। यह एक स्मोक अलार्म है, और लेबल यही कहता है। अगर यह कभी काफ़ी न रहे, तो इलाज असली बॉक्स पार्सिंग है।
टेक्स्ट वाला हिस्सा मेरे छिपे-टेक्स्ट इंस्पेक्टर का कोडपॉइंट स्कैनर दोबारा इस्तेमाल करता है: ज़ीरो-विड्थ कैरेक्टर, Unicode Tag ब्लॉक जो पूरे ASCII संदेश अदृश्य रूप से छिपा सकता है, bidi कंट्रोल, वेरिएशन सिलेक्टर। ये सब पहचाने जा सकते हैं और चिह्नित करने लायक़ हैं।
सबसे कठिन हिस्सा कोड नहीं था। वह एक अकेले फ़ैसले के शब्द थे। टूल में “सांख्यिकीय वॉटरमार्क (Claude, SynthID-Text)” नाम का एक संकेत है जिसकी स्थायी स्थिति not checkable है, साथ में स्पष्टीकरण। जारी करने से पहले मैं इस पर काफ़ी देर बैठा रहा, क्योंकि जो टूल “मुझे नहीं पता” कहता है वह टूटा हुआ लगता है।
यह इसलिए मायने रखता है कि इन नतीजों का इस्तेमाल कैसे होता है। कोई एक पैराग्राफ़ चेकर में डालता है और आउटपुट अनुशासन बैठक में ले जाता है। इसलिए टूल चार चेतावनियों से शुरू होता है। पहली दो Anthropic का अपना रुख़ हैं, बाक़ी दो मेरी हैं कि मैंने जो बनाया उसकी सीमाएँ क्या हैं:
- चिह्न का न मिलना मानवीय लेखन का प्रमाण नहीं है। Anthropic भारी संपादन, पैराफ़्रेज़िंग, अनुवाद और दूसरे लेखन से मिलाने को ऐसी स्थितियाँ बताता है जिनमें चिह्न पकड़ में नहीं आते।
- चिह्न का मिलना भी लेखक होने का प्रमाण नहीं है। यह बताता है कि सामग्री उस मॉडल से गुज़री हो सकती है, यह नहीं कि किसने लिखा या किसी इंसान ने कितना बदला।
- C2PA की मौजूदगी C2PA का सत्यापन नहीं है। यह टूल मैनिफ़ेस्ट ढूँढता है, हस्ताक्षर या जारीकर्ता को वैलिडेट नहीं करता।
- मेटाडेटा नाज़ुक होता है। स्क्रीनशॉट, दोबारा सेव और ज़्यादातर प्लेटफ़ॉर्म अपलोड उसे हटा देते हैं, इसलिए डाउनलोड की गई फ़ाइल पर साफ़ नतीजा मूल के बारे में बहुत कम बताता है।
जब दस्तावेज़ के दो लेखक हों तब क्या होता है
ऊपर की हर बात मानकर चलती है कि दस्तावेज़ का एक ही लेखक है। लगभग किसी का नहीं होता। लोग एक चैटबॉट में ड्राफ़्ट बनाते हैं, किसी हिस्से को दूसरे में दोबारा लिखते हैं, उस हफ़्ते जो सबसे सस्ता हो उसके लिए OpenRouter से रूट करते हैं, और बीच-बीच में हाथ से संपादन करते हैं। यह कोई अनोखी चकमा देने की तकनीक नहीं है, आजकल काम ऐसे ही होता है।
Anthropic इसे पहले ही चिह्नित करता है। जिन स्थितियों में चिह्न पकड़ में नहीं आता, उनकी सूची में वह टेक्स्ट शामिल है जो “भारी संपादित, पैराफ़्रेज़ किया हुआ, अनूदित, या दूसरे लेखन के साथ मिलाया गया” हो। वह इसे चेतावनी की तरह कहकर वहीं छोड़ देता है। तंत्र यह रहा, क्योंकि असर का आकार मुझे चौंका गया।
ग्रीन-लिस्ट पहचान टोकन गिनती पर एक z-टेस्ट है। यह प्रकाशित ग्रीन-लिस्ट निर्माण है, उदाहरण के लिए चुने गए पैरामीटरों के साथ। यह Anthropic की योजना नहीं है, जो अप्रकाशित है। नतीजे का आकार आगे लागू होता है, ख़ास आँकड़े नहीं।
z = (greens - γT) / sqrt(T · γ(1-γ))
मान लीजिए दस्तावेज़ में T टोकन हैं, जिनमें से केवल W मशीन-लिखित हैं, और हर एक ग्रीन दर को ε से ऊपर उठाता है। मानवीय टोकन आधार दर γ पर ग्रीन देते हैं, इसलिए अपेक्षित ग्रीन गिनती Tγ + Wε है और पूरे दस्तावेज़ का सांख्यिकीय मान यह बनता है:
z_whole = W·ε / sqrt(T · γ(1-γ))
अब केवल मशीन-लिखित हिस्से को स्कोर करें:
z_span = ε·sqrt(W) / sqrt(γ(1-γ))
एक को दूसरे से भाग दें तो सब कुछ कटकर एक अकेली संख्या बन जाता है:
z_whole / z_span = sqrt(W/T) = sqrt(f)
पूरे दस्तावेज़ को स्कोर करने पर आपकी पहचान-शक्ति का केवल मशीन-लिखित अंश का वर्गमूल बचता है। f = 0.1 पर यह 32% है। उदाहरण के लिए γ = 0.5 और ग्रीन-दर में उछाल ε = 0.25 लें, तो 300 टोकन का मशीन-लिखित अंश अकेले z = 8.66 देता है और भारी भरोसे के साथ चिह्नित हो जाएगा। उसी अंश को 3,000 टोकन के दस्तावेज़ में डाल दें तो पूरे दस्तावेज़ का स्कोर गिरकर z = 2.74 रह जाता है, किसी भी वाजिब सीमा से नीचे। वॉटरमार्क नहीं बदला। डिटेक्टर ने ग़लत इकाई मापी।
यानी मॉडल मिलाना वॉटरमार्क पर हमला नहीं करता। वह डिटेक्टर की विंडो के चुनाव पर हमला करता है।
इलाज है टेक्स्ट पर एक विंडो खिसकाना और अधिकतम स्कोर लेना, मोटे तौर पर SynthID-Text पेपर का WinMax विचार। यह काम करता है, और इसकी क़ीमत भी है। सैकड़ों ओवरलैपिंग विंडो को स्कोर करने का मतलब है एक दस्तावेज़ पर सैकड़ों परिकल्पना परीक्षण चलाना, इसलिए बहु-तुलना सुधार चाहिए, जो सीमा को ऊपर धकेलता है, जो छोटे अंशों को फिर उसके नीचे धकेल देता है। आप डाइल्यूशन की समस्या को ग़लत पॉज़िटिव की समस्या से बदल लेते हैं, और उस डाइल की कोई भी सेटिंग दोनों से नहीं बचाती।
विंडोइंग भी केवल एक वेंडर के चिह्न को ही स्थानीयकृत करती है, क्योंकि हर प्रदाता अपना छद्म-यादृच्छिक फ़ंक्शन अपनी कुंजी से चलाता है:
for each vendor key K: # Anthropic, Google, OpenAI, ...
for each window w in text: # all of these need FPR correction together
score(w, K)
तीन वेंडर का मतलब तीन डिटेक्टर, तीन API राउंड-ट्रिप, तीन भरोसे के रिश्ते। फ़ेडरेटेड संस्करण कोई नहीं देता, और Anthropic का अभी सार्वजनिक नहीं है।
फिर वह छेद है जो ऊपर की ज़्यादातर बातों को सैद्धांतिक बना देता है। वॉटरमार्किंग के लिए ज़रूरी है कि इनफ़रेंस चलाने वाला सैंपलिंग चरण को झुकाए। यह सर्विंग स्टैक का गुण है, टेक्स्ट का नहीं। तो:
| रास्ता | वॉटरमार्क है? | क्यों |
|---|---|---|
| OpenRouter → Claude / Gemini / GPT | हाँ | टोकन लौटाने से पहले प्रदाता के स्टैक के भीतर लगाया जाता है। राउटर बस तैयार टेक्स्ट आगे भेजता है। |
| OpenRouter → Llama / Qwen / Mistral | नहीं | ओपन-वेट इनफ़रेंस प्रदाताओं पर झुकी हुई सैंपलिंग लागू करने की न बाध्यता है न प्रेरणा। |
| आपके अपने लैपटॉप पर llama.cpp | नहीं | वही कारण, और ज़्यादा। |
OpenRouter रूटिंग से वॉटरमार्क को नहीं हराता। वह एक ऐसी लेन देता है जहाँ चिह्न कभी लगा ही नहीं, और वह लेन एक कॉन्फ़िग स्ट्रिंग दूर है। इसलिए यह व्यवस्था मालिकाना फ्रंटियर API तक सीमित है, और कुछ नहीं। ओपन वेट ज़्यादातर टेक्स्ट कामों के लिए पहले से काफ़ी अच्छे हैं और इसके बाहर हैं। जो इसके आसपास निकलना चाहे, वह एक मॉडल का नाम बदल देता है।
मैंने डाइल्यूशन प्रभाव को इंस्पेक्टर में तीसरे टैब के रूप में जोड़ा। यह कोई टेक्स्ट विश्लेषित नहीं करता और कुछ पहचानता नहीं। यह z-टेस्ट का गणित चलाता है और दिखाता है कि मशीन-लिखित अंश बदलने पर दोनों स्कोर कैसे अलग होते हैं।
मैं कहाँ ग़लत था
मैंने मान रखा था कि वॉटरमार्क का टिकाऊपन संपादनों से बचने की बात है। असल में यह पैराफ़्रेज़ से बचने की बात है, जो कहीं कठिन है, क्योंकि पैराफ़्रेज़ टोकन चयन को दोबारा सैंपल करता है और संकेत वहीं रहता है। मेरी पहली योजना आत्मविश्वास प्रतिशत वाला चेकर थी, क्योंकि लोग वही उम्मीद करते हैं और वही रैंक करता है। मैंने उसे ख़त्म कर दिया। मेरा बनाया कोई भी आँकड़ा किसी और लेबल के नीचे एक आम AI-टेक्स्ट क्लासिफ़ायर होता, और उनमें दर्ज ग़लत पॉज़िटिव की समस्याएँ हैं, ख़ासकर ग़ैर-मूल अंग्रेज़ी लेखकों के ख़िलाफ़।
कठिन फ़ैसला वॉटरमार्क रिमूवर का था, पास का वह उत्पाद जो असल में ट्रैफ़िक खींचता। मैंने उसे छोड़ दिया। वह खुलासे की प्रतिबद्धता से बच निकलने का टूल होता, और वैसे भी काम नहीं करता। हटाने को कोई अक्षर नहीं है, इसलिए हटाने का मतलब इतना आक्रामक पैराफ़्रेज़ है कि लेखन बिगड़ जाए, और ब्राउज़र टूल मॉडल भेजे बिना पैराफ़्रेज़ नहीं कर सकता। बाद में जो बात मेरे साथ रह गई, वह यह कि इसके साथ जारी किया मेरा विराम-चिह्न ठीक करने वाला टूल ज़ीरो-विड्थ कैरेक्टर हटाता है, जो मैं अपने ड्राफ़्ट के लिए चाहता था। वही रेगेक्स, अलग उत्पाद। रेखा इसमें है कि पेज कहता है टूल किस लिए है, कोड में नहीं।
यह कहाँ जाता है
जो प्रोवेनेंस संकेत केवल वेंडर जाँच सके, वह अभी सार्वजनिक प्रोवेनेंस नहीं है। लेकिन sqrt(f) का नतीजा “हथियारों की दौड़ जारी है” से ज़्यादा ठोस कुछ बताता है। केवल सामग्री पर आधारित फ़ोरेंसिक उस सवाल का जवाब नहीं दे सकता जो लोग असल में पूछते हैं। यह नहीं कि टेक्स्ट जनरेट हुआ या नहीं, बल्कि कौन-से हिस्से, किसके द्वारा, और किसी इंसान ने कितना बदला। हमारे पास जितने भी तंत्र हैं वे ठीक वहीं बिगड़ते हैं जहाँ असली दस्तावेज़ रहते हैं, कई लेखकों और लंबे संपादन इतिहास वाली फ़ाइलों में। इसलिए काम की चाल शायद यह है कि टेक्स्ट से पूछताछ बंद करके माहौल का रिकॉर्ड रखना शुरू करें। एडिटर का रिवीज़न इतिहास, कमिट टाइमलाइन और हस्ताक्षरित संपादन-श्रृंखलाएँ पहले से किसी तैयार कृति पर किसी भी सांख्यिकीय परीक्षण से कहीं ज़्यादा भरोसेमंद ढंग से लेखन को दर्ज करती हैं, और C2PA का असर्शन मॉडल ठीक इसी तरह की परतदार, बहु-कर्ता प्रोवेनेंस को निशाना बनाता है। वॉटरमार्क का असली काम सुर्ख़ियों के सुझाव से ज़्यादा सीमित है। यह उस मशीनी टेक्स्ट के लिए डिफ़ॉल्ट-ऑन खुलासा है जिसे कोई छिपाने की कोशिश नहीं कर रहा, और विरोधी मामले वहीं सँभाले जाते हैं जहाँ उन्हें हमेशा होना चाहिए था, उन टूल्स में जो दर्ज करते हैं कि दस्तावेज़ कैसे बना।
लेखक
Rohit BuraniAI इंजीनियर, जो लैब से लोकल-फ़र्स्ट सिस्टम, सेल्फ़-होस्टेड इंफ्रास्ट्रक्चर और स्वायत्त टूल बनाते हैं।