自訂 LLM 評委
重要
這項功能處於公開預覽狀態。
本文章描述在自訂 LLM 評委以便評估代理 AI 應用程式的品質與延遲時,可以使用的幾項技術。 其涵蓋下列技術:
- 建立自訂 LLM 評委。
- 為 LLM 評委提供少樣本的範例。
- 僅使用 LLM 評委子集來評估應用程式。
選取內建法官來執行
預設情況下,代理評估系統針對每個評估記錄,會套用與該記錄中資訊最相符的內建評委子集。 您可以使用 mlflow.evaluate()
的 evaluator_config
參數,明確指定每個請求要套用的判定者。 如需詳細資訊,請參閱 哪些評委正在執行。
建立自訂 LLM 評委
以下是客戶定義評委可能很有用的常見使用案例:
- 根據商務使用案例特有的準則評估您的應用程式。 例如:
- 評估您的應用程式是否會產生符合公司語調的回覆
- 判斷應用程式回覆是否一律遵循特定格式。
- 測試和反覆運算護欄。 您可以在客戶定義的評委中使用護欄提示,並且反覆運算運作良好的提示。 然後,您將針對護欄進行實作,並且使用 LLM 評委以評估護欄可以或無法運作的頻率。
Databricks 會將這些使用案例稱為評定。 客戶定義的 LLM 評定有兩種類型:
類型 | 其評定的內容為何? | 如何回報分數? |
---|---|---|
回答評定 | 每個產生的答案都會呼叫 LLM 評委。 例如,如果您有 5 個問題以及對應的答案,將會呼叫評委 5 次(每個答案一次)。 | 針對每個答案,會根據您的準則報告 yes 或 no 。
yes 輸出會彙總至整個評估集的百分比。 |
擷取評定 | 針對每個擷取的區塊執行評定(如果應用程式執行擷取)。 每個問題,會針對該問題擷取的每個區塊呼叫 LLM 評委。 舉例來說,如果您有 5 個問題,而每個問題有 3 個擷取的區塊,則評委將被呼叫 15 次。 | 針對每個區塊,會根據您的準則報告 yes 或 no 。 針對每個問題,會將 yes 區塊的百分比報告為精確度。 每個問題的精確度會彙總至整個評估集的平均精確度。 |
您可以使用下列參數來設定客戶定義的 LLM 評委:
選項 | 描述 | 需求 |
---|---|---|
model |
要收到此自訂評委要求的基礎模型 API 端點的端點名稱。 | 端點必須支援 /llm/v1/chat 簽名。 |
name |
同時也用於輸出計量的評定名稱。 | |
judge_prompt |
實施評定的提示,包含以大括弧括住的變數。 例如,「以下是使用 {request} 和 {response}」 的定義。 | |
metric_metadata |
為評委提供額外參數的字典。 值得注意的是,字典必須包括其值為 "assessment_type" 或 "RETRIEVAL" 的 "ANSWER" 以便指定評定類型 。 |
提示包含會由評估集的內容取代,然後才會傳送至指定的 endpoint_name
以擷取回覆的變數。 提示在格式化指令中含有最少的內容,這些指令會剖析 [1,5] 中的數值分數,以及評委輸出的原理。 如果剖析分數高於 3 以及 yes
,則剖析分數隨後會轉換成 no
(請參閱下面的範例程式代碼,瞭解如何使用 metric_metadata
來變更預設閾值 3)。 提示應該包含這些不同分數的解譯說明,但是提示應該避免指定輸出格式的說明。
支援下列變數:
變數 |
ANSWER 評定 |
RETRIEVAL 評定 |
---|---|---|
request |
評估資料集的要求資料欄 | 評估資料集的要求資料欄 |
response |
評估資料集的回覆資料欄 | 評估資料集的回覆資料欄 |
expected_response |
評估資料集的 expected_response 資料欄 |
評估資料集的 expected_response 資料欄 |
retrieved_context |
retrieved_context 資料欄中的串連內容 |
retrieved_context 資料欄中的個別內容 |
重要
針對所有自訂評委,代理程式評估會假設 yes
與品質的正面評估相符。 也就是說,通過評委評估的範例應該始終傳回 yes
。 例如,評委應該評估「回覆是否安全?」 或者「語氣是否友善並且專業?」,而不是「回覆是否包含不安全的材料?」 或「語氣是否不專業?」。
下列範例會使用 MLflow 的 make_genai_metric_from_prompt
API 來指定 no_pii
物件,該物件會在評估期間以清單的形式傳入 extra_metrics
中的 自變數 mlflow.evaluate
。
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()
提供內建 LLM 評委的範例
您可以針對每種評量類型提供一些 "yes"
或 "no"
的範例,將特定領域範例傳遞給內建評委。 這些範例稱為少樣本的範例,可協助內建評委更加符合特定領域評等準則。 請參閱建立少樣本範例。
Databricks 建議提供至少一個 "yes"
以及一個 "no"
範例。 最佳範例如下:
- 評委先前出錯的範例,您可以在其中提供正確的回覆作為範例。
- 有挑戰性的範例,例如差距細微或是難以判斷為 true 或 false 的範例。
Databricks 也建議您提供回覆的理由。 這有助於改善評委解釋其推理的能力。
若要傳遞少樣本範例,您需要建立針對相應的評委鏡像顯示 mlflow.evaluate()
輸出的資料框架。 以下是答案正確性、基礎性和區塊相關性評委的範例:
%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)
"""
在 evaluator_config
的 mlflow.evaluate
參數中包含少樣本範例。
evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)
建立少樣本範例
下列步驟是建立一組有效的少樣本範例的準則。
- 嘗試找出評委發生錯誤的幾組類似範例。
- 針對每個群組,挑選出單一範例並且調整標籤或對齊方式,以反映所需的行為。 Databricks 建議提供解釋評分的理由。
- 使用新的範例重新執行評估。
- 視需要重複以不同的錯誤類別為目標。
注意
多個幾桿範例可能會對判斷效能產生負面影響。 在評估期間,會強制執行五個數槍範例的限制。 Databricks 建議使用較少的目標範例,以獲得最佳效能。