이 글에서 다루는 내용은 다음과 같습니다.
1. 평가 프로세스 구축
1. 평가 프로세스 구축
참고 : examples 폴더에는 eval building Jupyter 노트북이 포함되어 있어, 전체 과정을 이해하는 데 도움이 됩니다.
평가 프로세스 구축은 데이터셋을 구성하고, 해당 데이터셋으로 새로운 평가를 등록한 뒤 평가를 실행하는 것입니다. 이 글에서는 기본 제공되는 평가 템플릿을 사용한다고 가정하겠습니다. (그렇지 않다면 커스텀 평가를 만드는 예제를 참고하세요.)
1) 데이터셋 구성
샘플 데이터 구조
원하는 평가 방식을 결정한 후에는 샘플 데이터를 올바른 JSONL 형식으로 변환해야 합니다. (참고 : JSONL 파일은 각 줄마다 하나의 JSON 객체가 있는 JSON 파일입니다)
평가 데이터는 다음과 같은 구조로 구성되어있습니다.
- JSON 객체는 한 개의 평가 대상 데이터 포인트를 나타냅니다.
- JSON 객체에 필요한 {key}는 사용하는 평가 템플릿에 따라 다릅니다.
- 모든 템플릿은 "input" 키를 필요로 하며, 이는 프롬프트를 의미합니다.
- 프롬프트는 채팅 형식으로 지정하는 것이 이상적이며, 문자열 형식도 지원됩니다.
- 채팅 모델이 아닌 모델을 평가하더라도 채팅 형식을 사용하는 것이 좋습니다. 만약 채팅 모델과 비채팅 모델을 모두 평가하는 경우, 채팅 형식 프롬프트와 문자열 프롬프트 간의 변환을 처리해 줍니다 (변환 논리는 여기에서 확인할 수 있습니다).
- 기본 평가 방식인 Match, Includes, FuzzyMatch의 경우, 필요한 또 다른 키는 "ideal"입니다
- 이 키는 정답을 나타내는 문자열 또는 문자열 목록입니다.
- 예시)
{"input": [{"role": "system", "content": "Complete the phrase as concisely as possible."}, {"role": "user", "content": "Once upon a "}], "ideal": "time"} {"input": [{"role": "system", "content": "Complete the phrase as concisely as possible."}, {"role": "user", "content": "The first US president was "}], "ideal": "George Washington"} {"input": [{"role": "system", "content": "Complete the phrase as concisely as possible."}, {"role": "user", "content": "OpenAI was founded in 20"}], "ideal": "15"}
- model-graded eval의 경우 필요한 키는 다양합니다. 평가 프롬프트에서 {key}로 지정된 필드에 따라 달라지며, (선택적) args로 지정되지 않은 키들입니다.
- 예시 )
{"input":[{"role":"system","content":"Which word does NOT belong with the others? A. index B. glossary C. chapter D. book"}],"ideal":"D. book"} {"input":[{"role":"system","content":"You are on an island populated by two tribes. Members of one tribe consistently lie. Members of the other tribe always tell the truth. Tribe members can recognize one another, but you can't tell them apart. You meet two people, C and D on the island. C says, 'Exactly one of us is from the liars tribe.' Which tribe is D from?"}],"ideal":"D is from the Liars tribe."} {"input":[{"role":"system","content":"There are five people in a room. Each person will either always tell the truth or always tell a lie. Each person is asked the following question: How many liars are among you? The answers are: \"one\", \"two\", \"three\", \"four\", \"five\". How many liars are in the room?"}],"ideal":"There are four liars."}
- 예시 )
- 모든 템플릿은 "input" 키를 필요로 하며, 이는 프롬프트를 의미합니다.
registry/data/README.md 에서 보다 다양한 JSONL 평가 파일 예제를 확인할 수 있습니다.
데이터 경로 지정
local machine에 데이터셋 파일이 있는 경우, JSONL 파일을 evals/registry/data/<eval_name>/samples.jsonl 경로에 넣으세요. 만약 Cloud Object Storage에 있는 경우, 주요한 클라우드들에 대해서 path-style URL을 지원합니다.
2) Eval 등록하기
Eval 등록 경로 지정
Eval을 등록하려면, evals/registry/evals/<eval_name>.yaml 경로에 elsuite 레지스트리 형식으로 파일을 추가합니다.
👀 참고 : elsuite registry format 이란?
elsuite 레지스트리 형식은 OpenAI Evals 패키지에서 사용하는 형식으로, 새로운 eval을 정의할 때 필요한 기본 구조와 키 구성을 갖춘 YAML 파일 형식을 의미합니다. 이를 통해 각 평가 항목의 메타데이터와 구성 요소를 정의하여, Evals 시스템에서 이를 인식하고 실행할 수 있게 합니다.
💜 주요 구성 요소:
- Eval ID와 메타데이터:
- <eval_name>: 아래에 id, description, metrics 등의 필드를 추가하여 해당 eval의 식별자(ID), 설명, 평가 기준(예: 정확도) 등을 정의합니다.
- metrics는 모델 평가에 사용할 기준을 나타내며, 여기에는 accuracy와 같은 평가 지표를 지정할 수 있습니다.
- Eval 버전 및 클래스:
- <eval_name>.dev.v0: 형태로 이름을 지정하여 버전을 나타내고, class 필드에는 해당 eval이 사용하는 템플릿 클래스를 지정합니다. 예를 들어, evals.elsuite.basic.match:Match와 같은 클래스는 기본적인 Match 평가 템플릿을 의미합니다.
- args는 eval을 실행할 때 필요한 추가 인자를 정의하며, 일반적으로 samples_jsonl 같은 데이터 파일 경로를 설정합니다.
- 데이터 파일 경로:
- samples_jsonl 키를 통해 evals/registry/data/<eval_name>/samples.jsonl 파일의 경로를 지정하여 데이터 파일의 위치를 정의합니다.
Eval을 위한 yaml 파일 작성
예를 들어, Match eval을 등록하려면 다음과 같이 작성할 수 있습니다:
<eval_name>:
id: <eval_name>.dev.v0
description: <description>
metrics: [accuracy]
<eval_name>.dev.v0:
class: evals.elsuite.basic.match:Match
args:
samples_jsonl: <eval_name>/samples.jsonl
Eval을 실행할 때, 데이터는 evals/registry/data 폴더에서 검색됩니다. 예를 들어 test_match/samples.jsonl 경로가 지정되면, 데이터는 evals/registry/data/test_match/samples.jsonl 위치에 있어야 합니다.
Eval의 이름은 <eval_name>.<split>.<version> 형식을 따릅니다:
- <eval_name>은 eval의 이름으로, 성능 비교가 필요한 eval들을 그룹화하는 데 사용됩니다.
- <split>은 데이터 분할 유형을 나타내며, 같은 <base_eval>에 속하는 eval들을 그룹화하는 데 사용됩니다. 예를 들어 "val", "test", "dev" 등으로 테스트 단계를 구분할 수 있습니다.
- <version>은 eval의 버전을 나타내며, 점이나 특수 문자를 제외한 설명을 자유롭게 붙일 수 있습니다.
같은 eval 이름을 동일한 모델에 실행할 경우, 유사한 결과가 나오도록 구성하여 다른 사람들이 재현할 수 있도록 하는 것이 좋습니다. 따라서 eval을 수정할 때는 버전을 업데이트해야 합니다.
3) Eval 실행하기
이제 선택한 모델이나 완성 함수(completion function)를 사용하여 CLI에서 Eval을 실행할 수 있습니다.
예를 들어, gpt-3.5-turbo 모델을 사용하려면 다음과 같이 입력합니다:
oaieval gpt-3.5-turbo <eval_name>
축하합니다! Eval을 성공적으로 만들었습니다. 원하는 결과에 만족할 때까지 계속 테스트하고 수정해 보세요.
4) model-graded evals : 단계별 워크플로우
기존의 model-graded eval 템플릿(예: fact, closedqa, battle)이 대부분의 사용 사례에 적합하지만, 일부 사용 사례에서는 약간의 customizing (예: 다른 evaluation prompt)이 필요할 수 있습니다. 이 경우, 약간의 추가 작업이 필요하지만 보통 코딩은 필요하지 않습니다!
1. 새로운 YAML 파일 생성 또는 기존 YAML 편집
기존의 model-graded eval 템플릿을 사용할 수 없다면, 새로운 YAML 파일을 만들거나 기존 YAML 파일에 항목을 추가하여 평가 파라미터를 정의하세요. 예로 humor.yaml 파일을 참조할 수 있습니다.
- 새 YAML 파일을 만들 때는 기존 YAML 파일을 복사하여 시작하는 것이 편리할 수 있습니다. 예를 들어, 모델의 응답을 기준에 따라 평가하는 eval이라면 closedqa.yaml을 복사하고 args 부분을 수정하면 됩니다.
2. 데이터셋 생성 및 Eval 등록
위에서 설명한 대로 데이터셋을 만들고 eval을 등록하세요. 예시로는 joke_fruits_labeled.jsonl과 joke-fruits를 참고할 수 있습니다.
- 이 단계에서 eval_type을 지정하는 것이 권장되며, eval을 등록할 때 추가할 수 있습니다.
3. Eval 실행
CLI를 사용하여 eval을 실행합니다. 예를 들어 joke-fruits라는 eval을 gpt-3.5-turbo 모델로 실행하려면 다음과 같이 입력합니다:
oaieval gpt-3.5-turbo joke-fruits
4. Meta-Eval 추가 (권장 사항)
Meta-eval을 추가하여 model-graded eval의 품질을 확인할 수 있습니다. 각 model-graded eval에는 조정 가능한 몇 가지 항목이 포함되어 있으며, 주로 프롬프트와 eval_type을 조정할 수 있습니다.
- choice labels를 통해 사람이 직접 지정한 정답을 평가에 포함시키면 모델이 어떤 선택을 했어야 하는지를 확인할 수 있습니다. 예를 들어 joke_fruits_labeled.jsonl 파일의 choice 키는 joke-fruits eval에 사용되지 않지만, joke-fruits-meta meta-eval에서 활용됩니다.
- Meta-eval을 실행한 후, 예를 들어 다음 명령을 사용합니다:
oaieval gpt-3.5-turbo joke-fruits-meta
그러면 metascore와 accuracy 결과가 출력됩니다. 높은 품질의 model-graded eval이라면 metascore와 accuracy가 1.0에 가까운 값을 보여야 합니다.
'LLM' 카테고리의 다른 글
[LLM] Hugging Face Dataset (0) | 2024.10.30 |
---|---|
[LLM] LLM 평가를 위한 데이터셋 생성 시 주의사항 (2) | 2024.10.30 |
[LLM] LLM for Financial Research Paper List: Read and To-Read (5) | 2024.10.24 |
[LangChain] Runnable (1) | 2024.10.23 |
[LLM] Tools, Toolkits, Tool Binding (2) | 2024.10.17 |