


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
아.어려워.
'🤖 AI > AI' 카테고리의 다른 글
😄 Hugging Face 탐색 (0) | 2024.10.25 |
---|---|
🔬sLLM 학습하기 :미세 조정(fine-tuning) ing (2) | 2024.10.24 |
🔬sLLM 학습하기 :Text2SQL 데이터셋 (2) | 2024.10.24 |
🦿딥러닝 실전 : Data Loader (1) | 2024.10.17 |
🦿딥러닝 실전 : 파이토치 입문 (0) | 2024.10.15 |