Dies ist der Quellcode für das Tensor Trust Web Game und die Datenreinigungspipeline. Weitere Informationen zum Projekt finden Sie auf der Papierwebsite. Sie können die Daten auch verwenden oder das Spiel spielen!
Wenn Sie in einer akademischen Veröffentlichung auf unseren Code oder Daten aufbauen, zitieren Sie uns bitte mit den folgenden Bibtex:
@misc { toyer2023tensor ,
title = { {Tensor Trust}: Interpretable Prompt Injection Attacks from an Online Game } ,
author = { Toyer, Sam and Watkins, Olivia and Mendes, Ethan Adrian and Svegliato, Justin and Bailey, Luke and Wang, Tiffany and Ong, Isaac and Elmaaroufi, Karim and Abbeel, Pieter and Darrell, Trevor and Ritter, Alan and Russell, Stuart } ,
year = { 2023 } ,
journal = { arXiv preprint arXiv:2311.01011 } ,
url = { https://arxiv.org/pdf/2311.01011.pdf }
}Um zu installieren und auszuführen, richten Sie zuerst die OpenAI -API -Schlüssel ein, wenn Sie noch nicht:
https://platform.openai.com/account/api-keys .set OPENAI_API_KEY=<your-key> und auf unix run export OPENAI_API_KEY=<your-key> .Führen Sie nun Folgendes aus:
# Install Redis on Ubuntu. For other OSes see:
# https://redis.io/docs/getting-started/installation/
sudo apt install redis
# If this command fails, try running `redis-server` directly
sudo systemctl enable redis-server
&& sudo systemctl restart redis-server
# Install node.js on Ubuntu. For other OSes see:
# https://nodejs.org/en/download
# If this command doesn't work, try installing using nvm. See
# https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04#option-3-installing-node-using-the-node-version-manager
sudo snap install node --classic
# setup:
conda create -n promptgame python=3.10
conda activate promptgame
pip install -e ' .[dev] '
./manage.py tailwind install # install JS modules for Tailwind
./manage.py migrate # set up database
# For testing, we need two commands.
# Run this first command in one terminal to update the stylesheet in response to Tailwind changes:
./manage.py tailwind start
# Now run this second command in another terminal to a Django server
./manage.py runserver # run demo server (will auto-restart when you edit files)Jetzt können Sie eine Entwicklungskopie der Website unter http: // localhost: 8000/besuchen.
Django übernimmt die Datenbankverwaltung mit Models , die wir in src/promptgame/gameui/models.py definieren. Wenn Sie ein Model bearbeiten, müssen Sie die Änderung in der zugrunde liegenden Datenbank, die Django verwaltet, reflektiert werden. Um dies zu tun, rennen Sie:
./manage.py makemigrations
./manage.py migrate In Git ist makemigrations wie das Erstellen einer Commit -Aufzeichnung Ihrer Änderung in der Datenbank. Diese Migration wird tatsächlich in einer Datei im Verzeichnis src/promptgame/migrations verfolgt. Das Ausführen migrate ist wie das Schreiben dieses Commits und aktualisiert damit die Datenbank. Klicken Sie hier hier, um mehr über diesen Prozess zu erfahren (einschließlich, wie komplexere Verhaltensweisen wie die Rückkehr Ihrer Datenbank in einen früheren Migrationsstatus zurückversetzt werden).
Beachten Sie, dass Sie, wenn Sie von main ziehen, nachdem jemand zu einem Modell geändert wurde, auch ausführen müssen ./manage.py migrate
Um ein Admin -Konto zu erstellen, führen Sie aus:
./manage.py createsuperuserBefolgen Sie die Aufforderungen, einen Benutzernamen und ein Passwort zu erstellen.
Melden Sie sich bei der Administratorseite bei Localhost an: 8000/privat/dj-login/. Auf der Prod-Site finden Sie dies unter TensorTrust.ai/private/dj-login/.
Geben Sie den oben erstellten Benutzernamen und das Passwort ein. Wenn Sie sich auf der Prod -Site befinden, müssen Sie das Kennwort abrufen, indem Sie ein Terminal öffnen und gcloud secrets versions access --secret=promptgame_prod_application_settings latest .
Tailwind ist ein CSS -Framework, das es einfacher macht, CSS direkt in Ihre HTML -Tags einzubetten, anstatt Ihre HTML -Quelle und Ihre CSS -Quelle an verschiedenen Stellen zu setzen. Es funktioniert, indem es Informationen in einer Reihe vordefinierter Klassen füllt, wie diese Mischung aus HTML- und Rückenwindklassen, die eine abgerundete lila Taste definieren:
< div class =" ml-8 rounded-md bg-indigo-600 px-3 py-2 text-[0.8125rem]
font-semibold leading-5 text-white hover:bg-indigo-500 " >
This is a button!
</ div > Aus diesem Beispiel können Sie feststellen, dass der Satz möglicher Rückenwindklassen wirklich groß ist. zB text-[0.8125rem] macht den Text 0,8125 REM hoch, aber was ist, wenn der Benutzer nach 0,31 REM oder anfordern, oder um 0,31 REM oder
Natürlich können Browser nur eine begrenzte Anzahl definierter, gestalteter Klassen bewältigen, sodass Rückenwind eine Möglichkeit benötigt, um herauszufinden, welche Klassen sie tatsächlich erzeugen und welche es überspringen kann. Dies erfolgt mit einem CSS -Compiler. Für Entwicklungszwecke kann der Compiler dynamisch in Ihrem Webbrowser ausgeführt werden, indem dieses Tag in den Kopf Ihres Dokuments eingefügt wird:
< script src =" https://cdn.tailwindcss.com " > </ script >Dies funktioniert, hat aber den Nachteil, langsam zu sein und manchmal einen nicht angezeigten Inhalt anzuzeigen. Ich bin auch ein wenig besorgt, dass wir von ihrem CDN verbannt würden, wenn wir es in der Produktion verwenden, aber ich weiß nicht, wie wahrscheinlich das tatsächlich ist.
Aus diesen beiden Gründen verwenden wir stattdessen den serverseitigen Compiler von Tailwind (über Django-Tailwind). Der serverseitige Compiler ist in JavaScript geschrieben, weshalb wir einen Knoten benötigen und auch, warum wir ausführen müssen ./manage.py tailwind install Der Compiler scannt Ihren Quellcode (HTML, Python, JavaScript) nach Dingen, die wie Rückenwindklassennamen aussehen, dann alle generiert und in dieses Stylesheet eingesetzt werden:
src/promptgame/theme/static/css/dist/styles.css
Das Stylesheet wird in git diffs Versionskontrolle untersucht. Wenn Sie also ./manage.py tailwind start . Dies ist ein bisschen hässlich, aber letztendlich in Ordnung, da die Datei für produzierte styles.css nur ein paar tausend Zeilen lang ist.
Um die Django Silk UI anzusehen, besuchen Sie http://127.0.0.1:8000/silk/.
Dieses Projekt ist so konfiguriert, dass sie auf GCP bereitgestellt werden. Es stellte sich heraus, dass es überraschend kompliziert war, da wir brauchten:
Die Details, wie alles eingerichtet ist, befinden sich in einem internen Dokument (siehe internem TT -Kanal, wenn Sie ein Chai -Partner sind, der Zugriff benötigt).
Um eine neue Version der Website bereitzustellen, müssen Sie nur eine winzige Teilmenge dessen wissen, was sich in diesem Dokument befindet. Sobald Sie die entsprechenden Berechtigungen für das GCP-Projekt prompt-ad-game erhalten haben, können Sie eine neue Staging-Bereitstellung wie folgt verkürzen:
gcloud auth login && gcloud config set project prompt-ad-gamestaging_image_tag= " $( git rev-parse --short=7 HEAD ) $( git diff --quiet || echo " -drt " ) "
&& gcloud builds submit -t " gcr.io/prompt-ad-game/promptgame-staging: $staging_image_tag "
&& yes | gcloud container images add-tag
gcr.io/prompt-ad-game/promptgame-staging:{ " $staging_image_tag " ,latest}Dockerfile im Stammwurzel des Repo erstellt. Das Bild heißt gcr.io/prompt-ad-game/promptgame-staging mit einem :latest Tag sowie einem Tag, das aus den letzten 7 Ziffern der aktuellen Git-Revision besteht.:latest Bild, das Sie oben erstellt haben): gcloud run jobs execute promptgame-staging-collect-and-migrate
--region us-central1 --wait./deploy/replace_cloud_run_service.py stagingWenn alle Befehle erfolgreich sind, sollte die App auf unserer Staging -Site ausgeführt werden! Sie können dies als Gelegenheit nutzen, um in einer Einstellung mit niedrigem Einsatz damit zu spielen-es ist in Ordnung, wenn unsere Staging-Site durcheinander kommt, solange wir die Fehler beheben, bevor wir zur Produktion gehen.
Sobald Sie überprüft haben, ob die App in der Inszenierung funktioniert, können Sie sie in die Produktion treiben:
0f043fc verwendet, aber Sie können das richtige Tag für Ihr Bild mit diesem Befehl herausfinden: gcloud container images list-tags
gcr.io/prompt-ad-game/promptgame-staging # can replace -staging:latest with -staging:<your tag>
yes | gcloud container images add-tag
gcr.io/prompt-ad-game/promptgame-staging:latest
gcr.io/prompt-ad-game/promptgame-prod:latestgcloud run jobs execute promptgame-prod-collect-and-migrate
--region us-central1 --wait./deploy/replace_cloud_run_service.py prodSobald Sie all diese Schritte ausgeschlossen haben, sollte auch der Code, den Sie auf der Staging -Site erfolgreich ausgeführt haben, auch auf der Staging -Site verfügbar sein!
Es gibt viele andere Details, die ich hier nicht behandelt habe, z. B. wie man neue Einstellungen hinzufügt, die zwischen Inszenierung und Produkt unterscheiden oder wie die Staging-Umgebung von Grund auf neu erstellt werden kann. Das (sehr lange) oben verlinkte Google -Dokument sollte einige dieser Fragen beantworten, aber Sie können Sam auch auf Slack pingen, wenn Sie Zeiger möchten.