Sdílet prostřednictvím


Jak spouštět hodnocení online pomocí sady Azure AI Foundry SDK

Důležité

Položky označené (Preview) v tomto článku jsou aktuálně ve verzi Public Preview. Tato verze Preview je poskytována bez smlouvy o úrovni služeb a nedoporučujeme ji pro produkční úlohy. Některé funkce se nemusí podporovat nebo mohou mít omezené možnosti. Další informace najdete v dodatečných podmínkách použití pro verze Preview v Microsoft Azure.

V tomto článku se dozvíte, jak s využitím sady Azure AI Foundry SDK průběžně spouštět hodnocení online. Vyhodnocení v předprodukčním prostředí je nezbytné pro zajištění bezpečnosti, výkonu a vytváření vysoce kvalitních výsledků vaší aplikace. Vyhodnocení se ale po nasazení aplikace nezastaví. V produkčním prostředí se můžou měnit různé věci, například typy dotazů, které uživatelé odesílají do vaší aplikace, což může ovlivnit výkon vaší aplikace. Pokud chcete zachovat vysoký stupeň pozorovatelnosti v produkční aplikaci AI, je důležité sledovat a průběžně vyhodnocovat data vaší aplikace. Díky tomu můžete zachovat důvěru v bezpečnost, kvalitu a výkon vaší aplikace.

Jak funguje online vyhodnocení

V této části se dozvíte, jak funguje online vyhodnocení, jak se integruje se službou Azure Monitor Application Insights a jak ho můžete použít ke spouštění průběžných vyhodnocování dat trasování z vašich aplikací generující umělé inteligence.

Po instrumentaci aplikace pro odesílání dat trasování do Application Insights nastavte plán online vyhodnocení, který bude tato data průběžně vyhodnocovat. Online vyhodnocení je služba, která používá výpočetní prostředky Azure AI k nepřetržitému spouštění konfigurovatelné sady vyhodnocovačů. Jakmile pomocí sady Azure AI Foundry SDK nastavíte plán online vyhodnocení, spustí se podle konfigurovatelného plánu. Při každém spuštění naplánované úlohy provede následující kroky:

  1. Dotazování dat trasování aplikace z připojeného prostředku Application Insights pomocí zadaného dotazu Kusto (KQL).
  2. Spusťte každý vyhodnocovač nad daty trasování a vypočítejte každou metriku (například uzemnění: 3).
  3. Napište hodnocení zpět do každého trasování pomocí standardizovaných sémantických konvencí.

Poznámka:

Online vyhodnocení podporuje stejné metriky jako azure AI Evaluation. Další informace o tom, jak funguje vyhodnocení a které metriky vyhodnocení se podporují, najdete v tématu Vyhodnocení aplikace Generative AI pomocí sady Azure AI Evaluation SDK.

Řekněme například, že máte nasazenou chatovací aplikaci, která denně dostává mnoho dotazů zákazníků. Chcete průběžně vyhodnocovat kvalitu odpovědí z vaší aplikace. Nastavíte plán online vyhodnocení s denním opakováním. Konfigurujete vyhodnocovače: Uzemnění, soudržnost a plynulost. Služba každý den vypočítá hodnocení těchto metrik a zapíše data zpět do Application Insights pro každé trasování, které se shromáždilo během časového intervalu opakování (v tomto příkladu za posledních 24 hodin). Data se pak dají dotazovat z každého trasování a zpřístupnit je v Azure AI Foundry a Azure Monitor Application Insights.

Výsledky vyhodnocení napsané zpět na každé trasování v Application Insights se řídí následujícími konvencemi. Do každého trasování pro každou metriku vyhodnocení se přidá jedinečné rozpětí:

Vlastnost Tabulka Application Insights Pole pro danou operation_ID Příklad hodnoty
Metrika vyhodnocení traces, AppTraces customDimensions[“event.name”] gen_ai.evaluation.relevance
Hodnocení skóre metriky traces, AppTraces customDimensions[“gen_ai.evaluation.score”] 3
Komentář k metrikě vyhodnocení (pokud je k dispozici) traces, AppTraces message {“comment”: “I like the response”}

Teď, když rozumíte tomu, jak funguje online vyhodnocení a jak se připojuje ke službě Azure Monitor Application Insights, je dalším krokem nastavení služby.

Nastavení online vyhodnocení

