Udostępnij za pośrednictwem


Dostosowywanie sędziów LLM

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej.

W tym artykule opisano kilka technik, których można użyć do dostosowywania sędziów LLM używanych do oceny jakości i opóźnień aplikacji sztucznej inteligencji agenta. Obejmuje ona następujące techniki:

  • Tworzenie niestandardowych sędziów LLM.
  • Podaj kilka przykładów dla sędziów LLM.
  • Ocenianie aplikacji przy użyciu tylko podzbioru sędziów LLM.

Wybierz wbudowanych sędziów do działania

Domyślnie, dla każdego rekordu oceny, ocena agenta stosuje zestaw wbudowanych sędziów, którzy najlepiej dopasowują się do informacji znajdujących się w rekordzie. Można bezpośrednio określić sędziów dla każdego wniosku, używając argumentu evaluator_config z mlflow.evaluate(). Aby uzyskać szczegółowe informacje, zobacz Które sędziowie są uruchamiani.

Tworzenie niestandardowych sędziów LLM

Poniżej przedstawiono typowe przypadki użycia, w których sędziowie zdefiniowani przez klienta mogą być przydatni:

  • Oceń aplikację pod kątem kryteriów specyficznych dla twojego przypadku użycia biznesowego. Na przykład: .
    • Ocena, czy aplikacja generuje odpowiedzi zgodne z firmowym tonem głosu
    • Ustal, czy odpowiedź aplikacji zawsze jest zgodna z określonym formatem.
  • Testowanie i iterowanie na barierach zabezpieczających. Możesz użyć monitu strażnika w sędziego zdefiniowanego przez klienta i iterować w kierunku monitu, który działa dobrze. Następnie należy zaimplementować barierę chroniącą i użyć sędziego LLM, aby ocenić, jak często zabezpieczenia są lub nie działają.

Usługa Databricks odnosi się do tych przypadków użycia jako ocen. Istnieją dwa typy ocen LLM zdefiniowanych przez klienta:

Typ Co ocenia? Jak jest raportowany wynik?
Ocena odpowiedzi Sędzia LLM jest wzywany do każdej wygenerowanej odpowiedzi. Jeśli na przykład masz 5 pytań z odpowiednimi odpowiedziami, sędzia zostanie wywołany 5 razy (raz dla każdej odpowiedzi). Dla każdej odpowiedzi zgłaszana jest wartość yes lub no na podstawie kryteriów. yes dane wyjściowe są agregowane do wartości procentowej dla całego zestawu oceny.
Ocena pobierania Przeprowadź ocenę dla każdego pobranego fragmentu (jeśli aplikacja wykonuje pobieranie). Dla każdego pytania sędzia LLM jest wzywany do każdego fragmentu, który został pobrany dla tego pytania. Jeśli na przykład masz 5 pytań, a każdy z nich miał 3 pobrane fragmenty, sędzia zostanie nazwany 15 razy. Dla każdego fragmentu element yes lub no jest raportowany na podstawie kryteriów. Dla każdego pytania procent fragmentów yes jest zgłaszany jako precyzja. Precyzja na pytanie jest agregowana do średniej dokładności dla całego zestawu oceny.

Sędzia LLM zdefiniowany przez klienta można skonfigurować przy użyciu następujących parametrów:

Opcja Opis Wymagania
model Nazwa punktu końcowego punktu końcowego interfejsu API modelu foundation, który ma odbierać żądania dla tego niestandardowego sędziego. Punkt końcowy musi obsługiwać /llm/v1/chat podpis.
name Nazwa oceny, która jest również używana dla metryk wyjściowych.
judge_prompt Monit, który implementuje ocenę, ze zmiennymi ujętymi w nawiasy klamrowe. Na przykład "Oto definicja, która używa {request} i {response}".
metric_metadata Słownik zawierający dodatkowe parametry dla sędziego. W szczególności słownik musi zawierać element "assessment_type" z wartością "RETRIEVAL" lub "ANSWER" w celu określenia typu oceny.

