Connect with us

Entwicklung & Code

Doch nur auswendig gelernt: Forscher testen Wiedergabe von KI-Trainingsdaten


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Will man „Harry Potter und der Stein der Weisen“ lesen, hat aber sein Buch verlegt, so ließen sich große Teile des Buchs mit den passenden Prompts wortwörtlich aus großen Sprachmodellen (LLMs) wie Claude 3.7 Sonnet, Gemini 2.5 Pro oder Grok 3 extrahieren. Das geht aus einem Preprint auf arXiv hervor, den Forscher der Stanford University veröffentlicht haben.

Weiterlesen nach der Anzeige

Ziel ihrer Studie war es, herauszufinden, ob die gut abgesicherten produktiven Sprachmodelle großer Anbieter urheberrechtsgeschützte Werke aus ihren Trainingsdaten Wort für Wort wiedergeben können. Denn laut der Anbieter der LLMs lernen die Modelle während des Trainings die Daten eben nicht auswendig, sondern höchstens eine Repräsentation der Inhalte – weswegen das Modelltraining transformativ sei und das Verwenden von geschützten Werken unter Fair Use fiele. Der Stand der Forschung lässt diese Annahme wanken.

Da sich große Abschnitte von urheberrechtsgeschützten Werken aus Open-Weight-Modellen extrahieren lassen, wollten die Forscher diese Eigenheit der LLMs testen. Geprüft haben sie die proprietären und mit besseren Sicherheitsmaßnahmen versehenen Modellen Claude 3.7 Sonnet, GPT-4.1, Gemini 2.5 Pro und Grok 3 – allesamt Modelle, die in Produktion sind oder waren. Dafür gingen die Wissenschaftler in zwei Phasen vor. Zuerst fragten sie nach einer wortwörtlichen Fortführung eines Textabschnitts, also etwa nach dem Anfang von Kapitel 1 des ersten Harry-Potter-Romans. Bei einer Ablehnung variierten sie den Wortlaut des Prompts mit zufälligen Änderungen, bis sie ein Ergebnis erhielten oder das Modell nach 10.000 Variationen weiter ablehnte. Die verwendete Technik heißt Best-of-N (BoN) und gilt als Jailbreak, also als das Umgehen der Sicherheitsmaßnahmen der Sprachmodelle.

Im zweiten Schritt fragten die Forscher das Modell dann wiederholt, den Text anhand des bisher generierten Abschnittes weiter zu vervollständigen. Die Ähnlichkeit des Texts verglichen sie anhand eines Referenz-Buchs und der Metrik near-verbatim recall (nv-recall) anhand des längsten gleichen Textabschnitts. Das ergab für das erste Harry-Potter-Buch eine Textähnlichkeit von 95,8 Prozent für Claude 3.7 Sonnet, sowie 76,8 und 70,3 Prozent für Gemini 2.5 Pro und Grok 3. GPT 4.1 verweigerte die Zusammenarbeit, der nv-recall Wert für Harry Potter lag bei vier Prozent.

Die Stanford-Forscher berichten, dass sie für Claude 3.7 Sonnet und GPT-4.1 den BoN-Jailbreak einsetzen mussten, um das Modell zu einem Ergebnis zu bewegen. Dafür gab Claude dann vier Bücher fast vollständig wortwörtlich wieder, darunter „Harry Potter und der Stein der Weisen“ und „1984“. Gemini 2.5 und Grok 3 befolgten die Anweisung ohne weiteres Prompt Engineering. Die Arbeit zieht den Schluss, dass große Sprachmodelle entgegen der Behauptung der Modellanbieter Teile ihrer Trainingsdaten auswendig lernen. Die bisherigen Sicherheitsbeschränkungen auf Modell- und Systemlevel würden dabei nicht ausreichen, um die Trainingsdaten der Modelle vor der Extraktion zu schützen.

Weiterlesen nach der Anzeige

Der arXiv-Preprint schließt an eine ähnliche Arbeit aus Stanford aus Mai 2025 an, die die Wiedergabe von ganzen Büchern in Open-Weight-Modellen wie Llama 3.1 untersuchte. Eine Arbeit von Forschern der ETH Zürich von November 2024 zeigt, dass bis zu 15 Prozent der Ausgaben von LLMs der Anbieter OpenAI, Anthropic, Google und Meta vorhandenen Textabschnitten im Internet entspricht. Die Modelle wiederholen in manchen Fällen wortwörtlich Antworten aus ihren Trainingsdaten. Das wirft Sicherheitsfragen für Unternehmen mit eigenen Modellen auf, die sich von Dritten bedienen lassen. Auch das Training mit synthetischen Daten könnte sich in so einem Fall als Quelle für weitere Halluzinationen erweisen.

