395 comments

So this won't be happening in the US, but in the EU:

"When a supported Claude model generates text, it weaves an imperceptible watermark directly into the text itself. You won’t see it, and it doesn’t change the meaning, quality, or readability of Claude’s response.

Because the watermark is part of the text, it will travel with the text when it’s copied and pasted elsewhere, and may persist through some editing. Watermarking will be applied at the model level, which means it will be present no matter which Claude product or surface the text comes from."

I would love to see what this looks like in practice. Especially in generated code. I assume this is more than insertion of non visible special unicode whitespace characters, but more in the pattern of the text content itself?
non visible text is extremely easy to filter with a git hook, a post tool call hook, or just a script. I doubt they are doing that
sixtyj
Or grep, in a skill. /clean-cc-watermark just entered the chat…
mucha
The watermark will be encoded in the visible text.
IIRC, watermarking text could be as simple as training the model to use specific words/phrases more frequently than what you would expect to find in human-written text, to the point where it's highly statistically improbable that it wasn't AI generated. I assume similar logic could apply to code in the form of functions/code styling.

That's probably an over simplification. Also a solid defence that can be used against complaints about the way AI writes text.

toufka
I'm guessing - probably some textual variation on Benford's law? [1]. Trivial for compute, painful for a human.

- "Ensure distribution of vowels is in >99th percentile of human work"

- "Ensure the distribution of the letter "s" is within 99th percentile of human work"

- "Ensure the distribution of the letter "L" is periodic with periodicity within 5% of 1/N characters.

- "Ensure there is a cross-linguistic 'typo' (colour vs color) at 1/N words, where N: 1000 = Model1, 2000 = Model2, 3000 = Model3.

- "Ensure the distribution of tense error is within 99th percentile of human work"

If more than 3 dimensions have a score >99% percentile of human, let's call it watermarked...

- 1) https://en.wikipedia.org/wiki/Benford%27s_law

I would hate to have any of these rules effecting my output
I see what you did there!
Models can't reliably follow instructions involving their own logprobs unless they can take agentic control and use quite sophisticated dynamic grammars/structures/constraints to force this behavior in one shot (which can be slow and the dynamic grammar modification feature isn't supported in closed model APIs for safety reasons) or repeated attempts at rewriting which is expensive/slow.

Yes they can do this, but it's more likely closer to the original "red token, green token" paper: https://arxiv.org/abs/2301.10226

i.e. take half of your LLMs vocabulary, and upweight its probabilities by ~55% to the other half's ~45%, and scan for overuse of this half of all tokens. You can even choose a different half/slice for every individual user, for every individual action. You can implement this under the hood cheaply with logit-biasing.

Considering how weirdly detuned tokens selections have become in Anthropic's LLM prose in recent models, there is a chance this goes unnoticed in everyday use.
rcxdude
It essentially looks like the difference between two different runs of the model with the same prompt but different seeds. The watermark is essentially a small bias in the model such that when there's multiple different tokens that could conceivably follow the previous token, the model will only pick some subset of them (the subset is derived from a hash of the previous token). This bias can then be checked for statistically (without needing access to the model and without needing the whole prompt), and for longer text where there's enough freedom in word choice you can show that it would be vanishingly improbable to accidentally follow the rules in the watermark.
Article specifically says "worldwide"
Computer0 OC
I agree with your reading, I initially misread it.
kbelder
If you do the same prompt with zero noise from the US and the EU, would the difference reveal the watermark?

I suspect they'll roll out the watermark everywhere.

> Generated text will carry embedded watermarks, and generated files will include digitally signed provenance metadata where supported.

This should make it easier to catch cheaters who use Claude, right? Unless everyone runs their artifacts through some watermark and metadata sanitizer?

As long as they’re in the EU.
From the linked article

> Regions. Marking will apply to output from supported models wherever Claude is offered, worldwide.

> Unless everyone runs their artifacts through some watermark and metadata sanitizer?

It will happen if Claude tampers the text. Guaranteed.

