Este é o código -fonte do jogo da web do Tensor Trust e do pipeline de limpeza de dados. Consulte o site em papel para obter mais detalhes sobre o projeto. Você também pode usar os dados ou jogar o jogo!
Se você desenvolver nosso código ou dados em uma publicação acadêmica, cite -nos com o seguinte 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 e executar, primeiro configure a tecla API OpenAI, se você ainda não o possui:
https://platform.openai.com/account/api-keys .set OPENAI_API_KEY=<your-key> e no Unix Run export OPENAI_API_KEY=<your-key> .Agora execute o seguinte:
# 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)Agora você pode visitar uma cópia de desenvolvimento do site em http: // localhost: 8000/.
O Django lida com o gerenciamento de banco de dados com Models , que definimos no src/promptgame/gameui/models.py . Sempre que você edita um Model , precisa que a alteração seja refletida no banco de dados subjacente que o Django está gerenciando. Para fazer isso, corra:
./manage.py makemigrations
./manage.py migrate Em termos Git, makemigrations são como criar um comitê de gravar sua alteração no banco de dados. Essa migração é realmente rastreada dentro de um arquivo no diretório src/promptgame/migrations . A execução migrate é como empurrar esse compromisso e, portanto, atualiza o banco de dados. Para saber mais sobre esse processo (incluindo como fazer comportamentos mais complexos, como reverter seu banco de dados de volta a um estado de migração anterior), clique aqui.
Observe que, se você estiver puxando de main depois que alguém fizer uma alteração em um modelo, você também terá que executar ./manage.py migrate para aplicar as novas migrações geradas pela outra pessoa.
Para criar uma conta de administrador, execute:
./manage.py createsuperuserSiga os avisos para criar um nome de usuário e senha.
Faça login na página de administração em localhost: 8000/privado/dj-login/. No site Prod, isso será em tensortrust.ai/private/dj-login/.
Digite o nome de usuário e a senha que você criou acima. Se você estiver no site Prod, precisará obter a senha abrindo um terminal e executando gcloud secrets versions access --secret=promptgame_prod_application_settings latest .
O Tailwind é uma estrutura CSS que facilita a incorporação de CSS diretamente em suas tags HTML, em vez de colocar sua fonte HTML e sua fonte CSS em diferentes locais. Funciona enchendo informações de estilo em um conjunto de classes predefinidas, como esta mistura de classes HTML e Tailwind que define um botão roxo arredondado:
< 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 > Você pode notar neste exemplo que o conjunto de possíveis classes de vento de cauda é realmente grande. por exemplo text-[0.8125rem]
Obviamente, os navegadores só podem lidar com um número finito de classes definidas e estilizadas; portanto, o Tailwind precisa de alguma maneira de descobrir quais classes ele realmente precisa gerar e que pode pular. Faz isso usando um compilador CSS. Para fins de desenvolvimento, o compilador pode ser executado dinamicamente no seu navegador da web inserindo essa tag na cabeça do seu documento:
< script src =" https://cdn.tailwindcss.com " > </ script >Isso funciona, mas tem a desvantagem de ser lento e, às vezes, causar o conteúdo sem si exibir. Também estou um pouco preocupado que sejamos proibidos do CDN deles se o usássemos na produção, mas não sei a probabilidade de isso realmente é.
Por esses dois motivos, usamos o compilador do lado do servidor do Tailwind (via django-tailwind). O compilador do lado do servidor está escrito no JavaScript, e é por isso que precisamos de nó e também por que precisamos executar ./manage.py tailwind install para baixar todas as dependências do Tailwind ao instalar primeiro em uma nova máquina. O compilador digitaliza seu código -fonte (HTML, Python, JavaScript) quanto a coisas que se parecem com nomes de classe do Tailwind, depois gera todos eles e os coloca nesta folha de estilo:
src/promptgame/theme/static/css/dist/styles.css
A folha de estilo é verificada no controle da versão; portanto, quando você é executado ./manage.py tailwind start , as alterações feitas pelo compilador ao vivo também aparecerão no git diffs . Isso é um pouco feio, mas em última análise, porque o arquivo styles.css produzido tem apenas alguns milhares de linhas.
Para usar o View the Django Silk Ui, visite http://127.0.0.1:8000/silk/.
Este projeto está configurado para ser implantado no GCP. Acabou sendo surpreendentemente complicado, já que precisávamos:
Os detalhes de como tudo está configurado estão em um documento interno (consulte o canal TT interno se você é um afiliado da CHAI que precisa de acesso).
Para implantar uma nova versão do site, você só precisa conhecer um pequeno subconjunto do que está nesse doc. Depois de ter permissões apropriadas no projeto GCP prompt-ad-game , você pode cortar uma nova implantação de estadiamento 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 na raiz do repositório. A imagem será nomeada gcr.io/prompt-ad-game/promptgame-staging com uma tag :latest , bem como uma tag que consiste nos últimos 7 dígitos da revisão atual do Git.:latest que você construiu acima): gcloud run jobs execute promptgame-staging-collect-and-migrate
--region us-central1 --wait./deploy/replace_cloud_run_service.py stagingSe todos os comandos forem bem -sucedidos, o aplicativo deve estar em execução em nosso site de estadiamento! Você pode usar isso como uma oportunidade de brincar com ele em um ambiente de baixo risco-é bom se nosso site de encenação for bagunçado, desde que corrigimos os bugs antes de ir à produção.
Depois de verificar se o aplicativo funciona no estadiamento, você pode empurrá -lo para a produção:
0f043fc , mas você pode descobrir a tag certa para sua imagem 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 prodDepois de concluir todas essas etapas, o código que você executou com sucesso no site de estadiamento também deve estar disponível no site de estadiamento!
Existem muitos outros detalhes que não cobri aqui, como adicionar novas configurações que diferem entre estadiamento e produto ou como recriar o ambiente de encenação do zero. O (muito longo) o Google Doc vinculado acima deve responder a algumas dessas perguntas, mas você também pode pingar Sam no Slack se quiser indicadores.