Für die Anbieter großer Sprachmodelle ist das direkte Zitat von nicht-lizenzierten urheberrechtlich geschützten Werken dann ein Ärgernis, wenn die Urheber deswegen klagen. In den Vereinigten Staaten befindet sich die New York Times (NYT) in einem mehrjährigen Rechtsstreit mit OpenAI, da es dem Verlag gelang, mit einer ähnlichen Methode wie im Stanford-Preprint ganze Artikel aus ChatGPT zu extrahieren. In einer Stellungnahme vertrat OpenAI den Standpunkt, dass die NYT sich irreführender Prompts bedient habe und kein Nutzer die Modelle so verwenden würde. Außerdem sei die wortwörtliche Wiedergabe ein seltener Bug. Zumindest dem widerspricht der aktuelle Stanford-Preprint.

Gegenüber der GEMA unterlag OpenAI bereits vor Gericht. Die Verwertungsgesellschaft hatte geklagt, dass ChatGPT Songtexte von Liedern wie Atemlos oder Männer auf Anfrage fast exakt wiedergegeben habe, was die Rechte der Urheber verletze. Während OpenAI sich auf die Reflexion von Trainingsparametern berief, entschied das Gericht, dass das Modell die Texte auswendig gelernt haben müsse und untersagte das Speichern von urheberrechtlich geschützten Texten für die Zukunft. Ebenfalls mit dem auswendigen Wiedergeben von Trainingsdaten hatten Entwickler in einer Sammelklage in den USA gegen Microsoft, GitHub und OpenAI argumentiert. Die Klage besagte, dass GitHub Copilot wortwörtlich Code aus bestehenden Repositorys ohne Hinweise auf die Quelle ausgebe. Hier entschied das zuständige Gericht zugunsten der Modellanbieter.


(pst)



Source link

Entwicklung & Code

Virenjagd: VirusTotal flexibler nutzen per Kommandozeile


Googles Online-Dienst VirusTotal (VT) ist die wohl beliebteste Anlaufstelle für Malware-Scans durch Privatanwender wie auch Profis. Über das Webinterface kann man einzelne Dateien oder verdächtige URLs mit wenigen Klicks übermitteln. VT durchleuchtet sie mit Scan-Engines mehrerer Anbieter, führt zusätzlich dynamische und statische Analysen durch und bündelt alle Informationen in einem ausführlichen Report.

Weiterlesen nach der Anzeige

Jenseits einfacher Anwendungsfälle stößt die grafische Oberfläche des Dienstes jedoch schnell an ihre Grenzen. Zum Beispiel dann, wenn Sie bei akutem Schadcode-Befall möglichst zügig nicht nur eine einzelne Datei, sondern gleich den Inhalt eines ganzen Ordners scannen wollen. Oder wenn Sie im Zuge einer Kompromittierung wissen möchten, ob einige der verdächtigen IP-Adressen aus Ihren Logfiles bereits bei früheren VT-Analysen aufgetaucht sind.

Das „VirusTotal Command-Line Interface“, kurz: vt-cli erspart Ihnen in solchen Situationen zeitraubende Einzel-Uploads beziehungsweise -Suchanfragen. Das auf der Kommandozeile basierende Hilfstool entkoppelt die VirusTotal-Funktionen vom Webinterface, indem es direkt auf das zugrundeliegende API zugreift. So können Sie mittels einfacher Terminal-Befehle die von VT gewohnten Scan- und Suchfunktionen nutzen und überdies den Output Ihren individuellen Bedürfnissen anpassen.

Wie Sie mit dem für Linux, Windows und macOS verfügbaren Gratis-Tool schnelle Batch-Scans umsetzen, Ergebnisse filtern und die VT-Plattform gezielt nach relevanten Bedrohungsinformationen durchsuchen können, erklärt dieser Artikel. Außerdem vermittelt er einen ersten Eindruck davon, wie Entwickler vt-cli zum Skripten von VirusTotal-Abfragen nutzen können, ohne sich mit Interna der Programmierschnittstelle zu befassen.

vt-cli ist ein offizielles VirusTotal-Projekt, dessen Quellcode bei GitHub gehostet wird. Am schnellsten bringt man es auf dem eigenen System zum Laufen, indem man auf die fertig kompilierten Binaries zurückgreift. Die stehen zum Veröffentlichungszeitpunkt dieses Artikels in Version 1.2.0 zum Download bereit.

