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}%")
'Generative AI > Prompt Engineering' 카테고리의 다른 글
Limitations of LLM-as-a-Judge (0) | 2024.09.06 |
---|---|
Claude 에서 Evaluation 하는 법 (0) | 2024.09.06 |
The Prompt Report: A Systematic Survey of Prompting Techniques (0) | 2024.08.28 |
Flow Engineering is all you need (0) | 2024.06.22 |
Prompt Engineering with Llama 2 & 3 (0) | 2024.06.19 |