pixl97
Text is too low bandwidth to classify reliably without lots of false positives. Especially as people start talking like LLMs.
The approach Pangram has taken which works pretty well is to simply lower the recall a lot but ensure the precision is very high. Which means potentially high false negative rate but low false positive rate.
amelius
They should just replace the spaces by one of Unicode special space characters.

Can it be circumvented? Of course. Will most people go through the trouble to circumvent it? No.

sixtyj
https://unicode-explorer.com/articles/space-characters

U+2800 or U+3164 would be nice.

But as I remove unwanted characters with grep before layout in InDesign, someone will make a skill for removing such space characters.

We already have one, our Claude setup already requires output to be 7-bit ASCII clean and scans it for such.
If it's that simple and obvious, you'll have 10 "Remove Claude Watermark" web-apps by the end of Day 1. Most of them coded by Claude.

Hell, it'll probably happen no matter how sophisticated their watermark is. There's no watermark in text that can't be detected and removed, and no text that can't be converted to generic keyboard ASCII.

amelius OC
You forgot about the cases where (1) people don't care, (2) people want to say "I used an LLM for this". I'm convinced that those cases happen more often than you think. Why not cover them with a simple mechanism? It's also in the interest of AI companies who don't want to train on AI output.
pixl97
Depends on the pushback in different sets of users. Students for example would clean it up.
amelius
Sure, but let's first find out how many % of people are willing to be frank about their AI usage, and/or don't care about it. My guess is it is worthwhile to do this.
selcuka
But the source codes of those web apps will also be watermarked. /s
Those invisible spaces get wiped by the first sanitizer in any normal ide. Worse it'll instantly break parsing for configs like yaml where spaces are critical for structure
aabhay
I have had a hunch for a while now that (in addition to these tools), Anthropic has actually leaned in to Claude's distinctive manner of writing since it makes the text more obviously AI generated and thus less susceptible to misuse.

That's not necessarily the same thing as a markov-style fingerprint but it could be a correlated factor.

pjm331
I had a similar thought but I assumed they leaned in because it improved performance on coding or something like that
It could also partly be a byproduct of examples of claude writing being in the dataset, which of course anthropic has lots and lots of and they do train on.
r_lee
no way. there's just no good excuse for why "load-bearing" and "worth flagging" are everywhere now, I've pretty much never seen that in the wild before
I suspect it's because of alignment concerns. The more deeply they can integrate their principles, the harder it'll be to misuse. Or at least that's the idea.
andai
From what I heard several AI companies have intentionally been making the personality more cringe so people stop making it their girlfriend.
It's pretty trivial to command it to not speak that way. That's one of the first things you should write into the prompt. What style you want it to write in. Make it use a very concise and dry academic style with no overt LLMisms, melodramatic or flowery language, or metacommentary.
People have been posting some variant of this comment for three years, and it's no more true today. Ever notice that the "prompt engineer" career hasn't materialized?
Regular engineers still exist.
Prompt engineer is a requirement within every serious job now, not a job in itself
I've never known any firefighters to prompt engineer a blaze, but perhaps you don't consider that a "serious" job.
andai
Hey ChatGPT, what side should I make the incision on?
case540
I don’t like the idea of hacking a response to contain a watermark. I also don’t like the idea of false positives detections coming directly from Anthropic. If people read more AI generated content, people will probably start writing more in that style
pixl97
I have no idea why you were down voted for this. Language is alive and people adopt it from sources they hear a lot.
Moreover, what if you quote text that happens to have been generated by Claude, does that bump up the AI-ness score of your source file or document?
The amount of times ‘delve’ appeared in general conversation in the last couple of years shows the influence LLMs have on society.
The flip side of this is that if AI-generated content becomes reliably identifiable and carries a stigma, then people might deliberately change their styles to be more diverse and human.

One example I've seen are junior employees at my company deliberately adopting a lowercase/less punctuation writing style so as to stand apart from AI.

simonw
> When a supported Claude model generates text, it weaves an imperceptible watermark directly into the text itself. You won’t see it, and it doesn’t change the meaning, quality, or readability of Claude’s response.

I'd like to know a lot more about how that works.

