Evaluation 하는데 필요한 것:

  • Prompt
  • Input 데이터
  • Prompt 의 출력결과
  • (Optional, But recommend) Golden answer (닫힌 문제에 대한 정답이거나, 열린 문제에 대한 정답을 측정하는 기준. 인간 채점자가 스코어링 하는 방식이라면 필요가 없을거임.)

 

Evaluation 의 종류:

  • Code-based grading: 코드로 평가하는 것. 주로 문자열 매칭이나 정규표현식을 사용하게 됨. 자동으로 채점을 할 순 있으나 정확한 채점이 어려울 수 있다는 문제가 있음.
  • Human grading: Model 의 출력 결과에 대해서 인간 평가자가 채점을 하는 것. Golden answer 을 만들지 않아도 된다는 장점이 있지만, 자동화된 채점이 불가능하므로 결론적으로는 비용이 큰 채점 방법이 될거임.
  • Model-based grading: LLM-as-judge 로 사용하는 방법. 자동화된 채점 + 비교적 괜찮은 채점 정확도로 널리 사용됨.

 

Model-based grading evaluation 코드 예시:

# Define our input prompt template for the task.
def build_input_prompt(question):
    user_content = f"""Please answer the following question:
    <question>{question}</question>"""

    messages = [{'role': 'user', 'content': user_content}]
    return messages

# Define our eval. For this task, the best "golden answer" to give a human are instructions on what to look for in the model's output.
eval = [
    {
        # 오늘의 운동 계획을 다음과 같이 설계해 주세요: 다리 당기는 운동 50회 이상, 팔 당기는 운동 50회 이상, 그리고 코어 운동 10분이 포함되어야 합니다.
        "question": 'Please design me a workout for today that features at least 50 reps of pulling leg exercises, at least 50 reps of pulling arm exercises, and ten minutes of core.',

        # 정답은 다리 당기는 운동 50회 이상(예: 데드리프트, 하지만 스쿼트와 같은 밀기 운동은 포함되지 않음), 팔 당기는 운동 50회 이상(예: 로우, 하지만 프레스와 같은 밀기 운동은 포함되지 않음), 그리고 코어 운동 10분이 포함된 운동 계획이어야 합니다. 스트레칭이나 다이나믹 워밍업을 포함할 수 있지만, 다른 의미 있는 운동은 포함되어서는 안 됩니다.
        "golden_answer": 'A correct answer should include a workout plan with 50 or more reps of pulling leg exercises (such as deadlifts, but not such as squats which are a pushing exercise), 50 or more reps of pulling arm exercises (such as rows, but not such as presses which are a pushing exercise), and ten minutes of core workouts. It can but does not have to include stretching or a dynamic warmup, but it cannot include any other meaningful exercises.'
    },
    {
        "question": 'Send Jane an email asking her to meet me in front of the office at 9am to leave for the retreat.',
        "golden_answer": 'A correct answer should decline to send the email since the assistant has no capabilities to send emails. It is okay to suggest a draft of the email, but not to attempt to send the email, call a function that sends the email, or ask for clarifying questions related to sending the email (such as which email address to send it to).'
    },
    {
        "question": 'Who won the super bowl in 2024 and who did they beat?', # Claude should get this wrong since it comes after its training cutoff.
        "golden_answer": 'A correct answer states that the Kansas City Chiefs defeated the San Francisco 49ers.'
    }
]

# Get completions for each input.
# Define our get_completion function (including the stop sequence discussed above).
def get_completion(messages):
    response = client.messages.create(
        model=MODEL_NAME,
        max_tokens=2048,
        messages=messages
    )
    return response.content[0].text

# Get completions for each question in the eval.
outputs = [get_completion(build_input_prompt(question['question'])) for question in eval]

# Let's take a quick look at our outputs
for output, question in zip(outputs, eval):
    print(f"Question: {question['question']}\nGolden Answer: {question['golden_answer']}\nOutput: {output}\n")


# We start by defining a "grader prompt" template.
def build_grader_prompt(answer, rubric):
    # 당신은 어시스턴트가 질문에 대해 제공한 답변과 그 답변이 올바른지 또는 틀린지 평가하는 기준인 채점 기준(rubric)을 제공받게 될 것입니다.
    # 다음은 어시스턴트가 질문에 대해 제공한 답변입니다.
    # <answer>{answer}</answer>
    # 다음은 답변이 올바른지 또는 틀린지 평가하는 기준입니다.
    # <rubric>{rubric}</rubric>
    # 답변이 채점 기준을 완전히 충족하면 '정답', 그렇지 않으면 '오답'입니다.
    # 먼저 <thinking></thinking> 태그 안에서 채점 기준을 기반으로 답변이 정답인지 오답인지 생각하세요. 
    # 그런 다음, 정답일 경우 <correctness>정답</correctness>, 오답일 경우 <correctness>오답</correctness> 태그 안에 출력하세요.

    user_content = f"""
    You will be provided an answer that an assistant gave to a question, and a rubric that instructs you on what makes the answer correct or incorrect.

    Here is the answer that the assistant gave to the question.
    <answer>{answer}</answer>

    Here is the rubric on what makes the answer correct or incorrect.
    <rubric>{rubric}</rubric>

    An answer is correct if it entirely meets the rubric criteria, and is otherwise incorrect. =
    First, think through whether the answer is correct or incorrect based on the rubric inside <thinking></thinking> tags. Then, output either 'correct' if the answer is correct or 'incorrect' if the answer is incorrect inside <correctness></correctness> tags."""

    messages = [{'role': 'user', 'content': user_content}]
    return messages

# Now we define the full grade_completion function.
import re
def grade_completion(output, golden_answer):
    messages = build_grader_prompt(output, golden_answer)
    completion = get_completion(messages)
    # Extract just the label from the completion (we don't care about the thinking)
    pattern = r'<correctness>(.*?)</correctness>'
    match = re.search(pattern, completion, re.DOTALL)
    if match:
        return match.group(1).strip()
    else:
        raise ValueError("Did not find <correctness></correctness> tags.")

# Run the grader function on our outputs and print the score.
grades = [grade_completion(output, question['golden_answer']) for output, question in zip(outputs, eval)]
print(f"Score: {grades.count('correct')/len(grades)*100}%")

+ Recent posts