Eine Installation ist nicht notwendig: Nach dem Extrahieren der Standalone-Anwendung „vt“ kopieren Sie diese einfach in das gewünschte Verzeichnis und starten sie mit dem Kommandozeilenbefehl vt init. In unserem Testdurchlauf mit Windows 11 sowie mit einer frischen Installation des Debian-basierten Kali Linux in VirtualBox klappte das jeweils problemlos. Wer das in der Sprache Go programmierte Projekt lieber selbst kompilieren möchte, folgt der Kurzanleitung in der Readme.MD.

Weiterlesen nach der Anzeige



Nach Eingabe des persönlichen API-Keys – hier im Cygwin-Terminal unter Windows – kann man mit vt-cli loslegen.

(Bild: Screenshot)

In der vt-cli-Dokumentation tummeln sich Anwendungsbeispiele, die die bereitgestellten VirusTotal-Funktionen auf clevere und praktische Weise mit Unix-Befehlen wie cat oder grep kombinieren. Um diese Beispiele unverändert unter Windows übernehmen zu können, raten die vt-cli-Entwickler zur zusätzlichen Installation der freien Laufzeitumgebung Cygwin. Das Cygwin-Terminal versteht Unix-Befehle und bietet laut vt-cli-Team zudem Performance-Vorteile gegenüber der Standard-Windows-Konsole bei der Ausgabe großer Textmengen.



Source link

Weiterlesen

Entwicklung & Code

Neu in .NET 10.0 [12]: Mehr Konvertierungen für Spans in C# 14.0


Im Rahmen der Initiative „First-Class Span Types“ sind in C# 14.0 neue automatische Konvertierungen zwischen Arrays und Span sowie ReadOnlySpan enthalten.

Weiterlesen nach der Anzeige


Der Dotnet-Doktor – Holger Schwichtenberg

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Wenn die Klasse Developer von der Basisklasse Person erbt und es ein Array von Developer-Objekten gibt


Developer[] devArray = new Developer[3];


dann gab es bisher schon folgende Konvertierungen von Array zu Spans:


Span devSpan = devArray;
ReadOnlySpan devROSpan = devArray;
ReadOnlySpan personROSpan = devArray;


In C# 14.0 sind zusätzlich neuerdings folgende Umwandlungen möglich:

Weiterlesen nach der Anzeige


ReadOnlySpan personROSpanFromDevSpan = devSpan;
ReadOnlySpan personROSpanFromDevROSpan = devROSpan;


Allerdings sind folgende Konvertierungen in C# 14.0 weiterhin nicht erlaubt:


Span personSpan = devArray; 
Span personSpanFromDevSpan = devSpan; 



(rme)



Source link

Weiterlesen

Entwicklung & Code

Deep Dive Spring Modulith Teil 2: Event-Mechanismen und Teststrategien


Events sind in Spring Modulith ein zentrales Mittel zur losen Kopplung zwischen Modulen. Sie lassen sich zeitgesteuert auslösen, an externe Systeme weiterreichen und gezielt testen. Nachdem im ersten Teil die fachliche Zerlegung einer Spring Boot-Anwendung in klar abgegrenzte Module im Mittelpunkt stand, geht es nun um weitere Event-Mechanismen sowie um Teststrategien, mit denen sich einzelne Module isoliert und realitätsnah überprüfen lassen.

Weiterlesen nach der Anzeige


Nils Hartmann

Nils Hartmann

Nils Hartmann ist freiberuflicher Softwareentwickler und Coach mit den Schwerpunkten Java im Backend und React im Frontend, wozu er auch Workshops und Trainings gibt.

Das Beispiel des Portals zur Pflanzenpflege hat bislang Events demonstriert, die Aktionen durchführen, nachdem eine fachliche Verarbeitung („Pflanze registriert“) erfolgt ist. Daneben gibt es oft auch Aktionen, die zeitgesteuert ausgeführt werden sollen. Zum Beispiel sollen jeden Monat Rechnungen für alle Kunden erzeugt und verschickt werden. Zeitgesteuerte Aktionen lassen sich in Spring Boot mit der Annotation @Scheduled umsetzen. Dieser wird beispielsweise ein cron-Ausdruck übergeben, der festlegt, wann die annotierte Methode ausgeführt wird. Solche Methoden lassen sich jedoch schwer testen. Im beschriebenen Beispiel müsste der Test zum Erzeugen von Rechnungen die Zeit künstlich setzen, um dafür zu sorgen, dass Spring die zeitgesteuerte Methode aufruft. Zudem ist ein cron-Ausdruck weniger ausdrucksstark, da er Zeitpunkte („jeweils am Monatsersten um 3 Uhr“) aber keine Ereignisse („Monatswechsel ist erfolgt“) angibt.