A lot of my interactions with Claude return pretty precise text. If I ask it to edit a project and refactor a specific function in several places I know exactly what I want to happen, it will NOT be OK if those refactors have some kind of weird pattern baked into their text to act as a watermark.

I guess this may be covered by this:

> Content generated by Claude may not carry a detectable mark if, for example: [...] The passage is very short, leaving too little text for a reliable signal;

gajus
Most likely watermark will be proportional to the input/output ratio, i.e. if you input a long document and ask to make edits, it will not attempt to watermark it. On the other hand, if you provide a tweet and ask it to write an article, that will include watermark. Just a guess (and yes, it feels flawed)
It will just thread some load-bearing seams through the paragraphs.
baq
> I'd like to know a lot more about how that works.

Count load-bearing words using two different algorithms in a belt-and-braces fashion

Belt, braces, and suspenders.
Don't forget the suppositories
quintu5
This is why I never use max effort! I’ll stick with my suspenders, thank you.
jbs789
Fair - I should have been honest about the watermark.
That’s the real shape of the problem.
r_lee
One thing worth flagging: those words are load-bearing
You’re absolutely right. Yo momma is doing a lot of heavy lifting here. Her load-bearing methods have the right shape.
yedidmh
I have to push back: you've found the seam.
akozak
Most likely this method https://arxiv.org/pdf/2301.10226 (EDIT: and Google's SynthID paper which builds on it https://www.nature.com/articles/s41586-024-08025-4)
That "just add a constant to the green logits" as a fix to the entropy problem is so elegant I love it.
If different model providers use different green logits, does that mean they can only tell if the text came from their own model?
What happens if someone handwrites a Claude output, then someone uses that handwritten text as a reference. Now you've got a watermarked idea which may have no direct linkage to the usage of Claude.
How is that different from referencing digital text that someone copied and pasted from Claude?
Because there's an expectation of authenticity from the written word. If you've referenced something handwritten, you don't expect it to be the output of an LLM.

Similarly, if you quote someone word-for-word, you wouldn't anticipate their words to be flagged as Claude content, but if someone memorized Claude output word-for-word. That would still be classified as a Claude output.

Going forward you could categorize the influence of Claude on a population based off a percentage match between their spoken words with the LLM prose.

Are you worried about being accused of using LLMs to generate your work? As long as you don't plagiarize you have nothing to worry about.
What if I unknowingly read content written by Claude in various articles and it influences my own writing style?
I'm not too sure about that, people making stuff have already gotten penalized by overzealous AI detectors, most recently Kurtzgesagt.
You can't make a blanket statement like this without knowing how the watermark is implemented.
If the algos work as advertised, watermarked token sequences have an extremely low probability. Copying the words by hand doesn't change that.

The mechanism seems to survive editing. The extreme probabilities get a little less extreme, but are still extreme enough to be distinctive.

But it wouldn't survive paraphrasing, because the output would be entirely human and the token correlations would disappear.

It might not survive referencing if only a sentence or two is used.

The practical issue is how true the claims are. It's one thing to create a proof of concept, another to see how it works in use.

And this is potentially catastrophic for code, because the grammar and word choices of code are completely different and more fragile than standard English.

mihaelm
> have some kind of weird pattern baked into their text to act as a watermark.

public abstract class BaseAnimalBeanFactoryGeneratedFromClaudeFactory

siva7
I can tell you how: Claude produces a huge wall of text with jargon ridden bullshit and invented terms no human subject matter expert would seriously use and overuse.
>I'd like to know a lot more about how that works.

My guess is that it works like Gemini's SynthID: by altering the logprobs of the next token.

