定義評估指標

建立評估資料集後,下一步是定義用於評估模型成效的指標。生成式 AI 模型可為各種工作建立應用程式,而 Gen AI Evaluation Service 採用測試導向架構,可將主觀評分轉換為客觀且可執行的結果。

以下是與評估指標相關的核心概念:

  • 評量表:評估 LLM 模型或應用程式回應的標準。

  • 指標:根據評分標準評估模型輸出內容的分數。

Gen AI Evaluation Service 提供下列類別的指標:

  • 以評量表為準的指標:將 LLM 納入評估工作流程。

    • 自動調整評量表 (建議):系統會為每個提示動態生成評量表。系統會根據提示,以詳細且可解釋的通過或失敗回饋評估回覆。

    • 靜態評量表:明確定義評量表,並將同一份評量表套用至所有提示。系統會使用同一組以分數為依據的評估人員來評估回應。每個提示的單一數值分數 (例如 1 到 5 分)。需要評估非常具體的層面,或所有提示都必須使用完全相同的評分標準時。

  • 以運算資源為基礎的指標:使用確定性演算法評估回覆,通常會使用真值。每個提示的數值分數 (例如 0.0 到 1.0)。實際資料可用,且可透過確定性方法比對。

  • 自訂函式指標:透過 Python 函式定義自己的指標。

以評量表為準的指標

以評量表為準的指標會在工作流程中納入大型語言模型,評估模型回覆的品質。以評量表為準的評估方式適用於各種工作,特別是寫作品質、安全性和指令遵循程度,這些通常難以透過確定性演算法評估。

自動調整式評量表

自適應評量表的功能類似於模型的單元測試。適應性評量表會針對資料集中的每個提示,動態產生一組專屬的通過或未通過測試。評分量表可確保評估結果與要求的工作相關,並提供客觀、可解釋且一致的結果。

以下範例說明如何為一組提示生成自適性評量表:

提示詞 自動調整式評量表
「Summarize the following article about the benefits of solar power in under 100 words…」(請在 100 字內總結下列文章,說明太陽能的優點…)
  • 摘要是否少於 100 字?
  • 摘要是否列出太陽能的優點?
  • 回覆內容是否包含文章中沒有的資訊?
「請撰寫簡短友善的電子郵件,邀請員工參加公司年度野餐活動。請提及日期為 9 月 15 日,並說明當天會提供素食選項…」
  • 電子郵件的語氣是否友善且具吸引力?
  • 電子郵件是否提及 9 月 15 日?
  • 電子郵件是否說明會提供素食料理?

您可以透過 SDK 存取自動調整式評量表。建議您從預設的 GENERAL_QUALITY 開始。

一般品質指標

GENERAL_QUALITY 會根據輸入提示,生成一組涵蓋各種工作的評量表,例如遵循指示、格式、語氣、風格等。您可以在下列程式碼行中,將評量準則生成與驗證功能結合:

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY,
    ],
)

您可以先分別生成評分量表 (以便在模型和代理程式之間審查或重複使用),再用來評估模型回覆:

from vertexai import types

# Use GENERAL_QUALITY recipe to generate rubrics, and store them
# as a rubric group named "general_quality_rubrics".
data_with_rubrics = client.evals.generate_rubrics(
    src=eval_dataset_df,
    rubric_group_name="general_quality_rubrics",
    predefined_spec_name=types.RubricMetric.GENERAL_QUALITY,
)

# Specify the group of rubrics to use for the evaluation.
eval_result = client.evals.evaluate(
    dataset=data_with_rubrics,
    metrics=[types.RubricMetric.GENERAL_QUALITY(
      rubric_group_name="general_quality_rubrics",
    )],
)

您也可以使用GENERAL_QUALITY自然語言guidelines引導 GENERAL_QUALITY,著重在對您最重要的評分標準上生成評量表。接著,Gen AI 評估服務會產生評量表,涵蓋預設工作和您指定的準則。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY(
            metric_spec_parameters={
                "guidelines": "The response must maintain a professional tone and must not provide financial advice."
            }
        )
    ],
)

目標品質指標

如要評估模型品質的特定面向,可以使用可產生評量表 (著重於特定領域) 的指標。例如:

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.TEXT_QUALITY,
        types.RubricMetric.INSTRUCTION_FOLLOWING,
    ],
)

Gen AI Evaluation Service 提供下列類型的適應性評量表:

  • INSTRUCTION_FOLLOWING:衡量回覆內容是否符合提示中的特定限制和指令。

  • TEXT_QUALITY:專門評估回覆的語言品質,包括流暢度、連貫性和文法。

