LLM·에이전트 평가 (MLflow Evaluation Driven Development)
LLM·에이전트 평가 (MLflow Evaluation Driven Development)
좋은 LLM 앱을 만드는 가장 큰 고민 중 하나는 "이 응답이 정말 괜찮은 거지?"를 체계적으로 판단하는 일이에요. MLflow의 평가·모니터링 기능은 LLM 애플리케이션과 AI 에이전트의 품질을 개발부터 프로덕션까지 생애주기 전반에 걸쳐 체계적으로 측정·개선·유지할 수 있게 도와줘요. 특히 핵심 원칙인 **Evaluation-Driven Development(평가 주도 개발)**는 애드혹 테스트를 체계적인 품질 보증으로 바꿔주는 실천이에요.
평가를 구성하는 세 요소
MLflow에서 각 평가는 데이터셋(Dataset)·스코러(Scorer)·예측 함수(Predict Function) 세 요소로 정의돼요.
| 구성 요소 | 예시 |
|---|---|
| Dataset 입력·기대값(선택적으로 미리 생성된 출력·트레이스) | [{"inputs": {"question": "2+2"}, "expectations": {"answer": "4"}}] |
| Scorer 평가 기준 | @scorer 데코레이터의 exact_match 함수 |
| Predict Function 데이터셋에 대한 출력 생성 | client.chat.completions.create(...) 호출 함수 |
평가 전에 테스트 데이터가 필요한데, Evaluation Datasets는 테스트 케이스·정답 기대값·평가 데이터를 규모 있게 관리하는 중앙 저장소예요. AI 시스템을 평가하는 데 필요한 모든 데이터의 단일 진실 원천, 일종의 "테스트 데이터베이스"로 보면 돼요.
간단한 평가 예시
질문과 기대 답변으로 이루어진 데이터셋을 규칙 스코어러와 LLM 판정 스코어러로 평가하는 예시예요.
import os
import openai
import mlflow
from mlflow.genai.scorers import Correctness, Guidelines
client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 1. 간단한 QA 데이터셋 정의
dataset = [
{
"inputs": {"question": "Can MLflow manage prompts?"},
"expectations": {"expected_response": "Yes!"},
},
{
"inputs": {"question": "Can MLflow create a taco for my lunch?"},
"expectations": {"expected_response": "No, unfortunately, MLflow is not a taco maker."},
},
]
# 2. 응답을 생성하는 예측 함수 정의
def predict_fn(question: str) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": question}],
)
return response.choices[0].message.content
# 3. 평가 실행
results = mlflow.genai.evaluate(
data=dataset,
predict_fn=predict_fn,
scorers=[
# 내장 LLM 판정
Correctness(),
# 커스텀 기준을 LLM 판정에 사용
Guidelines(
name="is_english",
guidelines="The answer must be in English",
),
],
)
결과 확인
MLflow UI를 열어 평가 결과를 확인할 수 있어요.
mlflow server --port 5000
UI의 "Runs" 탭 아래 새 평가 런이 생성되면, 런 이름을 클릭해서 평가 결과를 볼 수 있어요.