V této části se dozvíte, jak nakonfigurovat plán online vyhodnocení pro průběžné monitorování nasazené aplikace generující AI. Sada Azure AI Foundry SDK nabízí tyto funkce prostřednictvím. Rozhraní Python API a podporuje všechny funkce dostupné v místních vyhodnoceních. Pomocí následujících kroků odešlete plán online vyhodnocení dat pomocí předdefinovaných nebo vlastních vyhodnocovačů.

Poznámka:

Hodnocení jsou podporována pouze ve stejných oblastech jako metriky rizika a bezpečnosti s asistencí umělé inteligence.

Požadavky

Provedením následujících kroků požadavků nastavte prostředí a ověřování na nezbytné prostředky:

  1. Předplatné Azure.
  2. Skupina prostředků v oblasti podporované vyhodnocením
  3. Nová spravovaná identita přiřazená uživatelem ve stejné skupině prostředků a oblasti Poznamenejte si ho clientId. Budete ho potřebovat později.
  4. Centrum Azure AI ve stejné skupině prostředků a oblasti.
  5. Projekt Azure AI v tomto centru najdete v tématu Vytvoření projektu na portálu Azure AI Foundry.
  6. Prostředek Azure Monitor Application Insights
  7. Přejděte na stránku centra na webu Azure Portal a přidejte prostředek Application Insights, viz Aktualizace Aplikace Azure lication Insights a Azure Container Registry.
  8. Nasazení Azure OpenAI s podporou chat completionmodelu GPT , například gpt-4.
  9. Connection String pro projekt Azure AI pro snadné vytvoření AIProjectClient objektu. Project připojovací řetězec můžete získat na stránce Přehled projektu v části Podrobnosti projektu.
  10. Na webu Azure Portal přejděte k prostředku Application Insights a pomocí karty Řízení přístupu (IAM) přidejte Log Analytics Contributor roli do spravované identity přiřazené uživatelem, kterou jste vytvořili dříve.
  11. Připojte spravovanou identitu přiřazenou uživatelem k projektu.
  12. Na webu Azure Portal přejděte ke službám Azure AI a pomocí karty Řízení přístupu (IAM) přidejte Cognitive Services OpenAI Contributor roli do spravované identity přiřazené uživatelem, kterou jste vytvořili dříve.

Pokyny k instalaci

Instalace Azure CLI a přihlášení

Nainstalujete Azure CLI a přihlásíte se z místního vývojového prostředí, abyste mohli pomocí přihlašovacích údajů uživatele volat službu Azure OpenAI.

Ve většině případů můžete Azure CLI nainstalovat z terminálu pomocí následujícího příkazu:

winget install -e --id Microsoft.AzureCLI

Pokud tyto příkazy nefungují pro konkrétní operační systém nebo nastavení, můžete postupovat podle pokynů , jak nainstalovat Azure CLI .

Po instalaci Azure CLI se přihlaste pomocí az login příkazu a přihlaste se pomocí prohlížeče:

az login

Alternativně se můžete přihlásit ručně pomocí prohlížeče pomocí kódu zařízení.

az login --use-device-code

Vytvoření nového prostředí Pythonu

Nejprve musíte vytvořit nové prostředí Pythonu, které se použije k instalaci balíčku, který potřebujete pro účely tohoto kurzu. Neinstalujte balíčky do globální instalace Pythonu. Při instalaci balíčků Pythonu byste měli vždy používat virtuální prostředí nebo prostředí Conda, jinak můžete přerušit globální instalaci Pythonu.

V případě potřeby nainstalujte Python.

Doporučujeme používat Python 3.10 nebo novější, ale vyžaduje se aspoň Python 3.8. Pokud nemáte nainstalovanou vhodnou verzi Pythonu, můžete postupovat podle pokynů v kurzu VS Code Python pro nejjednodušší způsob instalace Pythonu do operačního systému.

Vytvoříte virtuální prostředí.

Pokud už máte nainstalovaný Python 3.10 nebo novější, můžete vytvořit virtuální prostředí pomocí následujících příkazů:

py -3 -m venv .venv
.venv\scripts\activate

Aktivace prostředí Python znamená, že při spuštění python nebo pip z příkazového řádku pak použijete interpret Pythonu obsažený ve .venv složce vaší aplikace.

Poznámka:

Pomocí příkazu můžete deactivate ukončit virtuální prostředí Pythonu a později ho v případě potřeby znovu aktivovat.

Můžete také vytvořit nové prostředí Pythonu pomocí conda:

conda create -n online-evaluation
conda activate online-evaluation

Nainstalujte požadované balíčky:

pip install azure-identity azure-ai-projects azure-ai-ml

Tip

