Sady vyhodnocení
Důležité
Tato funkce je ve verzi Public Preview.
Chcete-li měřit kvalitu agentické aplikace, musíte být schopni definovat reprezentativní sadu požadavků spolu s kritérii, která charakterizují vysoce kvalitní odpovědi. Uděláte to tak, že poskytnete sadu vyhodnocení. Tento článek popisuje různé možnosti sady vyhodnocení a některé osvědčené postupy pro vytvoření sady hodnocení.
Databricks doporučuje vytvořit sadu hodnocení označenou člověkem, která se skládá z reprezentativních otázek a odpovědí na základní pravdu. Pokud vaše aplikace obsahuje krok načítání, můžete volitelně poskytnout podpůrné dokumenty, na kterých očekáváte, že bude odpověď založena. Aby vám pomohl(a) začít s vytvářením sady hodnocení, poskytuje Databricks sadu SDK pro generování vysoce kvalitních syntetických otázek a odpovědí s pravdivostí, které lze přímo použít při hodnocení agentů nebo je poslat odborníkům na danou problematiku k posouzení. Vizte syntézu vyhodnocovacích sad
Dobrá sada hodnocení má následující charakteristiky:
- Zástupce: Měl by přesně odrážet rozsah požadavků, se kterými se aplikace setká v produkčním prostředí.
- Náročné: Mělo by zahrnovat obtížné a různorodé případy, které efektivně testuje celou řadu funkcí aplikace.
- Průběžně se aktualizuje: Pravidelně by se měla aktualizovat tak, aby odrážela způsob použití aplikace a měnící se vzory produkčního provozu.
Požadované schéma pro sadu hodnocení najdete v dokumentu Vstupní schéma hodnocení agenta.
Ukázkové sady vyhodnocení
Tato část obsahuje jednoduché příklady zkušebních sad.
Ukázková sada vyhodnocení s pouhým request
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}
]
Ukázková sada pro vyhodnocení s request
a 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.",
}
]
Ukázková sada vyhodnocení s request
, expected_response
a 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.",
}
]
Ukázková sada vyhodnocení s pouze request
a 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.",
}
]
Ukázková sada vyhodnocení s request
, response
a 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",
]
}
]
Ukázková sada pro vyhodnocení s request
, response
, guidelines
a 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",
],
}
]
Ukázková sada vyhodnocení s request
, response
a 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",
},
],
}
]
Ukázková sada pro vyhodnocení s request
, response
, retrieved_context
a 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",
},
],
}
]
Ukázková hodnotící sada s request
, response
, retrieved_context
, expected_facts
a 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",
},
],
}
]
Osvědčené postupy pro vývoj testovací sady
- Uvažujte každý vzorek nebo skupinu vzorků ve vyhodnocovací sadě jako jednotkový test. To znamená, že každý vzorek by měl odpovídat konkrétnímu scénáři s explicitním očekávaným výsledkem. Zvažte například testování delších kontextů, odůvodnění s více segmenty směrování a možnost odvodit odpovědi z nepřímých důkazů.
- Zvažte testování nežádoucích scénářů od škodlivých uživatelů.
- Neexistuje žádné konkrétní vodítko týkající se počtu otázek, které by se mohly zahrnout do sady hodnocení, ale jasné signály z vysoce kvalitních dat obvykle fungují lépe než hlučné signály ze slabých dat.
- Zvažte zahrnutí příkladů, které jsou velmi náročné, i pro lidi, aby na ně odpověděli.
- Ať už vytváříte aplikaci pro obecné účely nebo cílíte na konkrétní doménu, vaše aplikace se pravděpodobně setká s širokou škálou otázek. Sada hodnocení by to měla odrážet. Pokud například vytváříte aplikaci pro konkrétní otázky lidských zdrojů, měli byste zvážit testování jiných domén (například operací), aby se zajistilo, že aplikace nebude halucinovat nebo poskytovat škodlivé odpovědi.
- Vysoce kvalitní, konzistentní popisky generované člověkem jsou nejlepším způsobem, jak zajistit, aby základní hodnoty pravdivých informací, které poskytnete aplikaci, přesně odrážely požadované chování. Některé kroky k zajištění vysoké kvality lidských štítků jsou následující:
- Agregujte odpovědi (popisky) z více popisovačů lidí pro stejnou otázku.
- Ujistěte se, že jsou pokyny k označování jasné a že jsou popisovače konzistentní.
- Ujistěte se, že podmínky procesu označování člověkem jsou stejné jako formát požadavků odeslaných do aplikace RAG.
- Lidské popisovače jsou z povahy hlučné a nekonzistentní, například z důvodu různých interpretací otázky. To je důležitá část procesu. Používání popisků člověkem může odhalit interpretace otázek, které jste nepovažovali, a které by mohly poskytnout přehled o chování, které sledujete ve své aplikaci.