--- library_name: transformers license: llama3 base_model: beomi/Llama-3-Open-Ko-8B datasets: - beomi/KoAlpaca-v1.1a - kyujinpy/OpenOrca-KO - nlpai-lab/openassistant-guanaco-ko language: - ko pipeline_tag: text-generation --- # Model Card ~아오지~ ## Model Details ### Model Description [beomi/Llama-3-Open-Ko-8B](https://huggingface.co/beomi/Llama-3-Open-Ko-8B) (최신 버전)의 Instruction tuning 버전 모델입니다. - Dataset: - [beomi/Ko**A**lpaca-v1.1a](https://huggingface.co/datasets/beomi/KoAlpaca-v1.1a) - [kyujinpy/Open**O**rca-KO](https://huggingface.co/datasets/kyujinpy/OpenOrca-KO) - [nlpai-lab/openassistant-**g**uanaco-ko](https://huggingface.co/datasets/nlpai-lab/openassistant-guanaco-ko) - Instruction format: - alpaca ### Dataset - 상업적으로 이용 가능한 데이터 셋을 사용하였습니다. - 향후 비교를 위하여, 수학/코딩 관련 질문이 많은 데이터 셋(ex: kyujinpy/KOpen-platypus)은 제외하였습니다. - 멀티 턴 대화 데이터(nlpai-lab/openassistant-guanaco-ko)를 추가해보았습니다. - beomi/KoAlpaca-v1.1a - 80% 확률로 instruction 추가("당신은 인공지능 비서입니다. 사용자가 답을 이해하기 위해 외부에서 검색할 필요가 없도록 상세한 답변을 제공하세요.") - kyujinpy/OpenOrca-KO - 변경사항 없음 - nlpai-lab/openassistant-guanaco-ko - 멀티 턴 대화의 경우, 마지막 Assistant의 답변을 목표로 함 - Alpaca format에 맞춰 이전 대화 내용에 대한 전처리 수행 - 80% 확률로 instruction 추가 ("당신은 인공지능 비서입니다. 사용자가 답을 이해하기 위해 외부에서 검색할 필요가 없도록 상세한 답변을 제공하세요.") ### Training details Training: Axolotl을 이용해 LoRA로 3epoch 학습 시켰습니다. - lora_r: 32 - lora_alpha: 32 - lora_dropout: 0.05 - gradient_accumulation_steps: 8 - micro_batch_size: 4 - num_epochs: 3 - learning_rate: 0.0002 (2e-4) - lr_scheduler: cosine - warmup_steps: 50 - sequence_len: 4096 - bf16 학습 시간: 1xA100, 약 8시간 ### Evaluation - boolq를 제외하면 큰 정확도 향상은 없었습니다. - 5shot kobest (Accuracy) | Tasks |[werty1248/Llama-3-Ko-8B-OpenOrca](https://huggingface.co/werty1248/Llama-3-Ko-8B-OpenOrca)|[beomi/Llama-3-Open-Ko-8B](https://huggingface.co/beomi/Llama-3-Open-Ko-8B)|[werty1248/Llama-3-Ko-8B-Instruct-AOG](https://huggingface.co/beomi/Llama-3-Open-Ko-8B-Instruct-AOG)| |----------------|------:|------:|------:| |kobest_boolq |0.7158±0.0120|0.7963±0.0108|0.8312±0.0100| |kobest_copa |0.7620±0.0135|0.8110±0.0124|0.8120±0.0124| |kobest_hellaswag|0.4740±0.0224|0.4780±0.0224|0.4700±0.0223| |kobest_sentineg |0.9471±0.0112|0.9622±0.0096|0.9647±0.0093| |kobest_wic |0.6079±0.0138|0.5778±0.0139|0.5937±0.0138| ### Format & Examples - Instruction - Input - Response 형태가 권장되지만, 경험적으로 Question - Instruction - Response로 사용하는 것이 더 나은 것 같습니다. - 잘 된 답변 예시 ``` input = """### Question: 피보나치 수열이 뭐야? 그리고 피보나치 수열에 대해 파이썬 코드를 짜줘볼래? ### Instruction: 친절한 챗봇으로서 상대방의 요청에 최대한 자세하고 친절하게 답하자. ### Response: """ 피보나치 수열은 1차와 2차 수를 사용해 다음 수를 구하는 방식으로 만들어지는 순열입니다. 예를들면 피보나치 수열의 처음 7개 요소는 1, 1, 2, 3, 5, 8, 13입니다. 피보나치 수열의 각 위치에서 2개 이전 위치의 수를 더하여 새로운 요소가 계산됩니다. Python 코드는 다음과 같습니다. def fibo(n): if n<2: return n else: return fibo(n-1)+fibo(n-2) 이렇게 작성함으로써 피보나치 수열의 위치 0부터 n까지 각 요소가 계산됩니다. 6이라는 위치로 계산하는 경우 다음과 같은 출력이 나타납니다: print(fibo(6)) fibonacci(6)==> 8<|end_of_text|> ``` - 잘못된 답변(할루시네이션) 예시 ``` input = """### Question: 세종대왕의 집현전 맥북 던짐 사건에 대해서 알고 있어? ### Instruction: 친절한 챗봇으로서 상대방의 요청에 최대한 자세하고 친절하게 답하자. ### Response: """ 네, 2007년에 세종대왕의 집현전 맥북 던진 사건이 일어났습니다. 동화 작가인 이주영씨가 김소희 작가의 책을 집필하면서, 책 내용상 원래 있었던 세종대왕이 맥북을 던졌다는 내용을 제재로 해서 출판하였고, 이에 김소희 작가는 집현전이란 이름으로 이주영 작가에게 법적 소송을 걸게 되었습니다. 그러나 결론적으로, 김소희 작가의 집현전이란 단어는 특정 단체나 장소만을 명백하게 사용하는 '호칭'의 성격과 함께 다수의 집현전 사람들이 공동 사용하는 '표준'의 성격을 가졌으므로, 이주영 작가의 출판 행위가 명예훼손에 해당되는지 여부를 판단할 때에는 출판 당시 집현전이 일반적으로 어떤 의미를 가지고 있었는지가 중요한 요소로 고려되었습니다. 따라서 단순히 집현전이 가계상 특정 단체 및 장소와 관련된 호칭으로만 사용되어왔다면, 출판 행위로 인해 명예훼손을 받았다는 김소희 작가의 주장은 받아들여지지 않았을 수도 있습니다.<|end_of_text|> ``` - 멀티턴 대화 예시 (신뢰도 낮음) ``` """### Question: 피보나치 수열이 뭐야? 그리고 피보나치 수열에 대해 파이썬 코드를 짜줘볼래? ### Response: 피보나치 수열은 1차와 2차 수를 사용해 다음 수를 구하는 방식으로 만들어지는 순열입니다. 예를들면 피보나치 수열의 처음 7개 요소는 1, 1, 2, 3, 5, 8, 13입니다. 피보나치 수열의 각 위치에서 2개 이전 위치의 수를 더하여 새로운 요소가 계산됩니다. Python 코드는 다음과 같습니다. def fibo(n): if n<2: return n else: return fibo(n-1)+fibo(n-2) 이렇게 작성함으로써 피보나치 수열의 위치 0부터 n까지 각 요소가 계산됩니다. 6이라는 위치로 계산하는 경우 다음과 같은 출력이 나타납니다: print(fibo(6)) fibonacci(6)==> 8 ### Question: 더 빠른 알고리즘은 없을까? ### Instruction: 친절한 챗봇으로서 상대방의 요청에 최대한 자세하고 친절하게 답하자. ### Response: """ 다른 Python 코드는 다음과 같습니다: def fibo(n): a, b = 0, 1 for _ in range(n): a, b = b, a+b return a 이 코드는 두 개의 로컬 변수 a 및 b를 사용하는 이터레이터를 사용하여 계산을 수행합니다. 초기화 시 a는 피보나치 수열의 위치 0의 값으로 설정되고, b는 이전 계산에서 피봇 계열의 위치 0의 값(위치 0을 포함하면 1단계에서 1이며, 위치 1을 포함하면 2단계에서 1)으로 설정됩니다. 다음 각 반복에서 a는 이전 로컬 변수 b의 값과 새로운 값으로 값이 바뀝니다. 두 번째 파라미터 __는 각 반복에서 값이 출력되지 않는다는(그러나 여전히 사용됩니다) 것을 반영하기 위해 선택되었습니다.<|end_of_text|> ``` ### License: [https://llama.meta.com/llama3/license](https://llama.meta.com/llama3/license)