790просмотров
22 августа 2025 г.
📷 ФотоScore: 869
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