Einführung
Anthropic's Claude-Modell Enthüllt: Einzigartige Fähigkeiten Freisetzen
Anthropic, ein führendes globales KI-Unternehmen, stellt das revolutionäre Claude-Modell vor. Von Notion bis Quora nutzen große Technologieunternehmen seine Vielseitigkeit in Gesprächen, Textverarbeitung und sogar Programmierung. Aber was hebt Claude hervor? Tauchen Sie ein in dieses besondere Tutorial, das die bemerkenswerten Eigenschaften untersucht, die Claude hervorstechen lassen.
Die Macht von ChromaDB und Embeddings
Entdecken Sie die entscheidende Rolle von Embeddings in der Verarbeitung natürlicher Sprache und im maschinellen Lernen. Erfahren Sie, wie diese Vektorrepräsentationen semantische Bedeutungen erfassen und ähnliche Textsuchen ermöglichen. Erkunden Sie ChromaDB, eine Open-Source-Embedding-Datenbank, und deren Fähigkeit, Embeddings mithilfe von Dokumentrepräsentationen zu speichern und abzufragen. Tauchen Sie ein in diese aufschlussreiche Diskussion über die dynamische Welt der Embeddings und ChromaDB.
Voraussetzungen
- Grundkenntnisse in Python
- Zugang zur Anthropic Claude API
- Zugang zur OpenAI API (für die Embedding-Funktion)
- Eine eingerichtete Chroma-Datenbank
Gliederung
- Initialisierung des Projekts
- Einrichten der benötigten Bibliotheken
- Projektdateien schreiben
- Testen des grundlegenden Chatbots ohne Kontextbewusstsein
- Nutzung von Claudes großem Kontextfenster
- Testen des Chatbots mit Kontextbewusstsein
- Bereitstellung von kontextuellen Informationen für Claude
- Bewertung des verbesserten Chatbots (zusätzlicher Kontext bereitgestellt)
- Erstellung einer Wissensdatenbank für Claude
- Testen von Claudes endgültiger Form (verbessert durch die Wissensdatenbank)
- Diskussion
Initialisierung des Projekts
Okay, rollt die Ärmel hoch und lasst uns codieren! Zuerst müssen wir das Projekt initialisieren. Wir werden es diesmal chroma-claude nennen. Öffnen Sie also Ihr bevorzugtes Terminal, navigieren Sie zu Ihrem bevorzugten Codierungs- oder Projektverzeichnis und erstellen Sie ein neues Verzeichnis für chroma-claude. So machen Sie das:
Als Nächstes erstellen wir eine neue virtuelle Umgebung für dieses Projekt. Wenn Sie sich fragen, warum, nun, eine virtuelle Umgebung hilft uns, die Abhängigkeiten unseres Projekts von unserer globalen Python-Umgebung zu trennen. Diese Isolierung ist ein Lebensretter, wenn Sie mit mehreren Projekten mit unterschiedlichen Abhängigkeiten jonglieren.
Aber das ist nicht der einzige Vorteil einer virtuellen Umgebung! Sie erleichtert uns auch das Verfolgen der spezifischen Bibliotheken und Versionen, die wir verwenden. Wir tun dies, indem wir sie in eine Datei requirements.txt "einfrieren", die eine praktische Aufzeichnung aller Abhängigkeiten ist, die Ihr Projekt benötigt, um zu funktionieren.
Lassen Sie uns diese virtuelle Umgebung einrichten!
Um eine neue virtuelle Umgebung zu erstellen, verwenden wir den folgenden Befehl in unserem Terminal:
python3 -m venv env
Sobald wir die Umgebung erstellt haben, müssen wir sie aktivieren. Dieser Schritt ist etwas anders, je nachdem, ob Sie Windows oder ein unix-basiertes System (wie Linux oder MacOS) verwenden. So machen Sie das:
- Wenn Sie Windows verwenden, verwenden Sie den folgenden Befehl in Ihrem Terminal:
. \env\Scripts\activate
- Wenn Sie Linux oder MacOS verwenden, sieht der Befehl so aus:
source env/bin/activate
Nachdem Sie den entsprechenden Befehl ausgeführt haben, sollten Sie den Namen Ihrer Umgebung (env, in diesem Fall) in Klammern am Anfang Ihrer Terminal-Eingabeaufforderung sehen. Das bedeutet, dass die Umgebung aktiviert ist und bereit ist! So sollte es aussehen:
Großartige Arbeit! Sie haben Ihre virtuelle Umgebung eingerichtet und aktiviert.
Einrichten der benötigten Bibliotheken
Als Nächstes müssen wir alle benötigten Bibliotheken installieren. Wenn Sie meine anderen Tutorials zu Chroma und OpenAI-Modellen gelesen haben, werden Sie den Installationsprozess recht vertraut finden. Diesmal werden wir jedoch auch die anthropic Bibliothek installieren.
Hier ist eine kurze Übersicht der Bibliotheken, die wir verwenden werden:
- chromadb-Bibliothek: Wir werden dies verwenden, um die Embeddings zu speichern und abzufragen.
- anthropic-Bibliothek: Diese ist erforderlich, um mit dem Claude-Modell von Anthropic zu interagieren.
- halo-Bibliothek: Diese Bibliothek bietet coole Ladeindikatoren, die erscheinen, während auf Anfragen gewartet wird.
Lassen Sie uns mit der Installation dieser Bibliotheken beginnen. Ich werde pip3 für die Installation verwenden. Wenn Sie sich mit pip wohler fühlen, können Sie gerne zu diesem wechseln.
pip install chromadb anthropic halo
Projektdateien schreiben
Es ist Zeit, wieder in den Codierungsteil einzutauchen! Stellen Sie sicher, dass wir uns noch in unserem Projektverzeichnis befinden. Öffnen Sie Ihre bevorzugte IDE oder den Code-Editor und erstellen Sie eine neue Datei, nennen wir sie main.py. Dies wird die einzige Python-Datei sein, die wir für dieses Projekt benötigen.
Schritt 1: Notwendige Bibliotheken importieren
Beginnen Sie damit, die notwendigen Bibliotheken zu importieren. Dazu gehören dotenv für das Laden von Umgebungsvariablen, os für systemnahe Operationen, anthropic für die Interaktion mit dem Claude-Modell, pprint für das schöne Drucken und halo für die Anzeige eines Ladespirals.
Schritt 2: Umgebungsvariablen laden
Laden Sie die Umgebungsvariablen aus Ihrer .env-Datei. Hier speichern Sie sensible Daten wie Ihren Anthropic API-Schlüssel.
Schritt 3: Funktion zur Antwortgenerierung definieren
Definieren Sie eine Funktion namens generate_response(), die Nachrichten als Eingabe entgegennimmt und eine vom Modell generierte Antwort zurückgibt. Innerhalb dieser Funktion initialisieren Sie zuerst einen Ladeindikator, der ausgeführt wird, während das Modell eine Antwort generiert.
Schritt 4: Erstellen Sie einen Anthropic-Client und senden Sie eine Abschlussanfrage
Als Nächstes erstellen Sie einen Anthropic-Client mit Ihrem API-Schlüssel und verwenden ihn, um eine Abschlussanfrage an das Claude-Modell zu senden. Die Anfrage umfasst Ihre Eingabemeldungen, den Modellnamen und die Stop-Sequenzen, um das Ende einer Gesprächsrunde zu signalisieren.
Schritt 5: Stoppen Sie den Indikator und drucken Sie die Anfrage und die Antwort aus
Sobald die Antwort empfangen wurde, stoppen Sie den Ladeindikator. Drucken Sie sowohl die Anfrage als auch die Antwort für Debugging-Zwecke auf der Konsole aus. Geben Sie dann die Antwort zurück.
Schritt 6: Hauptfunktion definieren
Definieren Sie die Hauptfunktion. Hier starten Sie eine kontinuierliche Schleife, um Benutzereingaben zu erhalten und Antworten zu generieren.
Schritt 7: Bereiten Sie das Prompt vor und bearbeiten Sie den 'quit'-Befehl
Innerhalb der Schleife bereiten Sie zuerst das Prompt für das Claude-Modell vor, indem Sie den Benutzereingabetext mit den notwendigen Gesprächsmarkierungen verketten. Sie behandeln auch den "quit"-Befehl: Wenn der Benutzer "quit" eingibt, brechen Sie die Schleife ab, um den Chat zu stoppen.
Schritt 8: Antwort generieren und ausdrucken
Als Nächstes rufen Sie die Funktion generate_response() mit den vorbereiteten Nachrichten auf, um eine Antwort vom Claude-Modell zu generieren. Sobald die Antwort empfangen wurde, drucken Sie sie auf der Konsole aus, mit dem Präfix "Claude:", um die Antwort des Chatbots zu kennzeichnen.
Schritt 9: Hauptfunktion ausführen
Zuletzt fügen Sie eine Bedingung ein, um sicherzustellen, dass die Hauptfunktion nur ausgeführt wird, wenn das Skript direkt (nicht als Modul importiert) ausgeführt wird.
Grundlegender Chatbot (kein Kontextbewusstsein)
Wenn Sie die Schritte korrekt befolgt haben, sollte Ihr vollständiges main.py-Skript so aussehen:
...
Dieses Skript ermöglicht die grundlegende Interaktion des Chatbots mit dem Claude-Modell; es behält jedoch kein Kontext zwischen den Benutzereingaben. Das bedeutet, dass jede Eingabe als separates Gespräch behandelt wird und das Modell frühere Eingaben nicht erinnert.
.env
Erinnern Sie sich an den Teil, als wir Variablen aus der Umgebung mit der Funktion load_dotenv()
laden? Dies ist die Datei, in der die Funktion die Variablen und deren Werte entnimmt. Lassen Sie uns die Datei erstellen und die Variablen und deren Werte wie folgt schreiben:
CLAUDE_KEY=your_api_key_here
Bitte beachten Sie, dass die .env-Datei sensible Informationen enthält und Sie die Datei daher an einem sicheren Ort aufbewahren sollten. Teilen Sie diese Werte niemals, insbesondere den CLAUDE_KEY, der geheim gehalten werden sollte.
requirements.txt
Schließlich, obwohl dieser Teil optional ist, gilt es als bewährte Praktik, unsere Abhängigkeitsliste in eine Datei namens requirements.txt aufzunehmen. Dadurch können andere Entwickler die erforderlichen Bibliotheken mit einem einfachen Befehl problemlos installieren.
Um die requirements.txt-Datei zu erstellen, navigieren Sie zu Ihrer virtuellen Umgebung des Projekts, in der alle erforderlichen Abhängigkeiten installiert sind, und führen Sie aus:
pip freeze > requirements.txt
Dann kann jeder, der Ihr Projekt ausführen möchte, alle erforderlichen Abhängigkeiten mit diesem Befehl installieren:
pip install -r requirements.txt
Dieser Befehl wird normalerweise von jemandem durchgeführt, der Ihr Projekt installieren oder ausführen möchte. Es ist gute Praxis, dies in der Dokumentation Ihres Projekts unter einem Abschnitt über die Installation oder Ausführung Ihres Projekts aufzunehmen.
Testen des grundlegenden Chatbots ohne Kontextbewusstsein
Jetzt lassen Sie uns unsere erste Iteration des Claude-Chatbots testen! Während diese grundlegende Version gut funktionieren sollte, fehlt ihr das "Kontextbewusstsein" - ein Begriff, der die Fähigkeit eines Chatbots beschreibt, sich an frühere Teile des Gesprächs zu erinnern und darauf zu verweisen. Das bedeutet, dass unser Bot nach jeder Antwort vergisst, was der Benutzer zuvor gesagt hat.
Um den Chatbot zu testen, führen Sie das main.py-Skript mit dem Befehl python
oder python3
in Ihrem Terminal aus:
python main.py
Wenn alles korrekt eingerichtet wurde, sollte das Terminal eine Eingabeaufforderung anzeigen, die Sie auffordert, eine Nachricht einzugeben. Versuchen Sie, etwas einzugeben und die Eingabetaste zu drücken. Sie werden sehen, dass ein Ladeindikator erscheint, während der Bot eine Antwort generiert.
Nach ein paar Sekunden zeigt das Terminal die Antwort des Bots an.
Versuchen Sie nun, dem Bot eine Folgefrage zu stellen, basierend auf seiner vorherigen Antwort. Sie werden bemerken, dass Claude sich nicht an den Kontext der vorherigen Nachricht erinnert.
Denken Sie daran, wenn Sie beim Ausführen des Skripts auf Probleme stoßen, überprüfen Sie die Fehlermeldung im Terminal und versuchen Sie, entsprechend zu beheben.
Nutzung von Claudes großem Kontextfenster
Also, wir verwenden ein Modell mit einem wirklich großen Kontextfenster. Es wäre eine tragische Verschwendung, es nur für ein Gespräch zu nutzen, das es sofort vergisst. Lassen Sie uns unseren Code ein wenig ändern. Diesmal sollte unser Code sowohl den vorherigen Chat als auch die aktuelle Benutzereingabe erfassen.
Dieses neue Blockstück führt eine Variable messages außerhalb der Hauptschleife ein. Diese Variable wird die gesamte Gesprächshistorie enthalten und kontinuierlich während des Gesprächs aktualisiert.
Hier, anstatt die aktuelle Benutzereingabe nur der Variablen messages zuzuweisen, fügen Sie sie jetzt hinzu. Dies stellt sicher, dass die Variable messages alle Eingaben des Benutzers speichert.
In diesem Block, nachdem Sie eine Antwort von Claude generiert haben, fügen Sie Claudes Antwort der Variable messages hinzu. Dies stellt sicher, dass sowohl die Benutzereingaben als auch die Antworten von Claude in der Variable messages beibehalten werden, wodurch Claude Zugriff auf den gesamten Gesprächsverlauf hat.
Schließlich, um die größeren Gesprächshistorien, die die Variable messages enthalten könnte, unterzubringen, haben Sie max_tokens_to_sample
von 300 auf 1200 erhöht. Dies weist Claude an, bis zu 1200 Tokens bei der Generierung einer Antwort zu berücksichtigen, was besonders wichtig ist, wenn es um längere Gespräche geht. Beachten Sie jedoch, dass, wenn ein Gespräch das Kontextfenster des Modells von 1200 Tokens überschreitet, die älteren Teile des Gesprächs gekürzt oder ignoriert werden, was möglicherweise zu einem Verlust des Kontexts führen kann.
Lassen Sie uns nun unseren aktualisierten Code ansehen:
...
Testen des Chatbots mit Kontextbewusstsein
In diesem Abschnitt werden wir unseren kontextbewussten Chatbot auf die Probe stellen. Insbesondere werden wir Claude nach dem Videospiel Dota2 und insbesondere nach dem neuesten Patch "New Frontier" fragen.
Bisher so gut. Jetzt wollen wir eine zweite Frage stellen: "Was wissen Sie über den neuesten Patch, New Frontier?" Claude, obwohl er ein fortschrittlicher Chatbot ist, gesteht, dass ihm spezifisches Wissen über den neuesten Patch fehlt. Dies liegt an der Schulungsunterbrechung des Modells, die Ende 2021 endete. In einem optimaleren Szenario würde Claude dennoch relevante, wenn auch möglicherweise veraltete, Informationen bieten. In einem weniger wünschenswerten Szenario könnte Claude Informationen generieren, die genau erscheinen, aber tatsächlich falsch sind, ein Phänomen, das als "Halluzination" bezeichnet wird. Es ist entscheidend, sich dieser Einschränkungen bewusst zu sein und Vorsicht walten zu lassen, wenn Sie das Modell nach Ereignissen oder Informationen fragen, die nach seinem Training liegen.
Wie können wir also diese Einschränkung umgehen und Claude mit aktuelleren Informationen ausstatten? Nun, für die Zwecke dieses Tutorials werden wir Claude manuell mit ergänzenden Lernmaterialien versorgen, indem wir die Daten in Textdateien kopieren und einfügen, die wir dann mit der integrierten Funktionalität von Python lesen können. Während wir nicht technisch gesehen Claude "lernen" lassen, stellen wir frische Daten zur Verfügung, die er verwenden kann, um aktuellere Antworten zu generieren. Lassen Sie uns dies weiter im nächsten Abschnitt vertiefen.
Bereitstellung von kontextuellen Informationen für Claude
Um Claudes volles Potenzial zu testen, müssen wir ihm genügend kontextrelevante Daten liefern. Für dieses Tutorial habe ich einige Texte von Wiki-Sites kopiert, wie den von IGN, der den Patch "New Frontiers" behandelt. Dieser Text ist in einer Datei namens patch_notes.txt gespeichert. Lassen Sie uns diese Datei in unserer Hauptfunktion lesen.
Wir lesen die Textdatei und verwenden ihren Inhalt, um die ursprüngliche Nachricht für Claude zu bilden. Diese Nachricht wird Claude Kontext über den Dota2-Patch liefern, den er bei der Beantwortung verwandter Anfragen heranziehen kann. Diese Methode macht Claude technisch gesehen nicht "lernen" neue Informationen, sondern hilft, genaue Antworten für diese spezifische Interaktion zu erzeugen.
Wir fügen auch einen Token-Zähler nahe dem Ende der main()-Funktion hinzu. Dies hilft uns, die gesamte Anzahl der im Gespräch verwendeten Tokens zu überwachen, um sicherzustellen, dass wir die maximalen Token-Limits des Modells nicht überschreiten. So sieht unser aktualisierter Code aus:
...
Bewertung des verbesserten Chatbots (zusätzlicher Kontext bereitgestellt)
Lassen Sie uns unseren erweiterten Chatbot auf die Probe stellen! Zuerst werden wir allgemeine Informationen über Dota2s neuesten Patch, "New Frontiers", anfragen.
beeindruckend aufzurufenden und analysierenden Changes hat Claude nun alle bedeutenden Änderungen, die der Patch mit bemerkenswerter Genauigkeit eingeführt hat, aufgezählt. Es ist jedoch bemerkenswert, dass die Tokenanzahl bereits 5298 erreicht hat. Dies erinnert uns daran, dass tiefgehende Antworten und umfassende Gesprächshistorien schnell Tokens verbrauchen können.
Um Claudes Verständnis des bereitgestellten Kontexts weiter zu bewerten, stellen wir ihm die Frage über die "Tormentors". Diese Frage kann als litmus-Test für Claudes Kontextbewusstsein gesehen werden. Für einen Uninformierten könnte "Tormentors" Bilder von grausamen, bedrohlichen Kreaturen hervorrufen, während sie in Dota2 tatsächlich harmlose, schwebende Würfel sind.
Claude hat den Test mit Bravour bestanden! Es ist wirklich faszinierend, wie die passenden Eingaben, kombiniert mit zusätzlichem Kontext, die Genauigkeit von Claudes Antworten erheblich verbessern können.
Erstellung einer Wissensdatenbank für Claude
Das Ziel der Erstellung einer Wissensdatenbank für Claude besteht darin, ihn mit einer Vielzahl von Daten auszustatten, auf die er bei der Generierung von Antworten zurückgreifen kann. Dies ermöglicht es ihm, genauere und kontextbewusste Antworten zu geben, selbst bei komplexen und vielfältigen Daten, wie den neuesten Dota2-Patchnotizen.
Um dies zu erreichen, werden wir die Chroma-Datenbank als unsere Wissensdatenbank verwenden. Auf diese Weise können wir die Daten in kleinere Stücke aufteilen und in der Datenbank speichern. Das ist effizienter, als Claude bei jeder Kommunikation das gesamte Datenmaterial zu füttern. Um die Daten in kleinere Stücke zu zerlegen, verwenden wir die tiktoken-Bibliothek.
Zuerst installieren wir tiktoken und chromadb und aktualisieren unsere requirements.txt-Datei:
pip install tiktoken chromadb
Als Nächstes werden wir einige Änderungen an unserem Skript vornehmen, um die Funktionalität der Chroma-Datenbank zu ermöglichen:
- Zuerst importieren wir alle erforderlichen Bibliotheken:
from chromadb import Client
import tiktoken # <- die tiktoken-Bibliothek holen
Nun erstellen wir eine Funktion create_chunks, um unseren langen Text in kleinere Teile zu zerlegen. Diese Funktion gibt die aufeinander folgenden Textblöcke zurück:
def create_chunks(text, max_length=512):
return [text[i:i+max_length] for i in range(0, len(text), max_length)]
In der Hauptfunktion initialisieren wir den Tokenizer, teilen die Patchnotizen in Stücke auf und erstellen eine neue Chroma-Kollektion. Jedes Textstück wird dann als separates Dokument in die Sammlung hinzugefügt:
def main():
...
chunks = create_chunks(patch_notes)
for chunk in chunks:
chroma_collection.add_document(chunk)
...
Während des Gesprächs mit dem Benutzer fragen wir die Chroma-Sammlung nach den 20 besten Dokumenten, die für die Benutzereingabe relevant sind. Die Ergebnisse dieser Abfrage werden dann dem Kontext für Claude hinzugefügt, was seine Antworten verbessert:
def main():
...
relevant_docs = chroma_collection.query(user_input, top_k=20)
context = "".join(relevant_docs) + previous_context
response = generate_response(context)
...
Testen von Claudes endgültiger Form (verbessert durch die Wissensdatenbank)
Wir sind endlich am entscheidenden Moment angekommen! Dieses Tutorial mag etwas länger als gewöhnlich gewesen sein, aber es ist entscheidend, um Claudes großes Kontextfenster und die Macht der Chroma-Datenbank zur Verbesserung von Claudes Wissensdatenbank zu demonstrieren. Lassen Sie uns also unseren verbesserten Claude auf die Probe stellen!
Beim ersten Test werde ich Claude bitten, die drei bedeutendsten spielverändernden Aktualisierungen im neuesten Dota 2-Patch aufzulisten.
Claude identifiziert beeindruckend die drei bedeutendsten Änderungen: die erweiterte Karte mit 40% mehr Terrain, das Überarbeiten des Black King Bar und der neue Heldentyp: Universal. Denken Sie daran, dass wir Claude nicht die gesamte Patchnotiz auf einmal gefüttert haben. Stattdessen nutzt er die Kraft seiner verbesserten Wissensdatenbank, um diese relevanten Informationen abzurufen.
Für die nächste Herausforderung werde ich Claude fragen, was Tormentors im neuesten Patch sind, als ob ich vollkommen blind in ein Spiel einsteigen würde.
Claude gibt einen allgemeinen Überblick über die Tormentors, übersieht jedoch einige wichtige Details. Er erwähnt "mehrere Tormentors", obwohl nur zwei an bestimmten Orten auf der gesamten Karte erscheinen. Dies hebt die Notwendigkeit hervor, die Wissensdatenbank kontinuierlich mit genaueren Daten zu aktualisieren, um Claude zu helfen, präzisere und hilfreichere Analysen zu liefern.
Diese Tests demonstrieren das Potenzial von KI-Modellen wie Claude, wenn sie mit einer reichhaltigen, kontinuierlich aktualisierten Wissensdatenbank kombiniert werden. Sie zeigen auch die kontinuierliche Natur der AI-Entwicklung - während wir unsere Modelle mit mehr und besseren Daten speisen, können sie zunehmend genauere und nuancierte Antworten liefern.
Fazit: Die Macht des Claude-Modells von Anthropic und der Chroma-Integration freisetzen
In diesem umfassenden Tutorial von Anthropic haben wir die außergewöhnlichen Fähigkeiten des Claude-Modells von Anthropic und der Chroma-Datenbank erkundet. Das Claude-Modell, mit seinem umfangreichen Kontextfenster, war entscheidend für die Entwicklung eines Chatbots, der umfangreiche Textdaten lesen und verstehen kann und detaillierte Analysen zu Dota 2-Updates bietet. Die Chroma-Datenbank hat diese Fähigkeit weiter verstärkt und die Erstellung einer effizienteren und skalierbaren Wissensdatenbank ermöglicht, während gleichzeitig der Tokenverbrauch gesenkt wird.
Obwohl wir bemerkenswerte Erfolge erzielt haben, hat dieses Tutorial zur anthropischen Anwendung auch potenzielle Verbesserungsbereiche aufgezeigt. Zum Beispiel, unser Verständnis bestimmter Spielelemente wie die Tormentors in Dota 2 zu verfeinern und die Wissensdatenbank kontinuierlich zu aktualisieren und zu erweitern, um die Genauigkeit des Chatbots sicherzustellen.
Das Potenzial für das, was wir als Nächstes mit der Kombination von Claude + Chroma bauen können, ist wirklich überwältigend. Ob es sich nun um einen Chatbot für eingehende Spielstrategieanalysen handelt, um einen virtuellen Assistenten mit Fachwissen in einer Vielzahl von Themen oder um ein leistungsstarkes Werkzeug zur Hilfe für Forscher, um große Datenmengen zu bewältigen - die Möglichkeiten sind nur durch unsere Vorstellungskraft und unsere Speicherkapazität begrenzt!
Hinterlasse einen Kommentar
Alle Kommentare werden vor der Veröffentlichung geprüft.
Diese Website ist durch hCaptcha geschützt und es gelten die allgemeinen Geschäftsbedingungen und Datenschutzbestimmungen von hCaptcha.