Like, for every 10th token, instead of outputting the most probable, it outputs the 17th most probable, or something. (Obviously it's way more complicated but I think conceptually this is how it works.) No human will notice this, but a classifier trained on Claude's output will.

So it's not like the watermark is the words "le epic bacon" and Claude will output "le epic bacon" in everything. That would be extremely annoying (and easy to defeat).

They still need to choose when to do that though. When I prompt the program to e.g. alter a bash script in a specific way or to recite a longer known text it can't go round and randomly exchange tokens. It has to somehow define what is a simple repeated text from a different origin and what is a novel generation.
I am wondering how that applies to newly generated code.

Odd variable naming? Stylistic choices that are watermarked?

Or as someone else noted further down in the comments, it could be more subtle:

Between the first and second most likely choice, in certain positions it will consistently choose in a certain way.

> Odd variable naming? Stylistic choices that are watermarked?

Whatever it is, I'm sure it's load-bearing.

You're absolutely right. But it is not just load-bearing, it is the load-bearing seams.
Personal observation: Opus 5, over the last week, has started outputting A LOT more comments. Despite my global instructions being full of variations on "don't use comments unless absolutely necessary".

I might be imagining things of course. But comments would be great fit for this use case.

They have mentioned that their system prompt used to say "avoid over-commenting" and it no longer does. They should bring that back IMO.
pram
Yes the length of comments Opus 5 leaves is exhausting. Not to mention it will insert info thats only relevant within the current session. I've just been deleting all of them lol
Comments seem most plausible, especially since I absolutely expect it to match my code style, existing architecture, and have the code go through CSharpier and dotnet format after the fact.

edit: as an aside - I actually use extensions to collapse comments and change the color to be less intrusive.

wpietri
I would guess they're not worrying about watermarking a tweak to a human-written program. That's both a tiny fraction of Claude use and of very little concern to the kinds of people who want to check watermarks.
kuboble
I cannot imagine the code with well defined specification will have extra watermarks unless the watermark is requested as part of the harness instructions.

If it works like people describe - on the every nth token or something - then the mark will be left in the chain of thought and discussion with the model - not in the code artifacts.

If you're that targeted with your edits, then do you deserve a watermark anyway?
lozenge
Most probable usually means for a specific prompt. How can this operate without the the original prompt?
ebtebt
Just double checking my understanding: If this is true then only Anthropic will be able to detect if text was generated by one of its models, correct?
Likely yes.
But what prevents someone from using Anthropic own detection system to train a watermark-scrubber?

Seems like this would only catch the most unsophisticated cases.

Rate limits, presumably.
Most of the people posting unedited LLM content all over the internet are unbelievably lazy.
Less probable also means less optimal and you get a subpar response. More so if it's baked into its reasoning. It's intelligence will suffer unless this is some post processing thing.
shawnz
There is already some intentional randomness in token selection, because it actually improves the quality of responses if you intentionally don't always pick the most likely next token.

You can hide data in that randomness without impacting the quality of the response by using a sufficiently "random looking" pseudorandom bit stream instead of real random numbers.

I previously worked on a project to do that here: https://github.com/shawnz/textcoder

Good point, very interesting. Thanks!
> Like, for every 10th token, instead of outputting the most probable, it outputs the 17th most probable, or something.

Wouldn't you need the prompt to know the probability of the next token?

Chabsff
Not necessarily. Here's a rough example (it's not what's going on here, just a representative idea):

There are words/tokens that are heavily correlated to the prompt (a yes or a no, for example), and then there are others that are going to be less so (adjectives with a lot of synonyms for example).

Given a text, you can identify what the "load bearing" and auxiliary words/chunks are. Then, looking only at the auxiliary words/chunks, you should, in principle, be able to determine what other wordings could have gone there instead. From this, you can, very roughly, recreate the token probability distribution that was in effect when those tokens were generated. With the probability distribution in hand for enough chunks of text, you can start inferring properties about the RNG process that was used to sample from those distributions.

But then, this notion of "load bearing" vs "auxiliary" can be expressed directly in the probability distributions. A load bearing token just has a very high probability, and thus any RNG bias that may have been in effect will likely be swallowed in the distribution. So the parts of the text that are highly dependant on the prompt will naturally not be contributing much information about he RNG in the first place.

So this is finally what "load bearing seam" means.
Art9681
Ah so this is why Gemini is neurotic.
it's going to be easy to defeat either way, like SynthID is. From apps built to remove the watermark, to simply rephrase the work with an Open Model...

By the way: https://x.com/alexcdot/status/2087078010524406137

what about temperature though? Wouldn't that only work if temp == 0?
Maybe there is a reason why Opus 5 produces such word salad conversations
myko
So frustrating to use. And the comments generated by Claude today are unreadable garbage.
Yes. The irritating epigram / aphorism style it now uses is such a regression compared to previous Anthropic models. Probably is the case that this is due to watermarking - though hardly subtle if it is.
sixtyj
Though if pangram should be trusted, there are still statistical artifacts that tells you that a text LLM generated. I don't find that to be implausible.
timpera
Alas, Pangram should not be trusted.
s_dev
So was it going down:

"Neutralize engine is temporarily unavailable. Try again."

arcfour
> Honest note: Anthropic has not shipped a public Claude watermark detector yet. This tool uses rewrite-based neutralization — a meaning-preserving paraphrase with a non-Claude model — which is the attack path watermark research points to. Not affiliated with Anthropic.

Well, they should have run their own AI slop website through their tool...

nunez
This attack was actually pointed out in the watermarking paper linked above. The researchers added an instruction to the prompt that switches letters like a Caesar Cipher. It lowers the quality of the output from the LLM but alters the "red list" enough for a watermark detection tool to fail at detecting the watermark.
fl0id
also their example for rewriting just completely changes it. might as well redo it in this case (with another model or by hand)
layer8
Well, if the model that page uses also falls under the EU act, the output will just be watermarked differently. ;)
cush
Should be ensloppifier.app - it somehow makes the AI sound more like AI, while also completely changing the meaning and context of the input text