Volitelně můžete použít pip install azure-ai-evaluation , pokud chcete, aby prostředí prvního kódu načítá ID vyhodnocovače pro předdefinované vyhodnocovače v kódu. Informace o tom, jak to provést, najdete v tématu Určení vyhodnocovačů z knihovny vyhodnocovačů.

Nastavení trasování pro generující aplikaci AI

Před nastavením online vyhodnocení se ujistěte, že jste nejprve nastavili trasování pro svoji aplikaci generující AI.

Použití názvu služby v datech trasování

K identifikaci aplikace prostřednictvím jedinečného ID v Application Insights můžete ve svých trasovacích datech použít vlastnost OpenTelemetry s názvem služby. To je zvlášť užitečné, pokud protokolujete data z více aplikací do stejného prostředku Application Insights a chcete mezi nimi rozlišovat. Řekněme například, že máte dvě aplikace: App-1 a App-2 s trasováním nakonfigurovaným pro protokolování dat do stejného prostředku Application Insights. Možná byste chtěli nastavit , aby se aplikace App-1 vyhodnocovala nepřetržitě podle relevance a app-2 , aby se vyhodnocovala nepřetržitě podle zemnění. Název služby můžete použít k rozlišení aplikací v konfiguracích online vyhodnocení.

Pokud chcete nastavit vlastnost názvu služby, můžete to provést přímo v kódu aplikace pomocí kroků, viz Použití více zprostředkovatelů trasování s jiným prostředkem. Případně můžete proměnnou OTEL_SERVICE_NAME prostředí nastavit před nasazením aplikace. Další informace o práci s názvem služby najdete v tématu Proměnné prostředí OTEL a sémantické konvence prostředků služby.

Další informace o použití názvu služby k rozlišení mezi generujícími aplikacemi AI najdete v tématu trasování.

Dotazování uložených dat trasování v Application Insights

Pomocí dotazovací jazyk Kusto (KQL) můžete dotazovat data trasování generující aplikace AI z Application Insights, která se použijí k průběžnému online hodnocení. Pokud k trasování aplikace generující AI použijete balíček Azure AI Tracing, můžete použít následující dotaz Kusto:

Důležité

Dotaz KQL používaný službou pro online vyhodnocení musí vypíše následující sloupce: operation_Id, operation_ParentIda gen_ai_response_id. Každý vyhodnocovací objekt má navíc vlastní požadavky na vstupní data. Dotaz KQL musí vypíše tyto sloupce, které se použijí jako vstupy do samotných vyhodnocovačů. Seznampožadavkůch

let gen_ai_spans = (
    dependencies
    | where isnotnull(customDimensions["gen_ai.system"])
    | extend response_id = tostring(customDimensions["gen_ai.response.id"])
    | project id, operation_Id, operation_ParentId, timestamp, response_id
);
let gen_ai_events = (
    traces
    | where message in ("gen_ai.choice", "gen_ai.user.message", "gen_ai.system.message")
        or tostring(customDimensions["event.name"]) in ("gen_ai.choice", "gen_ai.user.message", "gen_ai.system.message")
    | project 
        id = operation_ParentId, 
        operation_Id, 
        operation_ParentId, 
        user_input = iff(
            message == "gen_ai.user.message" or tostring(customDimensions["event.name"]) == "gen_ai.user.message", 
            parse_json(iff(message == "gen_ai.user.message", tostring(customDimensions["gen_ai.event.content"]), message)).content, 
            ""
        ), 
        system = iff(
            message == "gen_ai.system.message" or tostring(customDimensions["event.name"]) == "gen_ai.system.message", 
            parse_json(iff(message == "gen_ai.system.message", tostring(customDimensions["gen_ai.event.content"]), message)).content, 
            ""
        ), 
        llm_response = iff(
            message == "gen_ai.choice", 
            parse_json(tostring(parse_json(tostring(customDimensions["gen_ai.event.content"])).message)).content, 
            iff(tostring(customDimensions["event.name"]) == "gen_ai.choice", parse_json(parse_json(message).message).content, "")
        )
    | summarize 
        operation_ParentId = any(operation_ParentId), 
        Input = maxif(user_input, user_input != ""), 
        System = maxif(system, system != ""), 
        Output = maxif(llm_response, llm_response != "") 
    by operation_Id, id
);
gen_ai_spans
| join kind=inner (gen_ai_events) on id, operation_Id
| project Input, System, Output, operation_Id, operation_ParentId, gen_ai_response_id = response_id

