Este es el código fuente para el juego web de Tensor Trust y la tubería de limpieza de datos. Consulte el sitio web del documento para obtener más detalles sobre el proyecto. ¡También puedes usar los datos o ir a jugar!
Si se basa en nuestro código o datos en una publicación académica, cíquanos con el siguiente 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 }
}Para instalar y ejecutar, primero configure la tecla API de OpenAI si aún no lo ha hecho:
https://platform.openai.com/account/api-keys .set OPENAI_API_KEY=<your-key> , y en UNIX Ejecute export OPENAI_API_KEY=<your-key> .Ahora ejecute lo siguiente:
# 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)Ahora puede visitar una copia de desarrollo del sitio web en http: // localhost: 8000/.
Django maneja la gestión de la base de datos con Models , que definimos en src/promptgame/gameui/models.py . Siempre que edite un Model , necesita que el cambio se refleje en la base de datos subyacente que Django está administrando. Para hacer esto, ejecute:
./manage.py makemigrations
./manage.py migrate En términos de GIT, makemigrations es como crear un compromiso para registrar su cambio en la base de datos. Esta migración en realidad se rastrea dentro de un archivo en el directorio src/promptgame/migrations . Ejecutar migrate es como impulsar esta confirmación y, por lo tanto, actualiza la base de datos. Para obtener más información sobre este proceso (incluido cómo hacer un comportamiento más complejo, como revertir su base de datos a un estado de migración anterior), haga clic aquí.
Tenga en cuenta que si está sacando de main después de que alguien haya hecho un cambio en un modelo, también tendrá que ejecutar ./manage.py migrate para aplicar las nuevas migraciones generadas por la otra persona.
Para crear una cuenta de administración, ejecute:
./manage.py createsuperuserSiga las indicaciones para crear un nombre de usuario y contraseña.
Inicie sesión en la página de administración en Localhost: 8000/privado/dj-login/. En el sitio de Prod, esto será en tensorcust.ai/private/dj-login/.
Ingrese el nombre de usuario y la contraseña que creó anteriormente. Si está en el sitio de PROD, tendrá que obtener la contraseña abriendo un terminal y ejecutando gcloud secrets versions access --secret=promptgame_prod_application_settings latest .
Tailwind es un marco CSS que facilita la incrustación de CSS directamente en sus etiquetas HTML, en lugar de colocar su fuente HTML y su fuente de CSS en diferentes lugares. Funciona rellenando información de estilo en un conjunto de clases predefinidas, como esta mezcla de clases HTML y Ventillez que define un botón de púrpura redondeado:
< 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 > Puede notar a partir de este ejemplo que el conjunto de posibles clases de viento de cola es realmente grande. por ejemplo text-[0.8125rem] hace que el texto 0.8125 REM sea alto, pero ¿qué pasa si el usuario solicitó 0.31 REM o
Por supuesto, los navegadores solo pueden manejar un número finito de clases definidas y de estilo, por lo que Tailwind necesita alguna forma de averiguar qué clases realmente tiene que generar y cuáles pueden omitir. Hace esto usando un compilador CSS. Para fines de desarrollo, el compilador se puede ejecutar dinámicamente en su navegador web insertando esta etiqueta en el jefe de su documento:
< script src =" https://cdn.tailwindcss.com " > </ script >Esto funciona, pero tiene el inconveniente de ser lento y, a veces, causar contenido sin estilo se muestra. También estoy un poco preocupado de que nos prohiban su CDN si lo usamos en producción, pero no sé qué tan probable es que realmente sea.
Por ambas razones, en su lugar usamos el compilador del lado del servidor de Tailwind (a través de Django-Tailwind). El compilador del lado del servidor está escrito en JavaScript, por lo que necesitamos Node, y también por qué necesitamos ejecutar ./manage.py tailwind install para descargar todas las dependencias de Tailwind al instalar por primera vez en una nueva máquina. El compilador escanea su código fuente (HTML, Python, JavaScript) para cosas que parecen nombres de clase de viento de cola, luego los genera todos y los coloca en esta hoja de estilo:
src/promptgame/theme/static/css/dist/styles.css
La hoja de estilo se registra en el control de versiones, por lo que cuando se ejecuta ./manage.py tailwind start , los cambios realizados por el compilador en vivo también aparecerán en git diffs . Esto es un poco feo pero, en última instancia, bien, porque el archivo producido styles.css tiene solo unos pocos miles de líneas de largo.
Para usar la vista de la UI de seda Django, visite http://127.0.0.1:8000/silk/.
Este proyecto está configurado para implementarse en GCP. Resultó ser sorprendentemente complicado, ya que necesitábamos:
Los detalles de cómo está todo configurado están en un documento interno (consulte el canal TT interno si es un afiliado de Chai que necesita acceso).
Para implementar una nueva versión del sitio web, solo necesita conocer un pequeño subconjunto de lo que hay en ese documento. Una vez que tenga permisos apropiados en el proyecto GCP prompt-ad-game , puede reducir una nueva implementación de puesta en escena como esta:
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 en la raíz del repositorio. La imagen se llamará gcr.io/prompt-ad-game/promptgame-staging con una etiqueta :latest etiqueta, así como una etiqueta que consta de los últimos 7 dígitos de la revisión actual de GIT.:latest que creó arriba):: gcloud run jobs execute promptgame-staging-collect-and-migrate
--region us-central1 --wait./deploy/replace_cloud_run_service.py stagingSi todos los comandos tienen éxito, ¡la aplicación debería ejecutarse en nuestro sitio de puesta en escena! Puede usar esto como una oportunidad para jugar con él en un entorno de bajo riesgo: está bien si nuestro sitio de puesta en escena se equivoca, siempre que solucionemos los errores antes de ir a la producción.
Una vez que haya verificado que la aplicación funcione en escena, puede llevarla a la producción:
0f043fc , pero puede descubrir la etiqueta correcta para su imagen usando este comando: 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 prodUna vez que haya completado todos estos pasos, el código que realizó con éxito en el sitio de puesta en escena debe estar disponible en el sitio de preparación también.
Hay muchos otros detalles que no he cubierto aquí, como cómo agregar nuevas configuraciones que difieren entre la puesta en escena y el producto, o cómo recrear el entorno de puesta en escena desde cero. El Doc de Google (muy largo) vinculado anteriormente debe responder algunas de esas preguntas, pero también puede hacer ping a Sam en Slack si desea consejos.