From their before/after:

   - Certainly! -> (removed)
   - onboarding redesign -> revamping the introductory process
   - this week -> (removed)
   - empty states -> empty sections
   - CTA heirarchy -> call-to-action sequence
   - interviews -> discussions
   - aligned copy with brand voice -> verbal identity
... these choices change the meaning of the text
Load-bearing==claude
My guess is it will be similar to how Genius watermarked lyrics, using things like variants of punctuation

https://www.pcmag.com/news/genius-we-caught-google-red-hande...

toxik
In program code? Unlikely, surely¡
That was actually the cause of an issue I had a couple of years ago: I had hand-typed JSON using my iPad into GitHub’s online text editor and Safari helpfully used “pretentious quotes” instead of "old-school quotes" - and the JSON library used by the program to read that file had relaxed parsing rules that accepted actual JS object literals without quoted property names; so the fancy-quotes were interpreted as part of the key-names. This took ages to figure out because when human-eyeballing the JSON file it looked perfectly fine in Notepad.
kccqzy
I don’t doubt your experience, but many people are intimately aware of the use of proper Unicode quote characters, in any reasonable font they choose. For me, one of the first things I learned when using LaTeX is how the quotes are transformed from the source to the typeset document; since then I’ve become extremely sensitive to the kind of quotes I see.
Consider these naming options:

> total = calculate(items)

> result = calculate(items)

> value = calculate(items)

> amount = calculate(items)

All of them are reasonable options. If we bias the model's output so that one of them is more likely than the others, then we can reconstruct that watermark if enough of these frames are present.

Off the top of my head I would have thought zero width characters (eg: U+200B, U+200C) making some unique identifier sprinkled in amongst the output. But obviously far from foolproof since they could simply be removed.
wrsh07
Scott Aaronson talks about his project at OpenAI to do this^

You can carefully select which pseudorandom number generator (prng) you use to be able to id text of a certain length. I expect there is some performance characteristic you have to manage since you're doing this on every inference, but once you do that it doesn't change the output in any meaningful way (the prng is still a statistically valid prng, it just happens to let you check if the output used that prng)

The point is that you can do this simply by swapping to a different RNG, which isn't noticeable to the end user, and while it changes the output, it's not any different from how using a different seed or being lumped in a different batch will change the output.

^ excerpt:

> So then to watermark, instead of selecting the next token randomly, the idea will be to select it pseudorandomly, using a cryptographic pseudorandom function, whose key is known only to OpenAI. That won’t make any detectable difference to the end user, assuming the end user can’t distinguish the pseudorandom numbers from truly random ones. But now you can choose a pseudorandom function that secretly biases a certain score—a sum over a certain function g evaluated at each n-gram (sequence of n consecutive tokens), for some small n—which score you can also compute if you know the key for this pseudorandom function.

