
Marca d'água semântica com detecção robusta a ordem sobre unidades de sub-frase
O SwordStamp adiciona detecção robusta à ordem e unidades de extensão semântica a marcas d'água semânticas baseadas em embeddings. Este artefato contém a configuração exata do artigo, o código de geração e detecção, a suíte de ataques inalterada, a avaliação de qualidade e a extração e plotagem determinísticas de resultados.
Artigo: Semantic Watermarking with Order-Robust Detection over Sub-sentence Units (arXiv:2608.27666)
Com taxa de falsos positivos de 5% e requisito de preservação de conteúdo de 90%, o ataque de deslocamento de embedding específico do esquema (EDA-S) alcança:
| Marca d'água | Taxa de sucesso do ataque EDA-S |
|---|---|
| SemStamp | 47,9% |
| k-SemStamp | 33,3% |
| PMark | 46,1% |
| SAMark | 32,6% |
| SwordStamp | 18,7% |
| k-SwordStamp | 10,8% |
Em relação às suas linhas de base publicadas, o SwordStamp e o k-SwordStamp reduzem o sucesso do EDA-S em 29,2 e 22,5 pontos percentuais, com custos de fidelidade em condição limpa de 1,8 e 4,4 pontos. Suas taxas de detecção em condição limpa são de 94,9% e 97,0%. Sob o teste de estresse EDA-D de acesso ao detector mais forte, o sucesso máximo com restrição de qualidade é de 39,7% no k-SwordStamp contra 65,5% no k-SemStamp.


Esses resultados abrangem continuações de notícias em inglês, um modelo de provedor, dois codificadores de provedor e um par paráfrase/substituto EDA.
visualization consome apenas o pacote compilado CSV/Parquet. Ele falha em células ausentes do artigo em vez de desenhar uma figura parcial.
uv sync --frozen --only-group plot --no-install-project
uv run --no-sync python -m visualization extract \
--bundle results/paper --output results/paper
uv run --no-sync python -m visualization render \
--bundle results/paper --output results/paper
Isso grava tabelas auditáveis em results/paper/tables/ e sete figuras em
PNG e PDF em results/paper/figures/. O branch de revisão anônima inclui
o pacote compilado; uma execução completa no branch de release cria os mesmos arquivos
com python -m visualization compile.
O ataque de deslocamento de embedding (EDA) é um ataque adaptativo de paráfrase de texto completo.
Em cada unidade de saída, ele
amostra K continuações e mantém o candidato com o maior deslocamento
de cosseno em relação à sua âncora de origem sob um codificador substituto. Como cada
candidato continua o prefixo completo de reescrita, um único objetivo pode reformular o conteúdo,
reordená-lo e dividir ou mesclar unidades do detector.
O EDA sem caixa vê o texto marcado e o design público da marca d'água. Ele não consulta o detector ou gerador e não recebe chave secreta, codificador do provedor, ou oráculo de qualidade.
| Variante | Âncora e unidade | Configuração |
|---|---|---|
| EDA-P | sentença posicional | adaptive, anchor=positional, unidade do atacante sentence |
| EDA-S | design público do alvo | sentenças posicionais para SemStamp, k-SemStamp e PMark; bag/sentence para SAMark; bag/semspan para ambas as variantes do SwordStamp |
| EDA-D | detector do provedor | oracle; herda o codificador, a partição e a segmentação do defensor |
Para ancoragem por bag, o artigo usa attack.bag_agg=min: maximizar a distância da
âncora de origem mais próxima. As execuções sem caixa relatadas usam
Qwen/Qwen2.5-3B-Instruct, BAAI/bge-base-en-v1.5,
K={1,2,4,8,16,32,64}, temperatura 1.0, top-p 0.95, no máximo 96 tokens por
candidato, e no máximo 512 tokens de reescrita.
Outros projetistas de marca d'água podem chamar o EDA diretamente:
from attacks.paraphrasing.adaptive import adaptive_attack_paraphrase
attacked = adaptive_attack_paraphrase(
texts,
base_model="Qwen/Qwen2.5-3B-Instruct",
surrogate_model="BAAI/bge-base-en-v1.5",
num_candidates=32,
anchor="positional", # EDA-P; use "bag" for an order-robust design
bag_agg="min",
segmentation_type="sentence",
segmentation_backend="nltk",
)
Para o EDA-S ciente do SwordStamp do artigo, defina anchor="bag",
segmentation_type="semspan", semcut_max_words=15 e
semcut_window=5. Neste repositório, o CLI equivalente é:
uv run python -m attacks DATA_PATH --config PRESET \
--set attack.paraphraser=adaptive \
--set attack.custom_model=Qwen/Qwen2.5-3B-Instruct \
--set attack.surrogate_model=BAAI/bge-base-en-v1.5 \
--set attack.num_candidates=32 \
--set attack.anchor=bag --set attack.bag_agg=min \
--set segmentation.attacker_type=semspan \
--set segmentation.attacker_backend=nltk
DATA_PATH é sempre o corpus base e PRESET identifica a célula com marca d'água.
Consulte attacks/README.md para todos os ataques retidos e campos de configuração.

config/paper.py é a única fonte de verdade. Para cada um de LSH e k-means,
scripts/experiments/swordstamp.sh executa esta escada aditiva de cinco níveis com 64
candidatos de provedor:
A grade contém apenas estas dez células e uma linha de base sem marca d'água. O PMark é
somente online; o SAMark usa um padrão de flag por execução. Os orçamentos do EDA-D são
K={4,8,16,32,64}.
Os submódulos de comparação adaptam as fontes públicas de avaliação do PMark e do SAMark apenas em suas fronteiras de conjunto de dados/resultados e na calibração compartilhada de falsos positivos; os algoritmos de marca d'água permanecem inalterados.
Os pré-requisitos são Git, uv, Python 3.11, CUDA para execuções de modelo, acesso às revisões de modelo fixadas e armazenamento temporário.
git clone --recurse-submodules [email protected]:D-Diaa/SwordStamp.git
cd SwordStamp
bash scripts/setup.sh
uv run --frozen python scripts/check_artifact.py
Prepare as partições C4 determinísticas e disjuntas:
uv run --frozen python scripts/prepare_c4.py --output-dir data
Instale e configure o agendador fixado. O instalador imprime seus efeitos colaterais no nível do usuário antes de alterar qualquer coisa:
bash scripts/install_gpu_scheduler.sh --print-plan
bash scripts/install_gpu_scheduler.sh --yes
gpu-scheduler init --gpus 0,1
gpu-scheduler start
Pré-visualize e, em seguida, envie cada shard físico:
for shard in c4-val-def-256 c4-val-def-256b c4-val-def-512; do
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/swordstamp.sh
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/pmark.sh
BASE="data/$shard" DRY_RUN=1 bash scripts/experiments/samark.sh
done
# Remove DRY_RUN=1 after inspecting the exact DAGs.
Compile, extract, and render: