View a markdown version of this page

Commencer à utiliser l'évaluation à la demande - Amazon Bedrock AgentCore

Commencer à utiliser l'évaluation à la demande

Suivez ces étapes pour configurer et exécuter votre première évaluation à la demande.

Conditions préalables

Pour utiliser les fonctionnalités OnDemand d'évaluation des AgentCore évaluations, vous devez :

  • AWS Compte doté des autorisations IAM appropriées

  • Accès à Amazon Bedrock avec les autorisations d'invocation du modèle

  • Recherche de transactions activée dans CloudWatch - voir Activer la recherche de transactions

  • Python 3.10 ou version ultérieure installé

  • La OpenTelemetry bibliothèque — Incluez aws-opentelemetry-distro (ADOT) dans votre fichier requirements.txt

Cadres pris en charge

AgentCore Les évaluations prennent actuellement en charge les cadres agentiques et les bibliothèques d'instruments suivants :

  • Agents à mèches

  • LangGraph configuré avec l'une des bibliothèques d'instrumentation suivantes :

    • opentelemetry-instrumentation-langchain

    • openinference-instrumentation-langchain

Étape 1 : créer et déployer votre agent

Note

Si un agent est déjà opérationnel dans AgentCore Runtime, vous pouvez passer directement à l'étape 2

Créez et déployez votre agent en suivant le guide de démarrage pour AgentCore Runtime. Vous trouverez des exemples supplémentaires dans les exemples d'AgentCore évaluations.

Étape 2 : Invoquez votre agent

Appelez votre agent à l'aide de la commande suivante et consultez les traces, les sessions et les métriques sur le tableau de bord GenAI Observability sur. CloudWatch

Exemple invoke_agent.py

import boto3 import json import uuid region = "region-code" ace_demo_agent_arn = "agent-arn from step-2" agent_core_client = boto3.client('bedrock-agentcore', region_name=region) text_to_analyze = "Sample text to test agent for agentcore evaluations demo" payload = json.dumps({ "prompt": f"Can you analyze this text and tell me about its statistics: {text_to_analyze}" }) # random session-id, you can set your own here session_id = "test-ace-demo-session-18a1dba0-62a0-462g" response = agent_core_client.invoke_agent_runtime( agentRuntimeArn=ace_demo_agent_arn, runtimeSessionId=session_id, payload=payload, qualifier="DEFAULT" ) response_body = response['response'].read() response_data = json.loads(response_body) print("Agent Response:", response_data) print("SessionId:", session_id)

Étape 3 : Evaluer l'agent

Une fois que vous avez fait quelques invocations à votre agent, vous êtes prêt à l'évaluer. Pour les évaluations, nous avons besoin de :

  • EvaluatorId: il peut s'agir de l'identifiant d'un évaluateur intégré ou d'un évaluateur créé sur mesure

  • SessionSpans: les spans sont les blocs de télémétrie émis lorsque vous interagissez avec une application. Dans notre exemple, l'application est un agent hébergé sur AgentCore Runtime.

    • Pour une évaluation à la demande, nous devons télécharger les étendues à partir des groupes de CloudWatch journaux et les utiliser pour l'évaluation.

    • AgentCore La CLI le fait automatiquement pour vous et est la plus simple à utiliser.

    • Si vous n'utilisez pas la AgentCore CLI, nous vous montrerons comment télécharger les journaux à l'aide de l'identifiant de session et les utiliser à des fins d'évaluation à l'aide du SDK. AWS

Exemples de code pour la AgentCore CLI et le AgentCore SDK

Les exemples de code suivants montrent comment exécuter des évaluations à la demande en utilisant différentes approches de développement. Choisissez la méthode qui correspond le mieux à votre environnement de développement et à vos préférences.

Exemple
AgentCore CLI
  1. # Runs evaluation for the specified runtime and session. # It auto queries cloudwatch logs and orchestrates evaluation over multiple evaluators. RUNTIME_NAME="your_runtime_name" SESSION_ID="YOUR_SESSION_ID" agentcore run eval \ --runtime $RUNTIME_NAME \ --session-id $SESSION_ID \ --evaluator "Builtin.Helpfulness" \ --evaluator "Builtin.GoalSuccessRate" # Auto reads default runtime from current project config if available # Verify using ```agentcore status``` agentcore run eval \ --evaluator "Builtin.Helpfulness" \ --evaluator "Builtin.GoalSuccessRate"

    Les résultats sont enregistrés localement et peuvent être revus ultérieurement avecagentcore evals history. En mode interactif, la CLI découvre automatiquement les sessions récentes depuis CloudWatch  : vous n'avez pas besoin de connaître les identifiants de session à l'avance.

    Note

    Exécutez-le depuis un répertoire de AgentCore projet (créé avecagentcore create). Le --agent-arn drapeau peut être utilisé en dehors d'un répertoire de projet.

