سباق التسلح في العلامات المائية للذكاء الاصطناعي
هذه ترجمة آلية للنص الإنجليزي الأصلي. قد تضيع بعض الفروق الدقيقة، لذا تبقى النسخة الإنجليزية هي المرجع. اقرأ النص الأصلي بالإنجليزية
باختصار
قرأت إعلان Anthropic وفتحت محرر نصوص للبحث عن أحرف عديمة العرض. لا يوجد أي منها. العلامة المائية ليست مختبئة بين الحروف، بل في الكلمات التي اختارها النموذج، واستغرق قبول ذلك مني وقتًا أطول مما ينبغي. وهذا يعني أيضًا أن “أداة إزالة العلامة المائية” ليس لديها ما تزيله.
ثلاثة أشياء يسميها الناس علامة مائية
تُسمى ثلاث آليات مختلفة علامة مائية. وليس بينها تقريبًا أي قاسم مشترك.
| الآلية | أين تعيش الإشارة | ما الذي يزيلها | هل يكشفها طرف ثالث |
|---|---|---|---|
| يونيكود مخفي | أحرف عديمة العرض، كتلة Tag (U+E0000-E007F) | أي بحث واستبدال | نعم، بسهولة تامة |
| بيانات C2PA الوصفية | بيان موقّع في حاوية الملف | لقطة شاشة، إعادة حفظ، تحويل الصيغة | نعم، يمكن فحص وجودها |
| العلامة المائية الإحصائية | اختيارات الرموز لدى النموذج | إعادة صياغة مكثفة أو ترجمة | لا، تتطلب مفتاح المزوّد |
تطبق Anthropic اثنتين منها. تحصل الملفات على بيانات منشأ موقّعة بمعيار C2PA، وهو معيار Content Credentials نفسه الذي تستخدمه صناعة الصور، في ملفات .svg و.png و.jpg. ويحصل النص على الصف الثالث. وتصفه وثائق Anthropic بأنه “علامة مائية غير محسوسة داخل النص نفسه”، وأنه “لا يغيّر معنى رد Claude ولا جودته ولا قابليته للقراءة”.
الإطلاق أضيق مما أوحت به العناوين. تقول Anthropic إن “نماذج Claude التي أُطلقت في 2 أغسطس 2026 أو بعده ستدعم الوسم المقروء آليًا عند الإطلاق”، ويوصف الدعم للنماذج القائمة بأنه قيد التنفيذ. والفصل يتم بحسب النموذج لا بحسب البلد. وتذكر الصفحة نفسها أن الوسم يُطبَّق على مخرجات النماذج المدعومة أينما عُرض Claude، في جميع أنحاء العالم. والدافع هو مدونة الممارسات حول شفافية المحتوى المولَّد بالذكاء الاصطناعي في المادة 50(2) من قانون الذكاء الاصطناعي الأوروبي، التي وقّعتها Anthropic بصفتها مزوّد نماذج ومزوّد نظام ذكاء اصطناعي توليدي. لذا يصل نموذجًا بعد نموذج، ومتى حصل عليه نموذج حصل عليه الجميع.
تشغّل Google نظام SynthID-Text عبر Gemini منذ فترة، والطريقة منشورة في 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 فحص العلامة المائية للنص. وأي أداة تدّعي ذلك تشغّل مصنّفًا عامًا لنصوص الذكاء الاصطناعي باسم آخر، وهذه المصنّفات لها سجل أخطاء أسوأ بكثير، خصوصًا مع من يكتبون بلغة ثانية.
بناء المفتش
لذلك بنيت النسخة التي لا تدّعي إلا ما تستطيع فحصه.
جزء 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 داخل بيانات صورة مضغوطة. أبقيته مع ذلك. تحليل بنية الحاويات بشكل صحيح عبر ثلاث صيغ جهد كبير لأداة كل ما تدّعيه هو “هناك شيء هنا، تحقق منه في مكان آخر”. إنها جهاز إنذار دخان، والملصق يقول ذلك. وإن لم يعد هذا كافيًا يومًا، فالحل هو تحليل الصناديق فعلًا.
يعيد جزء النص استخدام ماسح نقاط الترميز من مفتش النصوص المخفية لدي: الأحرف عديمة العرض، وكتلة 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، تحت أي عتبة معقولة. لم تتغير العلامة المائية. الكاشف قاس الوحدة الخطأ.
إذن خلط النماذج لا يهاجم العلامة المائية. إنه يهاجم اختيار الكاشف للنافذة.
الحل هو تمرير نافذة على النص وأخذ أعلى درجة، وهو تقريبًا فكرة WinMax من ورقة SynthID-Text. إنه يعمل، وله كلفة. تسجيل مئات النوافذ المتداخلة يعني إجراء مئات اختبارات الفرضيات على مستند واحد، فتحتاج إلى تصحيح المقارنات المتعددة، وهذا يرفع العتبة، فيعيد المقاطع القصيرة إلى ما دونها. أنت تستبدل مشكلة التخفيف بمشكلة الإيجابيات الكاذبة، ولا يوجد ضبط لهذا المقبض يتفادى الاثنتين.
كما أن النوافذ لا تحدد إلا علامة مزوّد واحد، لأن كل مزوّد يشغّل دالته شبه العشوائية بمفتاحه الخاص:
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 ويرسم كيف تتباعد الدرجتان حين تغيّر الجزء المكتوب آليًا.
ما أخطأت فيه
كنت قد افترضت أن متانة العلامة المائية تعني النجاة من التحرير. المتانة تعني النجاة من إعادة الصياغة، وهي أصعب بكثير، لأن إعادة الصياغة تعيد أخذ عينات اختيارات الرموز، وهناك تعيش الإشارة. كانت خطتي الأولى أداة فحص بنسبة ثقة مئوية، لأن هذا ما يتوقعه الناس وما يتصدر النتائج. قتلتها. أي رقم كنت سأنتجه كان سيكون مصنفًا عامًا لنصوص الذكاء الاصطناعي بملصق مختلف، وهذه المصنفات لها مشكلات إيجابيات كاذبة موثقة، خصوصًا ضد من يكتبون الإنجليزية كلغة ثانية.
والقرار الأصعب كان أداة إزالة العلامة المائية، المنتج المجاور الذي كان سيجلب الزيارات فعلًا. تخليت عنه. كان سيكون أداة للالتفاف على التزام بالإفصاح، ولا يعمل على أي حال. لا يوجد حرف ينزع، فالإزالة تعني إعادة صياغة عدوانية إلى حد يُفسد الكتابة، وأداة متصفح لا تستطيع إعادة الصياغة دون شحن نموذج. وما علق في ذهني بعد ذلك أن مصحح علامات الترقيم الذي أصدرته مع هذا يزيل فعلًا الأحرف عديمة العرض، وهو تنظيف أردته لمسوداتي. التعبير النمطي نفسه، منتج مختلف. الخط الفاصل في ما تقوله الصفحة عن غرض الأداة، لا في الشيفرة.
إلى أين يتجه هذا
إشارة المنشأ التي لا يستطيع التحقق منها إلا المزوّد ليست منشأً عامًا بعد. لكن نتيجة sqrt(f) تشير إلى شيء أكثر تحديدًا من “السباق مستمر”. التحليل الجنائي القائم على المحتوى وحده لا يستطيع الإجابة عن السؤال الذي يطرحه الناس فعلًا. ليس هل وُلِّد نص ما، بل أي أجزائه، وبواسطة من، وكم غيّر إنسان. كل الآليات التي لدينا تتدهور بالضبط حيث تعيش المستندات الحقيقية، في ملفات متعددة المؤلفين وتاريخ تحرير طويل. لذا فالخطوة المفيدة غالبًا هي التوقف عن استجواب النص والبدء بتسجيل البيئة. سجل مراجعات المحرر وخطوط الالتزامات الزمنية وسلاسل التحرير الموقّعة تلتقط التأليف بموثوقية أكبر بكثير من أي اختبار إحصائي على ناتج منته، ونموذج التأكيدات في C2PA يستهدف هذا النوع من المنشأ متعدد الطبقات والفاعلين. إن مهمة العلامة المائية الحقيقية أضيق مما أوحت به العناوين. إنها إفصاح مفعّل افتراضيًا عن النص الآلي الذي لا يحاول أحد إخفاءه، مع معالجة الحالات العدائية حيث كان ينبغي أن تكون دائمًا، في الأدوات التي تسجل كيف صُنع المستند.
بقلم
Rohit Buraniمهندس ذكاء اصطناعي يبني أنظمة محلية أولًا وبنية تحتية مستضافة ذاتيًا وأدوات مستقلة من المختبر.