EE84M3i
wrsh07
That's what I excerpted, although I had seen it presented from his talk at Stony Brook
I’ve always wondered how this works when we only observe the final output and not the internal state that’s used to generate the output.

The LLM presumably generates f(input, RNG) but we only can observe f(RNG).

Groxx
Since they do have the input, they could probably just store checksums at each step...

... though I'm not sure why that would be preferable over a coarse rolling checksum over all of the output. Seems like that wouldn't influence output, would be equally imperceptible, and probably easier to calculate (compared to "hash seed times running all LLMs supported times number of RNG algorithms, to see if output matches").

Presumably there's some other trick, or it's a red herring / failed experiment and not what they actually do in practice.

wrsh07
No you don't need to do that, the prng is detectable if you know what bias to look for and have the key
teravor
this would be a very heavy watermark application.

there are many simpler methods, for example you can have a tiny windowed transformer operating on the output text and all you do is alter certain words (that don't change meanings) to maximize its surprise. the tiny language model will have a special training regime to build up a somewhat unique view of the language.

we are talking about a 0.5 bit watermark here (existence). I would have zero confidence in being able to reliably remove such a watermark from pretty much any medium.

wrsh07
That's actually much worse because it fundamentally changes the output, whereas this doesn't change the output, it just changed the prng
cma
When you tell the AI: copy this function to here, a small window rewriter would mean it just corrupts and changes it instead of moving it. And even it's own tool use would have some small window dumb model changing the tool calls based on what it thinks are synonyms? The Aaronson approach is much better than this, it's essentially like changing out the random seed for the sampling parts that were already random. For an operation like recall of previous text, the tight logits that result still keep it doing that close to deterministically. For something it creates itself, with more spread out probability mass, it gets watermarked.
I think a lot of the examples below are projecting more complicated options, but it could also be something just as simple as using a word with a hyphen in it every prime-numbered sentence. Or any other "puzzle-y" pattern.
cush
Certainly it can't watermark text with low entropy. If you're renaming a function using claude it won't be marked
izonu
> We’re also working to enable users and other third parties to detect Claude’s embedded watermarks and provenance metadata.

This seems to be similar in execution to Google's SynthID. I hope they release actual code the technically proficient can use, unlike SynthID which can only (afaik) be queried with Gemini's UI.

gajus
The moment Google announced SynthID, the first domain I bought was deSynthID.com

Several open-source projects have already proven SynthID to be ineffective.

There are many free lock picking tutorials, but yet locks are still effective.
gajus
this gives strong "you wouldn't steal a car" vibes
simonw
An interesting factor of this is competition.

If Claude was the only model family they could ship a change like this and users who want to cheat (or don't like watermarks for other reasons) would just have to put up with it.

In a world with many different competing models, the risk of losing customers to other providers over this is much more real.

Maybe they've looked at the numbers and the portion of people who clearly use Claude to cheat on examples etc is so tiny that losing them to other providers isn't a problem?

gajus
There are already small models trained specifically to prevent statistical detection, e.g., https://huggingface.co/kalpeshk2011/dipper-paraphraser-xxl

I guess whoever is the policy maker is assuming that some protection is better than none and that most people will not reach for such tools.

slowin
I’m more worried that this will degrade performance. I want the best results from a model, not the results that fit a constraint that’s not defined by me. Any increased cost or latency is also unacceptable.
lhd1
Scott Aaronson spoke about this in a colloquium where he said that this was mooted at OpenAI before the decision was made by Altman to not implement it for the reasons you describe.

https://youtu.be/9udWn1Hlj_s?si=VWOiK5-y4zcyDoHI

OpenAI will soon be adding watermarking to text as well, as it signed the EU Code of Practice on Transparency of AI-Generated Content: https://openai.com/index/advancing-responsible-ai-across-eur...
Either that or they want to comply with the EU AI Act when it affects them.
andai
Presumably the expected cost of doing it is less than the cost of getting fined by the EU for not doing it.