--- library_name: transformers tags: - kobart - text2text - korean --- ## Model Description `kobart-oxquiz`는 OX 퀴즈 생성을 위해 fine-tuning 된 KoBART 모델입니다. 사용자가 입력한 문맥(context)과 정답 여부(ox)를 기반으로 관련된 퀴즈 문장을 생성합니다. 이 모델은 [`gogamza/kobart-base-v2`](https://huggingface.co/gogamza/kobart-base-v2)을 fine-tuning 한 모델입니다. 생성된 문장이 특히 반복 부분에서 취약하기 때문에 아래 예시와 같이 여러 매개변수를 이용하여 조정한 후에 사용하시는 것을 추천드립니다. ## How to use ```python from transformers import AutoModelForSeq2SeqLM, AutoTokenizer import torch import re device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 질문 생성 함수 def generate_ox(model, tokenizer, context, ox): ox_str = "True" if ox else "False" input_text = f"context: {context}\n ox: {ox_str}" inputs = tokenizer(input_text, return_tensors="pt", truncation=True, padding=True).to(device) inputs.pop("token_type_ids", None) with torch.no_grad(): output_ids = model.generate(input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_length=25, do_sample=True, top_k=50, top_p=0.9, repetition_penalty=3.0, no_repeat_ngram_size=2, num_beams=10, early_stopping=True) question = tokenizer.decode(output_ids[0], skip_special_tokens=True) question = re.sub(r'다(\.다)+\.', '다.', question) question = re.sub(r'\.\.+', '.', question) question = re.sub(r'(?<=다\.)(?=[^\s])', ' ', question) question = question.strip() last_period_index = question.rfind('.') if last_period_index: question = question[:last_period_index+1] return question # 모델과 토크나이저 로드 model_name = "asteroidddd/kobart-oxquiz" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to(device) model.eval() # 예시 출력 print("\n[Example]") context = "올해 한국의 GDP 성장률은 2.5%로 최근 10년 사이 가장 높은 수치로 예상된다." question_T = generate_ox(model, tokenizer, context, True) question_F = generate_ox(model, tokenizer, context, False) print(f"Context\t\t: {context}") print(f"True question\t: {question_T}") print(f"False question\t: {question_F}\n") ``` ## Training Data [\[월간 데이콘 한국어 문장 관계 분류 경진대회\]](https://dacon.io/competitions/official/235875/overview/description) 원본 데이터셋은 **Premise(문장)**, **Hypothesis(가설)**, **Label(관계)** 로 이루어진 NLI(자연어 추론) 데이터입니다. input 으로는 `Premise`는 `context`로, `Label`은 `ox`로 이름을 변경하여 사용하였습니다. 목표 output 으로는 `Hypothesis`를 `question`으로 이름 변경한 후, `Hypothesis`의 값인 `Entailment`을 `True`로, `Contradiction`을 `False`로 변환하고, `Neutral`은 제외하여 사용하였습니다.