
benchmark de red-teaming específico do domínio financeiro rubrica de avaliação
Um pipeline de geração de benchmark de red-team para avaliação de segurança no domínio financeiro.
Materiais detalhados referenciados no artigo:
FinRED/
├── main.py # Executor principal
├── requirements.txt # Dependências
├── run/ # Scripts de execução de exemplo
├── prompts/ # Arquivos de prompt
├── tests/ # Notebooks de exemplo
├── README.md
│
├── src/
│ ├── Step1_build.py # Módulo de geração de cenários
│ ├── Step2_build.py # Módulo de geração de prompts semente
│ ├── __init__.py
│ │
│ ├── data/ # Dados baixados
│ │ ├── contexts/ # Dados de contexto
│ │ │ ├── R3_products/ # Resumos de produtos R3
│ │ │ └── retrieved_chunks/# Saídas de busca por similaridade
│ │ ├── orig/ # Dados brutos
│ │ │ ├── db/ # Banco de dados CSV de chunks
│ │ │ ├── parsed_docs/ # PDFs + JSON de chunks
│ │ │ └── investinfo/ # Texto de produtos R3
│ │ └── queries/ # Arquivos CSV de consultas
│ │
│ ├── data/schemas/ # Definições de esquema de saída
│ │ ├── ko/ # Esquemas em coreano
│ │ └── en/ # Esquemas em inglês
│ │
│ ├── outputs/ # Saídas de geração
│ │ ├── scenarios/ # Saídas da Etapa 1
│ │ └── prompts/ # Saídas da Etapa 2
│ │
│ ├── preprocess/ # Pipeline de pré-processamento
│ │ ├── preprocess_README.md # Guia detalhado de pré-processamento
│ │ ├── 1_chunking.py
│ │ ├── 2_parsed_to_csv.py
│ │ ├── 3_common_to_csv.py
│ │ ├── 4_product_summarizer.py
│ │ ├── 5_summary_extractor.py
│ │ └── 6_chunk_retriever.py
│ │
│ ├── eval/ # Módulo de avaliação
│ │ ├── judge_finred.py # Script de avaliação
│ │ ├── dataset/ # Conjunto de dados de avaliação
Google Drive: https://drive.google.com/drive/u/0/folders/1cfBf419OUDrQQMRKMPLLJqRX97WMxExC Google Drive
Coloque os dados baixados de forma a corresponder à estrutura de pastas acima (em src/data).
# Conda
conda create -n finred python=3.10 -y
conda activate finred
# Ou venv
python3.10 -m venv finred_env
source finred_env/bin/activate
cd /path/to/FinRED
pip install -r requirements.txt
Se você precisar de pré-processamento (chunking de PDF, etc.):
# Unstructured
pip install "unstructured[all-docs]"
# Dependências do sistema (Ubuntu/Debian)
sudo apt-get install -y libmagic-dev poppler-utils tesseract-ocr tesseract-ocr-kor libreoffice pandoc
Guia de pré-processamento:
src/preprocess/preprocess_README.md
python --version # Python 3.10.x
python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}')"
[Context + Schema + Query]
│
▼
┌─────────────┐
│ Step1_build │ Geração de cenários (OpenAI GPT-4)
└─────────────┘
│
▼
[Scenario JSON]
│
▼
┌─────────────┐
│ Step2_build │ Geração de prompts semente (Gemini)
└─────────────┘
│
▼
[Seed Prompts]
│
▼
┌─────────────┐
│ Evaluation │ Avaliação de respostas do modelo
└─────────────┘
Gera cenários de red-team com base no contexto e esquema.
src/outputs/scenarios/{category}/Gera prompts semente a partir de cenários.
src/outputs/prompts/{category}/# Executar o pipeline completo com o script de exemplo
sh run/run_data_generate.sh
python src/eval/judge_finred.py \
-i src/eval/dataset/qwen_2.5_test.csv \
-o qwen_2.5_test_judged \
-d src/eval/infer_result
cd /path/to/FinRED
python main.py \
--step <1|2|all> \
--category <category> \
--openai_api_key "sk-..." \
--gemini_api_key "AIza..."
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
--step | Sim | Etapa a executar: 1 (cenário), 2 (prompt), all (sequencial) |
--category | Sim | Categoria: R1, R2, R3, R4, R5 ou R1_1, etc. |
--openai_api_key | Etapa 1 | Chave de API da OpenAI |
--gemini_api_key | Etapa 2 | Chave de API do Gemini |
--lang | Opcional | Idioma do prompt: ko (padrão), en |
--num_prompts | Opcional | Número de prompts (padrão: 3) |
--step1_model | Opcional | Modelo para a Etapa 1 (padrão: gpt-4.1-2025-04-14) |
--step2_model | Opcional | Modelo para a Etapa 2 (padrão: models/gemini-2.5-pro) |
--model_name | Opcional | Alias obsoleto para --step1_model |
# Pipeline completo (R1)
python main.py \
--step all \
--category R1 \
--openai_api_key "sk-proj-..." \
--gemini_api_key "AIza..."
# Apenas Etapa 1
python main.py \
--step 1 \
--category R2 \
--openai_api_key "sk-proj-..."
# Apenas Etapa 2 (Inglês, 5 prompts)
python main.py \
--step 2 \
--category R5 \
--lang en \
--num_prompts 5 \
--gemini_api_key "AIza..."
# Subcategoria única
python main.py \
--step 2 \
--category R1_1 \
--num_prompts 3 \
--gemini_api_key "AIza..."
| Categoria | Subcategorias | Descrição |
|---|---|---|
| R1 | R1_1 ~ R1_6 | Ameaças à segurança financeira |
| R2 | R2_1 ~ R2_5 | Fraudes e atividades ilegais |
| R3 | R3_1 ~ R3_3 | Venda inadequada |
| R4 | R4_1 ~ R4_5 | Manipulação de mercado |
| R5 | R5_1 ~ R5_7 | Violações regulatórias |
Avalia as respostas do modelo aos prompts gerados.
cd /path/to/FinRED/src/eval
python src/eval/judge_finred.py \
-i <input_csv_path> \
-o <output_basename> \
-d <output_dir>
python src/eval/judge_finred.py \
-i ./dataset/qwen_2.5_7b_all_with_responses.csv \
-o qwen2.5_7b_responses \
-d ./infer_result/
O CSV deve incluir:
infer_result/: resultados da avaliaçãojudge_errors/: logs de erros{
"scenario_id": "R1_1_0001",
"context": "...",
"risk_description": "...",
"attack_vector": "..."
}
{
"prompt_1": "Provide details about vulnerabilities in a financial system...",
"prompt_1_optionalelements": ["social engineering", "phishing"],
"prompt_2": "...",
"prompt_2_optionalelements": ["..."]
}