Monit zawiera zmienne, które są zastępowane zawartością zestawu ewaluacyjnej przed wysłaniem do określonego endpoint_name elementu w celu pobrania odpowiedzi. Monit jest minimalnie opakowany w instrukcje formatowania, które analizują wynik liczbowy w [1,5] i uzasadnienie z danych wyjściowych sędziego. Przeanalizowany wynik jest następnie przekształcany w yes wartość , jeśli jest wyższa niż 3 i no w przeciwnym razie (zobacz poniższy przykładowy kod, aby metric_metadata zmienić domyślny próg 3). Monit powinien zawierać instrukcje dotyczące interpretacji tych różnych wyników, ale monit powinien unikać instrukcji określających format danych wyjściowych.

Obsługiwane są następujące zmienne:

Zmienna ANSWER ocena RETRIEVAL ocena
request Kolumna żądania zestawu danych oceny Kolumna żądania zestawu danych oceny
response Kolumna odpowiedzi zestawu danych oceny Kolumna odpowiedzi zestawu danych oceny
expected_response expected_response kolumna zestawu danych oceny expected_response kolumnie zestawu danych oceny
retrieved_context Łączenie zawartości z retrieved_context kolumny Pojedyncza zawartość w retrieved_context kolumnie

Ważne

W przypadku wszystkich sędziów niestandardowych ocena agenta zakłada, że yes odpowiada pozytywnej ocenie jakości. Oznacza to, że przykład, który przechodzi ocenę sędziego, powinien zawsze zwracać wartość yes. Na przykład sędzia powinien ocenić "czy odpowiedź jest bezpieczna?" lub "czy ton przyjazny i profesjonalny?", nie "czy odpowiedź zawiera niebezpieczny materiał?" lub "czy ton jest nieprofesjonalny?".

W poniższym przykładzie make_genai_metric_from_prompt platformy MLflow do określenia no_pii obiektu, który jest przekazywany do argumentu extra_metrics w mlflow.evaluate postaci listy podczas oceny.

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()

Udostępnianie przykładów wbudowanym sędziom LLM

Przykłady specyficzne dla domeny można przekazać do wbudowanych sędziów, podając kilka "yes" lub "no" przykłady dla każdego typu oceny. Te przykłady są określane jako przykłady niewielu strzałów i mogą pomóc wbudowanym sędziom lepiej dopasować się do kryteriów klasyfikacji specyficznych dla domeny. Zobacz Tworzenie przykładów z kilkoma zrzutami.

Usługa Databricks zaleca podanie co najmniej jednego "yes" i jednego "no" przykładu. Najlepsze przykłady to:

  • Przykłady, które sędziowie wcześniej się mylili, gdzie podano poprawną odpowiedź jako przykład.
  • Trudne przykłady, takie jak przykłady, które są zniuansowane lub trudne do określenia jako prawda lub fałsz.

Usługa Databricks zaleca również podanie uzasadnienia odpowiedzi. Pomaga to poprawić zdolność sędziego do wyjaśnienia jego rozumowania.

Aby przekazać kilka przykładów, należy utworzyć ramkę danych, która odzwierciedla dane wyjściowe mlflow.evaluate() odpowiednich sędziów. Oto przykład poprawności odpowiedzi, uziemienia i fragmentowania sędziów:


%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)

"""

Uwzględnij kilka przykładów strzałów w parametrze evaluator_config .mlflow.evaluate


evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)

Tworzenie przykładów z kilkoma zrzutami

Poniższe kroki to wskazówki dotyczące tworzenia zestawu skutecznych przykładów z kilkoma zrzutami.

  1. Spróbuj znaleźć grupy podobnych przykładów, które sędzia się myli.
  2. Dla każdej grupy wybierz pojedynczy przykład i dostosuj etykietę lub uzasadnienie, aby odzwierciedlić żądane zachowanie. Usługa Databricks zaleca podanie uzasadnienia, które wyjaśnia ocenę.
  3. Uruchom ponownie ocenę przy użyciu nowego przykładu.
  4. Powtórz zgodnie z potrzebami, aby kierować do różnych kategorii błędów.

Uwaga

Wiele przykładów z kilku strzałów może negatywnie wpłynąć na wydajność sędziego. Podczas oceny wymuszany jest limit pięciu przykładów kilku strzałów. Usługa Databricks zaleca użycie mniejszej liczby docelowych przykładów w celu uzyskania najlepszej wydajności.