From 7de6367e5f504e3dfa47695d3a7e45a42485fb55 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Tue, 1 Oct 2024 14:51:41 -0700 Subject: [PATCH 1/8] Update task_query_response.prompty remove required keys --- .../simulator/_prompty/task_query_response.prompty | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty index 881d00493ff8..42a5d3fe4e37 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty @@ -3,11 +3,6 @@ name: TaskSimulatorQueryResponse description: Gets queries and responses from a blob of text model: api: chat - configuration: - type: azure_openai - azure_deployment: ${env:AZURE_DEPLOYMENT} - api_key: ${env:AZURE_OPENAI_API_KEY} - azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT} parameters: temperature: 0.0 top_p: 1.0 From f288b341820d9f54f7830dae8f841035b4f30df6 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Tue, 1 Oct 2024 14:51:54 -0700 Subject: [PATCH 2/8] Update task_simulate.prompty --- .../ai/evaluation/simulator/_prompty/task_simulate.prompty | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty index 7dce5e28a6d1..1d8e360b56b9 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty @@ -3,10 +3,6 @@ name: TaskSimulatorWithPersona description: Simulates a user to complete a conversation model: api: chat - configuration: - type: azure_openai - azure_deployment: ${env:AZURE_DEPLOYMENT} - azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT} parameters: temperature: 0.0 top_p: 1.0 From 2a4b6f744a9a6c8faee8c742f0ad55d5cf82b922 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Wed, 2 Oct 2024 07:21:58 -0700 Subject: [PATCH 3/8] Update task_query_response.prompty --- .../evaluation/simulator/_prompty/task_query_response.prompty | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty index 42a5d3fe4e37..b8c04fb19ef1 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty @@ -3,6 +3,10 @@ name: TaskSimulatorQueryResponse description: Gets queries and responses from a blob of text model: api: chat + configuration: + type: azure_openai + azure_deployment: ${env:AZURE_DEPLOYMENT} + azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT} parameters: temperature: 0.0 top_p: 1.0 From c8ce251bc34b2c3913f1d7e793ed65292e6a2e24 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Wed, 2 Oct 2024 07:22:17 -0700 Subject: [PATCH 4/8] Update task_simulate.prompty --- .../ai/evaluation/simulator/_prompty/task_simulate.prompty | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty index 1d8e360b56b9..7dce5e28a6d1 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty @@ -3,6 +3,10 @@ name: TaskSimulatorWithPersona description: Simulates a user to complete a conversation model: api: chat + configuration: + type: azure_openai + azure_deployment: ${env:AZURE_DEPLOYMENT} + azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT} parameters: temperature: 0.0 top_p: 1.0 From e672f62913bd460ec5cc3ee0a0d5640731ea3a1d Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Thu, 3 Oct 2024 08:18:38 -0700 Subject: [PATCH 5/8] Remove private variable and use kwargs --- .../azure/ai/evaluation/simulator/_adversarial_simulator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py index a3e3bcc35739..3ade5f88b71b 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py @@ -106,10 +106,10 @@ async def __call__( api_call_retry_sleep_sec: int = 1, api_call_delay_sec: int = 0, concurrent_async_task: int = 3, - _jailbreak_type: Optional[str] = None, language: SupportedLanguages = SupportedLanguages.English, randomize_order: bool = True, randomization_seed: Optional[int] = None, + **kwargs, ): """ Executes the adversarial simulation against a specified target function asynchronously. @@ -216,6 +216,7 @@ async def __call__( total_tasks, ) total_tasks = min(total_tasks, max_simulation_results) + _jailbreak_type = kwargs.get("_jailbreak_type", None) if _jailbreak_type: jailbreak_dataset = await self.rai_client.get_jailbreaks_dataset(type=_jailbreak_type) progress_bar = tqdm( From 1c59d3e4182c817154de95b3a1adaa45f13d7876 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Thu, 3 Oct 2024 08:21:00 -0700 Subject: [PATCH 6/8] Add experimental tag to adv sim --- .../simulator/_adversarial_simulator.py | 3 +- .../simulator/_direct_attack_simulator.py | 33 ++----------------- .../simulator/_indirect_attack_simulator.py | 32 ++---------------- 3 files changed, 6 insertions(+), 62 deletions(-) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py index 3ade5f88b71b..5833fdf0071a 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py @@ -29,10 +29,11 @@ TokenScope, ) from ._utils import JsonLineList +from ._helpers import experimental logger = logging.getLogger(__name__) - +@experimental class AdversarialSimulator: """ Initializes the adversarial simulator with a project scope. diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py index e1f102ce50d1..68935764a955 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py @@ -16,39 +16,11 @@ from ._adversarial_simulator import AdversarialSimulator from ._model_tools import AdversarialTemplateHandler, ManagedIdentityAPITokenManager, RAIClient, TokenScope - +from ._helpers import experimental logger = logging.getLogger(__name__) -def monitor_adversarial_scenario(func) -> Callable: - """Decorator to monitor adversarial scenario. - - :param func: The function to be decorated. - :type func: Callable - :return: The decorated function. - :rtype: Callable - """ - - @functools.wraps(func) - def wrapper(*args, **kwargs): - scenario = str(kwargs.get("scenario", None)) - max_conversation_turns = kwargs.get("max_conversation_turns", None) - max_simulation_results = kwargs.get("max_simulation_results", None) - decorated_func = monitor_operation( - activity_name="jailbreak.adversarial.simulator.call", - activity_type=ActivityType.PUBLICAPI, - custom_dimensions={ - "scenario": scenario, - "max_conversation_turns": max_conversation_turns, - "max_simulation_results": max_simulation_results, - }, - )(func) - - return decorated_func(*args, **kwargs) - - return wrapper - - +@experimental class DirectAttackSimulator: """ Initialize a UPIA (user prompt injected attack) jailbreak adversarial simulator with a project scope. @@ -110,7 +82,6 @@ def _ensure_service_dependencies(self): blame=ErrorBlame.USER_ERROR, ) - # @monitor_adversarial_scenario async def __call__( self, *, diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py index aeb9b4cbd6e5..b4d84a88227d 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py @@ -15,39 +15,12 @@ from ._adversarial_simulator import AdversarialSimulator from ._model_tools import AdversarialTemplateHandler, ManagedIdentityAPITokenManager, RAIClient, TokenScope +from ._helpers import experimental logger = logging.getLogger(__name__) -def monitor_adversarial_scenario(func) -> Callable: - """Decorator to monitor adversarial scenario. - - :param func: The function to be decorated. - :type func: Callable - :return: The decorated function. - :rtype: Callable - """ - - @functools.wraps(func) - def wrapper(*args, **kwargs): - scenario = str(kwargs.get("scenario", None)) - max_conversation_turns = kwargs.get("max_conversation_turns", None) - max_simulation_results = kwargs.get("max_simulation_results", None) - decorated_func = monitor_operation( - activity_name="xpia.adversarial.simulator.call", - activity_type=ActivityType.PUBLICAPI, - custom_dimensions={ - "scenario": scenario, - "max_conversation_turns": max_conversation_turns, - "max_simulation_results": max_simulation_results, - }, - )(func) - - return decorated_func(*args, **kwargs) - - return wrapper - - +@experimental class IndirectAttackSimulator: """ Initializes the XPIA (cross domain prompt injected attack) jailbreak adversarial simulator with a project scope. @@ -107,7 +80,6 @@ def _ensure_service_dependencies(self): blame=ErrorBlame.USER_ERROR, ) - # @monitor_adversarial_scenario async def __call__( self, *, From dbb27e8f35639a8a7a19b090fe9e1f012a223210 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Thu, 3 Oct 2024 09:20:08 -0700 Subject: [PATCH 7/8] format with black --- .../azure/ai/evaluation/simulator/_adversarial_simulator.py | 1 + .../azure/ai/evaluation/simulator/_direct_attack_simulator.py | 1 + 2 files changed, 2 insertions(+) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py index 5833fdf0071a..572c2c462f27 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py @@ -33,6 +33,7 @@ logger = logging.getLogger(__name__) + @experimental class AdversarialSimulator: """ diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py index 68935764a955..5adfd4a38a55 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py @@ -17,6 +17,7 @@ from ._adversarial_simulator import AdversarialSimulator from ._model_tools import AdversarialTemplateHandler, ManagedIdentityAPITokenManager, RAIClient, TokenScope from ._helpers import experimental + logger = logging.getLogger(__name__) From 774d8e64f180caae3084e5faa6c1abda54310c68 Mon Sep 17 00:00:00 2001 From: Nagkumar Arkalgud Date: Thu, 3 Oct 2024 12:05:18 -0700 Subject: [PATCH 8/8] Fix the pylint issues --- .../azure/ai/evaluation/simulator/_adversarial_simulator.py | 2 +- .../ai/evaluation/simulator/_direct_attack_simulator.py | 4 +--- .../ai/evaluation/simulator/_indirect_attack_simulator.py | 5 +---- .../azure/ai/evaluation/simulator/_simulator.py | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py index 572c2c462f27..2cc511c3e35a 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_adversarial_simulator.py @@ -94,7 +94,7 @@ def _ensure_service_dependencies(self): blame=ErrorBlame.USER_ERROR, ) - # @monitor_adversarial_scenario + # pylint: disable=too-many-locals async def __call__( self, *, diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py index 5adfd4a38a55..a7f6b5a715c2 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_direct_attack_simulator.py @@ -1,14 +1,12 @@ # --------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # --------------------------------------------------------- +# pylint: disable=C0301,C0114,R0913,R0903 # noqa: E501 -import functools import logging from random import randint from typing import Callable, Optional -from promptflow._sdk._telemetry import ActivityType, monitor_operation - from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException from azure.ai.evaluation._model_configurations import AzureAIProject from azure.ai.evaluation.simulator import AdversarialScenario diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py index b4d84a88227d..5d64b692ac06 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_indirect_attack_simulator.py @@ -1,13 +1,10 @@ # --------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # --------------------------------------------------------- +# pylint: disable=C0301,C0114,R0913,R0903 # noqa: E501 -import functools import logging from typing import Callable - -from promptflow._sdk._telemetry import ActivityType, monitor_operation - from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException from azure.ai.evaluation._model_configurations import AzureAIProject from azure.ai.evaluation.simulator import AdversarialScenario diff --git a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_simulator.py b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_simulator.py index bff65d987f7e..f2621966fab7 100644 --- a/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_simulator.py +++ b/sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/simulator/_simulator.py @@ -1,5 +1,5 @@ # flake8: noqa -# pylint: disable=W0102,W0613,R0914,C0301,E0401,E0611 +# pylint: disable=W0102,W0613,R0914,C0301,E0401,E0611,C0114,R0913,E0702,R0903 # --------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # ---------------------------------------------------------