Code LLM 모델과 평가방식

category AI 인공지능/LLM 2023. 10. 19. 14:59
728x90
반응형

개요

ChatGPT가 출현함으로써 개발자에게는 AI를 활용한 코드 생산성과 효율성을 증대시켰다.

번거로운 데이터 노가다 작업을 물론 코드 생성까지 해줌으로써 더 빠르고 효율적으로 사용할 수 있게하였다.

LLM (Large Language Model) 모델 Code 특화된 Model 살펴보고 어떻게 평가를 하는지 알아보고자 한다.

 

출처:https://modulabs.co.kr/blog/introducing-code-llm/

 

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}

 

평가 흐름도를 그려보면 다음과 같다.

728x90
반응형