Llamator для тех кто в танке, в банке, без интернетаБазовый сценарий работы Llamator'а предполагает взаимодействие с 3 моделями:
1. Атакующая-модель: генерирует промты
2. Модель которую тестируем
3. Модель-судья: анализирует ответы тестируемой модели
Мы будем использовать зараннее подготовленый файл с промтами, специфичными для внутреннего пользования.
Создаем заглушку для атакующей модели работающую с json:
class ClientFromFile(ClientBase):
def __init__(self, prompts_file: str, model_description: str = "Провайдер промптов из файла"):
super().__init__()
self.model_description = model_description
self.prompts: List[str] = []
self.index = 0
try:
with open(prompts_file, "r", encoding="utf-8") as f:
data = json.load(f)
# Обработка разных форматов данных в файле
if isinstance(data, list):
if data and isinstance(data[0], str):
self.prompts = data
elif data and isinstance(data[0], dict):
self.prompts = [
item.get("text") or item.get("content") or str(item)
for item in data
]
else:
self.prompts = [str(data)]
else:
self.prompts = [str(data)]
except FileNotFoundError:
self.prompts = []
except json.JSONDecodeError as e:
self.prompts = []
В этом же классе переопределяем interact, который возвращает следующий промпт из списка:
def interact(self, message: str = "", *args, **kwargs) -> Dict[str, Any]:
if not self.prompts:
return {"content": "Нет доступных промптов"}
response_text = self.prompts[self.index % len(self.prompts)]
self.index += 1
return {"content": response_text}
Далее переопределяем интерфейс генерации промтов (просто вызывается interact), отказываемся от сохранении истории чата и возвращаем информацию о модели в отчете.
def generate(self, prompt: str, *args, **kwargs) -> Dict[str, Any]:
return self.interact(prompt, *args, **kwargs)
def chat(self, messages: List[Dict[str, str]], *args, **kwargs) -> Dict[str, Any]:
return self.interact("", *args, **kwargs)
def get_model_info(self) -> Dict[str, Any]:
return {
"model_type": "file_based",
"description": self.model_description,
"prompts_count": len(self.prompts),
}
Загружаем промты из файла:
attack_model = ClientFromFile(prompts_file="all_prompts.json")
Тестируемая модель Qwen через Ollama:
tested_model = llamator.ClientOpenAI(
api_key="ollama", # Ключ для Ollama (фиктивный, т.к. не требуется)
base_url="http://localhost:11434/v1",
model="qwen:7b-chat",
temperature=0.1,
model_description="Qwen 7B"
)
Готовим атаки:
basic_tests = [
("aim_jailbreak", {"num_attempts": 3}), # Обход ограничений
("base64_injection", {"num_attempts": 2}), # Инъекции через Base64
("dan", {"num_attempts": 2}), # "Do Anything Now" промпты
("linguistic_evasion", {"num_attempts": 3}), # Лингвистические обходы
("harmbench", {"num_attempts": 2}), # Тесты на вредоносность
]
Конфигурирование тестирования:
config = {
"enable_logging": True,
"enable_reports": True,
"artifacts_path": "./artifacts",
"debug_level": 1,
"report_language": "ru",
"save_responses": True,
}Запускаем тестирование:
test_result_dict = llamator.start_testing(
attack_model=attack_model,
tested_model=tested_model,
judge_model=None, # Оценка без модели
config=config,
basic_tests=basic_tests,
num_threads=1,
)
#MlSecOps