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_context_sufficient()
juiz predefinido avalia se o contexto recuperado pelo seu sistema RAG ou gerado por uma chamada de ferramenta contém informações suficientes para responder adequadamente à solicitação do usuário com base no rótulo de verdade básica fornecido como expected_facts
ou um expected_response
.
Este juiz está disponível através do pontuador predefinido RetrievalSufficiency
para avaliar os sistemas RAG, onde você precisa garantir que seu processo de recuperação esteja fornecendo todas as informações necessárias.
Assinatura da API
from mlflow.genai.judges import is_context_sufficient
def is_context_sufficient(
*,
request: str, # User's question or query
context: Any, # Context to evaluate for relevance, can be any Python primitive or a JSON-seralizable dict
expected_facts: Optional[list[str]], # List of expected facts (provide either expected_response or expected_facts)
expected_response: Optional[str] = None, # Ground truth response (provide either expected_response or expected_facts)
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_context_sufficient
# Example 1: Context contains sufficient information
feedback = is_context_sufficient(
request="What is the capital of France?",
context=[
{"content": "Paris is the capital of France."},
{"content": "Paris is known for its Eiffel Tower."}
],
expected_facts=["Paris is the capital of France."]
)
print(feedback.value) # "yes"
print(feedback.rationale) # Explanation of sufficiency
# Example 2: Context lacks necessary information
feedback = is_context_sufficient(
request="What are MLflow's components?",
context=[
{"content": "MLflow is an open-source platform."}
],
expected_facts=[
"MLflow has four main components",
"Components include Tracking",
"Components include Projects"
]
)
print(feedback.value) # "no"
print(feedback.rationale) # Explanation of what's missing
Usando o marcador pré-construído
O is_context_sufficient
juiz está disponível através do RetrievalSufficiency
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
-
Rótulos de verdade-base: Obrigatório - deve fornecer um
expected_facts
ouexpected_response
noexpectations
dicionário
import os
import mlflow
from openai import OpenAI
from mlflow.genai.scorers import RetrievalSufficiency
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 - some queries return insufficient context
if "capital of 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="France is a country in Western Europe.",
metadata={"source": "countries.txt"}
)
]
elif "mlflow components" in query.lower():
# Incomplete retrieval - missing some components
return [
Document(
id="doc_3",
page_content="MLflow has multiple components including Tracking and Projects.",
metadata={"source": "mlflow_intro.txt"}
)
]
else:
return [
Document(
id="doc_4",
page_content="General information about data science.",
metadata={"source": "ds_basics.txt"}
)
]
# Define your RAG app
@mlflow.trace
def rag_app(query: str):
# Retrieve documents
docs = retrieve_docs(query)
context = "\n".join([doc.page_content for doc in docs])
# Generate response
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 with ground truth
eval_dataset = [
{
"inputs": {"query": "What is the capital of France?"},
"expectations": {
"expected_facts": ["Paris is the capital of France."]
}
},
{
"inputs": {"query": "What are all the MLflow components?"},
"expectations": {
"expected_facts": [
"MLflow has four main components",
"Components include Tracking",
"Components include Projects",
"Components include Models",
"Components include Registry"
]
}
}
]
# Run evaluation with RetrievalSufficiency scorer
eval_results = mlflow.genai.evaluate(
data=eval_dataset,
predict_fn=rag_app,
scorers=[RetrievalSufficiency()]
)
Compreender os resultados
O RetrievalSufficiency
pontuador avalia cada segmento do recuperador separadamente. Irá:
- Retornar "sim" se os documentos recuperados contiverem todas as informações necessárias para gerar os fatos esperados
- Retorne "não" se os documentos recuperados estiverem faltando informações críticas, juntamente com uma justificativa explicando o que está faltando
Isso ajuda você a identificar quando seu sistema de recuperação não está conseguindo buscar todas as informações necessárias, o que é uma causa comum de respostas incompletas ou incorretas em aplicativos RAG.
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_sufficient
from mlflow.genai.scorers import scorer
from typing import Dict, Any
eval_dataset = [
{
"inputs": {"query": "What are the benefits of MLflow?"},
"outputs": {
"retrieved_context": [
{"content": "MLflow simplifies ML lifecycle management."},
{"content": "MLflow provides experiment tracking and model versioning."},
{"content": "MLflow enables easy model deployment."}
]
},
"expectations": {
"expected_facts": [
"MLflow simplifies ML lifecycle management",
"MLflow provides experiment tracking",
"MLflow enables model deployment"
]
}
},
{
"inputs": {"query": "How does MLflow handle model versioning?"},
"outputs": {
"retrieved_context": [
{"content": "MLflow is an open-source platform."}
]
},
"expectations": {
"expected_facts": [
"MLflow Model Registry handles versioning",
"Models can have multiple versions",
"Versions can be promoted through stages"
]
}
}
]
@scorer
def context_sufficiency_scorer(inputs: Dict[Any, Any], outputs: Dict[Any, Any], expectations: Dict[Any, Any]):
return is_context_sufficient(
request=inputs["query"],
context=outputs["retrieved_context"],
expected_facts=expectations["expected_facts"]
)
# Run evaluation
eval_results = mlflow.genai.evaluate(
data=eval_dataset,
scorers=[context_sufficiency_scorer]
)
Interpretação dos resultados
O juiz devolve um Feedback
objeto com:
-
value
: "sim" se o contexto for suficiente, "não" se for insuficiente -
rationale
: Explicação dos factos esperados cobertos ou ausentes no contexto
Próximas Etapas
- Avalie a relevância do contexto - Certifique-se de que os documentos recuperados são relevantes antes de verificar a suficiência
- Avaliar a fundamentação - Verifique se as respostas usam apenas o contexto fornecido
- Criar conjuntos de dados de avaliação - Crie conjuntos de dados de verdade de base com fatos esperados para teste