Defina critérios de sucesso e crie avaliações
Defina critérios de sucesso mensuráveis para sua aplicação com LLM e crie avaliações para testá-la, desde verificações de correspondência exata até avaliação baseada em LLM.
Construir uma aplicação bem-sucedida baseada em "large language model" (modelo de linguagem grande), ou LLM, começa com a definição clara dos seus critérios de sucesso e, em seguida, com o design de avaliações para medir o desempenho em relação a eles. Esse ciclo é central para a engenharia de prompts.
Defina seus critérios de sucesso
Bons critérios de sucesso são:
-
Específicos: Defina claramente o que você quer alcançar. Em vez de "bom desempenho", especifique "classificação precisa de sentimentos".
-
Mensuráveis: Use métricas quantitativas ou escalas qualitativas bem definidas. Números fornecem clareza e escalabilidade, mas medidas qualitativas podem ser valiosas se aplicadas de forma consistente junto com medidas quantitativas.
- Até mesmo tópicos "nebulosos", como ética e segurança, podem ser quantificados:
Critérios de segurança Ruim Saídas seguras Bom Menos de 0,1% das saídas em 10.000 testes sinalizadas por toxicidade pelo filtro de conteúdo.
Métricas quantitativas:
- Específicas da tarefa: F1 score, BLEU score, perplexidade
- Genéricas: Acurácia, precisão, recall
- Operacionais: Tempo de resposta (ms), uptime (%)
Métodos quantitativos:
- Testes A/B: Compare o desempenho com um modelo de referência ou uma versão anterior.
- Feedback do usuário: Medidas implícitas, como taxas de conclusão de tarefas.
- Análise de casos extremos: Porcentagem de casos extremos tratados sem erros.
Escalas qualitativas:
- Escalas Likert: "Avalie a coerência de 1 (sem sentido) a 5 (perfeitamente lógico)"
- Rubricas de especialistas: Linguistas avaliando a qualidade da tradução com base em critérios definidos
- Até mesmo tópicos "nebulosos", como ética e segurança, podem ser quantificados:
-
Alcançáveis: Baseie suas metas em benchmarks do setor, experimentos anteriores, pesquisas em IA ou conhecimento de especialistas. Suas métricas de sucesso não devem ser irrealistas em relação às capacidades atuais dos modelos de fronteira.
-
Relevantes: Alinhe seus critérios com o propósito da sua aplicação e as necessidades dos usuários. Uma alta precisão de citações pode ser crítica para aplicativos médicos, mas menos importante para chatbots casuais.
| Critérios | |
|---|---|
| Ruim | O modelo deve classificar sentimentos bem |
| Bom | O modelo de análise de sentimentos deve alcançar um F1 score de pelo menos 0,85 (Mensurável, Específico) em um conjunto de teste separado* de 10.000 posts diversos do Twitter (Relevante), o que representa uma melhoria de 5% em relação à linha de base atual (Alcançável). |
*Mais sobre conjuntos de teste separados na próxima seção.
Critérios de sucesso comuns
Aqui estão alguns critérios que podem ser importantes para o seu caso de uso. Esta lista não é exaustiva.
Quão bem o modelo precisa desempenhar a tarefa? Você também pode precisar considerar o tratamento de casos extremos, como quão bem o modelo precisa se sair com entradas raras ou desafiadoras.
Quão semelhantes as respostas do modelo precisam ser para tipos semelhantes de entrada? Se um usuário fizer a mesma pergunta duas vezes, quão importante é que ele receba respostas semanticamente semelhantes?
Quão bem o modelo aborda diretamente as perguntas ou instruções do usuário? Quão importante é que as informações sejam apresentadas de maneira lógica e fácil de acompanhar?
Quão bem o estilo de saída do modelo corresponde às expectativas? Quão apropriada é sua linguagem para o público-alvo?
Qual é uma métrica de sucesso para a forma como o modelo lida com informações pessoais ou sensíveis? Ele consegue seguir instruções para não usar ou compartilhar determinados detalhes?
Com que eficácia o modelo usa o contexto fornecido? Quão bem ele referencia e se baseia nas informações fornecidas em seu histórico?
Qual é o tempo de resposta aceitável para o modelo? Isso depende dos requisitos de tempo real da sua aplicação e das expectativas dos usuários.
Qual é o seu orçamento para executar o modelo? Considere fatores como o custo de cada chamada de API, o tamanho do modelo e a frequência de uso.
A maioria dos casos de uso precisa de avaliação multidimensional ao longo de vários critérios de sucesso.
| Critérios | |
|---|---|
| Ruim | O modelo deve classificar sentimentos bem |
| Bom | Em um conjunto de teste separado de 10.000 posts diversos do Twitter, o modelo de análise de sentimentos deve alcançar: - um F1 score de pelo menos 0,85 - 99,5% das saídas não são tóxicas - 90% dos erros causariam inconveniência, não erro grave* - 95% de tempo de resposta < 200ms |
*Na realidade, você também definiria o que "inconveniência" e "grave" significam.
Crie avaliações
Princípios de design de avaliações
- Seja específico à tarefa: Projete avaliações que espelhem a distribuição de tarefas do mundo real. Não se esqueça de considerar os casos extremos!
- Dados de entrada irrelevantes ou inexistentes
- Dados de entrada ou entrada do usuário excessivamente longos
- [Casos de uso de chat] Entrada do usuário ruim, prejudicial ou irrelevante
- Casos de teste ambíguos em que até mesmo humanos teriam dificuldade em chegar a um consenso de avaliação
- Automatize quando possível: Estruture as perguntas para permitir avaliação automatizada (por exemplo, múltipla escolha, correspondência de strings, avaliação por código, avaliação por LLM).
- Priorize volume em vez de qualidade: Mais perguntas com avaliação automatizada de sinal ligeiramente menor é melhor do que menos perguntas com avaliações de alta qualidade feitas manualmente por humanos.
Exemplos de avaliações
O que mede: Avaliações de correspondência exata medem se a saída do modelo corresponde a uma resposta correta predefinida, normalmente após normalizar espaços em branco e maiúsculas/minúsculas. É uma métrica simples e inequívoca, perfeita para tarefas com respostas categóricas e bem definidas, como análise de sentimentos (positivo, negativo, neutro).
Exemplos de casos de teste de avaliação: 1.000 tweets com sentimentos rotulados por humanos.
tweets = [
{"text": "This movie was a total waste of time. 👎", "sentiment": "negative"},
{"text": "The new album is 🔥! Been on repeat all day.", "sentiment": "positive"},
{
"text": "I just love it when my flight gets delayed for 5 hours. #bestdayever",
"sentiment": "negative",
}, # Edge case: Sarcasm
{
"text": "The movie's plot was terrible, but the acting was phenomenal.",
"sentiment": "mixed",
}, # Edge case: Mixed sentiment
# ... mais 996 tweets
]
client = anthropic.Anthropic()
def get_completion(prompt: str):
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=50,
messages=[{"role": "user", "content": prompt}],
)
return next(block.text for block in message.content if block.type == "text")
def evaluate_exact_match(model_output, correct_answer):
return model_output.strip().lower() == correct_answer.lower()
outputs = [
get_completion(
f"Classify this as 'positive', 'negative', 'neutral', or 'mixed': {tweet['text']}"
)
for tweet in tweets
]
accuracy = sum(
evaluate_exact_match(output, tweet["sentiment"])
for output, tweet in zip(outputs, tweets)
) / len(tweets)
print(f"Sentiment Analysis Accuracy: {accuracy * 100}%")O que mede: A similaridade de cosseno mede a similaridade entre dois vetores (neste caso, embeddings de sentenças da saída do modelo usando Sentence-BERT (SBERT)) calculando o cosseno do ângulo entre eles. Valores mais próximos de 1 indicam maior similaridade. É ideal para avaliar consistência porque perguntas semelhantes devem produzir respostas semanticamente semelhantes, mesmo que a redação varie.
Exemplos de casos de teste de avaliação: 50 grupos com algumas versões parafraseadas cada.
from sentence_transformers import SentenceTransformer
import numpy as np
faq_variations = [
{
"questions": [
"What's your return policy?",
"How can I return an item?",
"Wut's yur retrn polcy?",
],
"answer": "Our return policy allows...",
}, # Edge case: Typos
{
"questions": [
"I bought something last week, and it's not really what I expected, so I was wondering if maybe I could possibly return it?",
"I read online that your policy is 30 days but that seems like it might be out of date because the website was updated six months ago, so I'm wondering what exactly is your current policy?",
],
"answer": "Our return policy allows...",
}, # Edge case: Long, rambling question
{
"questions": [
"I'm Jane's cousin, and she said you guys have great customer service. Can I return this?",
"Reddit told me that contacting customer service this way was the fastest way to get an answer. I hope they're right! What is the return window for a jacket?",
],
"answer": "Our return policy allows...",
}, # Edge case: Irrelevant info
# ... mais 47 perguntas frequentes
]
client = anthropic.Anthropic()
def get_completion(prompt: str):
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}],
)
return next(block.text for block in message.content if block.type == "text")
def evaluate_cosine_similarity(outputs):
model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode(outputs)
norms = np.linalg.norm(embeddings, axis=1)
cosine_similarities = np.dot(embeddings, embeddings.T) / np.outer(norms, norms)
return np.mean(cosine_similarities)
for faq in faq_variations:
outputs = [get_completion(question) for question in faq["questions"]]
similarity_score = evaluate_cosine_similarity(outputs)
print(f"FAQ Consistency Score: {similarity_score * 100}%")O que mede: ROUGE-L (Recall-Oriented Understudy for Gisting Evaluation - Longest Common Subsequence) avalia a qualidade de resumos gerados. Ele mede o comprimento da maior subsequência comum entre os resumos candidato e de referência. Pontuações ROUGE-L altas indicam que o resumo gerado captura informações-chave em uma ordem coerente.
Exemplos de casos de teste de avaliação: 200 artigos com resumos de referência.
from rouge import Rouge
articles = [
{
"text": "In a groundbreaking study, researchers at MIT...",
"summary": "MIT scientists discover a new antibiotic...",
},
{
"text": "Jane Doe, a local hero, made headlines last week for saving... In city hall news, the budget... Meteorologists predict...",
"summary": "Community celebrates local hero Jane Doe while city grapples with budget issues.",
}, # Edge case: Multitopic
{
"text": "You won't believe what this celebrity did! ... extensive charity work ...",
"summary": "Celebrity's extensive charity work surprises fans",
}, # Edge case: Misleading title
# ... mais 197 artigos
]
client = anthropic.Anthropic()
def get_completion(prompt: str):
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return next(block.text for block in message.content if block.type == "text")
def evaluate_rouge_l(model_output, true_summary):
rouge = Rouge()
scores = rouge.get_scores(model_output, true_summary)
return scores[0]["rouge-l"]["f"] # ROUGE-L F1 score
outputs = [
get_completion(f"Summarize this article in 1-2 sentences:\n\n{article['text']}")
for article in articles
]
relevance_scores = [
evaluate_rouge_l(output, article["summary"])
for output, article in zip(outputs, articles)
]
print(f"Average ROUGE-L F1 Score: {sum(relevance_scores) / len(relevance_scores)}")