Pokud k nastavení názvu služby používáte OTEL_SERVICE_NAME proměnnou prostředí ve generační aplikaci AI, můžete dotazovat v cloud_RoleName rámci plánu online vyhodnocení přidáním následujícího řádku do dotazu Kusto (KQL):

| where cloud_RoleName == "service_name"

Volitelně můžete použít ukázkový operátor nebo operátor vzít v dotazu Kusto tak, aby vracel pouze podmnožinu trasování. Vzhledem k tomu, že hodnocení s asistencí AI můžou být nákladná ve velkém, může vám tento přístup pomoct řídit náklady pouze vyhodnocením náhodného vzorku (nebo n trasování) dat.

Nastavení online vyhodnocení pomocí sady Azure AI Project SDK

Naplánovanou online úlohu vyhodnocení můžete odeslat pomocí sady Azure AI Project SDK prostřednictvím rozhraní Python API. V následujícím skriptu se dozvíte, jak nastavit online hodnocení pomocí vyhodnocovačů výkonu a kvality (asistované umělé inteligence). Pokud chcete zobrazit úplný seznam podporovaných vyhodnocovačů, přečtěte si téma Vyhodnocení pomocí sady Azure AI Evaluation SDK. Pokud chcete zjistit, jak používat vlastní vyhodnocovače, podívejte se na vlastní vyhodnocovače.

Začněte importem požadovaných balíčků a konfigurací požadovaných proměnných:

from azure.ai.projects import AIProjectClient 
from azure.identity import DefaultAzureCredential 
from azure.ai.projects.models import ( 
    ApplicationInsightsConfiguration,
    EvaluatorConfiguration,
    EvaluationSchedule,
    RecurrenceTrigger,
)
from azure.ai.evaluation import CoherenceEvaluator 

# This sample includes the setup for an online evaluation schedule using the Azure AI Project SDK and Azure AI Evaluation SDK
# The schedule is configured to run daily over the collected trace data while running two evaluators: CoherenceEvaluator and RelevanceEvaluator
# This sample can be modified to fit your application's requirements

# Name of your online evaluation schedule
SAMPLE_NAME = "online_eval_name"

# Connection string to your Azure AI Foundry project
# Currently, it should be in the format "<HostName>;<AzureSubscriptionId>;<ResourceGroup>;<HubName>"
PROJECT_CONNECTION_STRING = "<HostName>;<AzureSubscriptionId>;<ResourceGroup>;<HubName>"

# Your Application Insights resource ID
APPLICATION_INSIGHTS_RESOURCE_ID = "appinsights_resource_id"

# Kusto Query Language (KQL) query to query data from Application Insights resource
# This query is compatible with data logged by the Azure AI Inferencing Tracing SDK (linked in documentation)
# You can modify it depending on your data schema
# The KQL query must output these required columns: operation_ID, operation_ParentID, and gen_ai_response_id
# You can choose which other columns to output as required by the evaluators you are using
KUSTO_QUERY = "let gen_ai_spans=(dependencies | where isnotnull(customDimensions[\"gen_ai.system\"]) | extend response_id = tostring(customDimensions[\"gen_ai.response.id\"]) | project id, operation_Id, operation_ParentId, timestamp, response_id); let gen_ai_events=(traces | where message in (\"gen_ai.choice\", \"gen_ai.user.message\", \"gen_ai.system.message\") or tostring(customDimensions[\"event.name\"]) in (\"gen_ai.choice\", \"gen_ai.user.message\", \"gen_ai.system.message\") | project id= operation_ParentId, operation_Id, operation_ParentId, user_input = iff(message == \"gen_ai.user.message\" or tostring(customDimensions[\"event.name\"]) == \"gen_ai.user.message\", parse_json(iff(message == \"gen_ai.user.message\", tostring(customDimensions[\"gen_ai.event.content\"]), message)).content, \"\"), system = iff(message == \"gen_ai.system.message\" or tostring(customDimensions[\"event.name\"]) == \"gen_ai.system.message\", parse_json(iff(message == \"gen_ai.system.message\", tostring(customDimensions[\"gen_ai.event.content\"]), message)).content, \"\"), llm_response = iff(message == \"gen_ai.choice\", parse_json(tostring(parse_json(tostring(customDimensions[\"gen_ai.event.content\"])).message)).content, iff(tostring(customDimensions[\"event.name\"]) == \"gen_ai.choice\", parse_json(parse_json(message).message).content, \"\")) | summarize operation_ParentId = any(operation_ParentId), Input = maxif(user_input, user_input != \"\"), System = maxif(system, system != \"\"), Output = maxif(llm_response, llm_response != \"\") by operation_Id, id); gen_ai_spans | join kind=inner (gen_ai_events) on id, operation_Id | project Input, System, Output, operation_Id, operation_ParentId, gen_ai_response_id = response_id"

