AI Evaluation Suite - Quick Reference
Purpose
Production AI systems require rigorous evaluation beyond traditional software testing. This skill provides comprehensive evaluation capabilities for LLM quality, RAG systems, agents, hallucination detection, bias assessment, cost optimization, and performance metrics.
When to Use This Skill
- Evaluating LLM outputs for quality and correctness
- A/B testing prompt variations
- Measuring RAG system retrieval accuracy
- Detecting hallucinations in generated content
- Assessing model bias and fairness
- Optimizing token usage and costs
- Comparing multiple LLM models
- Evaluating fine-tuned models vs base models
- Running standard benchmarks (MMLU, HumanEval, etc.)
- Implementing LLM-as-judge evaluation patterns
Core Concepts
Evaluation Pyramid
┌─────────────┐
│ Human Eval │ <- Gold standard but expensive
└──────┬──────┘
│
┌──────┴──────────┐
│ LLM-as-Judge │ <- Scalable proxy for human judgment
└──────┬──────────┘
│
┌──────┴──────────┐
│ Reference-Based │ <- BLEU, ROUGE, F1 (needs ground truth)
└──────┬──────────┘
│
┌──────┴──────────┐
│ Reference-Free │ <- Perplexity, consistency, coherence
└─────────────────┘
Key Metric Categories
- Quality: Coherence, Relevance, Factuality, Completeness, Conciseness
- Performance: Latency, Throughput, Token Usage, Cost, Error Rate
- Safety: Hallucination Rate, Bias Scores, Toxicity, PII Leakage
- Task-Specific: RAG (Precision/Recall), Agents (Success Rate), Code (Pass@k)
Documentation Structure
This skill is organized into 6 files:
- SKILL.md (this file) - Quick reference and essential patterns
- KNOWLEDGE.md - Evaluation theory, benchmarks, resources
- PATTERNS.md - 8 evaluation patterns with complete code
- GOTCHAS.md - Common pitfalls, metric limitations, edge cases
- EXAMPLES.md - Complete real-world evaluation scenarios
- REFERENCE.md - Comprehensive metrics reference
Quick Start: LLM Quality Evaluation
from dataclasses import dataclass
import anthropic
import numpy as np
@dataclass
class QualityMetrics:
coherence: float
relevance: float
factuality: float
completeness: float
conciseness: float
overall_score: float
class LLMQualityEvaluator:
def __init__(self, model="claude-3-5-sonnet-20241022"):
self.client = anthropic.Anthropic()
self.evaluator_model = model
def evaluate(self, query: str, output: str,
ground_truth: str = None) -> QualityMetrics:
"""Score output on 5 dimensions using LLM-as-judge"""
eval_prompt = f"""Evaluate this LLM output (score 0-10 each):
Query: {query}
Output: {output}
{f'Ground Truth: {ground_truth}' if ground_truth else ''}
Provide JSON: {{
"coherence": X,
"relevance": X,
"factuality": X,
"completeness": X,
"conciseness": X
}}"""
response = self.client.messages.create(
model=self.evaluator_model,
max_tokens=256,
messages=[{"role": "user", "content": eval_prompt}]
)
import json
scores = json.loads(response.content[0].text)
return QualityMetrics(
coherence=scores["coherence"] / 10.0,
relevance=scores["relevance"] / 10.0,
factuality=scores["factuality"] / 10.0,
completeness=scores["completeness"] / 10.0,
conciseness=scores["conciseness"] / 10.0,
overall_score=np.mean(list(scores.values())) / 10.0
)
# Usage
evaluator = LLMQualityEvaluator()
metrics = evaluator.evaluate(
query="Explain quantum entanglement",
output="Quantum entanglement occurs when particles..."
)
print(f"Quality Score: {metrics.overall_score:.2f}")
Quick Start: Hallucination Detection
class HallucinationDetector:
def __init__(self, model="claude-3-5-sonnet-20241022"):
self.client = anthropic.Anthropic()
self.model = model
def detect(self, context: str, generated_text: str) -> dict:
"""Compare output against source context"""
prompt = f"""Is this generated text supported by context? (0-100%)
Context: {context}
Generated: {generated_text}
Response: {{"supported_percentage": X}}"""
response = self.client.messages.create(
model=self.model,
max_tokens=100,
messages=[{"role": "user", "content": prompt}]
)
import json
result = json.loads(response.content[0].text)
return {
"hallucination_rate": 1 - (result["supported_percentage"] / 100),
"supported_percentage": result["supported_percentage"]
}
detector = HallucinationDetector()
result = detector.detect(
context="The Eiffel Tower is in Paris and 300m tall",
generated_text="The Eiffel Tower in Paris is 330m tall"
)
print(f"Hallucination Rate: {result['hallucination_rate']:.1%}")
Quick Start: RAG Evaluation
@dataclass
class RAGMetrics:
retrieval_precision: float
retrieval_recall: float
overall_score: float
class RAGEvaluator:
def evaluate_retrieval(self, query: str, retrieved: list,
relevant_ids: list) -> dict:
"""Score retrieval: precision, recall, MRR"""
retrieved_set = set(range(len(retrieved)))
relevant_set = set(relevant_ids)
precision = len(retrieved_set & relevant_set) / len(retrieved_set) or 0
recall = len(retrieved_set & relevant_set) / len(relevant_set) or 0
# Mean Reciprocal Rank
mrr = 0
for i, _ in enumerate(retrieved):
if i in relevant_ids:
mrr = 1 / (i + 1)
break
return {
"precision": precision,
"recall": recall,
"f1": 2 * (precision * recall) / (precision + recall) if (precision + recall) else 0,
"mrr": mrr
}
Quick Start: Prompt Engineering A/B Test
def compare_prompts(variants: list, test_cases: list) -> dict:
"""Compare prompt performance on test set"""
results = {}
for variant in variants:
scores = []
for case in test_cases:
prompt = variant["template"].format(**case)
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
score = evaluate_output(response.content[0].text)
scores.append(score)
results[variant["id"]] = {
"mean_score": np.mean(scores),
"std": np.std(scores)
}
return results
Quick Start: Cost Optimization
PRICING = {
"claude-3-5-sonnet-20241022": {"input": 3.0, "output": 15.0},
"claude-3-haiku-20240307": {"input": 0.25, "output": 1.25}
}
def calculate_cost(input_tokens: int, output_tokens: int, model: str) -> float:
pricing = PRICING.get(model)
return ((input_tokens / 1_000_000) * pricing["input"] +
(output_tokens / 1_000_000) * pricing["output"])
# Compare models on single prompt
for model in ["claude-3-5-sonnet-20241022", "claude-3-haiku-20240307"]:
response = client.messages.create(model=model, max_tokens=256, ...)
cost = calculate_cost(response.usage.input_tokens,
response.usage.output_tokens, model)
print(f"{model}: ${cost:.4f}")
Best Practices
DO's
- Use multiple metrics - combine reference-based, reference-free, LLM-as-judge
- Establish baselines - track metrics over time
- Test diverse data - cover edge cases, domains, lengths
- Automate evaluation - integrate into CI/CD
- Calibrate judges - validate LLM judges against humans
- Monitor production - continuous evaluation on real queries
- Version everything - track prompts, models, datasets
- Set thresholds - define acceptable ranges
- Use held-out data - never evaluate on training data
- Document methodology - for reproducibility
DON'Ts
- Don't trust single metrics - BLEU/ROUGE alone insufficient
- Don't ignore edge cases - rare inputs reveal issues
- Don't overfit to benchmarks - high MMLU ≠ production-ready
- Don't skip human eval - periodically validate
- Don't forget cost - quality/cost tradeoff critical
- Don't ignore latency - response time matters for UX
- Don't test only happy paths - test failures, adversarial inputs
- Don't use stale benchmarks - models may have seen test data
- Don't evaluate in isolation - consider entire system
- Don't forget fairness - evaluate across demographic groups
8 Core Evaluation Patterns
See PATTERNS.md for complete implementations:
- LLM Output Quality - Coherence, relevance, factuality, completeness, conciseness
- Prompt Engineering - A/B test variants with cost/quality tradeoff
- RAG Systems - Retrieval + context + generation evaluation
- Hallucination Detection - Fact-checking, consistency, claim verification
- Bias & Fairness - Demographic parity, sentiment disparity metrics
- Cost Optimization - Token usage analysis, model comparison, optimization
- Performance Metrics - Latency (p50, p95, p99), throughput, load testing
- Benchmarks - MMLU, HumanEval, GSM8K benchmark implementations
Common Pitfalls
See GOTCHAS.md for detailed coverage:
- Benchmark overfitting and data contamination
- Metric-human judgment mismatch
- Hallucination detection challenges
- Bias and fairness assessment pitfalls
- Evaluation dataset size limitations
- Prompt sensitivity and context window issues
Metrics Reference
See REFERENCE.md for:
Text Metrics: BLEU, ROUGE-1/2/L, BERTScore, METEOR, perplexity, MAUVE
Ranking Metrics: Precision, Recall, F1, MRR, nDCG
LLM-as-Judge: G-Eval, Prometheus, AlpacaEval patterns
Task-Specific: Pass@k (code), Exact Match (QA), SacreBLEU (translation)
Knowledge Resources
See KNOWLEDGE.md for:
- Evaluation frameworks (HELM, LangSmith, Ragas, OpenAI Evals)
- Benchmarks (MMLU, HumanEval, MBPP, TruthfulQA, BBH, GSM8K, BEIR)
- LLM-as-judge resources and patterns
- Bias/fairness datasets and frameworks
- Production monitoring platforms
- Tool recommendations and libraries
Complete Examples
See EXAMPLES.md for:
- Building evaluation datasets from scratch
- Complete end-to-end evaluation workflows
- Production integration (CI/CD pipelines)
- Monitoring dashboards and reporting
- Cost tracking and analysis
Related Skills
codebase-onboarding-analyzer - Analyze AI-generated code quality
gap-analysis-framework - Identify evaluation coverage gaps
evaluation-reporting-framework - Generate detailed evaluation reports
orchestration-coordination-framework - Coordinate complex evaluation workflows
security-scanning-suite - Security evaluation for AI systems
Key Concepts at a Glance
Evaluation Approaches
- Reference-based: BLEU, ROUGE (need ground truth)
- Reference-free: Perplexity, consistency (no ground truth)
- LLM-as-judge: Scalable, flexible, but needs calibration
- Human eval: Gold standard, expensive, slow
Common Metrics
- Quality: Coherence, Relevance, Factuality, Completeness, Conciseness
- Performance: Latency (p50/p95/p99), Throughput (req/sec), Token count
- Safety: Hallucination rate, Bias score, Toxicity, PII leakage
Key Benchmarks
- MMLU: 57 subjects of general knowledge, 15K questions
- HumanEval: 164 coding problems, Pass@k metric
- GSM8K: 8.5K grade school math problems
- TruthfulQA: 817 questions testing truthfulness
- HellaSwag: 70K commonsense reasoning examples
Critical Pitfalls
- Benchmark overfitting (high score ≠ production-ready)
- Metric mismatch (BLEU/ROUGE don't correlate with human judgment)
- Hallucination blindness (LLMs sound confident when wrong)
- Prompt sensitivity (tiny changes cause large variance)
- Distribution shift (eval data differs from production)
Best Practice Workflow
- Define evaluation dimensions (quality, performance, safety)
- Establish baselines on existing systems
- Create diverse evaluation datasets
- Use multiple complementary metrics
- Automate evaluation in CI/CD
- Monitor production continuously
- Regular human eval for calibration
- Document methodology for reproducibility
1---2name: ai-evaluation-suite3description: Comprehensive AI/LLM evaluation toolkit for production AI systems. Covers LLM output quality, prompt engineering, RAG evaluation, agent performance, hallucination detection, bias assessment, cost/token optimization, latency metrics, model comparison, and fine-tuning evaluation. Includes BLEU/ROUGE metrics, perplexity, F1 scores, LLM-as-judge patterns, and benchmarks like MMLU and HumanEval.4---5
6# AI Evaluation Suite - Quick Reference
7
8## Purpose
9
10Production AI systems require rigorous evaluation beyond traditional software testing. This skill provides comprehensive evaluation capabilities for LLM quality, RAG systems, agents, hallucination detection, bias assessment, cost optimization, and performance metrics.
11
12## When to Use This Skill
13
14- Evaluating LLM outputs for quality and correctness
15- A/B testing prompt variations
16- Measuring RAG system retrieval accuracy
17- Detecting hallucinations in generated content
18- Assessing model bias and fairness
19- Optimizing token usage and costs
20- Comparing multiple LLM models
21- Evaluating fine-tuned models vs base models
22- Running standard benchmarks (MMLU, HumanEval, etc.)
23- Implementing LLM-as-judge evaluation patterns
24
25## Core Concepts
26
27### Evaluation Pyramid
28
29```
30 ┌─────────────┐
31 │ Human Eval │ <- Gold standard but expensive
32 └──────┬──────┘
33 │
34 ┌──────┴──────────┐
35 │ LLM-as-Judge │ <- Scalable proxy for human judgment
36 └──────┬──────────┘
37 │
38 ┌──────┴──────────┐
39 │ Reference-Based │ <- BLEU, ROUGE, F1 (needs ground truth)
40 └──────┬──────────┘
41 │
42 ┌──────┴──────────┐
43 │ Reference-Free │ <- Perplexity, consistency, coherence
44 └─────────────────┘
45```
46
47### Key Metric Categories
48
49- **Quality**: Coherence, Relevance, Factuality, Completeness, Conciseness
50- **Performance**: Latency, Throughput, Token Usage, Cost, Error Rate
51- **Safety**: Hallucination Rate, Bias Scores, Toxicity, PII Leakage
52- **Task-Specific**: RAG (Precision/Recall), Agents (Success Rate), Code (Pass@k)
53
54## Documentation Structure
55
56This skill is organized into 6 files:
571. **SKILL.md** (this file) - Quick reference and essential patterns
582. **KNOWLEDGE.md** - Evaluation theory, benchmarks, resources
593. **PATTERNS.md** - 8 evaluation patterns with complete code
604. **GOTCHAS.md** - Common pitfalls, metric limitations, edge cases
615. **EXAMPLES.md** - Complete real-world evaluation scenarios
626. **REFERENCE.md** - Comprehensive metrics reference
63
64## Quick Start: LLM Quality Evaluation
65
66```python
67from dataclasses import dataclass
68import anthropic
69import numpy as np
70
71@dataclass
72class QualityMetrics:
73 coherence: float
74 relevance: float
75 factuality: float
76 completeness: float
77 conciseness: float
78 overall_score: float
79
80class LLMQualityEvaluator:
81 def __init__(self, model="claude-3-5-sonnet-20241022"):
82 self.client = anthropic.Anthropic()
83 self.evaluator_model = model
84
85 def evaluate(self, query: str, output: str,
86 ground_truth: str = None) -> QualityMetrics:
87 """Score output on 5 dimensions using LLM-as-judge"""
88
89 eval_prompt = f"""Evaluate this LLM output (score 0-10 each):
90Query: {query}
91Output: {output}
92{f'Ground Truth: {ground_truth}' if ground_truth else ''}
93
94Provide JSON: {{
95 "coherence": X,
96 "relevance": X,
97 "factuality": X,
98 "completeness": X,
99 "conciseness": X
100}}"""
101
102 response = self.client.messages.create(
103 model=self.evaluator_model,
104 max_tokens=256,
105 messages=[{"role": "user", "content": eval_prompt}]
106 )
107
108 import json
109 scores = json.loads(response.content[0].text)
110
111 return QualityMetrics(
112 coherence=scores["coherence"] / 10.0,
113 relevance=scores["relevance"] / 10.0,
114 factuality=scores["factuality"] / 10.0,
115 completeness=scores["completeness"] / 10.0,
116 conciseness=scores["conciseness"] / 10.0,
117 overall_score=np.mean(list(scores.values())) / 10.0
118 )
119
120# Usage
121evaluator = LLMQualityEvaluator()
122metrics = evaluator.evaluate(
123 query="Explain quantum entanglement",
124 output="Quantum entanglement occurs when particles..."
125)
126print(f"Quality Score: {metrics.overall_score:.2f}")
127```
128
129## Quick Start: Hallucination Detection
130
131```python
132class HallucinationDetector:
133 def __init__(self, model="claude-3-5-sonnet-20241022"):
134 self.client = anthropic.Anthropic()
135 self.model = model
136
137 def detect(self, context: str, generated_text: str) -> dict:
138 """Compare output against source context"""
139
140 prompt = f"""Is this generated text supported by context? (0-100%)
141Context: {context}
142Generated: {generated_text}
143Response: {{"supported_percentage": X}}"""
144
145 response = self.client.messages.create(
146 model=self.model,
147 max_tokens=100,
148 messages=[{"role": "user", "content": prompt}]
149 )
150
151 import json
152 result = json.loads(response.content[0].text)
153 return {
154 "hallucination_rate": 1 - (result["supported_percentage"] / 100),
155 "supported_percentage": result["supported_percentage"]
156 }
157
158detector = HallucinationDetector()
159result = detector.detect(
160 context="The Eiffel Tower is in Paris and 300m tall",
161 generated_text="The Eiffel Tower in Paris is 330m tall"
162)
163print(f"Hallucination Rate: {result['hallucination_rate']:.1%}")
164```
165
166## Quick Start: RAG Evaluation
167
168```python
169@dataclass
170class RAGMetrics:
171 retrieval_precision: float
172 retrieval_recall: float
173 overall_score: float
174
175class RAGEvaluator:
176 def evaluate_retrieval(self, query: str, retrieved: list,
177 relevant_ids: list) -> dict:
178 """Score retrieval: precision, recall, MRR"""
179 retrieved_set = set(range(len(retrieved)))
180 relevant_set = set(relevant_ids)
181
182 precision = len(retrieved_set & relevant_set) / len(retrieved_set) or 0
183 recall = len(retrieved_set & relevant_set) / len(relevant_set) or 0
184
185 # Mean Reciprocal Rank
186 mrr = 0
187 for i, _ in enumerate(retrieved):
188 if i in relevant_ids:
189 mrr = 1 / (i + 1)
190 break
191
192 return {
193 "precision": precision,
194 "recall": recall,
195 "f1": 2 * (precision * recall) / (precision + recall) if (precision + recall) else 0,
196 "mrr": mrr
197 }
198```
199
200## Quick Start: Prompt Engineering A/B Test
201
202```python
203def compare_prompts(variants: list, test_cases: list) -> dict:
204 """Compare prompt performance on test set"""
205 results = {}
206
207 for variant in variants:
208 scores = []
209 for case in test_cases:
210 prompt = variant["template"].format(**case)
211 response = client.messages.create(
212 model="claude-3-5-sonnet-20241022",
213 max_tokens=1024,
214 messages=[{"role": "user", "content": prompt}]
215 )
216 score = evaluate_output(response.content[0].text)
217 scores.append(score)
218
219 results[variant["id"]] = {
220 "mean_score": np.mean(scores),
221 "std": np.std(scores)
222 }
223
224 return results
225```
226
227## Quick Start: Cost Optimization
228
229```python
230PRICING = {
231 "claude-3-5-sonnet-20241022": {"input": 3.0, "output": 15.0},
232 "claude-3-haiku-20240307": {"input": 0.25, "output": 1.25}
233}
234
235def calculate_cost(input_tokens: int, output_tokens: int, model: str) -> float:
236 pricing = PRICING.get(model)
237 return ((input_tokens / 1_000_000) * pricing["input"] +
238 (output_tokens / 1_000_000) * pricing["output"])
239
240# Compare models on single prompt
241for model in ["claude-3-5-sonnet-20241022", "claude-3-haiku-20240307"]:
242 response = client.messages.create(model=model, max_tokens=256, ...)
243 cost = calculate_cost(response.usage.input_tokens,
244 response.usage.output_tokens, model)
245 print(f"{model}: ${cost:.4f}")
246```
247
248## Best Practices
249
250### DO's
2511. Use multiple metrics - combine reference-based, reference-free, LLM-as-judge
2522. Establish baselines - track metrics over time
2533. Test diverse data - cover edge cases, domains, lengths
2544. Automate evaluation - integrate into CI/CD
2555. Calibrate judges - validate LLM judges against humans
2566. Monitor production - continuous evaluation on real queries
2577. Version everything - track prompts, models, datasets
2588. Set thresholds - define acceptable ranges
2599. Use held-out data - never evaluate on training data
26010. Document methodology - for reproducibility
261
262### DON'Ts
2631. Don't trust single metrics - BLEU/ROUGE alone insufficient
2642. Don't ignore edge cases - rare inputs reveal issues
2653. Don't overfit to benchmarks - high MMLU ≠ production-ready
2664. Don't skip human eval - periodically validate
2675. Don't forget cost - quality/cost tradeoff critical
2686. Don't ignore latency - response time matters for UX
2697. Don't test only happy paths - test failures, adversarial inputs
2708. Don't use stale benchmarks - models may have seen test data
2719. Don't evaluate in isolation - consider entire system
27210. Don't forget fairness - evaluate across demographic groups
273
274## 8 Core Evaluation Patterns
275
276See **PATTERNS.md** for complete implementations:
277
2781. **LLM Output Quality** - Coherence, relevance, factuality, completeness, conciseness
2792. **Prompt Engineering** - A/B test variants with cost/quality tradeoff
2803. **RAG Systems** - Retrieval + context + generation evaluation
2814. **Hallucination Detection** - Fact-checking, consistency, claim verification
2825. **Bias & Fairness** - Demographic parity, sentiment disparity metrics
2836. **Cost Optimization** - Token usage analysis, model comparison, optimization
2847. **Performance Metrics** - Latency (p50, p95, p99), throughput, load testing
2858. **Benchmarks** - MMLU, HumanEval, GSM8K benchmark implementations
286
287## Common Pitfalls
288
289See **GOTCHAS.md** for detailed coverage:
290- Benchmark overfitting and data contamination
291- Metric-human judgment mismatch
292- Hallucination detection challenges
293- Bias and fairness assessment pitfalls
294- Evaluation dataset size limitations
295- Prompt sensitivity and context window issues
296
297## Metrics Reference
298
299See **REFERENCE.md** for:
300
301**Text Metrics**: BLEU, ROUGE-1/2/L, BERTScore, METEOR, perplexity, MAUVE
302
303**Ranking Metrics**: Precision, Recall, F1, MRR, nDCG
304
305**LLM-as-Judge**: G-Eval, Prometheus, AlpacaEval patterns
306
307**Task-Specific**: Pass@k (code), Exact Match (QA), SacreBLEU (translation)
308
309## Knowledge Resources
310
311See **KNOWLEDGE.md** for:
312- Evaluation frameworks (HELM, LangSmith, Ragas, OpenAI Evals)
313- Benchmarks (MMLU, HumanEval, MBPP, TruthfulQA, BBH, GSM8K, BEIR)
314- LLM-as-judge resources and patterns
315- Bias/fairness datasets and frameworks
316- Production monitoring platforms
317- Tool recommendations and libraries
318
319## Complete Examples
320
321See **EXAMPLES.md** for:
322- Building evaluation datasets from scratch
323- Complete end-to-end evaluation workflows
324- Production integration (CI/CD pipelines)
325- Monitoring dashboards and reporting
326- Cost tracking and analysis
327
328## Related Skills
329
330- `codebase-onboarding-analyzer` - Analyze AI-generated code quality
331- `gap-analysis-framework` - Identify evaluation coverage gaps
332- `evaluation-reporting-framework` - Generate detailed evaluation reports
333- `orchestration-coordination-framework` - Coordinate complex evaluation workflows
334- `security-scanning-suite` - Security evaluation for AI systems
335
336## Key Concepts at a Glance
337
338**Evaluation Approaches**
339- Reference-based: BLEU, ROUGE (need ground truth)
340- Reference-free: Perplexity, consistency (no ground truth)
341- LLM-as-judge: Scalable, flexible, but needs calibration
342- Human eval: Gold standard, expensive, slow
343
344**Common Metrics**
345- Quality: Coherence, Relevance, Factuality, Completeness, Conciseness
346- Performance: Latency (p50/p95/p99), Throughput (req/sec), Token count
347- Safety: Hallucination rate, Bias score, Toxicity, PII leakage
348
349**Key Benchmarks**
350- MMLU: 57 subjects of general knowledge, 15K questions
351- HumanEval: 164 coding problems, Pass@k metric
352- GSM8K: 8.5K grade school math problems
353- TruthfulQA: 817 questions testing truthfulness
354- HellaSwag: 70K commonsense reasoning examples
355
356**Critical Pitfalls**
357- Benchmark overfitting (high score ≠ production-ready)
358- Metric mismatch (BLEU/ROUGE don't correlate with human judgment)
359- Hallucination blindness (LLMs sound confident when wrong)
360- Prompt sensitivity (tiny changes cause large variance)
361- Distribution shift (eval data differs from production)
362
363**Best Practice Workflow**
3641. Define evaluation dimensions (quality, performance, safety)
3652. Establish baselines on existing systems
3663. Create diverse evaluation datasets
3674. Use multiple complementary metrics
3685. Automate evaluation in CI/CD
3696. Monitor production continuously
3707. Regular human eval for calibration
3718. Document methodology for reproducibility