Il s'agit du code source du jeu Web et du pipeline de nettoyage des données Tensor Trust. Voir le site Web papier pour plus de détails sur le projet. Vous pouvez également utiliser les données ou jouer au jeu!
Si vous construisez sur notre code ou nos données dans une publication académique, veuillez nous citer avec le bibtex suivant:
@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 }
}Pour installer et exécuter, configurez d'abord la clé API Openai si vous ne l'avez pas déjà fait:
https://platform.openai.com/account/api-keys .set OPENAI_API_KEY=<your-key> , et sur Unix Run export OPENAI_API_KEY=<your-key> .Exécutez maintenant ce qui suit:
# 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)Vous pouvez maintenant visiter une copie de développement du site Web à http: // localhost: 8000 /.
Django gère la gestion de la base de données avec Models , que nous définissons dans src/promptgame/gameui/models.py . Chaque fois que vous modifiez un Model , vous avez besoin que le changement soit reflété dans la base de données sous-jacente que Django gère. Pour ce faire, courez:
./manage.py makemigrations
./manage.py migrate En termes GIT, makemigrations c'est comme créer un engagement d'enregistrement de votre modification dans la base de données. Cette migration est réellement suivie dans un fichier dans le répertoire src/promptgame/migrations . L'exécution migrate c'est comme pousser cet engagement, et met donc à jour en fait la base de données. Pour en savoir plus sur ce processus (y compris comment faire des comportements plus complexes tels que revenir à votre base de données à un état de migration précédent), cliquez ici.
Notez que si vous tirez de main après que quelqu'un ait apporté un changement à un modèle, vous devrez également exécuter ./manage.py migrate pour appliquer les nouvelles migrations générées par l'autre personne.
Pour créer un compte d'administration, exécutez:
./manage.py createsuperuserSuivez les invites pour créer un nom d'utilisateur et un mot de passe.
Connectez-vous à la page d'administration de LocalHost: 8000 / Private / DJ-Login /. Sur le site Prod, ce sera sur tenortrust.ai/private/dj-login/.
Entrez le nom d'utilisateur et le mot de passe que vous avez créés ci-dessus. Si vous êtes sur le site prod, vous devrez obtenir le mot de passe en ouvrant un terminal et en exécutant gcloud secrets versions access --secret=promptgame_prod_application_settings latest .
Tailwind est un cadre CSS qui facilite l'intégration CSS directement dans vos balises HTML, au lieu de mettre votre source HTML et votre source CSS à différents endroits. Il fonctionne en remplissant les informations de style dans un ensemble de classes prédéfinies, comme ce mélange de classes HTML et Tailwind qui définissent un bouton violet arrondi:
< 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 > Vous remarquerez peut-être à partir de cet exemple que l'ensemble des classes de vent arrière possibles est vraiment grande. par exemple text-[0.8125rem] rend le texte 0,8125 REM élevé, mais que se passe-t-il si l'utilisateur demandait 0,31 REM ou
Bien sûr, les navigateurs ne peuvent gérer qu'un nombre fini de classes de style définies, donc le vent arrière a besoin d'un moyen de déterminer les classes qu'il doit réellement générer et ce qu'elle peut sauter. Il le fait en utilisant un compilateur CSS. À des fins de développement, le compilateur peut être exécuté dynamiquement dans votre navigateur Web en insérant cette balise dans la tête de votre document:
< script src =" https://cdn.tailwindcss.com " > </ script >Cela fonctionne mais a l'inconvénient d'être lent et parfois de s'afficher du contenu incontestable. Je suis également légèrement inquiet que nous soyons interdits de leur CDN si nous l'avons utilisé en production, mais je ne sais pas à quel point c'est probable.
Pour ces deux raisons, nous utilisons plutôt le compilateur côté serveur de Tailwind (via django-tailwind). Le compilateur côté serveur est écrit en javascript, c'est pourquoi nous avons besoin de nœud, et aussi pourquoi nous devons exécuter ./manage.py tailwind install pour télécharger toutes les dépendances de Tailwind lors de l'installation pour la première fois sur une nouvelle machine. Le compilateur analyse votre code source (HTML, Python, JavaScript) pour des choses qui ressemblent à des noms de classe de vent arrière, puis les génèrent et les met dans cette feuille de style:
src/promptgame/theme/static/css/dist/styles.css
La feuille de style est vérifiée dans le contrôle de version, donc lorsque vous exécutez ./manage.py tailwind start , les modifications apportées par le compilateur en direct apparaîtront également dans git diffs . C'est un peu moche mais finalement bien, car le fichier produit styles.css produit ne fait que quelques milliers de lignes.
Pour utiliser Voir le Django Silk UI, visitez http://127.0.0.1:8000/silk/.
Ce projet est configuré pour être déployé sur GCP. Cela s'est avéré étonnamment compliqué, car nous avions besoin:
Les détails de la façon dont tout est configuré se trouvent dans un DOC interne (veuillez consulter le canal TT interne si vous êtes un affilié Chai qui a besoin d'accès).
Pour déployer une nouvelle version du site Web, vous n'avez qu'à connaître un petit sous-ensemble de ce qui est dans ce DOC. Une fois que vous avez des autorisations appropriées sur le projet GCP prompt-ad-game , vous pouvez couper un nouveau déploiement de mise en scène comme ceci:
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 à la racine du référentiel. L'image sera nommée gcr.io/prompt-ad-game/promptgame-staging avec une :latest ainsi qu'une balise composée des 7 derniers chiffres de la révision GIT actuelle.:latest image que vous avez construite ci-dessus): gcloud run jobs execute promptgame-staging-collect-and-migrate
--region us-central1 --wait./deploy/replace_cloud_run_service.py stagingSi toutes les commandes réussissent, l'application devrait s'exécuter sur notre site de mise en scène! Vous pouvez l'utiliser comme une opportunité de jouer avec dans un paramètre à faible enjeux - c'est bien si notre site de mise en scène est gâché, tant que nous corrigeons les bogues avant d'aller en production.
Une fois que vous avez vérifié que l'application fonctionne dans la mise en scène, vous pouvez la pousser à la production:
0f043fc , mais vous pouvez déterminer l'image de bonne balise pour votre commande: 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 prodUne fois que vous avez terminé toutes ces étapes, le code que vous avez exécuté avec succès sur le site de mise en scène devrait également être disponible sur le site de mise en scène!
Il y a beaucoup d'autres détails que je n'ai pas couverts ici, comme comment ajouter de nouveaux paramètres qui diffèrent entre la stadification et le prod, ou comment recréer l'environnement de mise en scène à partir de zéro. Le (très long) Google Doc lié ci-dessus devrait répondre à certaines de ces questions, mais vous pouvez également faire un ping à Sam sur Slack si vous voulez des pointeurs.