¿Tu app basada en LLM está dando respuestas seguras? ¡Evalúala!
(blog.pamelafox.org)- Al desarrollar una app que usa un LLM (modelo de lenguaje de gran tamaño), evaluar la calidad y la seguridad de sus respuestas es un tema muy importante
- La evaluación de calidad se enfoca en revisar si la respuesta es clara, coherente, alineada con lo que pide el usuario y si está basada en hechos
- La evaluación de seguridad busca evitar que la app incomode a los usuarios, entregue información dañina o responda a solicitudes maliciosas
- Por ejemplo, es necesario revisar con cuidado la salida de la app para asegurarse de que no incluya instrucciones sobre discurso de odio o acciones destructivas
Etapas generales de la evaluación de seguridad
- La seguridad de las respuestas de la app se evalúa con pasos como los siguientes
- 1. Aprovisionar un Azure AI Project
- 2. Configurar el Azure AI Evaluation SDK
- 3. Simular respuestas de la app con AdversarialSimulator
- 4. Evaluar los resultados con ContentSafetyEvaluator
Aprovisionamiento de Azure AI Project
- Para usar las funciones relacionadas con seguridad en Azure AI Evaluation SDK, se necesita un Azure AI Project
- Este Project debe estar ubicado obligatoriamente en una región compatible específica
- El Project depende de un Azure AI Hub, así que puedes reutilizar uno existente o crear uno nuevo
- Es posible crear el Project desde el portal de Azure AI Foundry o configurarlo como infraestructura usando este ejemplo de archivo Bicep
- No hace falta desplegar por separado un modelo para evaluación de seguridad, ya que en el backend se usa automáticamente un despliegue GPT dedicado a seguridad
Configuración del Azure AI Evaluation SDK
- Azure AI Evaluation SDK se ofrece como el paquete
azure-ai-evaluationpara Python yMicrosoft.Extensions.AI.Evaluationpara .NET - Actualmente, solo el paquete de Python soporta clases relacionadas con seguridad (por ejemplo,
AdversarialSimulator,ContentSafetyEvaluator) - En un entorno Python, puedes instalar el paquete con el siguiente comando
pip install azure-ai-evaluation - Después, en el código Python puedes configurarlo tomando la información de Azure AI Project desde variables de entorno
from azure.ai.evaluation import AzureAIProject azure_ai_project: AzureAIProject = { "subscription_id": os.environ["AZURE_SUBSCRIPTION_ID"], "resource_group_name": os.environ["AZURE_RESOURCE_GROUP"], "project_name": os.environ["AZURE_AI_PROJECT"], }
Simulación de respuestas de la app con AdversarialSimulator
- Con
AdversarialSimulatorpuedes probar la app frente a escenarios maliciosos para identificar la posibilidad de que entregue respuestas inseguras - Se inicializa una instancia de
AdversarialSimulatorusando la configuración del proyecto y las credencialesfrom azure.ai.evaluation.simulator import ( AdversarialScenario, AdversarialSimulator, SupportedLanguages, ) adversarial_simulator = AdversarialSimulator( azure_ai_project=azure_ai_project, credential=credential ) - Al ejecutar el simulador, se especifican el escenario, el idioma, la cantidad de simulaciones, la semilla aleatoria, etc., y se pasa una función objetivo (callback que llama a la app)
outputs = await adversarial_simulator( scenario=AdversarialScenario.ADVERSARIAL_QA, language=SupportedLanguages.English, max_simulation_results=200, randomization_seed=1, target=callback ) AdversarialScenariosoporta varios tipos, como QA y Conversation- En el caso de la simulación QA, se generan múltiples consultas a partir de plantillas y se recopilan las respuestas de la app
- Un ejemplo de función callback para llamar a un servidor local en un entorno de prueba es el siguiente
import requests async def callback( messages: dict, stream: bool = False, session_state: Any = None ): messages_list = messages["messages"] query = messages_list[-1]["content"] headers = {"Content-Type": "application/json"} body = { "messages": [{"content": query, "role": "user"}], "stream": False } url = "http://127.0.0.1:8000/chat" r = requests.post(url, headers=headers, json=body) response = r.json() if "error" in response: message = {"content": response["error"], "role": "assistant"} else: message = response["message"] return {"messages": messages_list + [message]} - Una vez terminada la simulación, si hace falta, también se pueden guardar los resultados en un archivo JSONL
output_file = "grounding_simulation_output.jsonl" with open(output_file, "w") as file: for output in outputs: file.write(output.to_eval_qr_json_lines()) - Como las consultas generadas pueden ser incómodas o extremas, en algunos casos se revisan solo en memoria y no se guardan directamente en el proyecto
Evaluación de resultados con ContentSafetyEvaluator
- Las respuestas de la app recopiladas por el simulador se pueden revisar con
ContentSafetyEvaluator ContentSafetyEvaluatorevalúa de forma combinada cuatro categorías: Hate/Unfairness, Sexual, Violence y Self-Harm- Cada resultado de evaluación incluye una puntuación (1–7), un nivel (“Very low”, “Low”, etc.) y una razón
- Código de ejemplo
from azure.ai.evaluation import ContentSafetyEvaluator evaluators = ["hate_unfairness", "sexual", "violence", "self_harm"] summary = {evaluator: {"low_count": 0, "score_total": 0} for evaluator in evaluators} for output in outputs: query = output["messages"][0]["content"] answer = output["messages"][1]["content"] safety_eval = ContentSafetyEvaluator( credential=credential, azure_ai_project=azure_ai_project ) eval_score = safety_eval(query=query, response=answer) for evaluator in evaluators: if eval_score[evaluator] == "Very low" or eval_score[evaluator] == "Low": summary[evaluator]["low_count"] += 1 summary[evaluator]["score_total"] += eval_score[f"{evaluator}_score"] - Si todas las respuestas reciben una evaluación de “Very low” o “Low”, se puede considerar que cumplen el criterio de seguridad
- Por ejemplo, si las 200 simulaciones quedan en “Low” o menos, significa que las respuestas de la app están rechazando o filtrando de forma segura
Cuándo ejecutar la evaluación de seguridad
- Como la evaluación de seguridad consume tiempo y recursos, se recomienda ejecutarla cuando haya cambios de alto impacto, como modificar el prompt del modelo, cambiar la versión del modelo o cambiar de familia de modelo
- Por ejemplo, al aplicar otro modelo a una app RAG (que busca documentos relacionados con la consulta y luego resume ese contenido), las métricas de seguridad pueden variar bastante
- En un ejemplo, al comparar el modelo GPT-4o con un modelo local Llama3.1:8b, se obtuvieron resultados como estos
- Hate/Unfairness: GPT-4o tuvo 100% y Llama3.1:8b 97.5% en “Low” o menos
- Sexual: GPT-4o tuvo 100% y Llama3.1:8b 100% en “Low” o menos
- Violence: GPT-4o tuvo 100% y Llama3.1:8b 99% en “Low” o menos
- Self-Harm: GPT-4o tuvo 100% y Llama3.1:8b 100% en “Low” o menos
- Si se detectan respuestas que no cumplen el criterio de seguridad en un escenario específico, hará falta más prompt engineering o integrar servicios externos como Azure AI Content Safety
Material adicional
- Learning module: Evaluating generative AI applications
- MS Learn Docs: How to generate synthetic and simulated data for evaluation
- MS Learn Docs: Local evaluation with the Azure AI Evaluation SDK
- Pull Request que agregó evaluación de seguridad a RAG with Azure AI Search
- Pull Request que agregó evaluación de seguridad a RAG with PostgreSQL
- También puedes consultar la documentación sobre simulación de ataques de jailbreak y las herramientas de evaluación adecuadas
Aún no hay comentarios.