안녕하세요, 저는 HolySheep AI에서 실제 프로덕션 환경의 AI 모델 통합을 담당하고 있는 엔지니어입니다. 이번 튜토리얼에서는 프롬프트 평가 프레임워크를 구축하는 방법을 단계별로 알려드리겠습니다. API 경험이 전혀 없는 초보자분들도 따라올 수 있도록 자세히 설명하겠습니다.

프롬프트를 작성했다면, 그 품질을 객관적으로 측정해야 합니다. 여기서 등장하는 개념이 바로 Prompt Engineering 평가입니다. 자동화된 점수系统和人工审核相结合することで、반복 가능한 평가 파이프라인을 만들 수 있습니다.

평가 프레임워크란 무엇인가?

단순히 말하면, 프롬프트의 성능을 숫자로 표현하는 체계입니다. 예를 들어 같은 질문이라도 프롬프트를 어떻게 쓰느냐에 따라 답변의 품질이 달라지죠. 이 차이를 측정하는 방법을 학습하겠습니다.

왜 평가가 중요한가?

평가 방법 두 가지: 자동과 수동

1. 자동 평가 (Automatic Evaluation)

AI 모델이 스스로 답변을 평가하는 방식입니다. 빠르고 일관적이지만, 때로 인간의 뉘앙스를 놓칠 수 있습니다.

2. 수동 평가 (Human Evaluation)

실제 인간이 답변을 검토하는 방식입니다. 정확하지만 시간과 비용이 많이 듭니다.

결합의 전략

저의 실제 경험상, 이 두 가지를 순차적으로 결합하는 것이 가장 효과적입니다:

  1. 먼저 자동 평가로 대량의 프롬프트를 빠르게 필터링
  2. 자동 평가에서Borderline(경계) 점수를 받은 것만 수동 검토

HolySheep AI로 평가 시스템 구축하기

이제 실전으로 들어갑니다. HolySheep AI의 통합 API를 사용하면, 다양한 모델(GPT-4.1, Claude, Gemini, DeepSeek)을 하나의 인터페이스에서 테스트할 수 있습니다. 가입은 지금 가입에서 무료로 하실 수 있습니다.

1단계: 기본 환경 설정

# Python 프로젝트 시작

터미널에서 다음 명령어 실행

pip install openai python-dotenv

프로젝트 폴더 생성

mkdir prompt-evaluator cd prompt-evaluator

.env 파일 생성 (API 키 저장용)

touch .env

📸 이미지 힌트: VS Code 또는 PyCharm에서 새 폴더를 만들고, 좌측 파일 탐색기에 .env 파일이 보이면 성공

2단계: HolySheep AI API 연결

# .env 파일에 다음 내용 작성

HolySheep AI 대시보드에서 API 키를 발급받으세요

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

📸 이미지 힌트: HolySheep AI 웹사이트 → 대시보드 → API Keys → Create New Key 버튼 클릭

3단계: 평가 스크립트 작성

# evaluate_prompt.py

import os
from openai import OpenAI
from dotenv import load_dotenv

API 키 로드

load_dotenv() api_key = os.getenv("HOLYSHEEP_API_KEY")

HolySheep AI API 설정

⚠️ 중요: base_url은 반드시 아래 주소 사용

client = OpenAI( api_key=api_key, base_url="https://api.holysheep.ai/v1" ) def evaluate_response(user_prompt, model_name="gpt-4.1"): """ 프롬프트 답변의 품질을 자동 평가 """ # 1단계: 실제 답변 생성 response = client.chat.completions.create( model=model_name, messages=[ {"role": "system", "content": "당신은 도움이 되는 AI 어시스턴트입니다."}, {"role": "user", "content": user_prompt} ] ) answer = response.choices[0].message.content # 2단계: 답변 품질 평가 evaluation_prompt = f""" 다음 질문과 답변을 평가해주세요. 질문: {user_prompt} 답변: {answer} 다음 5가지 항목에 대해 1~10점으로 평가하고, 각 항목별 이유를 짧게 설명해주세요: 1. 정확성 (답변의 사실적 정확도) 2. 명확성 (이해하기 쉬운가) 3. 유용성 (실제로 도움이 되는가) 4. 완성도 (답변이 충분히 상세한가) 5. 관련성 (질문과 관련이 있는가) JSON 형식으로 반환: {{"accuracy": 점수, "clarity": 점수, "helpfulness": 점수, "completeness": 점수, "relevance": 점수}} """ eval_response = client.chat.completions.create( model=model_name, messages=[ {"role": "system", "content": "당신은 엄격한 AI 평가 전문가입니다."}, {"role": "user", "content": evaluation_prompt} ] ) evaluation = eval_response.choices[0].message.content # 토큰 사용량 확인 (비용 추적) total_tokens = response.usage.total_tokens + eval_response.usage.total_tokens return { "question": user_prompt, "answer": answer, "evaluation": evaluation, "total_tokens": total_tokens }