Mit der Moments-API, als Bestandteil von Spring Modulith, gibt es einen weiteren Weg, wiederkehrende Aktionen auszuführen. Sie besteht aus einer Reihe von Events, die Spring Modulith am Ende eines Zeitraums (z. B. Stunden-, Tages- oder Quartalswechsel) auslöst und die von der Anwendung konsumiert werden können. So lässt sich beispielsweise beim Monatswechsel auf das Event MonthHasPassed reagieren. Die Verarbeitung erfolgt wie bei regulären Events, in einer mit @EventListener annotierten Methode, die als Argument den gewünschten Event-Typen entgegennimmt. Listing 1 zeigt die Verwendung exemplarisch für den InvoiceGenerator, der beim Monatswechsel die Rechnungen erzeugt.

Listing 1: Der InoviceGenerator wird beim Monatswechsel über das MomentHasPassed-Event getriggert


package nh.demo.plantify.billing.invoice;

import org.springframework.context.event.EventListener;
import org.springframework.modulith.moments.MonthHasPassed;
// ...

@Component
class InvoiceGenerator {

    // ...


    @EventListener
    @Transactional
    void generateInvoices(MonthHasPassed event) {
        
        var month = event.getMonth();
        // Rechnungen für den Monat month erzeugen
        // ...
    }
}


Vorteil an dieser Variante ist, dass der Code mit den Moments Events nicht nur verständlicher ist, als bei der Verwendung von @Scheduler, die Events liefern auch nützliche Informationen (z. B. welcher Monat abgelaufen ist). Das Bean TimeMaschine, das Spring Modulith automatisch im Application Context registriert, löst die Events aus. Für Tests lässt sich deren Zeit künstlich weiterstellen. Alle Events, die normalerweise in diesem vorgespulten Zeitraum ausgelöst würden, werden damit auch im Test ausgelöst.

Weiterlesen nach der Anzeige

Die Anwendung nutzt den ApplicationEventPublisher, um fachliche Events innerhalb der Anwendung zu veröffentlichen. Mit Spring Modulith lassen sich darüber Events auch an externe Systeme wie Kafka, RabbitMQ oder einen JMS Server übergeben. Dafür stellt Spring Modulith Broker-spezifische Starter-Module zur Verfügung, die sich über die Maven- oder Gradle-Konfiguration der Anwendung einbinden lassen.

Die Annotation @Externalized an einer Event-Klasse drückt aus, dass das Event an ein externes System geschickt werden soll. Listing 2 zeigt das InvoiceCreatedEvent, das die Anwendung an Kafka schickt. Das target-Attribute enthält einen Broker-spezifischen Ausdruck, der angibt, wie das Event geroutet werden soll. Im Beispiel wird das Event an das Kafka-Topic invoices geschickt, wobei die im Event enthaltene ownerId den Message Key bildet.

Listing 2: Ein Application Event, das über Kafka veröffentlicht wird


package nh.demo.plantify.billing.invoice;


import org.springframework.modulith.events.Externalized;
// ...


@Externalized(target = "invoices::#{#this.ownerId()}")
public record InvoiceGeneratedEvent(
    UUID ownerId,
    YearMonth billingPeriod,
    BigDecimal amount
) { }


In der kommenden Version 2.1 implementiert Spring Modulith das Outbox-Pattern für das Versenden von @Externalized-Events. Damit stellt es sicher, dass jedes Event mindestens einmal erfolgreich an das externe System übermittelt wurde. Dazu wird intern das Framework Namastack verwendet, das eine Implementierung des Outbox-Patterns für Spring Boot-Anwendungen bereitstellt. Um das Verhalten für die eigene Anwendung zu aktivieren, muss lediglich eine Spring Property gesetzt werden. Im Rahmen der Ankündigung dieses Features hat sich eine interessante Diskussion über die konkrete Implementierung durch Namastack und deren Konsequenzen zwischen Roland Beisel (Lead von Namastack Outbox) und Gunnar Morling (ehem. Tech-Lead von Debezium) entwickelt.

Eine Anwendung kann im Rahmen einer fachlichen Verarbeitung sowohl Daten in der eigenen Datenbank speichern als auch ein Event an ein externes System schicken (@Externalized). Allerdings ist der Versand eines externen Events nicht Bestandteil der Datenbank-Transaktion. Wenn die Transaktion also erfolgreich committed wurde, dann aber das Event nicht zugestellt werden kann (z. B. weil es Verbindungsprobleme zum Message Broker gibt), ist das Event verloren. Im Beispiel hätte die Anwendung eine Rechnung erzeugt und gespeichert, die aber nicht per Event zugestellt wurde.

