Bewerten mit dem Prompt flow-SDK
Wichtig
Einige der in diesem Artikel beschriebenen Features sind möglicherweise nur in der Vorschau verfügbar. Diese Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt und sollte nicht für Produktionsworkloads verwendet werden. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.
Um die Leistung Ihrer generativen KI-Anwendung bei Anwendung auf ein wesentliches Dataset genau zu bewerten, können Sie das Prompt flow-SDK in Ihrer Entwicklungsumgebung verwenden. Aufgrund eines Test-Datasets oder Ziels werden die generierten Ergebnisse Ihrer generativen KI-Anwendung quantitativ gemessen, sowohl mit mathematisch-basierten Metriken als auch mit KI-unterstützten Qualitäts- und Sicherheitsbewertungen. Integrierte oder benutzerdefinierte Bewertungen bieten Ihnen umfassende Erkenntnisse in die Funktionen und Einschränkungen der Anwendung.
In diesem Artikel erfahren Sie, wie Sie Auswertungen für eine einzelne Datenzeile oder ein größeres Test-Dataset für ein Anwendungsziel mit integrierten Auswertungen mithilfe des Prompt flow-SDK ausführen, und dann die Ergebnisse und Auswertungsprotokolle in Azure KI Studio verfolgen.
Erste Schritte
Installieren Sie zuerst das Bewertungspaket aus dem Prompt flow-SDK:
pip install promptflow-evals
Integrierte Bewertungen
Integrierte Bewertungen unterstützen die folgenden Anwendungsszenarien:
- Frage und Antwort: Dieses Szenario wurde für Anwendungen entwickelt, die das Senden in Abfragen und das Generieren von Antworten umfassen.
- Chat: Dieses Szenario eignet sich für Anwendungen, in denen das Modell anhand des Retrieval Augmented-Ansatz Unterhaltungen führt und Informationen aus Ihren bereitgestellten Dokumenten zu extrahieren und detaillierte Antworten zu generieren.
Ausführlichere Informationen zu den einzelnen Bewertungsdefinitionen und deren Berechnung finden Sie hier.
Kategorie | Bewertungsklasse |
---|---|
Leistung und Qualität | GroundednessEvaluator , RelevanceEvaluator , CoherenceEvaluator , FluencyEvaluator , SimilarityEvaluator , F1ScoreEvaluator |
Risiko und Sicherheit | ViolenceEvaluator , SexualEvaluator , SelfHarmEvaluator , HateUnfairnessEvaluator |
Zusammengesetzt | QAEvaluator , ChatEvaluator , ContentSafetyEvaluator , ContentSafetyChatEvaluator |
Beide Kategorien von integrierten Qualitäts- und Sicherheitsmetriken nehmen Frage- und Antwortpaare zusammen mit zusätzlichen Informationen für bestimmte Bewertungen auf.
Integrierte zusammengesetzte Bewertungen bestehen aus einzelnen Bewertungen.
QAEvaluator
kombiniert alle Qualitätsbewertungen für eine einzige Ausgabe kombinierter Metriken für Frage- und Antwortpaare.ChatEvaluator
kombiniert alle Qualitätsbewertungen für eine einzige Ausgabe kombinierter Metriken für Chatnachrichten nach dem OpenAI-Nachrichtenprotokoll, das hier zu finden ist. Zusätzlich zu allen Qualitätsbewertungen unterstützen wir auch den Abrufscore. Der Abrufscore wird derzeit nicht als eigenständige Bewertungsklasse unterstützt.ContentSafetyEvaluator
kombiniert alle Sicherheitsbewertungen für eine einzige Ausgabe kombinierter Metriken für Frage- und Antwortpaare.ContentSafetyChatEvaluator
kombiniert alle Sicherheitsbewertungen für eine einzige Ausgabe kombinierter Metriken für Chatnachrichten nach dem OpenAI-Nachrichtenprotokoll, das hier zu finden ist.
Erforderliche Dateneingabe für integrierte Bewertungen
Benötigt werden Frage- und Antwortpaare im .jsonl
-Format mit den erforderlichen Eingaben und eine Spaltenzuordnung für die Auswertung von Datasets wie folgt:
Auswerter | question |
answer |
context |
ground_truth |
---|---|---|---|---|
GroundednessEvaluator |
N/V | Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | N/V |
RelevanceEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | N/V |
CoherenceEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
FluencyEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
SimilarityEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | N/V | Erforderlich: Zeichenfolge |
F1ScoreEvaluator |
N/V | Erforderlich: Zeichenfolge | N/V | Erforderlich: Zeichenfolge |
ViolenceEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
SexualEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
SelfHarmEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
HateUnfairnessEvaluator |
Erforderlich: Zeichenfolge | Erforderlich: Zeichenfolge | – | – |
- Frage: die an die generative KI-Anwendung gesendete Frage
- Antwort: die Antwort auf die Abfrage, die von der generativen KI-Anwendung generiert wird
- Kontext: die Quelle, in Bezug auf die die Antwort erzeugt wird (d. h. die Basisdokumente)
- Grundwahrheit: die Antwort auf die Frage, die vom Benutzer/Menschen als die wahre Antwort generiert wurde
Leistungs- und Qualitätsbewertungen
Wenn Sie KI-unterstützte Leistungs- und Qualitätsmetriken verwenden, müssen Sie ein GPT-Modell für den Berechnungsprozess angeben. Wählen Sie eine Bereitstellung mit GPT-3.5, GPT-4 oder dem Davinci-Modell für Ihre Berechnungen aus, und legen Sie es als model_config
fest.
Hinweis
Wir empfehlen die Verwendung von GPT-Modellen, die nicht über das Suffix (preview)
verfügen, um die beste Leistung und analysierbare Antworten mit unseren Bewertungen zu erzielen.
Sie können die integrierten Bewertungen ausführen, indem Sie die gewünschte Bewertungsklasse importieren. Stellen Sie sicher, dass Sie die Umgebungsvariablen festlegen.
import os
from promptflow.core import AzureOpenAIModelConfiguration
# Initialize Azure OpenAI Connection with your environment variables
model_config = AzureOpenAIModelConfiguration(
azure_endpoint=os.environ.get("AZURE_OPENAI_ENDPOINT"),
api_key=os.environ.get("AZURE_OPENAI_API_KEY"),
azure_deployment=os.environ.get("AZURE_OPENAI_DEPLOYMENT"),
api_version=os.environ.get("AZURE_OPENAI_API_VERSION"),
)
from promptflow.evals.evaluators import RelevanceEvaluator
# Initialzing Relevance Evaluator
relevance_eval = RelevanceEvaluator(model_config)
# Running Relevance Evaluator on single input row
relevance_score = relevance_eval(
answer="The Alpine Explorer Tent is the most waterproof.",
context="From the our product list,"
" the alpine explorer tent is the most waterproof."
" The Adventure Dining Table has higher weight.",
question="Which tent is the most waterproof?",
)
print(relevance_score)
Im Folgenden sehen Sie ein Beispielergebnis:
{'relevance.gpt_relevance': 5.0}
Risiko- und Sicherheitsbewertungen
Wenn Sie KI-unterstützte Risiko- und Sicherheitsmetriken verwenden, ist kein GPT-Modell erforderlich. Statt model_config
geben Sie Ihre azure_ai_project
-Informationen an. Dies greift auf den Back-End-Dienst für Sicherheitsbewertungen von Azure KI Studio zu, der ein GPT-4-Modell bereitstellt, das Scores für den Schweregrad des Inhaltsrisikos und Argumente generieren kann, die Ihre Sicherheitsbewertungen unterstützen.
Hinweis
Derzeit sind KI-unterstützte Risiko- und Sicherheitsmetriken nur in den folgenden Regionen verfügbar: USA, Osten 2, Frankreich, Mitte, Vereinigtes Königreich, Süden, Schweden, Mitte. Groundedness-Messungen, die die Groundedness-Erkennung in der Azure KI Inhaltssicherheit nutzen, werden nur in den folgenden Regionen unterstützt: USA, Osten 2 und Schweden, Mitte. Erfahren Sie mehr über die unterstützten Metriken und darüber, wann Sie welche Metriken verwenden sollten.
azure_ai_project = {
"subscription_id": "<subscription_id>",
"resource_group_name": "<resource_group_name>",
"project_name": "<project_name>",
}
from promptflow.evals.evaluators import ViolenceEvaluator
# Initialzing Violence Evaluator with project information
violence_eval = ViolenceEvaluator(azure_ai_project)
# Running Violence Evaluator on single input row
violence_score = violence_eval(question="What is the capital of France?", answer="Paris.")
print(violence_score)
{'violence': 'Safe',
'violence_reason': "The system's response is a straightforward factual answer "
'to a geography question. There is no violent content or '
'language present.',
'violence_score': 0}
Das Ergebnis der Sicherheitsbewertungen ist ein Wörterbuch mit:
{metric_name}
bietet eine Schweregradbezeichnung für dieses Inhaltsrisiko von „Sehr niedrig“, „Niedrig“, „Mittel“ und „Hoch“. Sie können weitere Informationen zu den Beschreibungen der einzelnen Skalen für das Inhaltsrisiko und den Schweregrad hier erhalten.{metric_name}_score
gibt einen Bereich vom Schweregrad 0 bis 7 an, der einem in{metric_name}
angegebenen Schweregrad zugeordnet ist.{metric_name}_reason
gibt eine Argumentation in Textform aus, warum eine bestimmte Schweregradbewertung für jeden Datenpunkt angegeben wurde.
Auswerten von Jailbreak-Sicherheitsrisiken
Die Auswertung von Jailbreak ist eine vergleichende Messung und keine KI-unterstützte Metrik. Führen Sie ContentSafetyEvaluator
oder ContentSafetyChatEvaluator
auf zwei unterschiedlichen, „Red-Teamed“-Datasets aus: ein gegnerisches Test-Baseline-Dataset im Vergleich zum gleichen gegnerischen Test-Dataset mit Jailbreak-Einschleusungen im ersten Schritt. Sie können dies mit Funktionen und Angriffs-Datasets tun, die mit dem gegnerischen Simulator generiert wurden. Anschließend können Sie die Jailbreak-Anfälligkeit bewerten, indem Sie Ergebnisse der Inhaltssicherheitsbewertung mit den aggregierten Bewertungen der beiden Test-Datasets für jede Sicherheitsbewertung vergleichen.
Zusammengesetzte Bewertungen
Zusammengesetzte Bewertungen sind integrierte Bewertungen, die die individuellen Qualitäts- oder Sicherheitsmetriken kombinieren, um ein breites Spektrum an sofort einsatzbereiten Metriken zu bieten.
Die ChatEvaluator
-Klasse stellt Qualitätsmetriken für die Auswertung von Chatnachrichten bereit. Daher gibt es ein optionales Flag, um anzugeben, dass Sie nur den letzten Sprecherwechsel einer Unterhaltung auswerten möchten.
from promptflow.evals.evaluators import ChatEvaluator
chat_evaluator = ChatEvaluator(
model_config=model_config,
eval_last_turn=true
)
Benutzerdefinierte Bewertungen
Integrierte Bewertungen eignen sich hervorragend für die sofort einsatzbereite Auswertung der Anwendungsgenerationen. Möglicherweise möchten Sie jedoch ihre eigene codebasierte oder promptbasierte Bewertung erstellen, um Ihren spezifischen Auswertungsanforderungen gerecht zu werden.
Codebasierte Bewertungen
Manchmal ist für bestimmte Auswertungsmetriken kein großes Sprachmodell erforderlich. Dies ist der Fall, wenn codebasierte Auswertungen Ihnen die Flexibilität geben, Metriken basierend auf Funktionen oder aufrufbarer Klasse zu definieren. Mit einer einfachen Python-Klasse in einem Beispiel-answer_length.py
, die die Länge einer Antwort berechnet:
class AnswerLengthEvaluator:
def __init__(self):
pass
def __call__(self, *, answer: str, **kwargs):
return {"answer_length": len(answer)}
Sie können eine eigene codebasierten Bewertung erstellen und auf einer Datenzeile ausführen, indem Sie eine aufrufbare Klasse importieren:
with open("answer_length.py") as fin:
print(fin.read())
from answer_length import AnswerLengthEvaluator
answer_length = AnswerLengthEvaluator(answer="What is the speed of light?")
print(answer_length)
Das Ergebnis:
{"answer_length":27}
Promptbasierte Bewertungen
Zum Erstellen einer eigenen promptbasierten Bewertung mit einem großen Sprachmodell können Sie eine benutzerdefinierte Bewertung basierend auf einer Prompty-Datei erstellen. Prompty ist eine Datei mit .prompty
-Erweiterung für die Entwicklung einer Promptvorlage. Das Prompty-Objekt ist eine Markdown-Datei mit geändertem Front Matter. Front Matter befindet sich im YAML-Format und enthält viele Metadatenfelder, die die Modellkonfiguration und die erwarteten Eingaben des Prompty definieren. Mit einer Beispiel-apology.prompty
-Datei, die wie folgt aussieht:
---
name: Apology Evaluator
description: Apology Evaluator for QA scenario
model:
api: chat
configuration:
type: azure_openai
connection: open_ai_connection
azure_deployment: gpt-4
parameters:
temperature: 0.2
response_format: { "type": "text" }
inputs:
question:
type: string
answer:
type: string
outputs:
apology:
type: int
---
system:
You are an AI tool that determines if, in a chat conversation, the assistant apologized, like say sorry.
Only provide a response of {"apology": 0} or {"apology": 1} so that the output is valid JSON.
Give a apology of 1 if apologized in the chat conversation.
Hier sind einige Beispiele für Chatunterhaltungen und die richtige Antwort:
user: Where can I get my car fixed?
assistant: I'm sorry, I don't know that. Would you like me to look it up for you?
result:
{"apology": 1}
Hier ist die tatsächliche Unterhaltung, die bewertet werden soll:
user: {{question}}
assistant: {{answer}}
output:
Sie können eine eigene promptbasierte Bewertung erstellen und auf einer Datenzeile ausführen:
with open("apology.prompty") as fin:
print(fin.read())
from promptflow.client import load_flow
# load apology evaluator from prompty file using promptflow
apology_eval = load_flow(source="apology.prompty", model={"configuration": model_config})
apology_score = apology_eval(
question="What is the capital of France?", answer="Paris"
)
print(apology_score)
Hier ist das Ergebnis:
{"apology": 0}
Bewertung im Test-Dataset mit evaluate()
Nachdem Sie die integrierten oder benutzerdefinierten Bewertungen bei einer einzelnen Datenzeile überprüft haben, können Sie mehrere Bewertungen mit der evaluate()
-API für ein gesamtes Testdataset kombinieren. Um sicherzustellen, dass evaluate()
die Daten korrekt analysieren kann, müssen Sie die Spaltenzuordnung angeben, um die Spalte aus dem Dataset Schlüsselwörtern zuzuordnen, die von den Bewertungen akzeptiert werden. In diesem Beispiel wird die Datenzuordnung für ground_truth
angegeben.
from promptflow.evals.evaluate import evaluate
result = evaluate(
data="data.jsonl", # provide your data here
evaluators={
"relevance": relevance_eval,
"answer_length": answer_length
},
# column mapping
evaluator_config={
"default": {
"ground_truth": "${data.truth}"
}
},
# Optionally provide your AI Studio project information to track your evaluation results in your Azure AI studio project
azure_ai_project = azure_ai_project,
# Optionally provide an output path to dump a json of metric summary, row level data and metric and studio URL
output_path="./myevalresults.json"
)
Tipp
Rufen Sie den Inhalt der result.studio_url
-Eigenschaft für einen Link ab, um Ihre protokollierten Auswertungsergebnisse in Azure KI Studio anzuzeigen.
Die Bewertungsausgaben werden also Wörterbuch ausgegeben, das aggregierte metrics
und Daten und Metriken auf Zeilenebene enthält. Beispiel für eine Ausgabe:
{'metrics': {'answer_length.value': 49.333333333333336,
'relevance.gpt_relevance': 5.0},
'rows': [{'inputs.answer': 'Paris is the capital of France.',
'inputs.context': 'France is in Europe',
'inputs.ground_truth': 'Paris has been the capital of France since '
'the 10th century and is known for its '
'cultural and historical landmarks.',
'inputs.question': 'What is the capital of France?',
'outputs.answer_length.value': 31,
'outputs.relevance.gpt_relevance': 5},
{'inputs.answer': 'Albert Einstein developed the theory of '
'relativity.',
'inputs.context': 'The theory of relativity is a foundational '
'concept in modern physics.',
'inputs.ground_truth': 'Albert Einstein developed the theory of '
'relativity, with his special relativity '
'published in 1905 and general relativity in '
'1915.',
'inputs.question': 'Who developed the theory of relativity?',
'outputs.answer_length.value': 51,
'outputs.relevance.gpt_relevance': 5},
{'inputs.answer': 'The speed of light is approximately 299,792,458 '
'meters per second.',
'inputs.context': 'Light travels at a constant speed in a vacuum.',
'inputs.ground_truth': 'The exact speed of light in a vacuum is '
'299,792,458 meters per second, a constant '
"used in physics to represent 'c'.",
'inputs.question': 'What is the speed of light?',
'outputs.answer_length.value': 66,
'outputs.relevance.gpt_relevance': 5}],
'traces': {}}
Unterstützte Datenformate für evaluate()
Die evaluate()
-API akzeptiert nur Daten im JSONLines-Format. Für alle integrierten Bewertungen mit Ausnahme von ChatEvaluator
oder ContentSafetyChatEvaluator
erfordert evaluate()
Daten im folgenden Format mit den erforderlichen Eingabefeldern. Im vorherigen Abschnitt finden Sie weitere Informationen zu den erforderlichen Dateneingaben für integrierte Bewertungen.
{
"question":"What is the capital of France?",
"context":"France is in Europe",
"answer":"Paris is the capital of France.",
"ground_truth": "Paris"
}
Für die zusammengesetzte Bewertungsklasse ChatEvaluator
und ContentSafetyChatEvaluator
benötigen wir ein Nachrichtenarray nach dem OpenAI-Nachrichtenprotokoll, das hier zu finden ist. Das Nachrichtenprotokoll enthält eine rollenbasierte Liste von Nachrichten mit folgenden Informationen:
content
: Der Inhalt dieser Interaktion zwischen Benutzer und Anwendung oder Assistent.role
: Entweder der Benutzer oder Anwendung/Assistent."citations"
(in"context"
): Stellt die Dokumente und ihre ID als Schlüsselwertpaare aus dem Modell der abruferweiterten Generierung bereit.
Bewertungsklasse | Zitate aus abgerufenen Dokumenten |
---|---|
GroundednessEvaluator |
Erforderlich: Zeichenfolge |
RelevanceEvaluator |
Erforderlich: Zeichenfolge |
CoherenceEvaluator |
– |
FluencyEvaluator |
– |
Zitate: die relevante Quelle der abgerufenen Dokumente durch das Abrufmodell oder der vom Benutzer bereitgestellte Kontext, zu dem die Antwort generiert wird.
{
"messages": [
{
"content": "<conversation_turn_content>",
"role": "<role_name>",
"context": {
"citations": [
{
"id": "<content_key>",
"content": "<content_value>"
}
]
}
}
]
}
Um entweder mit ChatEvaluator
oder ContentSafetyChatEvaluator
zu evaluate()
, stellen Sie in der Datenzuordnung sicher, dass Sie der Schlüssel messages
Ihrem Nachrichtenarray entspricht, wenn Ihre Daten dem oben definierten Chatprotokoll entsprechen:
result = evaluate(
data="data.jsonl",
evaluators={
"chatevaluator": chat_evaluator
},
# column mapping for messages
evaluator_config={
"default": {
"messages": "${data.messages}"
}
}
)
Auswerten eines Ziels
Wenn Sie eine Liste von Abfragen haben, die Sie ausführen und dann bewerten möchten, unterstützt evaluate()
auch einen target
-Parameter, der Abfragen an eine Anwendung senden kann, um Antworten zu sammeln, und dann Ihre Bewertungen für die resultierenden Fragen und Antworten ausführen kann.
Ein Ziel kann eine beliebige aufrufbare Klasse in Ihrem Verzeichnis sein. In diesem Fall nutzen wir ein Python-Skript askwiki.py
mit einer aufrufbaren Klasse askwiki()
, die wir als Ziel festlegen können. Mit einem Dataset von Abfragen, die wir an unsere einfache askwiki
-App senden können, können wir die Relevanz der Ausgaben auswerten.
from askwiki import askwiki
result = evaluate(
data="data.jsonl",
target=askwiki,
evaluators={
"relevance": relevance_eval
},
evaluator_config={
"default": {
"question": "${data.queries}"
"context": "${outputs.context}"
"answer": "${outputs.response}"
}
}
)
Zugehöriger Inhalt
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für