테스트 실행

if __name__ == "__main__": test_prompt = "파이썬에서 리스트와 튜플의 차이점을 설명해주세요" result = evaluate_response(test_prompt) print("=" * 50) print("📝 질문:", result["question"]) print("=" * 50) print("💬 답변:", result["answer"][:200], "...") print("=" * 50) print("📊 평가 결과:", result["evaluation"]) print("=" * 50) print(f"💰 사용된 토큰: {result['total_tokens']}") # 비용 계산 (GPT-4.1 기준: $8/MTok) cost_usd = (result['total_tokens'] / 1_000_000) * 8 print(f"💵 예상 비용: ${cost_usd:.4f}")

📸 이미지 힌트: 위 코드를 실행하면 터미널에 평가 결과가 JSON 형태로 출력됩니다

대량 평가 시스템 구축

한 두 개가 아닌, 수십 개 프롬프트를 한번에 평가해야 할 때가 있습니다. 이때 배치 처리 스크립트가 필요합니다.

# batch_evaluator.py

import os
import json
from openai import OpenAI
from dotenv import load_dotenv
from datetime import datetime

load_dotenv()
client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

class PromptEvaluator:
    """프롬프트 대량 평가기"""
    
    def __init__(self, model="gpt-4.1"):
        self.model = model
        self.results = []
    
    def evaluate_single(self, prompt, expected_keywords=None):
        """단일 프롬프트 평가"""
        # 모델 응답 생성
        response = client.chat.completions.create(
            model=self.model,
            messages=[
                {"role": "system", "content": "당신은 전문적인 AI 어시스턴트입니다."},
                {"role": "user", "content": prompt}
            ]
        )
        
        answer = response.choices[0].message.content
        
        # 자동 품질 점수 계산
        score = self._calculate_auto_score(answer, expected_keywords)
        
        return {
            "prompt": prompt,
            "answer": answer,
            "auto_score": score,
            "needs_human_review": score < 7 or score > 9,  # 경계값은 수동 검토
            "tokens_used": response.usage.total_tokens
        }
    
    def _calculate_auto_score(self, answer, keywords):
        """키워드 기반 자동 점수 계산"""
        if not answer:
            return 0
        
        score = 5.0  # 기본 점수
        
        # 키워드 매칭 보너스
        if keywords:
            matched = sum(1 for kw in keywords if kw.lower() in answer.lower())
            keyword_bonus = (matched / len(keywords)) * 3
            score += keyword_bonus
        
        # 길이 점수 (너무 짧으면 감점)
        word_count = len(answer.split())
        if word_count < 20:
            score -= 2
        elif word_count > 50:
            score += 1
        
        return min(10, max(0, score))
    
    def batch_evaluate(self, prompts, keywords_list=None):
        """대량 평가 실행"""
        print(f"🚀 {len(prompts)}개 프롬프트 평가 시작...")
        
        for i, prompt in enumerate(prompts):
            keywords = keywords_list[i] if keywords_list else None
            result = self.evaluate_single(prompt, keywords)
            self.results.append(result)
            
            print(f"  [{i+1}/{len(prompts)}] 점수: {result['auto_score']:.1f}")
        
        return self._generate_report()
    
    def _generate_report(self):
        """평가 보고서 생성"""
        scores = [r["auto_score"] for r in self.results]
        avg_score = sum(scores) / len(scores)
        
        # 수동 검토 필요 항목 필터링
        needs_review = [r for r in self.results if r["needs_human_review"]]
        
        report = {
            "timestamp": datetime.now().isoformat(),
            "total_prompts": len(self.results),
            "average_score": round(avg_score, 2),
            "highest_score": max(scores),
            "lowest_score": min(scores),
            "needs_human_review_count": len(needs_review),
            "needs_human_review_items": [
                {"prompt": r["prompt"], "score": r["auto_score"]} 
                for r in needs_review
            ],
            "total_tokens_used": sum(r["tokens_used"] for r in self.results),
            "all_results": self.results
        }
        
        return report

