LLM을 활용한 실전 AI 애플리케이션 개발 / 허정준
🔬성능 평가 파이프라인 준비하기
학습이 잘 진행된 것인지 판단할 수 있는 성능 지표 필요
뛰어난 성능의 LLM을 평가 지표로 사용하기
Text2SQL 평가 방식
<방식>
EM 방식 : 생성한 sql문이 일치하는지 확인
실행 정확도 방식 : sql 쿼리를 수행한 내용이 일치하는지 확인
<필요>
- 평가 데이터셋
- LLM sql 생성용 프롬프트
- gpt 평가 사용 프롬프트 + api 요청 수행 코드
평가 데이터셋 구축
학습+평가 데이터셋으로 나누기~
평가 데이터셋
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
요청을 보낼 내용을 저장한 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 |