--- base_model: MLP-KTLim/llama-3-Korean-Bllossom-8B library_name: peft license: llama3 datasets: - iknow-lab/ko-genstruct-v1 --- # Ko-genstruct v0.1 Ko-genstruct는 주어진 문서로부터 instruction tuning에 필요한 instruction을 생성해내는 모델입니다. 시험문제와 글쓰기 문제 두가지 유형의 지시문을 생성해낼 수 있습니다. 이 모델은 [Ada-instruct](https://arxiv.org/abs/2310.04484)와 [Genstruct](https://huggingface.co/NousResearch/Genstruct-7B)로부터 영감을 받았습니다. 다음과 같은 용도로 활용할 수 있습니다. - 검색 모델을 학습하기 위해 주어진 텍스트로부터 질문을 생성하기 - Instruction Tuning 학습 데이터를 생성하기 위해 Ko-genstruct로 instruction을 생성 후, 다른 LLM을 이용하여 답변 생성 ## Details - **Developed by:** [iKnow-Lab](https://github.com/iKnowLab-Projects/ko-genstruct) - **License:** [llama3] - **Lora-tuned from model:** [MLP-KTLim/llama-3-Korean-Bllossom-8B](https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B) ## 사용방법 ### 질문 생성 아래 예제를 활용하여, 주어진 문서로부터 지시문을 생성할 수 있습니다. 시험문제와 글쓰기 문제 두가지 프롬프트 유형이 존재합니다. ```python import transformers import peft model_id = "MLP-KTLim/llama-3-Korean-Bllossom-8B" peft_model_id = "iknow-lab/ko-genstruct-v0.1" tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) model = transformers.AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype="auto").eval() model.load_adapter(peft_model_id, revision="epoch-1") title = "" text = "" PROMPT_QA = """당신은 시험문제 출제위원입니다. 다음 자료에 기반하여 전문가 수준의 시험문제를 출제할 것입니다. 자료를 바탕으로 지시사항에 맞는 결과물을 json 형식으로 반환해주세요. 1. 생성한 문제는 실생활에서 사용하는 질문의 말투를 사용해야 합니다(~무엇인가요? ~작성해주세요. ~ 어떻게 해야하죠?) 2. 먼저 고등학교 수준의 문제를 생성하고, 이를 전문가 수준으로 고난이도 문제로 향상해주세요. 각 문제는 반드시 제시된 자료를 바탕으로 만들어져야 합니다. 연관성이 적더라도, 창의적인 아이디어로 해당 자료를 활용하세요. 3. 문제에는 답안 작성에 필요한 내용을 주어진 자료에서 추출해서 함께 제공해야합니다. 4. 출제할 문제의 과목 후보는 다음과 같습니다: 글쓰기, 한국어, 영어, 수학, 사회과학, 과학, 역사 문화예술, 법, 도덕, 정치, 종교, 외국어, 경제, 경영, 의료, 공학, 인문학 등 - 후보에 없어도, 적절한 과목을 자유롭게 말할 수 있다. # 제목: {title} # 자료: {text}""" PROMPT_WRITING = """당신은 글쓰기 시험문제 출제위원입니다. 다음 자료에 기반하여 전문가 수준의 시험문제를 출제할 것입니다. 자료를 바탕으로 지시사항에 맞는 결과물을 json 형식으로 반환해주세요. 1. 생성한 문제는 실생활에서 사용하는 질문의 말투를 사용해야 합니다(~무엇인가요? ~작성해주세요. ~ 어떻게 해야하죠?) 2. 먼저 고등학교 수준의 문제를 생성하고, 이를 전문가 수준으로 고난이도 문제로 향상해주세요. 각 문제는 반드시 제시된 자료를 바탕으로 만들어져야 합니다. 연관성이 적더라도, 창의적인 아이디어로 해당 자료를 활용하세요. 3. 문제에는 글쓰기 작성에 필요한 내용을 주어진 자료에서 추출해서 함께 제공해야합니다. 4. 출제할 문제의 주제 후보는 다음과 같습니다. 이 중에서 적절한 주제를 3가지 선택하세요: 이력서, 노래가사, 시 혹은 소설, 에세이, 극본, 시나리오, 여행일기, 여행계획서, 요리레시피, 해설, 자기소개서, 편지, 이메일, 리뷰 및 평가, 소셜 미디어 포스트, 일기, 청원서, 항의서, 쇼핑 리스트, 메모, 연구 논문 및 계획서, 비즈니스 보고서 및 게획서, 기술 문서, 발표자료, 계약서 혹은 법률 문서, 편집 및 출판 문서, 광고 카피라이트, 웹 콘텐츠, 뉴스레터, 연설문, 자기계발서, 분석보고서, 기획안, 제안서 # 제목: {title} # 자료: {text}""" def generate_question(title, text, is_writing: bool = False): prompt=PROMPT_WRITING if is_writing else PROMPT_QA prompt = prompt.format(title=title, text=text) prompt = [{"content": prompt, "role": "user"}] inputs = tokenizer.apply_chat_template(prompt, return_tensors="pt", add_generation_prompt=True, tokenize=False) inputs = inputs.strip() + "\n\n```json\n{\n \"topic\":" inputs = tokenizer.encode(inputs, add_special_tokens=False, return_tensors="pt").to(model.device) outputs = model.generate(input_ids=inputs, max_new_tokens=256, do_sample=True, early_stopping=True, eos_token_id=128009, temperature=1.0) question = tokenizer.decode(outputs[0, inputs.shape[1]:], skip_special_tokens=False) return question print("Question generation test") for _ in range(5): question = generate_question(title, text) print(question) print("Writing generation test") for _ in range(5): question = generate_question(title, text, True) print(question) ``` ## Citation [optional] **BibTeX:** ``` @misc{cui2023adainstructadaptinginstructiongenerators, title={Ada-Instruct: Adapting Instruction Generators for Complex Reasoning}, author={Wanyun Cui and Qianle Wang}, year={2023}, eprint={2310.04484}, archivePrefix={arXiv}, primaryClass={cs.CL}, url={https://arxiv.org/abs/2310.04484}, } @misc{Genstruct, url={[https://https://huggingface.co/NousResearch/Genstruct-7B](https://huggingface.co/NousResearch/https://huggingface.co/NousResearch/Genstruct-7B)}, title={Genstruct}, author={"euclaise"} } ``` ## Model Card Authors [optional] - 김희규 (khk6435@ajou.ac.kr) ### Framework versions - PEFT 0.11.0