Popisek během vývoje

Při vytváření aplikace GenAI vám MLflow Tracing umožňuje přidávat zpětnou vazbu nebo očekávání přímo do tras. Můžete zaznamenávat problémy s kvalitou, označovat úspěšné příklady nebo přidávat poznámky pro budoucí referenci. To vám umožní sledovat kvalitu během vývoje před nastavením formálního hodnocení.

Požadavky

  • Vaše aplikace je vybavena nástroji pro trasování MLflow
  • Vygenerovali jste trasování spuštěním aplikace.

Přidání štítků hodnocení

Hodnocení připojují strukturovanou zpětnou vazbu, skóre nebo pravdivé hodnoty ke trasám a úsekům pro vyhodnocení a zlepšení kvality v MLflow.

Uživatelské rozhraní Databricks

Poznámky (popisky) můžete přidat přímo do trasování prostřednictvím uživatelského rozhraní MLflow.

Poznámka:

Pokud používáte poznámkový blok Databricks, můžete tyto kroky provést také v uživatelském rozhraní Trace, které je zobrazeno přímo v poznámkovém bloku.

lidská zpětná vazba

  1. V uživatelském rozhraní experimentu MLflow přejděte na kartu Traces.
  2. Otevřete jednotlivou stopu.
  3. V uživatelském rozhraní trasování klikněte na konkrétní rozsah, který chcete označit.
    • Výběrem kořenového spanu přiřadíte zpětnou vazbu k celé trase.
  4. Rozbalte záložku Hodnocení zcela vpravo.
  5. Vyplňte formulář a přidejte svůj názor.
    • Typ posouzení
      • Zpětná vazba: Subjektivní hodnocení kvality (hodnocení, komentáře)
      • Očekávání: Očekávaný výstup nebo hodnota (co by mělo být vytvořeno)
    • Název posouzení
      • Jedinečný název toho, čeho se zpětná vazba týká
    • Datový typ
      • Číslo
      • logický
      • Řetězec
    • Hodnota
      • Vaše hodnocení
    • Odůvodnění
      • Volitelné poznámky k hodnotě
  6. Kliknutím na Vytvořit uložíte popisek.
  7. Když se vrátíte na kartu Trasování, váš štítek se zobrazí jako nový sloupec.

MLflow SDK

Ke stopám můžete programově přidat popisky pomocí MLflow SDK. To je užitečné pro automatizované označování na základě logiky vaší aplikace nebo dávkové zpracování stop.

MLflow poskytuje dvě rozhraní API:

  • mlflow.log_feedback() – Zaznamená zpětnou vazbu, která vyhodnocuje skutečné výstupy nebo přechodné kroky vaší aplikace (například "Byla odpověď dobrá?", hodnocení, komentáře).
  • mlflow.log_expectation() – Zaznamená očekávání, která definují požadovaný nebo správný výsledek (základní pravdu), kterou by vaše aplikace měla vytvořit.
import mlflow
from mlflow.entities.assessment import (
    AssessmentSource,
    AssessmentSourceType,
    AssessmentError,
)


@mlflow.trace
def my_app(input: str) -> str:
    return input + "_output"


# Create a sample trace to demonstrate assessment logging
my_app(input="hello")

trace_id = mlflow.get_last_active_trace_id()

# Handle case where trace_id might be None
if trace_id is None:
    raise ValueError("No active trace found. Make sure to run a traced function first.")

print(f"Using trace_id: {trace_id}")


# =============================================================================
# LOG_FEEDBACK - Evaluating actual outputs and performance
# =============================================================================

# Example 1: Human rating (integer scale)
# Use case: Domain experts rating response quality on a 1-5 scale
mlflow.log_feedback(
    trace_id=trace_id,
    name="human_rating",
    value=4,  # int - rating scale feedback
    rationale="Human evaluator rating",
    source=AssessmentSource(
        source_type=AssessmentSourceType.HUMAN,
        source_id="evaluator@company.com",
    ),
)

# Example 2: LLM judge score (float for precise scoring)
# Use case: Automated quality assessment using LLM-as-a-judge
mlflow.log_feedback(
    trace_id=trace_id,
    name="llm_judge_score",
    value=0.85,  # float - precise scoring from 0.0 to 1.0
    rationale="LLM judge evaluation",
    source=AssessmentSource(
        source_type=AssessmentSourceType.LLM_JUDGE,
        source_id="gpt-4o-mini",
    ),
    metadata={"temperature": "0.1", "model_version": "2024-01"},
)

# Example 3: Binary feedback (boolean for yes/no assessments)
# Use case: Simple thumbs up/down or correct/incorrect evaluations
mlflow.log_feedback(
    trace_id=trace_id,
    name="is_helpful",
    value=True,  # bool - binary assessment
    rationale="Boolean assessment of helpfulness",
    source=AssessmentSource(
        source_type=AssessmentSourceType.HUMAN,
        source_id="reviewer@company.com",
    ),
)

# Example 4: Multi-category feedback (list for multiple classifications)
# Use case: Automated categorization or multi-label classification
mlflow.log_feedback(
    trace_id=trace_id,
    name="automated_categories",
    value=["helpful", "accurate", "concise"],  # list - multiple categories
    rationale="Automated categorization",
    source=AssessmentSource(
        source_type=AssessmentSourceType.CODE,
        source_id="classifier_v1.2",
    ),
)