多輪對話

  • multi_turn_general_quality:評估多輪對話的整體對話品質。

  • multi_turn_text_quality:評估多輪對話中回應的文字品質。

服務專員評估

  • final_response_reference_free:評估代理程式最終答案的品質,不需要參考答案。

如要進一步瞭解目標式自動調整評量表,請參閱「自動調整評量表詳細資料」。

靜態評分量表

靜態評量表會對資料集中的每個範例套用一組固定的評分指南。如果您需要根據所有提示的統一基準評估成效,這種以分數為導向的方法就非常實用。

舉例來說,以下靜態評分量表會以 1 到 5 分評估文字品質:

5: (Very good). Exceptionally clear, coherent, fluent, and concise. Fully adheres to instructions and stays grounded.
4: (Good). Well-written, coherent, and fluent. Mostly adheres to instructions and stays grounded. Minor room for improvement.
3: (Ok). Adequate writing with decent coherence and fluency. Partially fulfills instructions and may contain minor ungrounded information. Could be more concise.
2: (Bad). Poorly written, lacking coherence and fluency. Struggles to adhere to instructions and may include ungrounded information. Issues with conciseness.
1: (Very bad). Very poorly written, incoherent, and non-fluent. Fails to follow instructions and contains substantial ungrounded information. Severely lacking in conciseness.

Gen AI Evaluation Service 提供下列靜態評分標準指標:

  • GROUNDING:根據提供的來源文字 (事實根據) 檢查事實和一致性。這項指標對 RAG 系統至關重要。

  • SAFETY:評估模型回覆是否違反安全政策,例如仇恨言論或危險內容。

您也可以使用指標提示範本,例如 FLUENCY

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.SAFETY,
        types.RubricMetric.GROUNDING,
        types.RubricMetric.FLUENCY,
    ],
)

自訂靜態評量表

如有高度專業需求,可以自行建立靜態評量表。這種方法可提供最大程度的控制權,但您必須仔細設計評估提示,確保結果一致且可靠。建議您先使用附有GENERAL_QUALITY指引的評分標準,再自訂靜態評分標準。

# Define a custom metric to evaluate language simplicity
simplicity_metric = types.LLMMetric(
    name='language_simplicity',
    prompt_template=types.MetricPromptBuilder(
        instruction="Evaluate the story's simplicity for a 5-year-old.",
        criteria={
            "Vocabulary": "Uses simple words.",
            "Sentences": "Uses short sentences.",
        },
        rating_scores={
            "5": "Excellent: Very simple, ideal for a 5-year-old.",
            "4": "Good: Mostly simple, with minor complex parts.",
            "3": "Fair: Mix of simple and complex; may be challenging for a 5-year-old.",
            "2": "Poor: Largely too complex, with difficult words/sentences.",
            "1": "Very Poor: Very complex, unsuitable for a 5-year-old."
        }
    )
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        simplicity_metric
    ],
)

以運算為基礎的指標

以運算為基礎的指標會使用確定性演算法,比較模型的回應與參考答案,然後為模型的回應評分。這類指標需要資料集中的基準真相,非常適合「正確」答案定義明確的任務。

  • 喚回度導向的摘要評估研究 (rouge_l、rouge_1):評估模型回覆與參考文字之間 n 元語法 (連續字詞序列) 的重疊程度。通常用於評估文字摘要。

  • 雙語評估研究 (BLEU):計算相符的 n 元語法,評估回覆與高品質參考文字的相似程度。這是翻譯品質的標準指標,但也可用於其他文字生成工作。

  • 完全比對 (exact_match):測量與參考答案完全相同的回覆百分比。這項功能適用於回答事實類問題,或只能有一個正確答案的工作。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.Metric(name='bleu'),
        types.Metric(name='rouge_l'),
        types.Metric(name='exact_match')
    ],
)

自訂函式指標

您也可以將自訂 Python 函式傳遞至 custom_function 參數,實作自訂評估邏輯。Gen AI Evaluation Service 會針對資料集的每一列執行這項函式。

# Define a custom function to check for the presence of a keyword
def contains_keyword(instance: dict) -> dict:
    keyword = "magic"
    response_text = instance.get("response", "")
    score = 1.0 if keyword in response_text.lower() else 0.0
    return {"score": score}

keyword_metric = types.Metric(
    name="keyword_check",
    custom_function=contains_keyword
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[keyword_metric]
)

後續步驟