사용 예시

if __name__ == "__main__": evaluator = PromptEvaluator(model="gpt-4.1") # 테스트할 프롬프트 목록 test_prompts = [ "파이썬 리스트 정렬 방법을 알려줘", "머신러닝에서 과적합이란 무엇인가요?", "git 브랜치 생성 방법을 설명해주세요", "API란 무엇인가요? 간단히 설명해줘", "Docker 컨테이너와 가상머신의 차이는?" ] # 각 프롬프트별 기대 키워드 expected_keywords = [ ["sort", "sorted", "정렬"], ["과적합", "overfitting", "훈련"], ["git", "branch", "checkout"], ["API", "Application", "Programming"], ["Docker", "container", "VM", "가상화"] ] report = evaluator.batch_evaluate(test_prompts, expected_keywords) print("\n" + "=" * 60) print("📊 평가 보고서") print("=" * 60) print(f"평균 점수: {report['average_score']:.2f} / 10") print(f"토큰 사용량: {report['total_tokens_used']}") print(f"수동 검토 필요: {report['needs_human_review_count']}개") # 비용 계산 (GPT-4.1: $8/MTok) cost = (report['total_tokens_used'] / 1_000_000) * 8 print(f"총 비용: ${cost:.4f}") # 결과 저장 with open("evaluation_report.json", "w", encoding="utf-8") as f: json.dump(report, f, ensure_ascii=False, indent=2) print("\n✅ 보고서가 evaluation_report.json에 저장되었습니다")

수동 검토 시스템 추가하기

자동 평가에서Borderline 점수를 받은 항목만 인간이 검토하는 하이브리드 시스템을 만들어보겠습니다.

# hybrid_evaluator.py

import os
import json
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