Interactive
  1. Exécutez agentcore pour ouvrir le TUI, puis sélectionnez Exécuter et choisissez On-demand Evaluation :

  2. Sélectionnez les évaluateurs à exécuter sur les traces des agents :

    On-demand évaluation : sélectionner les évaluateurs
  3. Vérifiez la configuration et appuyez sur Entrée pour confirmer :

    On-demand évaluation : révision de la configuration
AgentCore SDK
  1. from bedrock_agentcore_starter_toolkit import Evaluation # Initialize the evaluation client eval_client = Evaluation() # Run evaluation on a specific session results = eval_client.run( agent_id="YOUR_AGENT_ID", # Replace with your agent ID session_id="YOUR_SESSION_ID", # Replace with your session ID evaluators=["Builtin.Helpfulness", "Builtin.GoalSuccessRate"] ) # Display results successful = results.get_successful_results() failed = results.get_failed_results() print(f" Successful: {len(successful)}") print(f" Failed: {len(failed)}") if successful: result = successful[0] print("\n📊 Result:") print(f" Evaluator: {result.evaluator_name}") print(f" Score: {result.value:.2f}") print(f" Label: {result.label}") if result.explanation: print(f" Explanation: {result.explanation[:150]}...")

AWS Kit SDK

Téléchargez les span-logs depuis CloudWatch

Avant d'appeler l'EvaluateAPI, vous devez télécharger les journaux d'extension depuis CloudWatch. Pour ce faire, vous pouvez utiliser le code Python ci-dessous et éventuellement les enregistrer dans un fichier JSON. Il est ainsi plus facile de faire la demande pour la même session auprès de différents évaluateurs.

Note

Le remplissage des journaux prend quelques minutes. Il est donc possible que si vous essayez d'exécuter le script ci-dessous « immédiatement » après l'appel de l'agent, les journaux soient vides ou incomplets CloudWatch

import boto3 import time import json from datetime import datetime, timedelta region = "region-code" agent_id = "agent-id-from-step-2" session_id = "session-id-from-step-3" def query_logs(log_group_name, query_string): client = boto3.client('logs', region_name=region) start_time = datetime.now() - timedelta(minutes=60) # past 1 hour end_time = datetime.now() query_id = client.start_query( logGroupName=log_group_name, startTime=int(start_time.timestamp()), endTime=int(end_time.timestamp()), queryString=query_string )['queryId'] while (result := client.get_query_results(queryId=query_id))['status'] not in ['Complete', 'Failed']: time.sleep(1) if result['status'] == 'Failed': raise Exception("Query failed") return result['results'] def query_session_logs(log_group_name, session_id, **kwargs): query = f"""fields @timestamp, @message | filter ispresent(scope.name) and ispresent(attributes.session.id) | filter attributes.session.id = "{session_id}" | sort @timestamp asc""" return query_logs(log_group_name, query, **kwargs) def query_agent_runtime_logs(agent_id, endpoint, session_id, **kwargs): return query_session_logs( f"/aws/bedrock-agentcore/runtimes/{agent_id}-{endpoint}", session_id, **kwargs) def query_aws_spans_logs(session_id, **kwargs): return query_session_logs("aws/spans", session_id, **kwargs) def extract_messages_as_json(query_results): return [json.loads(f['value']) for row in query_results for f in row if f['field'] == '@message' and f['value'].strip().startswith('{')] def get_session_span_logs(): agent_runtime_logs = query_agent_runtime_logs( agent_id=agent_id, endpoint="DEFAULT", session_id=session_id ) print(f"Downloaded {len(agent_runtime_logs)} runtime-log entries") aws_span_logs = query_aws_spans_logs(session_id=session_id) print(f"Downloaded {len(aws_span_logs)} aws/span entries") session_span_logs = extract_messages_as_json(aws_span_logs) + extract_messages_as_json(agent_runtime_logs) print(f"Returning {len(aws_span_logs) + len(agent_runtime_logs)} total records") return session_span_logs # get the spans from cloudwatch session_span_logs = get_session_span_logs() # optional (dump in a json file for reuse) session_span_logs_file_name = "ace-demo-session.json" with open(session_span_logs_file_name, "w") as f: json.dump(session_span_logs, f, indent=2)

Appelez Evaluate

Une fois que vous avez les plages d'entrée, vous pouvez appeler l'EvaluateAPI. Veuillez noter que les réponses peuvent prendre quelques instants, car un grand modèle linguistique marque vos traces.

# initialise client ace_dp_client = boto3.client('bedrock-agentcore', region_name = region) # call evaluate response = ace_dp_client.evaluate( evaluatorId = "Builtin.Helpfulness", # can be a custom evaluator id as well evaluationInput = {"sessionSpans": session_span_logs}) print(response["evaluationResults"])

Si vous utilisez ci-dessus et que vous enregistrez les durées de session dans un fichier json, vous pouvez également exécuter ensuite evaluate comme ci-dessous

