Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
Halaman ini menjelaskan penggunaan versi 0.22
Agent Evaluation dengan MLflow 2. Databricks merekomendasikan penggunaan MLflow 3, yang terintegrasi dengan >1.0
Evaluasi Agen. Di MLflow 3, API Evaluasi Agen sekarang menjadi bagian mlflow
dari paket.
Untuk informasi tentang topik ini, lihat Membangun Himpunan Data Evaluasi MLflow.
Untuk mengukur kualitas agen AI, Anda harus dapat menentukan serangkaian permintaan yang representatif bersama dengan kriteria yang mencirikan respons berkualitas tinggi. Anda melakukannya dengan memberikan kumpulan evaluasi. Artikel ini membahas berbagai opsi untuk kumpulan evaluasi Anda dan beberapa praktik terbaik untuk membuat kumpulan evaluasi.
Databricks merekomendasikan pembuatan set evaluasi berlabel manusia, yang terdiri dari pertanyaan perwakilan dan jawaban kebenaran dasar. Jika aplikasi Anda menyertakan langkah pengambilan, Anda dapat opsional menyediakan dokumen pendukung sebagai dasar dari respons yang Anda harapkan. Untuk membantu Anda mulai membuat kumpulan evaluasi, Databricks menyediakan SDK untuk menghasilkan pertanyaan sintetis berkualitas tinggi dan jawaban kebenaran dasar yang dapat digunakan langsung di Evaluasi Agen, atau dikirim ke pakar subjek untuk ditinjau. Lihat Sintesis set evaluasi.
Set evaluasi yang baik memiliki karakteristik berikut:
- Representatif: Ini harus secara akurat mewakili berbagai permintaan yang akan dihadapi aplikasi saat dalam produksi.
- Menantang: Ini harus mencakup kasus yang sulit dan beragam untuk menguji berbagai kemampuan aplikasi secara efektif.
- Terus diperbarui: Ini harus diperbarui secara teratur untuk mencerminkan bagaimana aplikasi digunakan dan pola lalu lintas produksi yang berubah.
Untuk skema yang diperlukan dari kumpulan evaluasi, lihat Skema input Evaluasi Agen (MLflow 2).
Kumpulan evaluasi sampel
Bagian ini mencakup contoh sederhana set evaluasi.
Set evaluasi sampel hanya dengan request
eval_set = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}
]
Evaluasi sampel diatur dengan request
dan 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.",
}
]
Sampel evaluasi diatur dengan request
, expected_response
, dan 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.",
}
]
Evaluasi sampel diatur hanya dengan request
dan 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.",
}
]
Set evaluasi sampel dengan request
dan response
yang diformat secara acak.
eval_set = [
{
"request": {"query": "Difference between", "item_a": "reduceByKey", "item_b": "groupByKey"},
"response": {
"differences": [
"reduceByKey aggregates data before shuffling",
"groupByKey shuffles all data",
"reduceByKey is more efficient",
]
}
}
]
Sampel evaluasi diatur dengan request
, response
, dan 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.",
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
"guidelines": {
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
}
}
]
Sampel evaluasi diatur dengan request
, response
, guidelines
, dan 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.",
],
# You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
"guidelines": {
"english": ["The response must be in English"],
"clarity": ["The response must be clear, coherent, and concise"],
}
}
]
Sampel evaluasi diatur dengan request
, response
, dan 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",
},
],
}
]
Sampel evaluasi diatur dengan request
, response
, retrieved_context
, dan 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",
},
],
}
]
Set evaluasi sampel dengan request
, response
, retrieved_context
, expected_facts
, dan 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",
},
],
}
]
Praktik terbaik untuk mengembangkan set evaluasi
- Pertimbangkan setiap sampel, atau grup sampel, dalam kumpulan evaluasi sebagai pengujian unit. Artinya, setiap sampel harus sesuai dengan skenario tertentu dengan hasil eksplisit yang diharapkan. Misalnya, pertimbangkan untuk menguji konteks yang lebih panjang, penalaran multi-hop, dan kemampuan untuk menyimpulkan jawaban dari bukti tidak langsung.
- Pertimbangkan untuk menguji skenario bermusuhan dari pengguna yang berniat jahat.
- Tidak ada pedoman khusus tentang jumlah pertanyaan yang harus disertakan dalam kumpulan evaluasi, tetapi sinyal yang jelas dari data berkualitas tinggi biasanya berperforma lebih baik daripada sinyal berisik dari data yang lemah.
- Pertimbangkan untuk menyertakan contoh yang sangat menantang, bahkan bagi manusia untuk menjawab.
- Baik Anda membangun aplikasi tujuan umum atau menargetkan domain tertentu, aplikasi Anda kemungkinan akan menemukan berbagai pertanyaan. Kumpulan evaluasi harus mencerminkan itu. Misalnya, jika Anda membuat aplikasi untuk menangani pertanyaan SDM tertentu, Anda masih harus mempertimbangkan untuk menguji domain lain (misalnya, operasi), untuk memastikan bahwa aplikasi tidak menghalusinasi atau memberikan respons yang berbahaya.
- Label yang dihasilkan manusia berkualitas tinggi dan konsisten adalah cara terbaik untuk memastikan bahwa nilai kebenaran dasar yang Anda berikan kepada aplikasi secara akurat mencerminkan perilaku yang diinginkan. Beberapa langkah untuk memastikan label manusia berkualitas tinggi adalah sebagai berikut:
- Respons agregat (label) dari beberapa pelabel manusia untuk pertanyaan yang sama.
- Pastikan instruksi pelabelan jelas dan pelabel manusia konsisten.
- Pastikan bahwa kondisi untuk proses pelabelan manusia identik dengan format permintaan yang dikirimkan ke aplikasi RAG.
- Pelabel manusia secara alami tidak akurat dan tidak konsisten, seperti karena interpretasi pertanyaan yang berbeda. Ini adalah bagian penting dari proses. Menggunakan pelabelan manusia dapat mengungkapkan interpretasi pertanyaan yang belum Anda pertimbangkan, dan yang mungkin memberikan wawasan tentang perilaku yang Anda amati dalam aplikasi Anda.