Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O judges.is_grounded()
juiz predefinido avalia se a resposta do seu aplicativo é factualmente suportada pelo contexto fornecido (seja de um sistema RAG ou gerada por uma chamada de ferramenta), ajudando a detetar alucinações ou declarações não apoiadas por esse contexto.
Este juiz está disponível através do pontuador predefinido RetrievalGroundedness
para avaliar os pedidos de RAG que precisam garantir que as respostas sejam fundamentadas em informações recuperadas.
Assinatura da API
from mlflow.genai.judges import is_grounded
def is_grounded(
*,
request: str, # User's original query
response: str, # Application's response
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
Instalar o MLflow e os pacotes necessários
pip install --upgrade "mlflow[databricks]>=3.1.0"
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_grounded
# Example 1: Response is grounded in context
feedback = is_grounded(
request="What is the capital of France?",
response="Paris",
context=[
{"content": "Paris is the capital of France."},
{"content": "Paris is known for its Eiffel Tower."}
]
)
print(feedback.value) # "yes"
print(feedback.rationale) # Explanation of groundedness
# Example 2: Response contains hallucination
feedback = is_grounded(
request="What is the capital of France?",
response="Paris, which has a population of 10 million people",
context=[
{"content": "Paris is the capital of France."}
]
)
print(feedback.value) # "no"
print(feedback.rationale) # Identifies unsupported claim about population
Usando o marcador pré-construído
O is_grounded
juiz está disponível através do RetrievalGroundedness
avaliador pré-configurado.
Requisitos:
-
Requisitos de rastreamento:
- O MLflow Trace deve conter pelo menos um span com
span_type
definido comoRETRIEVER
-
inputs
eoutputs
devem estar no espaço da raiz do Trace
- O MLflow Trace deve conter pelo menos um span com
import os
import mlflow
from openai import OpenAI
from mlflow.genai.scorers import RetrievalGroundedness
from mlflow.entities import Document
from typing import List
mlflow.openai.autolog()
# Connect to a Databricks LLM via OpenAI using the same credentials as MLflow
# Alternatively, you can use your own OpenAI credentials here
mlflow_creds = mlflow.utils.databricks_utils.get_databricks_host_creds()
client = OpenAI(
api_key=cred.token,
base_url=f"{cred.host}/serving-endpoints"
)
# Define a retriever function with proper span type
@mlflow.trace(span_type="RETRIEVER")
def retrieve_docs(query: str) -> List[Document]:
# Simulated retrieval based on query
if "mlflow" in query.lower():
return [
Document(
id="doc_1",
page_content="MLflow is an open-source platform for managing the ML lifecycle.",
metadata={"source": "mlflow_docs.txt"}
),
Document(
id="doc_2",
page_content="MLflow provides tools for experiment tracking, model packaging, and deployment.",
metadata={"source": "mlflow_features.txt"}
)
]
else:
return [
Document(
id="doc_3",
page_content="Machine learning involves training models on data.",
metadata={"source": "ml_basics.txt"}
)
]
# Define your RAG app
@mlflow.trace
def rag_app(query: str):
# Retrieve relevant documents
docs = retrieve_docs(query)
context = "\n".join([doc.page_content for doc in docs])
# Generate response using LLM
messages = [
{"role": "system", "content": f"Answer based on this context: {context}"},
{"role": "user", "content": query}
]
response = client.chat.completions.create(
# This example uses Databricks hosted Claude. If you provide your own OpenAI credentials, replace with a valid OpenAI model e.g., gpt-4o, etc.
model="databricks-claude-3-7-sonnet",
messages=messages
)
return {"response": response.choices[0].message.content}
# Create evaluation dataset
eval_dataset = [
{
"inputs": {"query": "What is MLflow used for?"}
},
{
"inputs": {"query": "What are the main features of MLflow?"}
}
]
# Run evaluation with RetrievalGroundedness scorer
eval_results = mlflow.genai.evaluate(
data=eval_dataset,
predict_fn=rag_app,
scorers=[RetrievalGroundedness()]
)
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_grounded
from mlflow.genai.scorers import scorer
from typing import Dict, Any
eval_dataset = [
{
"inputs": {"query": "What is MLflow used for?"},
"outputs": {
"response": "MLflow is used for managing the ML lifecycle, including experiment tracking and model deployment.",
"retrieved_context": [
{"content": "MLflow is a platform for managing the ML lifecycle."},
{"content": "MLflow includes capabilities for experiment tracking, model packaging, and deployment."}
]
}
},
{
"inputs": {"query": "Who created MLflow?"},
"outputs": {
"response": "MLflow was created by Databricks in 2018 and has over 10,000 contributors.",
"retrieved_context": [
{"content": "MLflow was created by Databricks."},
{"content": "MLflow was open-sourced in 2018."}
]
}
}
]
@scorer
def groundedness_scorer(inputs: Dict[Any, Any], outputs: Dict[Any, Any]):
return is_grounded(
request=inputs["query"],
response=outputs["response"],
context=outputs["retrieved_context"]
)
# Run evaluation
eval_results = mlflow.genai.evaluate(
data=eval_dataset,
scorers=[groundedness_scorer]
)
Interpretação dos resultados
O juiz devolve um Feedback
objeto com:
-
value
: "sim" se a resposta estiver fundamentada, "não" se contiver alucinações -
rationale
: Explicação pormenorizada que identifica:- Que afirmações são suportadas pelo contexto
- Que afirmações carecem de apoio (alucinações)
- Citações específicas do contexto que apoiam ou contradizem as afirmações
Próximas Etapas
- Avalie a suficiência do contexto - Verifique se o seu retriever fornece informações adequadas
- Avaliar a relevância do contexto - Garantir que os documentos recuperados sejam relevantes para as consultas
- Execute uma avaliação RAG abrangente - Combine vários juízes para uma avaliação RAG completa