Dále definujte klienta a nasazení Azure OpenAI GPT (například GPT-4), které se použije ke spuštění plánu online vyhodnocení. Připojte se také k prostředku Application Insights:

# Connect to your Azure AI Foundry Project
project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=PROJECT_CONNECTION_STRING
)

# Connect to your Application Insights resource 
app_insights_config = ApplicationInsightsConfiguration(
    resource_id=APPLICATION_INSIGHTS_RESOURCE_ID,
    query=KUSTO_QUERY
)

# Connect to your Azure OpenAI Service resource. You must use a GPT model deployment for this example.
deployment_name = "gpt-4"
api_version = "2024-08-01-preview"

# This is your Azure OpenAI Service connection name, which can be found in your Azure AI Foundry project under the 'Models + Endpoints' tab.
default_connection = project_client.connections._get_connection(
    "aoai_connection_name"
)

model_config = {
    "azure_deployment": deployment_name,
    "api_version": api_version,
    "type": "azure_openai",
    "azure_endpoint": default_connection.properties["target"]
}

Dále nakonfigurujte vyhodnocovače, které chcete použít:

# RelevanceEvaluator
# id for each evaluator can be found in your Azure AI Foundry registry - please see documentation for more information
# init_params is the configuration for the model to use to perform the evaluation
# data_mapping is used to map the output columns of your query to the names required by the evaluator
relevance_evaluator_config = EvaluatorConfiguration(
    id="azureml://registries/azureml-staging/models/Relevance-Evaluator/versions/4",
    init_params={"model_config": model_config},
    data_mapping={"query": "${data.Input}", "response": "${data.Output}"}
)

# CoherenceEvaluator
coherence_evaluator_config = EvaluatorConfiguration(
    id=CoherenceEvaluator.id,
    init_params={"model_config": model_config},
    data_mapping={"query": "${data.Input}", "response": "${data.Output}"}
)

Nakonec definujte opakování a vytvořte plán:

Poznámka: V požadovaných krocích jste vytvořili spravovanou identitu přiřazenou uživatelem, abyste ověřili plán online vyhodnocení vašeho prostředku Application Insights. properties EvaluationSchedule Parametr AzureMSIClientId třídy je clientId tato identita.

# Frequency to run the schedule
recurrence_trigger = RecurrenceTrigger(frequency="day", interval=1)

# Dictionary of evaluators
evaluators = {
    "relevance": relevance_evaluator_config,
    "coherence" : coherence_evaluator_config
}

name = SAMPLE_NAME
description = f"{SAMPLE_NAME} description"
# AzureMSIClientId is the clientID of the User-assigned managed identity created during set-up - see documentation for how to find it
properties = {"AzureMSIClientId": "your_client_id"}

# Configure the online evaluation schedule
evaluation_schedule = EvaluationSchedule(
    data=app_insights_config,
    evaluators=evaluators,
    trigger=recurrence_trigger,
    description=description,
    properties=properties)

# Create the online evaluation schedule 
created_evaluation_schedule = project_client.evaluations.create_or_replace_schedule(name, evaluation_schedule)
print(f"Successfully submitted the online evaluation schedule creation request - {created_evaluation_schedule.name}, currently in {created_evaluation_schedule.provisioning_state} state.")

Provádění operací podle plánu online vyhodnocení

Plány online vyhodnocení můžete získat, vypsat a zakázat přidáním následujícího kódu do konfiguračního skriptu pro online vyhodnocení:

Upozornění: Počkejte prosím malou dobu (přibližně 30 sekund) mezi vytvořením plánu online vyhodnocení a spuštěním get_schedule() rozhraní API.

Získejte plán online vyhodnocení:

name = "<my-online-evaluation-name>"
get_evaluation_schedule = project_client.evaluations.get_schedule(name)

Zobrazit seznam všech plánů online vyhodnocení:

count = 0
for evaluation_schedule in project_client.evaluations.list_schedule():
    count += 1
        print(f"{count}. {evaluation_schedule.name} "
        f"[IsEnabled: {evaluation_schedule.is_enabled}]")
        print(f"Total evaluation schedules: {count}")

Zakázat (obnovitelné odstranění) plánu online vyhodnocení:

name = "<my-online-evaluation-name>"
project_client.evaluations.disable_schedule(name)