/evals
/evals
LiteLLM Proxy는 OpenAI의 Evaluations (Evals) API를 지원하여, 정의된 테스트 기준에 대해 모델 성능을 측정하는 평가를 생성·관리·실행할 수 있게 해줍니다.
Evals란 무엇인가?
OpenAI Evals API는 다음을 위한 구조화된 방법을 제공합니다:
- 평가 생성 (Create Evaluations) : 모델 출력을 평가하기 위한 테스트 기준과 데이터 소스 정의
- 평가 실행 (Run Evaluations) : 특정 모델과 데이터셋에 대해 평가 실행
- 결과 추적 (Track Results) : 평가 진행 상황 모니터링 및 상세 결과 검토
빠른 시작
LiteLLM Proxy 설정
먼저 LiteLLM Proxy 서버를 시작하세요:
litellm --config config.yaml
# Proxy will run on http://localhost:4000
OpenAI 클라이언트 초기화
from openai import OpenAI
# Point to your LiteLLM Proxy
client = OpenAI(
api_key="sk-<your-litellm-api-key>", # Your LiteLLM proxy API key
base_url="http://localhost:4000" # Your proxy URL
)
비동기 작업의 경우:
from openai import AsyncOpenAI
client = AsyncOpenAI(
api_key="sk-<your-litellm-api-key>",
base_url="http://localhost:4000"
)
출처: 문서
본문
평가 관리 (Evaluation Management)
평가 생성
테스트 기준과 데이터 소스 구성으로 평가를 생성합니다.
예시: 감정 분류 평가
from openai import OpenAI
client = OpenAI(
api_key="sk-<your-litellm-api-key>",
base_url="http://localhost:4000"
)
# Create evaluation with label model grader
eval_obj = client.evals.create(
name="Sentiment Classification",
data_source_config={
"type": "stored_completions",
"metadata": {"usecase": "chatbot"}
},
testing_criteria=[
{
"type": "label_model",
"model": "gpt-5.6-luna",
"input": [
{
"role": "developer",
"content": "Classify the sentiment of the following statement as one of 'positive', 'neutral', or 'negative'"
},
{
"role": "user",
"content": "Statement: {{item.input}}"
}
],
"passing_labels": ["positive"],
"labels": ["positive", "neutral", "negative"],
"name": "Sentiment Grader"
}
]
)
# Note: If you want to use model-specific credentials for this evaluation, you can specify the model name in the extra body parameters.
print(f"Created eval: {eval_obj.id}")
print(f"Eval name: {eval_obj.name}")
예시: 푸시 알림 요약자 모니터링
이 예시는 푸시 알림 요약자에서 프롬프트 변경으로 인한 회귀(regression)를 모니터링하는 방법을 보여줍니다:
from openai import AsyncOpenAI
client = AsyncOpenAI(
api_key="sk-<your-litellm-api-key>",
base_url="http://localhost:4000"
)
# Define data source for stored completions
data_source_config = {
"type": "stored_completions",
"metadata": {
"usecase": "push_notifications_summarizer"
}
}
# Define grader criteria
GRADER_DEVELOPER_PROMPT = """
Label the following push notification summary as either correct or incorrect.
The push notification and the summary will be provided below.
A good push notification summary is concise and snappy.
If it is good, then label it as correct, if not, then incorrect.
"""
GRADER_TEMPLATE_PROMPT = """
Push notifications: {{item.input}}
Summary: {{sample.output_text}}
"""
push_notification_grader = {
"name": "Push Notification Summary Grader",
"type": "label_model",
"model": "gpt-5.6-luna",
"input": [
{
"role": "developer",
"content": GRADER_DEVELOPER_PROMPT,
},
{
"role": "user",
"content": GRADER_TEMPLATE_PROMPT,
},
],
"passing_labels": ["correct"],
"labels": ["correct", "incorrect"],
}
# Create the evaluation
eval_result = await client.evals.create(
name="Push Notification Completion Monitoring",
metadata={"description": "This eval monitors completions"},
data_source_config=data_source_config,
testing_criteria=[push_notification_grader],
)
eval_id = eval_result.id
print(f"Created eval: {eval_id}")
평가 목록
페이지네이션 지원으로 모든 평가 목록을 가져옵니다.
# List all evaluations
evals_response = client.evals.list(
limit=20,
order="desc"
)
for eval in evals_response.data:
print(f"Eval ID: {eval.id}, Name: {eval.name}")
# Check if there are more evals
if evals_response.has_more:
# Fetch next page
next_evals = client.evals.list(
after=evals_response.last_id,
limit=20
)
특정 평가 가져오기
ID로 특정 평가의 세부 정보를 가져옵니다.
eval = client.evals.retrieve(
eval_id="eval_abc123"
)
print(f"Eval ID: {eval.id}")
print(f"Name: {eval.name}")
print(f"Data Source: {eval.data_source_config}")
print(f"Testing Criteria: {eval.testing_criteria}")
평가 업데이트
평가 메타데이터나 이름을 업데이트합니다.
updated_eval = client.evals.update(
eval_id="eval_abc123",
name="Updated Evaluation Name",
metadata={
"version": "2.0",
"updated_by": "[email protected]"
}
)
print(f"Updated eval: {updated_eval.name}")
평가 삭제
평가를 영구 삭제합니다.
delete_response = client.evals.delete(
eval_id="eval_abc123"
)
print(f"Deleted: {delete_response.deleted}") # True
평가 실행 (Evaluation Runs)
실행 생성
실행을 만들어 평가를 실행합니다. 실행은 데이터를 모델로 처리하고 테스트 기준을 적용합니다.
저장된 컴플리션 사용
먼저 메타데이터로 채팅 컴플리션을 만들어 테스트 데이터를 생성합니다:
from openai import AsyncOpenAI
import asyncio
client = AsyncOpenAI(
api_key="sk-<your-litellm-api-key>",
base_url="http://localhost:4000"
)
# Generate test data with different prompt versions
push_notification_data = [
"""
- New message from Sarah: "Can you call me later?"
- Your package has been delivered!
- Flash sale: 20% off electronics for the next 2 hours!
""",
"""
- Weather alert: Thunderstorm expected in your area.
- Reminder: Doctor's appointment at 3 PM.
- John liked your photo on Instagram.
"""
]
PROMPTS = [
(
"""
You are a helpful assistant that summarizes push notifications.
You are given a list of push notifications and you need to collapse them into a single one.
Output only the final summary, nothing else.
""",
"v1"
),
(
"""
You are a helpful assistant that summarizes push notifications.
You are given a list of push notifications and you need to collapse them into a single one.
The summary should be longer than it needs to be and include more information than is necessary.
Output only the final summary, nothing else.
""",
"v2"
)
]
# Create completions with metadata for tracking
tasks = []
for notifications in push_notification_data:
for (prompt, version) in PROMPTS:
tasks.append(client.chat.completions.create(
model="gpt-5.6-luna",
messages=[
{"role": "developer", "content": prompt},
{"role": "user", "content": notifications},
],
metadata={
"prompt_version": version,
"usecase": "push_notifications_summarizer"
}
))
await asyncio.gather(*tasks)
이제 실행을 만들어 다른 프롬프트 버전을 평가합니다:
# Grade prompt_version=v1
eval_run_result = await client.evals.runs.create(
eval_id=eval_id,
name="v1-run",
data_source={
"type": "completions",
"source": {
"type": "stored_completions",
"metadata": {
"prompt_version": "v1",
}
}
}
)
print(f"Run ID: {eval_run_result.id}")
print(f"Status: {eval_run_result.status}")
print(f"Report URL: {eval_run_result.report_url}")
# Grade prompt_version=v2
eval_run_result_v2 = await client.evals.runs.create(
eval_id=eval_id,
name="v2-run",
data_source={
"type": "completions",
"source": {
"type": "stored_completions",
"metadata": {
"prompt_version": "v2",
}
}
}
)
print(f"Run ID: {eval_run_result_v2.id}")
print(f"Report URL: {eval_run_result_v2.report_url}")
다른 모델로 컴플리션 사용
같은 입력에서 다른 모델이 어떻게 수행하는지 테스트합니다:
# Test with gpt-5.6-terra using stored completions as input
tasks = []
for prompt_version in ["v1", "v2"]:
tasks.append(client.evals.runs.create(
eval_id=eval_id,
name=f"gpt-5.6-terra-run-{prompt_version}",
data_source={
"type": "completions",
"input_messages": {
"type": "item_reference",
"item_reference": "item.input",
},
"model": "gpt-5.6-terra",
"source": {
"type": "stored_completions",
"metadata": {
"prompt_version": prompt_version,
}
}
}
))
results = await asyncio.gather(*tasks)
for run in results:
print(f"Report URL: {run.report_url}")
실행 목록
특정 평가의 모든 실행을 가져옵니다.
# List all runs for an evaluation
runs_response = client.evals.runs.list(
eval_id="eval_abc123",
limit=20,
order="desc"
)
for run in runs_response.data:
print(f"Run ID: {run.id}")
print(f"Status: {run.status}")
print(f"Name: {run.name}")
if run.result_counts:
print(f"Results: {run.result_counts.passed}/{run.result_counts.total} passed")
실행 세부 정보 가져오기
결과를 포함한 특정 실행의 상세 정보를 가져옵니다.
run = client.evals.runs.retrieve(
eval_id="eval_abc123",
run_id="run_def456"
)
print(f"Run ID: {run.id}")
print(f"Status: {run.status}")
print(f"Started: {run.started_at}")
print(f"Completed: {run.completed_at}")
# Check results
if run.result_counts:
print(f"\nOverall Results:")
print(f"Total: {run.result_counts.total}")
print(f"Passed: {run.result_counts.passed}")
print(f"Failed: {run.result_counts.failed}")
print(f"Error: {run.result_counts.errored}")
# Per-criteria results
if run.per_testing_criteria_results:
for criteria_result in run.per_testing_criteria_results:
print(f"\nCriteria {criteria_result.testing_criteria_index}:")
print(f" Passed: {criteria_result.result_counts.passed}")
print(f" Average Score: {criteria_result.average_score}")
실행 삭제
실행과 그 결과를 영구 삭제합니다.
delete_response = await client.evals.runs.delete(
eval_id="eval_abc123",
run_id="run_def456"
)
print(f"Deleted: {delete_response.deleted}") # True
print(f"Run ID: {delete_response.run_id}")