본문 바로가기
  • 컴공생의 공부 일기
  • 공부보단 일기에 가까운 것 같은
  • 블로그
🤖 AI/AI

🔬sLLM 학습하기 : 성능 평가 파이프라인

by 정람지 2024. 10. 24.

언니들한테 이쁨받기흫흐흐

 

LLM을 활용한 실전 AI 애플리케이션 개발 / 허정준


🔬성능 평가 파이프라인 준비하기

학습이 잘 진행된 것인지 판단할 수 있는 성능 지표 필요

 

뛰어난 성능의 LLM을 평가 지표로 사용하기


Text2SQL 평가 방식

<방식>

EM 방식 : 생성한 sql문이 일치하는지 확인

실행 정확도 방식 : sql 쿼리를 수행한 내용이 일치하는지 확인 

 

<필요>

- 평가 데이터셋

- LLM sql 생성용 프롬프트

- gpt 평가 사용 프롬프트 + api 요청 수행 코드


평가 데이터셋 구축 

학습+평가 데이터셋으로 나누기~

 

평가 데이터셋

 

shangrilar/ko_text2sql · Datasets at Hugging Face

CREATE TABLE players ( player_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255) UNIQUE NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, date_joined DATETIME NOT NULL, last_login DATETIME ); CREATE TABLE characters (

huggingface.co


SQL 생성 프롬프트

def make_prompt(ddl, question, query=''):
    prompt = f"""당신은 SQL을 생성하는 SQL 봇입니다. DDL의 테이블을 활용한 Question을 해결할 수 있는 SQL 쿼리를 생성하세요.

### DDL:
{ddl}

### Question:
{question}

### SQL:
{query}"""
    return prompt

학습 데이터는 sql 쿼리 부분을 채우고

평가 데이터는 빼 놓기


GPT 평가 프롬프트와 코드 준비

단순 for문을 통해 평가 요청을 보낼 수도 있지만

 

양이 많아 시간이 오래 걸릴 시

요청 제한을 관리하면서 비동기적으로 요청을 보낼 수 있는 코드 

api_request_parallel_processor

 

openai-cookbook/examples/api_request_parallel_processor.py at main · openai/openai-cookbook

Examples and guides for using the OpenAI API. Contribute to openai/openai-cookbook development by creating an account on GitHub.

github.com

요청을 보낼 내용을 저장한 jsonl 파일을 읽어서 순차적으로 요청을 보냄

 

평가를 위한 요청 jsonl 작성 함수

import json
import pandas as pd
from pathlib import Path

def make_requests_for_gpt_evaluation(df, filename, dir='requests'):
  if not Path(dir).exists():
      Path(dir).mkdir(parents=True)
  prompts = []
  for idx, row in df.iterrows():
      prompts.append("""Based on below DDL and Question, evaluate gen_sql can resolve Question. If gen_sql and gt_sql do equal job, return "yes" else return "no". Output JSON Format: {"resolve_yn": ""}""" + f"""

DDL: {row['context']}
Question: {row['question']}
gt_sql: {row['answer']}
gen_sql: {row['gen_sql']}"""
)

  jobs = [{"model": "gpt-4-turbo-preview", "response_format" : { "type": "json_object" }, "messages": [{"role": "system", "content": prompt}]} for prompt in prompts]
  with open(Path(dir, filename), "w") as f:
      for job in jobs:
          json_string = json.dumps(job)
          f.write(json_string + "\n")

비동기 요청 명령

import os
os.environ["OPENAI_API_KEY"] = "자신의 OpenAI API 키 입력"

python api_request_parallel_processor.py \
  --requests_filepath {요청 파일 경로} \
  --save_filepath {생성할 결과 파일 경로} \
  --request_url https://api.openai.com/v1/chat/completions \
  --max_requests_per_minute 300 \
  --max_tokens_per_minute 100000 \
  --token_encoding_name cl100k_base \
  --max_attempts 5 \
  --logging_level 20

 

결과 jsonl 파일을 csv로 변환하는 함수

def change_jsonl_to_csv(input_file, output_file, prompt_column="prompt", response_column="response"):
    prompts = []
    responses = []
    with open(input_file, 'r') as json_file:
        for data in json_file:
            prompts.append(json.loads(data)[0]['messages'][0]['content'])
            responses.append(json.loads(data)[1]['choices'][0]['message']['content'])

    df = pd.DataFrame({prompt_column: prompts, response_column: responses})
    df.to_csv(output_file, index=False)
    return df

 

 

 

 

아.어려워.