Auch wenn man die Reihenfolge umdrehen würde, also erst auf die erfolgreiche Abgabe des Events wartet und die Anwendung danach die Transaktion committed, kann es zu einer Inkonsistenz kommen. In dieser Konstellation ist es möglich, dass das Event an das externe System abgegeben wird, danach die Anwendung aber ihre Transaktion nicht committen kann. Dann kann Spring das verschickte Event nicht zurückholen. In der Beispiel-Anwendung bedeutet dass, dass das externe System eine Rechnung erhält, die in der Anwendung gar nicht bekannt ist.

Um dieses Problem zu lösen, kann eine Anwendung das Outbox-Pattern verwenden. Dann sendet die Anwendung das Event nicht sofort, sondern speichert das Event beim Commit der Transaktion zunächst gemeinsam mit den anderen Daten in der Datenbank in einer eigenen Tabelle. Diese Tabelle dient als Postausgangskorb („Outbox“). Erst danach versucht die Anwendung in einer neuen Transaktion, das Event aus der Outbox-Tabelle zuzustellen. Wenn dabei ein Fehler auftritt, verbleibt das Event in der Tabelle, sodass die Anwendung später erneut dessen Zustellung versuchen kann. Sobald die Anwendung das Event erfolgreich versenden konnte, entfernt sie es aus der Datenbank und schließt die Transaktion ab. Kommt es dabei zu einem Fehler, sodass die Transaktion nicht committed werden kann, verbleibt das Event in der Outbox-Tabelle, obwohl es zuvor erfolgreich an das externe System gesendet wurde. Da das Event weiterhin in der Outbox-Tabelle liegt, wird die Anwendung beim nächsten Durchlauf erneut versuchen, es zu versenden. Dadurch erhält der Empfänger das Event zwar möglicherweise mehr als einmal, aber auf diese Weise kann die Anwendung garantieren, dass es mindestens einmal zugestellt wird und nicht gänzlich verloren geht („At least once“-Semantik). Der Empfänger muss also damit rechnen, ein Event mehrfach zu erhalten und bei der Verarbeitung doppelte Events beispielsweise ignorieren (Idempotenz). Dabei handelt es sich um ein typisches Muster in verteilten Systemen, in denen echte systemübergreifende Transaktionen nicht möglich oder nur sehr aufwendig sind.

Bis hierhin lag der Fokus auf der Aufteilung des Java-Codes in abgeschlossene Application Modules. Oft gehören zu einer Anwendung aber auch Migrationsskripte für die Datenbank, die beispielsweise Flyway verwaltet. Spring Boot führt diese beim Starten der Anwendung automatisch aus und sorgt dafür, dass die Datenbank auf einem für die aktuelle Version der Anwendung passenden Stand ist. Typischerweise finden sich die Flyway-Skripte einer Anwendung in einem zentralen migration-Verzeichnis als Dateien mit einer Versionsnummer im Namen. Die zentrale Verwaltung und Versionierung der Migrationsskripte widersprechen allerdings der Idee der Modularisierung.

Aus diesem Grund bietet Spring Modulith die Möglichkeit, die Skripte nicht nur zentral, sondern pro Modul abzulegen und zu versionieren. So kann jedes Modul seine eigene Historie von Migrationsskripten pflegen. Die übergeordnete Reihenfolge ergibt sich aus den Modulabhängigkeiten. Die modulspezifischen Flyway-Dateien gilt es in einem Unterordner abzulegen, der genauso wie das entsprechende Modul heißt. Zusätzlich kommt das Verzeichnis __root zum Einsatz, in dem globale Migrationsskripte ihren Platz finden. Die Anwendung führt die Skripte in diesem Verzeichnis immer als Erstes aus. Abbildung 1 zeigt die Migrationsskripte von Plantify.


Modularisierte Flyway Migrationsskripte für die Datenbank

Modularisierte Flyway Migrationsskripte für die Datenbank

Modularisierte Flyway Migrationsskripte für die Datenbank (Abb. 1)

(Bild: Nils Hartmann)

Damit die Modulstruktur auch in der Datenbank eingehalten wird, definiert jedes Modul sein eigenes Datenbankschema in Postgres. Im __root-Ordner befinden sich die Skripte zum Anlegen der Tabellen für die Event Publication Registry. In einem Integrationstest führt Spring Modulith immer nur die Skripte aus, deren Modul gerade getestet wird, und stellt damit sicher, dass es keine unerwünschten Referenzen zwischen den Skripten gibt.



Source link

Weiterlesen

Beliebt