Evaluatiesets
Belangrijk
Deze functie is beschikbaar als openbare preview.
Als u de kwaliteit van een agentische toepassing wilt meten, moet u een representatieve set van aanvragen kunnen definiƫren, samen met criteria die antwoorden van hoge kwaliteit karakteriseren. Dat doet u door een evaluatie sette geven. In dit artikel worden de verschillende opties voor uw evaluatie-set behandeld en enkele aanbevolen procedures voor het maken van een evaluatie-set.
Databricks raadt aan om een door mensen gelabelde evaluatie te maken set, die bestaat uit representatieve vragen en antwoorden op grond van waarheid. Als uw toepassing een ophaalstap bevat, kunt u desgewenst de ondersteunende documenten opgeven waarop u verwacht dat het antwoord is gebaseerd. Om u te helpen get met het maken van een evaluatie-set, biedt Databricks een SDK om synthetische vragen en antwoorden van hoge kwaliteit te generate die rechtstreeks in agentevaluatie kunnen worden gebruikt of die kunnen worden verzonden naar deskundigen ter beoordeling. Zie het synthetiseren van evaluatiesets.
Een goede evaluatie set heeft de volgende kenmerken:
- Vertegenwoordiger: Het moet nauwkeurig overeenkomen met het bereik van aanvragen die de toepassing in productie tegenkomt.
- Lastig: Het moet moeilijke en diverse gevallen omvatten om het volledige scala aan mogelijkheden van de toepassing effectief te testen.
- Voortdurend bijgewerkt: deze moet regelmatig worden bijgewerkt om aan te geven hoe de toepassing wordt gebruikt en de veranderende patronen van productieverkeer.
Voor de vereiste schema van een evaluatie-set, zie Agent Evaluation input schema.
Voorbeeldevaluatiesets
Deze sectie bevat eenvoudige voorbeelden van evaluatiesets.
Voorbeeldevaluatie set met alleen request
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}
]
Voorbeeldevaluatie set met request
en expected_response
eval_set = [
{
"request_id": "request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_response": "There's no significant difference.",
}
]
Voorbeeldevaluatie set met request
, expected_response
en expected_retrieved_content
eval_set = [
{
"request_id": "request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_retrieved_context": [
{
"doc_uri": "doc_uri_1",
},
{
"doc_uri": "doc_uri_2",
},
],
"expected_response": "There's no significant difference.",
}
]
Voorbeeldevaluatie set met alleen request
en response
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
}
]
Voorbeeldevaluatie set met request
, response
en guidelines
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"guidelines": [
"The response must be in English",
"The response must be clear, coherent, and concise",
]
}
]
Voorbeeldevaluatie set met request
, response
, guidelines
en expected_facts
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"expected_facts": [
"There's no significant difference.",
],
"guidelines": [
"The response must be in English",
"The response must be clear, coherent, and concise",
],
}
]
Voorbeeldevaluatie set met request
, response
en retrieved_context
eval_set = [
{
"request_id": "request-id", # optional, but useful for tracking
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"retrieved_context": [
{
# In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
"content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
"doc_uri": "doc_uri_2_1",
},
{
"content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
"doc_uri": "doc_uri_6_extra",
},
],
}
]
Voorbeeldevaluatie set met request
, response
, retrieved_context
en expected_facts
eval_set = [
{
"request_id": "request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_facts": [
"There's no significant difference.",
],
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"retrieved_context": [
{
# In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
"content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
"doc_uri": "doc_uri_2_1",
},
{
"content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
"doc_uri": "doc_uri_6_extra",
},
],
}
]
Voorbeeldevaluatie set met request
, response
, retrieved_context
, expected_facts
en expected_retrieved_context
eval_set = [
{
"request_id": "request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_retrieved_context": [
{
"doc_uri": "doc_uri_2_1",
},
{
"doc_uri": "doc_uri_2_2",
},
],
"expected_facts": [
"There's no significant difference.",
],
"response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
"retrieved_context": [
{
# In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
"content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
"doc_uri": "doc_uri_2_1",
},
{
"content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
"doc_uri": "doc_uri_6_extra",
},
],
}
]
Aanbevolen procedures voor het ontwikkelen van een evaluatie-set
- Bekijk elke steekproef of groep voorbeelden in de evaluatie-set als eenheidstest. Dat wil gezegd, elk voorbeeld moet overeenkomen met een specifiek scenario met een expliciet verwacht resultaat. Denk bijvoorbeeld aan het testen van langere contexten, redenering van meerdere hops en het vermogen om antwoorden uit indirect bewijs af te afleiden.
- Overweeg om adversarial scenario's van kwaadwillende gebruikers te testen.
- Er is geen specifieke richtlijn voor het aantal vragen dat moet worden opgenomen in een evaluatie set, maar duidelijke signalen van hoogwaardige gegevens presteren doorgaans beter dan ruissignalen van zwakke gegevens.
- Overweeg om voorbeelden op te nemen die erg lastig zijn, zelfs voor mensen om te beantwoorden.
- Of u nu een toepassing voor algemeen gebruik bouwt of op een specifiek domein richt, uw app krijgt waarschijnlijk een groot aantal vragen te zien. De evaluatie set moet dat weerspiegelen. Als u bijvoorbeeld een toepassing maakt voor specifieke HR-vragen, moet u nog steeds andere domeinen (bijvoorbeeld bewerkingen) testen om ervoor te zorgen dat de toepassing niet hallucineert of schadelijke reacties levert.
- Hoogwaardige, consistente door mensen gegenereerde labels zijn de beste manier om ervoor te zorgen dat de grondwaar values die u aan de toepassing verstrekt, nauwkeurig het gewenste gedrag weergeeft. Enkele stappen om menselijke labels van hoge kwaliteit te garanderen, zijn het volgende:
- Geaggregeerde antwoorden (labels) van meerdere menselijke labelers voor dezelfde vraag.
- Zorg ervoor dat labelinstructies duidelijk zijn en dat de menselijke labelers consistent zijn.
- Zorg ervoor dat de voorwaarden voor het proces voor menselijke labels identiek zijn aan de indeling van aanvragen die zijn ingediend bij de RAG-toepassing.
- Menselijke labelaars zijn van nature luidruchtig en inconsistent, bijvoorbeeld vanwege verschillende interpretaties van de vraag. Dit is een belangrijk onderdeel van het proces. Het gebruik van menselijke labels kan interpretaties onthullen van vragen die u niet had overwogen, en dat kan inzicht geven in gedrag dat u in uw toepassing bekijkt.