# Example 5: Complex analysis with metadata (when you need structured context)
# Use case: Detailed automated analysis with multiple dimensions stored in metadata
mlflow.log_feedback(
    trace_id=trace_id,
    name="response_analysis_score",
    value=4.2,  # single score instead of dict - keeps value simple
    rationale="Analysis: 150 words, positive sentiment, includes examples, confidence 0.92",
    source=AssessmentSource(
        source_type=AssessmentSourceType.CODE,
        source_id="analyzer_v2.1",
    ),
    metadata={  # Use metadata for structured details
        "word_count": "150",
        "sentiment": "positive",
        "has_examples": "true",
        "confidence": "0.92",
    },
)

# Example 6: Error handling when evaluation fails
# Use case: Logging when automated evaluators fail due to API limits, timeouts, etc.
mlflow.log_feedback(
    trace_id=trace_id,
    name="failed_evaluation",
    source=AssessmentSource(
        source_type=AssessmentSourceType.LLM_JUDGE,
        source_id="gpt-4o",
    ),
    error=AssessmentError(  # Use error field when evaluation fails
        error_code="RATE_LIMIT_EXCEEDED",
        error_message="API rate limit exceeded during evaluation",
    ),
    metadata={"retry_count": "3", "error_timestamp": "2024-01-15T10:30:00Z"},
)

# =============================================================================
# LOG_EXPECTATION - Defining ground truth and desired outcomes
# =============================================================================

# Example 1: Simple text expectation (most common pattern)
# Use case: Defining the ideal response for factual questions
mlflow.log_expectation(
    trace_id=trace_id,
    name="expected_response",
    value="The capital of France is Paris.",  # Simple string - the "correct" answer
    source=AssessmentSource(
        source_type=AssessmentSourceType.HUMAN,
        source_id="content_curator@example.com",
    ),
)

# Example 2: Complex structured expectation (advanced pattern)
# Use case: Defining detailed requirements for response structure and content
mlflow.log_expectation(
    trace_id=trace_id,
    name="expected_response_structure",
    value={  # Complex dict - detailed specification of ideal response
        "entities": {
            "people": ["Marie Curie", "Pierre Curie"],
            "locations": ["Paris", "France"],
            "dates": ["1867", "1934"],
        },
        "key_facts": [
            "First woman to win Nobel Prize",
            "Won Nobel Prizes in Physics and Chemistry",
            "Discovered radium and polonium",
        ],
        "response_requirements": {
            "tone": "informative",
            "length_range": {"min": 100, "max": 300},
            "include_examples": True,
            "citations_required": False,
        },
    },
    source=AssessmentSource(
        source_type=AssessmentSourceType.HUMAN,
        source_id="content_strategist@example.com",
    ),
    metadata={
        "content_type": "biographical_summary",
        "target_audience": "general_public",
        "fact_check_date": "2024-01-15",
    },
)

# Example 3: Multiple acceptable answers (list pattern)
# Use case: When there are several valid ways to express the same fact
mlflow.log_expectation(
    trace_id=trace_id,
    name="expected_facts",
    value=[  # List of acceptable variations of the correct answer
        "Paris is the capital of France",
        "The capital city of France is Paris",
        "France's capital is Paris",
    ],
    source=AssessmentSource(
        source_type=AssessmentSourceType.HUMAN,
        source_id="qa_team@example.com",
    ),
)

Zobrazení posouzení v souhrnu

Databricks REST API

Vytvářejte hodnocení pomocí rozhraní DATAbricks REST API k programovému protokolování zpětné vazby a hodnocení trasování z libovolného prostředí.

Viz dokumentace k rozhraní REST API služby Databricks.

Koncový bod rozhraní REST API

POST https://<workspace-host>.databricks.com/api/3.0/mlflow/traces/{trace_id}/assessments

Příklad požadavku:

curl -X POST \
  "https://<workspace-host>.databricks.com/api/3.0/mlflow/traces/<trace-id>/assessments" \
  -H "Authorization: Bearer <databricks-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "assessment": {
      "assessment_name": "string",
      "create_time": "2019-08-24T14:15:22Z",
      "expectation": {
        "serialized_value": {
          "serialization_format": "string",
          "value": "string"
        },
        "value": {}
      },
      "feedback": {
        "error": {
          "error_code": "string",
          "error_message": "string",
          "stack_trace": "string"
        },
        "value": {}
      },
      "last_update_time": "2019-08-24T14:15:22Z",
      "metadata": {
        "property1": "string",
        "property2": "string"
      },
      "overrides": "string",
      "rationale": "string",
      "source": {
        "source_id": "string",
        "source_type": "HUMAN"
      },
      "span_id": "string",
      "valid": true
    }
  }'

Příklad odpovědi:

{
  "assessment": {
    "assessment_id": "string",
    "assessment_name": "string",
    "create_time": "2019-08-24T14:15:22Z",
    "expectation": {
      "serialized_value": {
        "serialization_format": "string",
        "value": "string"
      },
      "value": {}
    },
    "feedback": {
      "error": {
        "error_code": "string",
        "error_message": "string",
        "stack_trace": "string"
      },
      "value": {}
    },
    "last_update_time": "2019-08-24T14:15:22Z",
    "metadata": {
      "property1": "string",
      "property2": "string"
    },
    "overrides": "string",
    "rationale": "string",
    "source": {
      "source_id": "string",
      "source_type": "HUMAN"
    },
    "span_id": "string",
    "trace_id": "string",
    "valid": true
  }
}

Další zdroje informací

Referenční příručky

Projděte si podrobnou dokumentaci k konceptům a funkcím uvedeným v této příručce.