class HybridEvaluator:
    """자동 + 수동 평가 하이브리드 시스템"""
    
    def __init__(self):
        self.auto_threshold_low = 5.0   # 이 점수 이하는 자동 실패
        self.auto_threshold_high = 8.0  # 이 점수 이상은 자동 성공
        self.need_manual_review = []    # 수동 검토 대기열
    
    def evaluate(self, prompt, criteria):
        """
        criteria 예시:
        {
            "expected_topics": ["파이썬", "리스트"],
            "min_length": 50,
            "max_length": 500,
            "required_format": "마크다운"
        }
        """
        # 1단계: 자동 평가
        auto_result = self._auto_evaluate(prompt, criteria)
        
        # 2단계: 분기 처리
        if auto_result["score"] < self.auto_threshold_low:
            # 자동 실패 - 즉시 결과 반환
            auto_result["status"] = "REJECTED_AUTO"
            auto_result["reason"] = "자동 평가 기준 미달"
            return auto_result
        
        elif auto_result["score"] > self.auto_threshold_high:
            # 자동 성공
            auto_result["status"] = "APPROVED_AUTO"
            return auto_result
        
        else:
            # 경계값 - 수동 검토 대기열에 추가
            auto_result["status"] = "NEEDS_HUMAN_REVIEW"
            self.need_manual_review.append(auto_result)
            return auto_result
    
    def _auto_evaluate(self, prompt, criteria):
        """LLM 기반 자동 평가"""
        # 모델 호출
        response = client.chat.completions.create(
            model="gpt-4.1",
            messages=[
                {"role": "system", "content": "당신은 프롬프트 품질 평가 전문가입니다."},
                {"role": "user", "content": f"""
프롬프트 품질을 1~10점으로 평가해주세요.

평가할 프롬프트: {prompt}

평가 기준:
- 예상 주제 포함 여부: {criteria.get('expected_topics', [])}
- 최소 길이: {criteria.get('min_length', 0)}자
- 최대 길이: {criteria.get('max_length', 1000)}자

JSON으로 반환:
{{"score": 점수, "reason": "평가 이유"}}
"""}
            ]
        )
        
        result_text = response.choices[0].message.content
        
        # JSON 파싱 시도
        try:
            result = json.loads(result_text)
        except:
            # 파싱 실패 시 기본값 반환
            result = {"score": 5, "reason": "파싱 실패"}
        
        result["prompt"] = prompt
        result["criteria"] = criteria
        result["tokens_used"] = response.usage.total_tokens
        
        return result
    
    def manual_review(self, review_items):
        """
        수동 검토 실행
        review_items: [{"index": 0, "decision": "approve/reject", "notes": "..."}]
        """
        reviewed = []
        for item in review_items:
            idx = item["index"]
            if idx < len(self.need_manual_review):
                self.need_manual_review[idx]["human_decision"] = item["decision"]
                self.need_manual_review[idx]["human_notes"] = item.get("notes", "")
                self.need_manual_review[idx]["status"] = "REVIEWED_HUMAN"
                reviewed.append(self.need_manual_review[idx])
        
        return reviewed
    
    def get_summary(self):
        """평가 결과 요약"""
        auto_approved = sum(1 for r in self.need_manual_review 
                          if r.get("human_decision") == "approve")
        auto_rejected = sum(1 for r in self.need_manual_review 
                          if r.get("human_decision") == "reject")
        pending = len(self.need_manual_review) - auto_approved - auto_rejected
        
        return {
            "total_in_review_queue": len(self.need_manual_review),
            "approved": auto_approved,
            "rejected": auto_rejected,
            "pending": pending
        }

사용 예시

if __name__ == "__main__": evaluator = HybridEvaluator() test_cases = [ { "prompt": "파이썬에서 리스트를 정렬하는 방법을 알려주세요", "criteria": { "expected_topics": ["파이썬", "정렬", "리스트"], "min_length": 50, "max_length": 500 } }, { "prompt": "hi", # 너무 짧음 - 자동 실패 예상 "criteria": { "expected_topics": [], "min_length": 20, "max_length": 500 } } ] results = [] for case in test_cases: result = evaluator.evaluate(case["prompt"], case["criteria"]) results.append(result) print(f"[{result['status']}] 점수: {result.get('score', 'N/A')}") # 수동 검토 대기열이 있으면 출력 if evaluator.need_manual_review: print(f"\n📋 수동 검토 필요: {len(evaluator.need_manual_review)}건") for i, item in enumerate(evaluator.need_manual_review): print(f" [{i}] {item['prompt'][:50]}...") print("\n✅ 하이브리드 평가 시스템 완료!")

평가 결과 해석하기

실제로 돌려본 결과 몇 가지 인사이트를 공유드리겠습니다. 제가 실제 프로덕션 환경에서 테스트한 수치입니다:

모델별 평가 비용 비교

평균 응답 시간

실전 적용 팁

평가 프롬프트를 작성할 때는 아래 사항들을 고려하세요:

  1. 일관된 기준: 평가 기준이 매번 바뀌면 비교가 불가능합니다
  2. 경계값 설정: 너무 엄격하면 모든 것이 실패, 너무 느슨하면 의미 없음
  3. 비용 모니터링: 배치 평가 시 토큰 사용량이 금방 불어납니다
  4. 점진적 개선: 한 번에 완벽한 프레임워크를 만들지 마세요

자주 발생하는 오류와 해결책

오류 1: API 키 인증 실패

# ❌ 잘못된 예시
client = OpenAI(
    api_key="sk-xxxxx",  # 직접 키 입력
    base_url="https://api.openai.com/v1"  # ❌ HolySheep 주소 아님
)

✅ 올바른 예시

from dotenv import load_dotenv import os load_dotenv() # .env 파일 로드 client = OpenAI( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" # ✅ HolySheep API 주소 )

원인: HolySheep AI는 별도의 API 엔드포인트를 사용합니다. openai.com 주소를