Evaluatiesets
Belangrijk
Deze functie is beschikbaar als openbare preview.
Als u de kwaliteit van een agentische toepassing wilt meten, moet u een representatieve set aanvragen kunnen definiƫren, samen met criteria die antwoorden van hoge kwaliteit karakteriseren. Je doet dat door een evaluatieset aan te leveren. Dit artikel bevat informatie over de verschillende opties voor uw evaluatieset en enkele aanbevolen procedures voor het maken van een evaluatieset.
Databricks raadt aan om een door mensen gelabelde evaluatieset te maken, 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 aan de slag te gaan met het maken van een evaluatieset, biedt Databricks een SDK voor het genereren van hoogwaardige synthetische vragen en basisantwoorden die rechtstreeks in agentevaluatie kunnen worden gebruikt of die naar deskundigen ter beoordeling kunnen worden verzonden. Zie het synthetiseren van evaluatiesets.
Een goede evaluatieset 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.
Zie Invoerschema voor agentevaluatievoor het vereiste schema van een evaluatieset.
Voorbeeldevaluatiesets
Deze sectie bevat eenvoudige voorbeelden van evaluatiesets.
Voorbeeldevaluatieset met alleen request
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}
]
Voorbeeldevaluatieset 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.",
}
]
Voorbeeldevaluatieset 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.",
}
]
Voorbeeldevaluatieset 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.",
}
]
Voorbeeldevaluatieset 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",
]
}
]
Voorbeeldevaluatieset 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",
],
}
]
Voorbeeldevaluatieset 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",
},
],
}
]
Voorbeeldevaluatieset 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",
},
],
}
]
Voorbeeldevaluatieset 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 evaluatieset
- Bekijk elk voorbeeld of elke groep voorbeelden in de evaluatieset 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 in een evaluatieset moet worden opgenomen, maar duidelijke signalen van gegevens van hoge kwaliteit 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 evaluatieset 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 waarden voor de grondwaarwaar die u aan de toepassing levert, nauwkeurig het gewenste gedrag weerspiegelen. 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.