evaluations/safety_eval.py (136 lines of code) (raw):

import asyncio import json import os from datetime import datetime from typing import List, Dict, Any from promptflow.evals.evaluate import evaluate from promptflow.evals.evaluators import SexualEvaluator, ViolenceEvaluator, SelfHarmEvaluator, HateUnfairnessEvaluator from promptflow.evals.synthetic import AdversarialScenario, AdversarialSimulator from azure.identity import DefaultAzureCredential from chat_request import get_response from azure_config import AzureConfig # Initialize AzureConfig azure_config = AzureConfig() async def callback( messages: List[Dict], stream: bool = False, session_state: Any = None, ) -> dict: query = messages["messages"][0]["content"] context = None # Add file contents for summarization or re-write if 'file_content' in messages["template_parameters"]: query += messages["template_parameters"]['file_content'] response = get_response(query, [])['answer'] # Format responses in OpenAI message protocol formatted_response = { "content": response, "role": "assistant", "context": {}, } messages["messages"].append(formatted_response) return { "messages": messages["messages"], "stream": stream, "session_state": session_state } async def main(): # Read configuration azure_config = AzureConfig() # Set required environment variables os.environ['AZURE_OPENAI_ENDPOINT'] = azure_config.aoai_endpoint os.environ['AZURE_OPENAI_API_KEY'] = azure_config.aoai_api_key # Read environment variables azure_location = azure_config.location azure_subscription_id = azure_config.subscription_id azure_resource_group = azure_config.resource_group azure_project_name = azure_config.workspace_name print("AZURE_LOCATION=", azure_location) print("AZURE_SUBSCRIPTION_ID=", azure_subscription_id) print("AZURE_RESOURCE_GROUP=", azure_resource_group) print("AZUREAI_PROJECT_NAME=", azure_project_name) valid_locations = ["eastus2", "francecentral", "uksouth", "swedencentral"] if azure_location not in valid_locations: print(f"Invalid AZURE_LOCATION: {azure_location}. Must be one of {valid_locations}.") else: # Import the built-in safety evaluators azure_ai_project = { "subscription_id": azure_subscription_id, "resource_group_name": azure_resource_group, "project_name": azure_project_name, } sexual_evaluator = SexualEvaluator(azure_ai_project) self_harm_evaluator = SelfHarmEvaluator(azure_ai_project) hate_unfairness_evaluator = HateUnfairnessEvaluator(azure_ai_project) violence_evaluator = ViolenceEvaluator(azure_ai_project) scenario = AdversarialScenario.ADVERSARIAL_QA azure_ai_project["credential"] = DefaultAzureCredential() simulator = AdversarialSimulator(azure_ai_project=azure_ai_project) outputs = await simulator( scenario=scenario, target=callback, max_conversation_turns=1, max_simulation_results=10, jailbreak=False ) adversarial_conversation_result = outputs.to_eval_qa_json_lines() print(f"Adversarial conversation results: {adversarial_conversation_result}.") prefix = os.getenv("PREFIX", datetime.now().strftime("%y%m%d%H%M%S"))[:14] try: azure_ai_project["credential"] = "" adversarial_eval_result = evaluate( evaluation_name=f"{prefix} Adversarial Tests", data=adversarial_conversation_result, evaluators={ "sexual": sexual_evaluator, "self_harm": self_harm_evaluator, "hate_unfairness": hate_unfairness_evaluator, "violence": violence_evaluator }, azure_ai_project= azure_ai_project, output_path="./adversarial_test.json" ) except Exception as e: print(f"An error occurred during evaluation: {e}\n Retrying without reporting results in Azure AI Project.") adversarial_eval_result = evaluate( evaluation_name=f"{prefix} Adversarial Tests", data=adversarial_conversation_result, evaluators={ "sexual": sexual_evaluator, "self_harm": self_harm_evaluator, "hate_unfairness": hate_unfairness_evaluator, "violence": violence_evaluator }, output_path="./adversarial_test.json" ) jb_outputs = await simulator( scenario=scenario, target=callback, max_simulation_results=10, jailbreak=True ) adversarial_conversation_result_w_jailbreak = jb_outputs.to_eval_qa_json_lines() print(f"Adversarial conversation w/ jailbreak results: {adversarial_conversation_result_w_jailbreak}.") try: adversarial_eval_w_jailbreak_result = evaluate( evaluation_name=f"{prefix} Adversarial Tests w/ Jailbreak", data=adversarial_conversation_result_w_jailbreak, evaluators={ "sexual": sexual_evaluator, "self_harm": self_harm_evaluator, "hate_unfairness": hate_unfairness_evaluator, "violence": violence_evaluator }, azure_ai_project=azure_ai_project, output_path="./adversarial_test_w_jailbreak.json" ) except Exception as e: print(f"An error occurred during evaluation: {e}\n Retrying without reporting results in Azure AI Project.") adversarial_eval_w_jailbreak_result = evaluate( evaluation_name=f"{prefix} Adversarial Tests w/ Jailbreak", data=adversarial_conversation_result_w_jailbreak, evaluators={ "sexual": sexual_evaluator, "self_harm": self_harm_evaluator, "hate_unfairness": hate_unfairness_evaluator, "violence": violence_evaluator }, output_path="./adversarial_test_w_jailbreak.json" ) print(f"Check {prefix} Adversarial Tests results in the 'Evaluation' section of your project: {azure_config.workspace_name}.") if __name__ == '__main__': import promptflow as pf asyncio.run(main())