--- library_name: transformers license: mit datasets: - shangrilar/ko_text2sql base_model: - EleutherAI/polyglot-ko-1.3b --- # polyglot-ko-1b-txt2sql `polyglot-ko-1b-txt2sql`은 한국어 자연어 질문을 SQL 쿼리로 변환하기 위해 파인튜닝된 텍스트 생성 모델입니다. 기반 모델은 [`EleutherAI/polyglot-ko-1.3b`](https://huggingface.co/EleutherAI/polyglot-ko-1.3b)를 사용했으며, LoRA를 통해 경량 파인튜닝되었습니다. 파인튜닝을 처음 해본 글쓴이가 실습용으로 만든 첫 모델로 성능을 보장할 순 없으니 참고바랍니다. --- ## 모델 정보 - **Base model**: EleutherAI/polyglot-ko-1.3b - **Fine-tuning**: QLoRA (4bit quantization + PEFT) - **Task**: Text2SQL (자연어 → SQL 변환) - **Tokenizer**: 동일한 토크나이저 사용 --- ## 학습 데이터셋 모델은 한국어 SQL 변환 태스크를 위해 설계된 자연어 질문-쿼리 페어로 파인튜닝되었습니다. - [shangrilar/ko_text2sql](https://huggingface.co/datasets/shangrilar/ko_text2sql) 데이터셋 일부 - 전처리: DDL-Question-SQL 구조로 prompt 구성 - 크기: 약 25,000건의 DDL + 자연어 질문 + SQL 정답 쌍 --- ## 평가 결과 - 평가 방식: GPT-4.1-nano 모델에게 gen_sql과 gt_sql 비교 후 평가 요청 - 평가 기준: 결과 동일 여부 기반 yes/no 판단 (JSON response: {"resolve_yn": "yes"}) - 평가 결과: - **베이스 모델 정확도**: 68% - **파인튜닝 모델 정확도**: 19% --- ## 문제점 - 베이스라인 모델은 gen_sql에 SQL 쿼리를 생성하지 못하고, 질문을 반복하거나 의미 없는 텍스트를 출력하는 경우가 많았다. - 파인튜닝 모델은 SQL 형태를 흉내내긴 했지만, 존재하지 않는 컬럼명이나 테이블명을 포함하는 등 논리적으로 틀린 쿼리를 생성했다. - 평가 모델(GPT-4.1-nano)은 베이스라인 모델이 잘못 생성한 쿼리에 대해 "resolve_yn": "yes"라고 잘못 판단하는 경우가 많았다. - 예를 들어, gen_sql이 SQL 형식을 전혀 따르지 않더라도 resolve_yn = yes로 잘못 평가되는 경우가 있었다. - 컬럼명 및 테이블명이 존재하지 않거나 잘못된 쿼리임에도 resolve_yn = yes로 잘못 분류된 경우가 존재했다. - 평가자(GPT 모델)는 문법적 타당성이나 테이블 구조 반영 여부를 제대로 판단하지 못하고, 단순 텍스트 유사성에 기반해 판별하는 경향을 보였다. --- ## 사용 예시 ```python from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline model = AutoModelForCausalLM.from_pretrained("your-username/polyglot-ko-1b-txt2sql", device_map="auto") tokenizer = AutoTokenizer.from_pretrained("your-username/polyglot-ko-1b-txt2sql") generator = pipeline("text-generation", model=model, tokenizer=tokenizer) prompt = """ 당신은 SQL 전문가입니다. ### DDL: 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 ); ### Question: 사용자 이름에 'admin'이 포함된 계정 수는? ### SQL: """ outputs = generator(prompt, do_sample=False, max_new_tokens=128) print(outputs[0]["generated_text"])