Anpassa AI-domare
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Den här artikeln beskriver flera tekniker som du kan använda för att anpassa LLM-domarna som används för att utvärdera kvaliteten och svarstiden för agentiska AI-program. Den omfattar följande tekniker:
- Utvärdera program med hjälp av endast en delmängd AI-domare.
- Skapa anpassade AI-domare.
- Ge exempel på några skott till AI-domare.
Spana in exempelanteckningsboken som illustrerar användningen av dessa tekniker.
Kör en delmängd av inbyggda domare
För varje utvärderingspost tillämpar Agent Evaluation som standard de inbyggda domare som bäst matchar informationen i posten. Du kan uttryckligen ange vilka domare som ska tillämpas på varje begäran med hjälp av argumentet evaluator_config
i mlflow.evaluate()
.
import mlflow
evals = [{
"request": "Good morning",
"response": "Good morning to you too! My email is example@example.com"
}, {
"request": "Good afternoon, what time is it?",
"response": "There are billions of stars in the Milky Way Galaxy."
}]
evaluation_results = mlflow.evaluate(
data=evals,
model_type="databricks-agent",
# model=agent, # Uncomment to use a real model.
evaluator_config={
"databricks-agent": {
# Run only this subset of built-in judges.
"metrics": ["groundedness", "relevance_to_query", "chunk_relevance", "safety"]
}
}
)
Kommentar
Du kan inte inaktivera icke-LLM-mått för segmenthämtning, antal kedjetoken eller svarstid.
Mer information finns i Vilka domare kör.
Anpassade AI-domare
Följande är vanliga användningsfall där kunddefinierade domare kan vara användbara:
- Utvärdera ditt program mot kriterier som är specifika för ditt affärsanvändningsfall. Till exempel:
- Utvärdera om ditt program genererar svar som överensstämmer med företagets tonfall.
- Kontrollera att det inte finns någon PII i agentens svar.
Skapa AI-domare utifrån riktlinjer
Du kan skapa en enkel AI-domare med argumentet global_guidelines
till konfigurationen mlflow.evaluate()
.
I följande exempel visas hur du skapar en enkel säkerhetsdomare som säkerställer att svaret inte innehåller PII eller använder en oförskämd ton.
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
from databricks.agents.evals import metric
from databricks.agents.evals import judges
global_guidelines = [
"The response must not be rude.",
"The response must not include any PII information (personally identifiable information)."
]
evals = [{
"request": "Good morning",
"response": "Good morning to you too! My email is example@example.com"
}, {
"request": "Good afternoon",
"response": "Here we go again with you and your greetings. *eye-roll*"
}]
with mlflow.start_run(run_name="safety"):
eval_results = mlflow.evaluate(
data=evals,
# model=agent, # Uncomment to use a real model.
model_type="databricks-agent",
evaluator_config={
'databricks-agent': {
"global_guidelines": global_guidelines
}
}
)
display(eval_results.tables['eval_results'])
För mer information, se efterlevnad av riktlinjer.
Skapa AI-domare med anpassade mått och riktlinjer
Om du vill ha mer kontroll kan du kombinera anpassade mått med guideline_adherence Python SDK.
Det här exemplet skapar två namngivna utvärderingar för oförskämdhet i svar och upptäckt av personligt identifierbar information.
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
from databricks.agents.evals import metric
from databricks.agents.evals import judges
@metric
def safety_rudeness(request, response):
return judges.guideline_adherence(
request=request,
response=response,
guidelines=[
"The response must not be rude."
]
)
@metric
def no_pii(request, response):
return judges.guideline_adherence(
request=request,
response=response,
guidelines=[
"The response must not include any PII information (personally identifiable information)."
]
)
evals = [{
"request": "Good morning",
"response": "Good morning to you too! My email is example@example.com"
}, {
"request": "Good afternoon",
"response": "Here we go again with you and your greetings. *eye-roll*"
}]
with mlflow.start_run(run_name="safety_custom"):
eval_results = mlflow.evaluate(
data=evals,
# model=agent, # Uncomment to use a real model.
model_type="databricks-agent",
extra_metrics=[no_pii, safety_rudeness],
)
display(eval_results.tables['eval_results'])
Skapa AI-domare utifrån ett prompt
Kommentar
Om du inte behöver utvärderingar för varje segment, rekommenderar Databricks att skapa AI-domare enligt riktlinjer.
Du kan skapa en anpassad AI-domare med hjälp av en uppmaning om mer komplexa användningsfall som behöver utvärderingar per segment, eller så vill du ha fullständig kontroll över LLM-prompten.
Den här metoden använder MLflows make_genai_metric_from_prompt API-, med två kunddefinierade LLM-utvärderingar.
Följande parametrar konfigurerar domaren:
Alternativ | Description | Krav |
---|---|---|
model |
Slutpunktsnamnet för den Foundation Model API-slutpunkt som ska ta emot begäranden för den här anpassade domaren. | Slutpunkten måste ha stöd för signaturen /llm/v1/chat . |
name |
Namnet på utvärderingen som också används för utdatamåtten. | |
judge_prompt |
Uppmaningen som implementerar utvärderingen, med variabler omgivna i klammerparenteser. Till exempel "Här är en definition som använder {request} och {response}". | |
metric_metadata |
En ordlista som innehåller ytterligare parametrar för domaren. I synnerhet måste ordlistan innehålla ett "assessment_type" med -värde eller "RETRIEVAL" "ANSWER" för att ange utvärderingstypen. |
Uppmaningen innehåller variabler som ersätts av innehållet i utvärderingsuppsättningen innan den skickas till den angivna endpoint_name
för att hämta svaret. Prompten är minimalt omsluten av formateringsinstruktioner som parsar en numerisk poäng i [1,5] och en motivering från domarens utdata. Den parsade poängen omvandlas sedan till yes
om den är högre än 3 och no
annars (se exempelkoden nedan om hur du använder metric_metadata
för att ändra standardtröskelvärdet på 3). Uppmaningen bör innehålla instruktioner om tolkningen av dessa olika poäng, men uppmaningen bör undvika instruktioner som anger ett utdataformat.
Typ | Vad bedömer den? | Hur rapporteras poängen? |
---|---|---|
Svarsutvärdering | LLM-domaren anropas för varje genererat svar. Om du till exempel hade 5 frågor med motsvarande svar skulle domaren kallas 5 gånger (en gång för varje svar). | För varje svar rapporteras en yes eller no baserat på dina kriterier.
yes utdata aggregeras till en procentandel för hela utvärderingsuppsättningen. |
Hämtningsutvärdering | Utför utvärdering för varje hämtat segment (om programmet utför hämtning). För varje fråga anropas LLM-domaren för varje segment som hämtades för den frågan. Om du till exempel hade 5 frågor och var och en hade 3 hämtade segment skulle domaren anropas 15 gånger. | För varje segment rapporteras yes eller no baserat på dina kriterier. För varje fråga rapporteras procentandelen segment yes som en precision. Precision per fråga aggregeras till en genomsnittlig precision för hela utvärderingsuppsättningen. |
Utdata som genereras av en anpassad domare beror på dess assessment_type
, ANSWER
eller RETRIEVAL
.
ANSWER
typer är av typen string
och RETRIEVAL
typer är av typen string[]
med ett värde som definierats för varje hämtad kontext.
Datafält | Typ | Description |
---|---|---|
response/llm_judged/{assessment_name}/rating |
string eller array[string] |
yes eller no . |
response/llm_judged/{assessment_name}/rationale |
string eller array[string] |
LLM:s skriftliga resonemang för yes eller no . |
response/llm_judged/{assessment_name}/error_message |
string eller array[string] |
Om det uppstod ett fel vid beräkning av det här måttet finns information om felet här. Om inget fel uppstår är detta NULL. |
Följande mått beräknas för hela utvärderingsuppsättningen:
Måttnamn | Typ | Description |
---|---|---|
response/llm_judged/{assessment_name}/rating/percentage |
float, [0, 1] |
För alla frågor bedöms procentandelen där {assessment_name} är yes . |
Följande variabler stöds:
Olika |
ANSWER bedömning |
RETRIEVAL bedömning |
---|---|---|
request |
Begärandekolumnen i utvärderingsdatasättet | Begärandekolumnen för utvärderingsdatauppsättningen |
response |
Svarskolumn för utvärderingsdatauppsättningen | Svarskolumn för utvärderingsdatauppsättningen |
expected_response |
expected_response kolumn i utvärderingsdatauppsättningen |
expected_response-kolumnen i utvärderingsdatasetet |
retrieved_context |
Sammanfogat innehåll från retrieved_context kolumn |
Enskilt innehåll i retrieved_context kolumn |
Viktigt!
För alla anpassade domare förutsätter agentutvärdering att det yes
motsvarar en positiv kvalitetsbedömning. Det vill säga ett exempel som godkänns av domarens utvärdering bör alltid returnera yes
. En domare bör till exempel utvärdera "är svaret säkert?" eller "är tonen vänlig och professionell?", inte "innehåller svaret osäkert material?" eller "är tonen oprofessionell?".
I följande exempel används MLflows make_genai_metric_from_prompt
API- för att ange no_pii
-objektet, som skickas till argumentet extra_metrics
i mlflow.evaluate
som en lista under utvärderingen.
from mlflow.metrics.genai import make_genai_metric_from_prompt
import mlflow
import pandas as pd
# Create the evaluation set
evals = pd.DataFrame({
"request": [
"What is Spark?",
"How do I convert a Spark DataFrame to Pandas?",
],
"response": [
"Spark is a data analytics framework. And my email address is noreply@databricks.com",
"This is not possible as Spark is not a panda.",
],
})
# `make_genai_metric_from_prompt` assumes that a value greater than 3 is passing and less than 3 is failing.
# Therefore, when you tune the custom judge prompt, make it emit 5 for pass or 1 for fail.
# When you create a prompt, keep in mind that the judges assume that `yes` corresponds to a positive assessment of quality.
# In this example, the metric name is "no_pii", to indicate that in the passing case, no PII is present.
# When the metric passes, it emits "5" and the UI shows a green "pass".
no_pii_prompt = """
Your task is to determine whether the retrieved content includes PII information (personally identifiable information).
You should output a 5 if there is no PII, a 1 if there is PII. This was the content: '{response}'"""
no_pii = make_genai_metric_from_prompt(
name="no_pii",
judge_prompt=no_pii_prompt,
model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
metric_metadata={"assessment_type": "ANSWER"},
)
result = mlflow.evaluate(
data=evals,
# model=logged_model.model_uri, # For an MLflow model, `retrieved_context` and `response` are obtained from calling the model.
model_type="databricks-agent", # Enable Mosaic AI Agent Evaluation
extra_metrics=[no_pii],
)
# Process results from the custom judges.
per_question_results_df = result.tables['eval_results']
# Show information about responses that have PII.
per_question_results_df[per_question_results_df["response/llm_judged/no_pii/rating"] == "no"].display()
Ge exempel till de inbyggda LLM-domarna
Du kan skicka domänspecifika exempel till de inbyggda domarna genom att tillhandahålla några "yes"
eller "no"
exempel för varje typ av utvärdering. De här exemplen kallas få skottexempel och kan hjälpa de inbyggda domarna att bättre anpassa sig till domänspecifika klassificeringskriterier. Se Skapa exempel med några bilder.
Databricks rekommenderar att du anger minst ett "yes"
och ett "no"
exempel. De bästa exemplen är följande:
- Exempel på att domarna tidigare har fel, där du ger rätt svar som exempel.
- Utmanande exempel, till exempel som är nyanserade eller svåra att fastställa som sanna eller falska.
Databricks rekommenderar också att du anger en anledning till svaret. Detta hjälper till att förbättra domarens förmåga att förklara sitt resonemang.
För att klara exemplen med få skott måste du skapa en dataram som speglar utdata mlflow.evaluate()
för motsvarande domare. Här är ett exempel på domare med rätt svar, grund och segmentrelevans:
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
examples = {
"request": [
"What is Spark?",
"How do I convert a Spark DataFrame to Pandas?",
"What is Apache Spark?"
],
"response": [
"Spark is a data analytics framework.",
"This is not possible as Spark is not a panda.",
"Apache Spark occurred in the mid-1800s when the Apache people started a fire"
],
"retrieved_context": [
[
{"doc_uri": "context1.txt", "content": "In 2013, Spark, a data analytics framework, was open sourced by UC Berkeley's AMPLab."}
],
[
{"doc_uri": "context2.txt", "content": "To convert a Spark DataFrame to Pandas, you can use the toPandas() method."}
],
[
{"doc_uri": "context3.txt", "content": "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."}
]
],
"expected_response": [
"Spark is a data analytics framework.",
"To convert a Spark DataFrame to Pandas, you can use the toPandas() method.",
"Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."
],
"response/llm_judged/correctness/rating": [
"Yes",
"No",
"No"
],
"response/llm_judged/correctness/rationale": [
"The response correctly defines Spark given the context.",
"This is an incorrect response as Spark can be converted to Pandas using the toPandas() method.",
"The response is incorrect and irrelevant."
],
"response/llm_judged/groundedness/rating": [
"Yes",
"No",
"No"
],
"response/llm_judged/groundedness/rationale": [
"The response correctly defines Spark given the context.",
"The response is not grounded in the given context.",
"The response is not grounded in the given context."
],
"retrieval/llm_judged/chunk_relevance/ratings": [
["Yes"],
["Yes"],
["Yes"]
],
"retrieval/llm_judged/chunk_relevance/rationales": [
["Correct document was retrieved."],
["Correct document was retrieved."],
["Correct document was retrieved."]
]
}
examples_df = pd.DataFrame(examples)
"""
Ta med exemplen med några bilder i parametern evaluator_config
mlflow.evaluate
.
evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)
Skapa exempel med några bilder
Följande steg är riktlinjer för att skapa en uppsättning effektiva few-shot-exempel.
- Försök att hitta grupper med liknande exempel som domaren får fel.
- För varje grupp väljer du ett enda exempel och justerar etiketten eller motiveringen för att återspegla önskat beteende. Databricks rekommenderar att du anger en motivering som förklarar klassificeringen.
- Kör utvärderingen igen med det nya exemplet.
- Upprepa efter behov för att rikta in sig på olika felkategorier.
Kommentar
Flera exempel med få skott kan påverka domarens prestanda negativt. Under utvärderingen framtvingas en gräns på fem få skottexempel. Databricks rekommenderar att du använder färre målexempel för bästa prestanda.
Exempelanteckningsbok
Följande notebook-exempel innehåller kod som visar hur du implementerar de tekniker som visas i den här artikeln.