Partilhar via


Resposta & Relevância do Contexto: julgador e sistemas de pontuação

O judges.is_context_relevant() juiz predefinido avalia se o contexto recuperado pelo seu sistema RAG ou gerado por uma chamada de ferramenta é relevante para a solicitação do usuário. Isso é crucial para diagnosticar problemas de qualidade - se o contexto não for relevante, a etapa de geração não pode produzir uma resposta útil.

Este juiz está disponível por meio de dois avaliadores predefinidos.

  • RelevanceToQuery: Avalia se a resposta do seu aplicativo aborda diretamente a entrada do usuário
  • RetrievalRelevance: Avalia se cada documento retornado pelo(s) recuperador(es) do seu aplicativo é relevante

Assinatura da API

from mlflow.genai.judges import is_context_relevant

def is_context_relevant(
    *,
    request: str,               # User's question or query
    context: Any,               # Context to evaluate for relevance, can be any Python primitive or a JSON-seralizable dict
    name: Optional[str] = None  # Optional custom name for display in the MLflow UIs
) -> mlflow.entities.Feedback:
    """Returns Feedback with 'yes' or 'no' value and a rationale"""

Pré-requisitos para executar os exemplos

  1. Instalar o MLflow e os pacotes necessários

    pip install --upgrade "mlflow[databricks]>=3.1.0" openai "databricks-connect>=16.1"
    
  2. Crie um experimento MLflow seguindo o início rápido de configuração do seu ambiente.

Uso direto do SDK

from mlflow.genai.judges import is_context_relevant

# Example 1: Relevant context
feedback = is_context_relevant(
    request="What is the capital of France?",
    context="Paris is the capital of France."
)
print(feedback.value)  # "yes"
print(feedback.rationale)  # Explanation of relevance

# Example 2: Irrelevant context
feedback = is_context_relevant(
    request="What is the capital of France?",
    context="Paris is known for its Eiffel Tower."
)
print(feedback.value)  # "no"
print(feedback.rationale)  # Explanation of why it's not relevant

Usando o marcador pré-construído

O is_context_relevant juiz está disponível através de dois marcadores pré-construídos:

1. RelevanceToQuery Artilheiro

Esse pontuador avalia se a resposta do seu aplicativo aborda diretamente a entrada do usuário sem se desviar para tópicos não relacionados.

Requisitos:

  • Requisitos de rastreamento: inputs e outputs devem estar no segmento raiz do rastreamento
from mlflow.genai.scorers import RelevanceToQuery

eval_dataset = [
    {
        "inputs": {"query": "What is the capital of France?"},
        "outputs": {
            "response": "Paris is the capital of France. It's known for the Eiffel Tower and is a major European city."
        },
    },
    {
        "inputs": {"query": "What is the capital of France?"},
        "outputs": {
            "response": "France is a beautiful country with great wine and cuisine."
        },
    }
]

# Run evaluation with RelevanceToQuery scorer
eval_results = mlflow.genai.evaluate(
    data=eval_dataset,
    scorers=[RelevanceToQuery()]
)

2. RetrievalRelevance Artilheiro

Esse pontuador avalia se cada documento retornado pelo(s) recuperador(es) do seu aplicativo é relevante para a solicitação de entrada.

Requisitos:

  • Requisitos de rastreamento: O MLflow Trace deve conter pelo menos um span com span_type definido como RETRIEVER
import mlflow
from mlflow.genai.scorers import RetrievalRelevance
from mlflow.entities import Document
from typing import List

# Define a retriever function with proper span type
@mlflow.trace(span_type="RETRIEVER")
def retrieve_docs(query: str) -> List[Document]:
    # Simulated retrieval - in practice, this would query a vector database
    if "capital" in query.lower() and "france" in query.lower():
        return [
            Document(
                id="doc_1",
                page_content="Paris is the capital of France.",
                metadata={"source": "geography.txt"}
            ),
            Document(
                id="doc_2",
                page_content="The Eiffel Tower is located in Paris.",
                metadata={"source": "landmarks.txt"}
            )
        ]
    else:
        return [
            Document(
                id="doc_3",
                page_content="Python is a programming language.",
                metadata={"source": "tech.txt"}
            )
        ]

# Define your app that uses the retriever
@mlflow.trace
def rag_app(query: str):
    docs = retrieve_docs(query)
    # In practice, you would pass these docs to an LLM
    return {"response": f"Found {len(docs)} relevant documents."}

# Create evaluation dataset
eval_dataset = [
    {
        "inputs": {"query": "What is the capital of France?"}
    },
    {
        "inputs": {"query": "How do I use Python?"}
    }
]

# Run evaluation with RetrievalRelevance scorer
eval_results = mlflow.genai.evaluate(
    data=eval_dataset,
    predict_fn=rag_app,
    scorers=[RetrievalRelevance()]
)

Usando num marcador personalizado

Ao avaliar aplicações com estruturas de dados diferentes dos requisitos do avaliador predefinido, envolva o avaliador em um avaliador personalizado:

from mlflow.genai.judges import is_context_relevant
from mlflow.genai.scorers import scorer
from typing import Dict, Any

eval_dataset = [
    {
        "inputs": {"query": "What are MLflow's main components?"},
        "outputs": {
            "retrieved_context": [
                {"content": "MLflow has four main components: Tracking, Projects, Models, and Registry."}
            ]
        }
    },
    {
        "inputs": {"query": "What are MLflow's main components?"},
        "outputs": {
            "retrieved_context": [
                {"content": "Python is a popular programming language."}
            ]
        }
    }
]

@scorer
def context_relevance_scorer(inputs: Dict[Any, Any], outputs: Dict[Any, Any]):
    # Extract first context chunk for evaluation
    context = outputs["retrieved_context"]
    return is_context_relevant(
        request=inputs["query"],
        context=context
    )

# Run evaluation
eval_results = mlflow.genai.evaluate(
    data=eval_dataset,
    scorers=[context_relevance_scorer]
)

Interpretação dos resultados

O juiz devolve um Feedback objeto com:

  • value: "sim" se o contexto for relevante, "não" se não
  • rationale: Explicação das razões pelas quais o contexto foi considerado relevante ou irrelevante

Próximas Etapas