with open(session_span_logs_file_name, "r") as f: session_span_logs = json.load(f) # initialise client ace_dp_client = boto3.client('bedrock-agentcore', region_name = region) # call evaluate response = ace_dp_client.evaluate( evaluatorId = "Builtin.ToolSelectionAccuracy", # can be a custom evaluator id as well evaluationInput = {"sessionSpans": session_span_logs}) print(response["evaluationResults"])

Utilisation des cibles d'évaluation

Pour évaluer une trace ou un outil spécifique au cours d'une session, vous pouvez spécifier la cible à l'aide du evaluationTarget paramètre de votre demande.

Session-level évaluateur

Comme le service ne prend en charge qu'une seule session par évaluation, il n'est pas nécessaire de définir explicitement l'objectif d'évaluation.

Trace-level évaluateur

Pour les évaluateurs au niveau de la trace (tels que Builtin.Helpfulness ouBuiltin.Correctness), définissez les ID de trace dans le paramètre : evaluationTarget

response = ace_dp_client.evaluate( evaluatorId = "Builtin.Helpfulness", evaluationInput = {"sessionSpans": session_span_logs}, evaluationTarget = {"traceIds": ["trace-id-1", "trace-id-2"]} )
Outil : évaluateur du niveau d'appel

Pour les évaluateurs au niveau de la plage (tels queBuiltin.ToolSelectionAccuracy), définissez les ID d'étendue dans le paramètre : evaluationTarget

response = ace_dp_client.evaluate( evaluatorId = "Builtin.ToolSelectionAccuracy", evaluationInput = {"sessionSpans": session_span_logs}, evaluationTarget = {"spanIds": ["span-id-1", "span-id-2"]} )

Étape 4 : Résultats de l'évaluation

Chaque appel Evaluate d'API renvoie une réponse contenant une liste des résultats de l'évaluateur. Comme une seule session peut inclure plusieurs traces et appels d'outils, ces éléments sont évalués en tant qu'entités distinctes. Par conséquent, un seul appel d'API peut renvoyer plusieurs résultats d'évaluation.

{ "evaluationResults": [ {evaluation-result-1}, {evaluation-result_2},.... ] }

Limite de résultats

Le nombre d'évaluations renvoyées par appel d'API est limité à 10 résultats. Par exemple, si vous évaluez une session contenant 15 traces à l'aide d'un évaluateur au niveau des traces, la réponse inclut un maximum de 10 résultats. Par défaut, l'API renvoie les 10 dernières évaluations, car celles-ci contiennent généralement le contexte le plus pertinent pour la qualité des évaluations.

Défaillances partielles

Un appel d'API peut traiter n évaluations alors que m d'entre elles échouent. Les défaillances peuvent survenir pour diverses raisons, notamment :

  • Limitation de la part des fournisseurs de modèles

  • Erreurs d'analyse

  • Temporisation du modèle

  • Autres problèmes de traitement

En cas d'échec partiel, la réponse inclut à la fois des évaluations réussies et des évaluations infructueuses. Les résultats d'échec incluent un code d'erreur et un message d'erreur pour vous aider à diagnostiquer le problème.

Contexte de Span

Chaque résultat de l'évaluateur comporte un spanContext champ qui identifie l'entité évaluée :

  • Pour les évaluateurs au niveau de la session, seul est présent. sessionId

  • Pour les évaluateurs au niveau de la trace, sessionId et traceId sont présents.

  • Pour les évaluateurs au niveau des outils, sessionIdtraceId, et spanId sont présents.

Exemple de saisie de résultats réussie

Il ne s'agit que d'une entrée. Si une session comporte plusieurs traces, vous verrez plusieurs entrées de ce type, une pour chaque trace. De même, pour les évaluateurs au niveau de l'outil, s'il y a plusieurs appels d'outils et qu'un évaluateur d'outil (tel queBuiltin.ToolSelectionAccuracy) est fourni, il y aura un résultat par plage d'outils.

{ "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", "evaluatorId": "Builtin.Helpfulness", "evaluatorName": "Builtin.Helpfulness", "explanation": ".... evaluation explanation will be added here ...", "context": { "spanContext": { "sessionId": "test-ace-demo-session-18a1dba0-62a0-462e", "traceId": "....trace_id......." } }, "value": 0.83, "label": "Very Helpful", "tokenUsage": { "inputTokens": 958, "outputTokens": 211, "totalTokens": 1169 } }

Exemple d'échec de la saisie des résultats

{ "evaluatorArn": "arn:aws:bedrock-agentcore:::evaluator/Builtin.Helpfulness", "evaluatorId": "Builtin.Helpfulness", "evaluatorName": "Builtin.Helpfulness", "context": { "spanContext": { "sessionId": "test-ace-demo-session-18a1dba0-62a0-462e", "traceId": "....trace_id......." } }, "errorMessage": ".... details of the error....", "errorCode": ".... name/code of the error...." }