개요
ChatGPT가 출현함으로써 개발자에게는 AI를 활용한 코드 생산성과 효율성을 증대시켰다.
번거로운 데이터 노가다 작업을 물론 코드 생성까지 해줌으로써 더 빠르고 효율적으로 사용할 수 있게하였다.
LLM (Large Language Model) 모델 중 Code에 특화된 Model을 살펴보고 어떻게 평가를 하는지 알아보고자 한다.
Code LLM 모델
아래 링크를 따라서 리더보드에 들어가보면 Code LLM 모델들과 평가방법에 따른 점수가 소개되어있다.
https://github.com/huybery/Awesome-Code-LLM
HumanEval, MBPP, HF 등은 여러가지 평가방식인데 예를 들어 MBPP은 "초급 프로그래머 수준의 Python 프로그래밍 문제" 이다. 자세한 설명은 아래의 평가방법에서 기재하였다.
Rank | Model | Params | HumanEval | MBPP | HF | Paper |
1 | GPT-4 + Reflexion | ? | 91.0 | 77.1 | paper | |
2 | GPT-4 | ? | 67.0 | paper | ||
3 | Code-Llama | 34B | 62.2 | 61.2 | paper | |
4 | Pangu-Coder2 | 15B | 61.6 | paper | ||
5 | WizardCoder-15B | 15B | 57.3 | 51.8 | ckpt | paper |
6 | GPT-3.5 | ? | 48.1 | paper | ||
7 | Code-Davinci-002 | ? | 47.0 | paper | ||
8 | StarCoder-15B (Prompted) | 15B | 40.8 | 49.5 | ckpt | paper |
9 | PaLM 2-S | ? | 37.6 | 50.0 | paper | |
10 | PaLM-Coder-540B | 540B | 36.0 | 47.0 | paper | |
11 | InstructCodeT5+ | 16B | 35.0 | paper | ||
12 | StarCoder-15B | 15B | 33.6 | 52.7 | ckpt | paper |
13 | Code-Cushman-001 | ? | 33.5 | 45.9 | paper | |
14 | CodeT5+ | 16B | 30.9 | paper | ||
15 | LLaMA2-70B | 70B | 29.9 | ckpt | paper | |
16 | CodeGen-16B-Mono | 16B | 29.3 | 35.3 | paper | |
17 | PaLM-540B | 540B | 26.2 | 36.8 | paper | |
18 | LLaMA-65B | 65B | 23.7 | 37.7 | paper | |
19 | CodeGeeX | 13B | 22.9 | 24.4 | paper | |
20 | LLaMA-33B | 33B | 21.7 | 30.2 | paper | |
21 | CodeGen-16B-Multi | 16B | 18.3 | 20.9 | paper | |
22 | AlphaCode | 1.1B | 17.1 | paper |
용어 정리
우선 평가방식과 데이터셋을 살펴보기 전에 기본적인 코딩 용어를 알아보도록 하자
예제)
def add(a, b):
"""
이 함수는 두 숫자를 더합니다.
:param a: 첫 번째 숫자
:param b: 두 번째 숫자
:return: a와 b의 합
"""
return a + b
독스트링 (DocString)
독스트링(Docstring)은 모듈, 함수, 클래스 또는 메소드 정의에서 첫 번째 명령문으로 나타나는 문자열 리터럴이다. 그러한 독스트링은 __doc__해당 객체의 특별한 속성이 된다.
"""
이 함수는 두 숫자를 더합니다.
:param a: 첫 번째 숫자
:param b: 두 번째 숫자
:return: a와 b의 합
"""
시그니처 (Signature)
함수의 이름과 매개변수 목록으로 구성되며, 매개변수의 이름과 데이터 유형
def add(a, b):
스니펫 (Snippet)
재사용 가능한 소스 코드, 기계어, 텍스트의 작은 부분을 일컫는 프로그래밍 용어
평가 방법
단위 테스트를 통한 평가방법
데이터셋의 해결 방식이 단위 테스트 코드로 존재하고 평가하는 방법을 말한다.
https://github.com/bigcode-project/bigcode-evaluation-harness/blob/main/docs/README.md
평가 방법 | 설명 | 데이터셋 |
HumanEval | 함수 Signature, DocString, 본문 및 여러 단위 테스트를 포함하여 손으로 쓴 Python 프로그래밍 문제 164개 | HumanEval |
HumanEvalPack | 인간 주석을 통해 HumanEval을 6개 언어의 3개 시나리오 로 확장한다. | HumanEvalPack |
InstructHumanEval | 명령(HumanEval DocString에서 파생됨), 함수 Signature 및 여러 단위 테스트로 설명된 164개의 손으로 쓴 Python 프로그래밍 문제 | InstructHumanEval |
MBPP | 초급 프로그래머가 해결할 수 있도록 설계된 약 1,000개의 크라우드 소스 Python 프로그래밍 문제로 구성. 각 문제는 영어로 된 작업 설명, 코드 솔루션 및 3개의 자동화된 테스트 사례로 구성. 인덱스 11부터 511까지의 샘플 테스트 세트를 평가 | MBPP |
DS-1000 | (1) 다양하고 현실적이며 실용적인 사용 사례를 반영하고 (2) 신뢰할 수 있는 측정 기준을 갖고 (3) 혼란스러운 질문을 통해 암기를 방지하는 7개의 Python 라이브러리에 걸친 1000개의 데이터 과학 질문이 포함된 코드 생성 벤치마크 | DS-1000 |
MultiPL-E | 18개 프로그래밍 언어를 지원하는 코드 생성을 위한 대규모 언어 모델을 평가하기 위한 벤치마크. OpenAI "HumanEval" Python 벤치마크를 사용하고 작은 컴파일러를 사용하여 이를 다른 언어로 번역 | MultiPL-E |
APPS | 10,000개의 Python 문제(학습용 5,000개, 평가용 5,000개)가 포함된 코드 생성에 대한 까다로운 벤치마크. 입문, 면접, 경쟁의 세 가지 난이도가 존재. | APPS |
Recode | 코드 생성 모델의 견고성을 평가하기 위해 일련의 코드 및 자연어 변환을 제안 | Recode |
단위 테스트가 없는 평가방법
단일 세대를 수행하고 생성된 코드를 참조 솔루션과 비교하고 BLEU 점수를 계산
Python 코드 생성을 위한 CoNaLa의 테스트 세트에는 500개의 작업이 있다.
문서 생성 작업
CodeXGLUE 의 코드-텍스트 작업 : Python, Go, Ruby, Java, JavaScript 및 PHP 등 6가지 프로그래밍 언어에 대한 영어 문서 생성을 위한 벤치마크
다운스트림 분류 작업
Java 및 C에 대한 분류 작업이며, 이러한 벤치마크에서 모델을 미세 조정하고 폴더에서 평가하는 코드를 제공
자연어 추론 작업
작업 설명/질문이 자연어로 되어 있는 수학적, 기호적, 절차적 추론을 포함하는 추론 작업
평가 흐름도
평가 타입과 데이터셋에 따라서 generation을 생성하는 프롬프트와 refrences가 달라진다.
LLM이 얼마나 프롬프트로 소스를 잘 생성하는지와 그 소스가 실제로 잘 실행하는지를 측정한다.
용어 정리
- generation : LLM을 활용하여 생성된 함수
- refrences : 테스트 후보군
1. 프롬프트를 통한 함수 생성과 테스트 후보군 선택
예) mbpp
def get_prompt(self, doc):
"""Builds the prompt for the LM to generate from.
MBPP prompt is built following to InCoder (Fried et al.) approach
prompt = docstring that includes one test
"""
description = doc["text"]
test_example = doc["test_list"][0]
prompt = f'"""\n{description}\n{test_example}\n"""\n'
return prompt
def get_reference(self, doc):
"""Builds the reference solution for the doc (sample from the test dataset)."""
return "\n".join(doc["test_list"])
예) human_eval
def get_prompt(self, doc):
"""Builds the prompt for the LM to generate from."""
if self.strip_prompt:
return doc["prompt"].strip()
else:
return doc["prompt"]
def get_reference(self, doc):
"""Builds the reference solution for the doc (sample from the test dataset)."""
test_func = doc["test"]
entry_point = f"check({doc['entry_point']})"
return "\n" + test_func + "\n" + entry_point
2. code_eval를 활용하여 코드 실행 후 평가
https://huggingface.co/spaces/evaluate-metric/code_eval
!pip install evaluate
import os
os.environ["HF_ALLOW_CODE_EVAL"] = "1"
from evaluate import load
code_eval = load("code_eval")
test_cases = ["assert add(2,3)==5"]
candidates = [["def add(a,b): return a*b", "def add(a, b): return a+b"]]
pass_at_k, results = code_eval.compute(references=test_cases, predictions=candidates, k=[1, 2])
results
defaultdict(list,
{0: [(0,
{'task_id': 0,
'passed': False,
'result': 'failed: ',
'completion_id': 0}),
(1,
{'task_id': 0,
'passed': True,
'result': 'passed',
'completion_id': 1})]})
pass_at_k
{'pass@1': 0.5, 'pass@2': 1.0}
평가 흐름도를 그려보면 다음과 같다.
'AI 인공지능 > LLM' 카테고리의 다른 글
ChatGPT 탈옥 (DAN 모드) 아직도 가능한가? (0) | 2023.08.04 |
---|---|
효과적인 ChatGPT Prompt Engineering 방법 (0) | 2023.08.02 |
ChatGPT API를 사용해보자 (0) | 2023.03.06 |
센세이션을 불고 온 ChatGPT (0) | 2023.02.20 |
DeepSpeed란 무엇인가? (1) | 2023.02.06 |