Delete kcmii_lm_rag.ipynb
Browse files- kcmii_lm_rag.ipynb +0 -483
kcmii_lm_rag.ipynb
DELETED
|
@@ -1,483 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"cells": [
|
| 3 |
-
{
|
| 4 |
-
"cell_type": "markdown",
|
| 5 |
-
"id": "9d6fc17a-d548-4ab6-b5d3-51e4b60960bb",
|
| 6 |
-
"metadata": {},
|
| 7 |
-
"source": [
|
| 8 |
-
"### full-fine-tuning 하기에 학습 시간이 너무 오래걸림\n",
|
| 9 |
-
"### RAG 검색 기반 활용해 개발해보는 것으로 진행"
|
| 10 |
-
]
|
| 11 |
-
},
|
| 12 |
-
{
|
| 13 |
-
"cell_type": "markdown",
|
| 14 |
-
"id": "33f8253d-352f-4ac6-9205-59b0e773be77",
|
| 15 |
-
"metadata": {},
|
| 16 |
-
"source": [
|
| 17 |
-
"### 키워드 기반의 RAG 구축 \n",
|
| 18 |
-
"\n",
|
| 19 |
-
"### 흐름\n",
|
| 20 |
-
"[입력: 전공명 3개] \n",
|
| 21 |
-
" ↓ \n",
|
| 22 |
-
"[CSV 문서에서 3개 전공 정보 추출] ← (Keyword-based Retriever) \n",
|
| 23 |
-
" ↓ \n",
|
| 24 |
-
"[전공 정보들을 연결하여 프롬프트 생성] ← (Prompt Composer) \n",
|
| 25 |
-
" ↓ \n",
|
| 26 |
-
"[LLM에게 전달하여 생기부 문구 생성] ← (Generator)"
|
| 27 |
-
]
|
| 28 |
-
},
|
| 29 |
-
{
|
| 30 |
-
"cell_type": "code",
|
| 31 |
-
"execution_count": 4,
|
| 32 |
-
"id": "cbe0926d-ccec-4942-8a9e-bf5f940d1a0b",
|
| 33 |
-
"metadata": {},
|
| 34 |
-
"outputs": [
|
| 35 |
-
{
|
| 36 |
-
"data": {
|
| 37 |
-
"text/plain": [
|
| 38 |
-
"(61,\n",
|
| 39 |
-
" '[전공명: 어문학]\\n전공설명: 동서양 언어의 구조와 문학적 표현을 체계적으로 탐구하고, 다양한 문화적 맥락을 이해하는 학문이다.\\n요구역량: 언어적 감각, 논리적 사고력, 비판적 분석 능력\\n전공관심: 언어와 문학, 다양한 국가의 사회·문화적 특성\\n관련진로: 소설가, 방송작가, 번역가, 문학비평가, 통역사, 언어학자')"
|
| 40 |
-
]
|
| 41 |
-
},
|
| 42 |
-
"execution_count": 4,
|
| 43 |
-
"metadata": {},
|
| 44 |
-
"output_type": "execute_result"
|
| 45 |
-
}
|
| 46 |
-
],
|
| 47 |
-
"source": [
|
| 48 |
-
"# 사용자로부터 전공명 3개 입력 받기\n",
|
| 49 |
-
"# csv 데이터에서 해당 전공 3개의 정보 추출\n",
|
| 50 |
-
"# 추출된 정보를 기반으로 프롬프트 구성\n",
|
| 51 |
-
"import pandas as pd\n",
|
| 52 |
-
"\n",
|
| 53 |
-
"file_path = \"dataset/kcmii_major_rag.csv\"\n",
|
| 54 |
-
"df = pd.read_csv(file_path)\n",
|
| 55 |
-
"\n",
|
| 56 |
-
"def make_major_prompt(df, majors : list) :\n",
|
| 57 |
-
" parts = []\n",
|
| 58 |
-
" for i, major in enumerate(major, 1) : # enumerate(major, 1) 스타팅 넘버 설정\n",
|
| 59 |
-
" row = df[df['전공명']==major]\n",
|
| 60 |
-
" if row.empty:\n",
|
| 61 |
-
" continue\n",
|
| 62 |
-
" r = row.iloc[o]\n",
|
| 63 |
-
" \n",
|
| 64 |
-
"전공설명: {row['전공설명']}\n",
|
| 65 |
-
"요구역량: {row['요구역량']}\n",
|
| 66 |
-
"전공관심: {row['전공관심']}\n",
|
| 67 |
-
"관련진로: {row['관련진로']}\"\"\"\n",
|
| 68 |
-
"\n",
|
| 69 |
-
"# 문서 리스트 생성\n",
|
| 70 |
-
"documents = df.apply(format_row_as_document, axis=1).tolist()\n",
|
| 71 |
-
"\n",
|
| 72 |
-
"# 문서 수 확인 및 샘플 출력\n",
|
| 73 |
-
"len(documents), documents[0]"
|
| 74 |
-
]
|
| 75 |
-
},
|
| 76 |
-
{
|
| 77 |
-
"cell_type": "code",
|
| 78 |
-
"execution_count": 35,
|
| 79 |
-
"id": "dbd6f8a1-aca2-44df-9d37-7377025c7126",
|
| 80 |
-
"metadata": {},
|
| 81 |
-
"outputs": [
|
| 82 |
-
{
|
| 83 |
-
"data": {
|
| 84 |
-
"text/plain": [
|
| 85 |
-
"pandas.core.series.Series"
|
| 86 |
-
]
|
| 87 |
-
},
|
| 88 |
-
"execution_count": 35,
|
| 89 |
-
"metadata": {},
|
| 90 |
-
"output_type": "execute_result"
|
| 91 |
-
}
|
| 92 |
-
],
|
| 93 |
-
"source": []
|
| 94 |
-
},
|
| 95 |
-
{
|
| 96 |
-
"cell_type": "code",
|
| 97 |
-
"execution_count": 5,
|
| 98 |
-
"id": "52fe7db0-e1e2-4f86-9eb7-55bf794ecb3d",
|
| 99 |
-
"metadata": {},
|
| 100 |
-
"outputs": [],
|
| 101 |
-
"source": [
|
| 102 |
-
"import pandas as pd\n",
|
| 103 |
-
"file_path = \"dataset/kcmii_major_rag.csv\"\n",
|
| 104 |
-
"df = pd.read_csv(file_path)\n",
|
| 105 |
-
"\n",
|
| 106 |
-
"majors = [\"심리\", \"교육\", \"사회복지\"]\n",
|
| 107 |
-
"parts = []\n",
|
| 108 |
-
"for i, major in enumerate(majors, 1):\n",
|
| 109 |
-
" row = df[df['전공명']==major]\n",
|
| 110 |
-
" r = row.iloc[0] # 시리즈 변환\n",
|
| 111 |
-
" part = f\"\"\"{i}. {major}\n",
|
| 112 |
-
"전공설명: {r['전공설명']}\n",
|
| 113 |
-
"요구역량: {r['요구역량']}\n",
|
| 114 |
-
"전공관심: {r['전공관심']}\n",
|
| 115 |
-
"관련진로: {r['관련진로']}\n",
|
| 116 |
-
"\"\"\"\n",
|
| 117 |
-
" parts.append(part)\n",
|
| 118 |
-
"\n",
|
| 119 |
-
"majors_str = \", \".join(majors)\n",
|
| 120 |
-
"prompt = f\"\"\"OO 학생은 아래의 세 전공 분야({majors_str})에 대해 흥미 수준이 높습니다.\n",
|
| 121 |
-
"각 전공에 대한 정보를 바탕으로, 고등학생 생활기록부 문구를 작성해주세요:\n",
|
| 122 |
-
"\n",
|
| 123 |
-
"{chr(10).join(parts)}\n",
|
| 124 |
-
"\"\"\""
|
| 125 |
-
]
|
| 126 |
-
},
|
| 127 |
-
{
|
| 128 |
-
"cell_type": "code",
|
| 129 |
-
"execution_count": 6,
|
| 130 |
-
"id": "17933069-cd0d-4b15-b424-410b83063dbc",
|
| 131 |
-
"metadata": {},
|
| 132 |
-
"outputs": [
|
| 133 |
-
{
|
| 134 |
-
"data": {
|
| 135 |
-
"text/plain": [
|
| 136 |
-
"['1. 심리\\n전공설명: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다.\\n요구역량: 공감 능력, 분석력, 관찰력\\n전공관심: 인간 행동, 감정, 인지 기능\\n관련진로: 임상심리사, 상담사, 조직심리전문가, 연구원, 교수\\n',\n",
|
| 137 |
-
" '2. 교육\\n전공설명: 인간의 학습과 발달을 연구하고 효과적인 교수법과 교육 제도를 탐구하는 학문이다.\\n요구역량: 소통 능력, 인내심, 관찰력\\n전공관심: 교육과정, 아동 발달, 교수 학습 방법\\n관련진로: 교사, 교육행정가, 교육연구원, 교수, 교육컨설턴트\\n',\n",
|
| 138 |
-
" '3. 사회복지\\n전공설명: 사회복지는 다양한 사회 구성원의 복지와 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다.\\n요구역량: 공감 능력, 대인관계능력, 문제 해결력\\n전공관심: 사회적 약자 지원, 복지 정책, 인간 존엄성\\n관련진로: 사회복지사, 청소년지도사, 복지행정가, 가족상담사, 다문화전문가\\n']"
|
| 139 |
-
]
|
| 140 |
-
},
|
| 141 |
-
"execution_count": 6,
|
| 142 |
-
"metadata": {},
|
| 143 |
-
"output_type": "execute_result"
|
| 144 |
-
}
|
| 145 |
-
],
|
| 146 |
-
"source": [
|
| 147 |
-
"parts"
|
| 148 |
-
]
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"cell_type": "code",
|
| 152 |
-
"execution_count": 7,
|
| 153 |
-
"id": "09768d88-b7a6-4ef6-bd3d-e58f23f8e82b",
|
| 154 |
-
"metadata": {},
|
| 155 |
-
"outputs": [
|
| 156 |
-
{
|
| 157 |
-
"data": {
|
| 158 |
-
"text/plain": [
|
| 159 |
-
"'OO 학생은 아래의 세 전공 분야(심리, 교육, 사회복지)에 대해 흥미 수준이 높습니다.\\n각 전공에 대한 정보를 바탕으로, 고등학생 생활기록부 문구를 작성해주세요:\\n\\n1. 심리\\n전공설명: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다.\\n요구역량: 공감 능력, 분석력, 관찰력\\n전공관심: 인간 행동, 감정, 인지 기능\\n관련진로: 임상심리사, 상담사, 조직심리전문가, 연구원, 교수\\n\\n2. 교육\\n전공설명: 인간의 학습과 발달을 연구하고 효과적인 교수법과 교육 제도를 탐구하는 학문이다.\\n요구역량: 소통 능력, 인내심, 관찰력\\n전공관심: 교육과정, 아동 발달, 교수 학습 방법\\n관련진로: 교사, 교육행정가, 교육연구원, 교수, 교육컨설턴트\\n\\n3. 사회복지\\n전공설명: 사회복지는 다양한 사회 구성원의 복지와 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다.\\n요구역량: 공감 능력, 대인관계능력, 문제 해결력\\n전공관심: 사회적 약자 지원, 복지 정책, 인간 존엄성\\n관련진로: 사회복지사, 청소년지도사, 복지행정가, 가족상담사, 다문화전문가\\n\\n'"
|
| 160 |
-
]
|
| 161 |
-
},
|
| 162 |
-
"execution_count": 7,
|
| 163 |
-
"metadata": {},
|
| 164 |
-
"output_type": "execute_result"
|
| 165 |
-
}
|
| 166 |
-
],
|
| 167 |
-
"source": [
|
| 168 |
-
"prompt\n",
|
| 169 |
-
"# 너무 길게나와서 학습시킬때 불안함..."
|
| 170 |
-
]
|
| 171 |
-
},
|
| 172 |
-
{
|
| 173 |
-
"cell_type": "code",
|
| 174 |
-
"execution_count": 17,
|
| 175 |
-
"id": "b178159f-cf48-4989-be66-85af3e7ec510",
|
| 176 |
-
"metadata": {},
|
| 177 |
-
"outputs": [],
|
| 178 |
-
"source": [
|
| 179 |
-
"# 선호 전공 3개의 간략한 정보만 추출해 나오는 프롬프트로 수정\n",
|
| 180 |
-
"file_path = \"dataset/kcmii_major_rag_summarized.csv\"\n",
|
| 181 |
-
"df = pd.read_csv(file_path)\n",
|
| 182 |
-
"\n",
|
| 183 |
-
"import pandas as pd\n",
|
| 184 |
-
"\n",
|
| 185 |
-
"def make_major_prompt(df, majors: list) -> str:\n",
|
| 186 |
-
" parts = []\n",
|
| 187 |
-
" for i, major in enumerate(majors, 1):\n",
|
| 188 |
-
" row = df[df['전공명'] == major]\n",
|
| 189 |
-
" if row.empty:\n",
|
| 190 |
-
" continue\n",
|
| 191 |
-
" summary = row.iloc[0]['요약']\n",
|
| 192 |
-
" parts.append(f\"{i}. {major}: {summary}\")\n",
|
| 193 |
-
"\n",
|
| 194 |
-
" majors_str = \", \".join(majors)\n",
|
| 195 |
-
" prompt = f\"\"\"OO 학생은 아래의 세 전공 분야({majors_str})에 흥미를 가지고 있습니다.\n",
|
| 196 |
-
"이 전공들에 대한 요약 정보를 참고하여, 학생의 활동 속에서 드러난 관심과 역량 또는 융합 가능성을 고려하여 고등학생 생활기록부 문구를 서술형으로 작성해주세요:\n",
|
| 197 |
-
"\n",
|
| 198 |
-
"{chr(10).join(parts)}\n",
|
| 199 |
-
"\"\"\"\n",
|
| 200 |
-
" return prompt"
|
| 201 |
-
]
|
| 202 |
-
},
|
| 203 |
-
{
|
| 204 |
-
"cell_type": "code",
|
| 205 |
-
"execution_count": 18,
|
| 206 |
-
"id": "6c24ded3-2a88-47ad-89c3-40b5e7c0dc01",
|
| 207 |
-
"metadata": {},
|
| 208 |
-
"outputs": [
|
| 209 |
-
{
|
| 210 |
-
"name": "stdout",
|
| 211 |
-
"output_type": "stream",
|
| 212 |
-
"text": [
|
| 213 |
-
"OO 학생은 아래의 세 전공 분야(심리, 교육, 사회복지)에 흥미를 가지고 있습니다.\n",
|
| 214 |
-
"이 전공들에 대한 요약 정보를 참고하여, 학생의 활동 속에서 드러난 관심과 역량 또는 융합 가능성을 고려하여 고등학생 생활기록부 문구를 서술형으로 작성해주세요:\n",
|
| 215 |
-
"\n",
|
| 216 |
-
"1. 심리: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다. (주요 역량: 공감 능력, 관심 분야: 인간 행동)\n",
|
| 217 |
-
"2. 교육: 인간의 학습과 발달을 연구하고 효과적인 교수법과 교육 제도를 탐구하는 학문이다. (주요 역량: 소통 능력, 관심 분야: 교육과정)\n",
|
| 218 |
-
"3. 사회복지: 사회복지는 다양한 사회 구성원의 복지와 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다. (주요 역량: 공감 능력, 관심 분야: 사회적 약자 지원)\n",
|
| 219 |
-
"\n"
|
| 220 |
-
]
|
| 221 |
-
}
|
| 222 |
-
],
|
| 223 |
-
"source": [
|
| 224 |
-
"example_majors = [\"심리\", \"교육\", \"사회복지\"]\n",
|
| 225 |
-
"prompt = make_major_prompt(df, example_majors)\n",
|
| 226 |
-
"print(prompt)"
|
| 227 |
-
]
|
| 228 |
-
},
|
| 229 |
-
{
|
| 230 |
-
"cell_type": "markdown",
|
| 231 |
-
"id": "6467b751-3228-4948-9042-de65f1a3f118",
|
| 232 |
-
"metadata": {},
|
| 233 |
-
"source": [
|
| 234 |
-
"### 50개 전공은 너무 많으니 공통적으로 묶이는 전공(유사분야) 케이스 10개만 분리해 학습데이터 생성\n",
|
| 235 |
-
"### LoRA 경략 학습으로 먼저 테스트"
|
| 236 |
-
]
|
| 237 |
-
},
|
| 238 |
-
{
|
| 239 |
-
"cell_type": "code",
|
| 240 |
-
"execution_count": 24,
|
| 241 |
-
"id": "bc8b0f50-c6e4-49fe-98a4-3ee8d8ef4b83",
|
| 242 |
-
"metadata": {},
|
| 243 |
-
"outputs": [
|
| 244 |
-
{
|
| 245 |
-
"name": "stdout",
|
| 246 |
-
"output_type": "stream",
|
| 247 |
-
"text": [
|
| 248 |
-
"사용 중인 디바이스: mps\n"
|
| 249 |
-
]
|
| 250 |
-
},
|
| 251 |
-
{
|
| 252 |
-
"name": "stdin",
|
| 253 |
-
"output_type": "stream",
|
| 254 |
-
"text": [
|
| 255 |
-
"The repository for LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct contains custom code which must be executed to correctly load the model. You can inspect the repository content at https://hf.co/LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct.\n",
|
| 256 |
-
"You can avoid this prompt in future by passing the argument `trust_remote_code=True`.\n",
|
| 257 |
-
"\n",
|
| 258 |
-
"Do you wish to run the custom code? [y/N] y\n"
|
| 259 |
-
]
|
| 260 |
-
},
|
| 261 |
-
{
|
| 262 |
-
"name": "stderr",
|
| 263 |
-
"output_type": "stream",
|
| 264 |
-
"text": [
|
| 265 |
-
"A new version of the following files was downloaded from https://huggingface.co/LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct:\n",
|
| 266 |
-
"- configuration_exaone.py\n",
|
| 267 |
-
". Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n"
|
| 268 |
-
]
|
| 269 |
-
},
|
| 270 |
-
{
|
| 271 |
-
"name": "stdin",
|
| 272 |
-
"output_type": "stream",
|
| 273 |
-
"text": [
|
| 274 |
-
"The repository for LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct contains custom code which must be executed to correctly load the model. You can inspect the repository content at https://hf.co/LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct.\n",
|
| 275 |
-
"You can avoid this prompt in future by passing the argument `trust_remote_code=True`.\n",
|
| 276 |
-
"\n",
|
| 277 |
-
"Do you wish to run the custom code? [y/N] y\n"
|
| 278 |
-
]
|
| 279 |
-
},
|
| 280 |
-
{
|
| 281 |
-
"name": "stderr",
|
| 282 |
-
"output_type": "stream",
|
| 283 |
-
"text": [
|
| 284 |
-
"A new version of the following files was downloaded from https://huggingface.co/LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct:\n",
|
| 285 |
-
"- modeling_exaone.py\n",
|
| 286 |
-
". Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n",
|
| 287 |
-
"Fetching 2 files: 100%|██████████| 2/2 [02:39<00:00, 79.72s/it] \n",
|
| 288 |
-
"Loading checkpoint shards: 100%|██████████| 2/2 [00:00<00:00, 37.62it/s]\n"
|
| 289 |
-
]
|
| 290 |
-
},
|
| 291 |
-
{
|
| 292 |
-
"name": "stdout",
|
| 293 |
-
"output_type": "stream",
|
| 294 |
-
"text": [
|
| 295 |
-
"\n",
|
| 296 |
-
"📄 생성된 문장:\n",
|
| 297 |
-
"\n",
|
| 298 |
-
"### 명령:\n",
|
| 299 |
-
"다음 전공 정보를 바탕으로 학생의 흥미와 활동을 반영한 생기부 문구를 작성하세요.\n",
|
| 300 |
-
"\n",
|
| 301 |
-
"### 입력:\n",
|
| 302 |
-
"1. 심리: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다. (주요 역량: 공감능력, 관심 분야: 감정)\n",
|
| 303 |
-
"2. 교육: 인간의 학습과 발달을 연구하고 효과적인 교수법을 탐색하는 학문이다. (주요 역량: 소통능력, 관심 분야: 아동 발달)\n",
|
| 304 |
-
"3. 사회복지: 다양한 사회 구성원의 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다. (주요 역량: 대인관계능력, 관심 분야: 사회적 약자 지원)\n",
|
| 305 |
-
"\n",
|
| 306 |
-
"### 출력:\n",
|
| 307 |
-
"\"심리학의 따뜻함 속에서 깊이 있게 감정에 귀 기울이며, 교육 현장에서는 아이들의 성장을 이끄는 지혜로운 멘토가 되고 싶습니다. 또한, 사회적 약자들에게 희망의 빛을 전해주기 위해 노력하는 따뜻한 사회복지사가 되어, 모든 사람이 존중받고 행복할 수 있도록 돕고 싶습니다.\"\n"
|
| 308 |
-
]
|
| 309 |
-
}
|
| 310 |
-
],
|
| 311 |
-
"source": [
|
| 312 |
-
"# 허깅페이스에 있는 모델을 임포트 및 토크나이저 로딩용 도구 불러서 테스트\n",
|
| 313 |
-
"import torch\n",
|
| 314 |
-
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
|
| 315 |
-
"\n",
|
| 316 |
-
"device = torch.device(\"mps\" if torch.backends.mps.is_available() else \"cpu\")\n",
|
| 317 |
-
"print(\"사용 중인 디바이스:\", device)\n",
|
| 318 |
-
"\n",
|
| 319 |
-
"# 모델 불러오기\n",
|
| 320 |
-
"model_name = \"LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct\"\n",
|
| 321 |
-
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 322 |
-
"model = AutoModelForCausalLM.from_pretrained(model_name).to(device)\n",
|
| 323 |
-
"\n",
|
| 324 |
-
"# 사용자가 입력할 텍스트 또는 입력값\n",
|
| 325 |
-
"prompt = \"\"\"### 명령:\n",
|
| 326 |
-
"다음 전공 정보를 바탕으로 학생의 흥미와 활동을 반영한 생기부 문구를 작성하세요.\n",
|
| 327 |
-
"\n",
|
| 328 |
-
"### 입력:\n",
|
| 329 |
-
"1. 심리: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다. (주요 역량: 공감능력, 관심 분야: 감정)\n",
|
| 330 |
-
"2. 교육: 인간의 학습과 발달을 연구하고 효과적인 교수법을 탐색하는 학문이다. (주요 역량: 소통능력, 관심 분야: 아동 발달)\n",
|
| 331 |
-
"3. 사회복��: 다양한 사회 구성원의 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다. (주요 역량: 대인관계능력, 관심 분야: 사회적 약자 지원)\n",
|
| 332 |
-
"\n",
|
| 333 |
-
"### 출력:\n",
|
| 334 |
-
"\"\"\"\n",
|
| 335 |
-
"\n",
|
| 336 |
-
"# 입력값을 토크나이저를 통해 숫자 토큰으로 변환\n",
|
| 337 |
-
"# return_tensors=\"pt\" 입력값을 숫자 토큰화하여 파이토지 텐서 형태로 리턴\n",
|
| 338 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n",
|
| 339 |
-
"\n",
|
| 340 |
-
"# gpt는 입력 자체가 항상 하나의 연속된 문장 스퀀스이기 때문에 문장 구분이 필요없음\n",
|
| 341 |
-
"if 'token_type_ids' in inputs:\n",
|
| 342 |
-
" inputs.pop('token_type_ids')\n",
|
| 343 |
-
"\n",
|
| 344 |
-
"# torch.no_grad() 추론 시에는 기울기 게산하지 않게하여 속도/메모리 절약 -> 왜 이렇게 해야하나?\n",
|
| 345 |
-
"with torch.no_grad():\n",
|
| 346 |
-
" # model.generate() 주어진 입력에 대해 텍스트를 생성함\n",
|
| 347 |
-
" ## 자세한 내용과 이해는 노션 참고\n",
|
| 348 |
-
" outputs = model.generate(\n",
|
| 349 |
-
" **inputs,\n",
|
| 350 |
-
" # 최대 80개의 새로운 토큰 생성\n",
|
| 351 |
-
" ## 모델이 새로 생성할 최대 토큰의 개수\n",
|
| 352 |
-
" max_new_tokens=150,\n",
|
| 353 |
-
" # 확률 기반 샘플링 활성화\n",
|
| 354 |
-
" ## 모델이 다음 토큰을 선택할 때 가장 확률 높은 단어를 무조건 고르는 것이 아니라 확률 분포에서 무작위로 하나 샘플링\n",
|
| 355 |
-
" do_sample=True,\n",
|
| 356 |
-
" # 확률 높은 상위 50개 중에서 선택\n",
|
| 357 |
-
" ## 샘플링할 때 상위 k개의 단어만으로 후보를 제한\n",
|
| 358 |
-
" top_k=50,\n",
|
| 359 |
-
" # 누적 확률 95%까지 포함한 후보군에서 선택\n",
|
| 360 |
-
" ## 상위 단위들의 누적화률이 95% 넘을 때까지 후보군을 누적시킴, 그 안에서 샘플링\n",
|
| 361 |
-
" top_p=0.95,\n",
|
| 362 |
-
" # 창의성 조절 값\n",
|
| 363 |
-
" temperature=0.8,\n",
|
| 364 |
-
" repetition_penalty=1.1\n",
|
| 365 |
-
" )\n",
|
| 366 |
-
"\n",
|
| 367 |
-
"# 토큰을 텍스트로 디코딩\n",
|
| 368 |
-
"# 모델이 생성한 토큰 시퀀스 중 첫번 째 결과를\n",
|
| 369 |
-
"# skip_special_tokens=True 특수토큰 제거\n",
|
| 370 |
-
"result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 371 |
-
"print(\"\\n📄 생성된 문장:\\n\")\n",
|
| 372 |
-
"print(result)"
|
| 373 |
-
]
|
| 374 |
-
},
|
| 375 |
-
{
|
| 376 |
-
"cell_type": "code",
|
| 377 |
-
"execution_count": 25,
|
| 378 |
-
"id": "382ea67d-298b-4d78-b16c-9f66f3052e21",
|
| 379 |
-
"metadata": {},
|
| 380 |
-
"outputs": [
|
| 381 |
-
{
|
| 382 |
-
"name": "stdout",
|
| 383 |
-
"output_type": "stream",
|
| 384 |
-
"text": [
|
| 385 |
-
"\n",
|
| 386 |
-
"📄 생성된 문장:\n",
|
| 387 |
-
"\n",
|
| 388 |
-
"### 명령:\n",
|
| 389 |
-
"다음 전공 정보를 바탕으로 학생의 흥미와 활동을 반영한 생기부 문구를 작성하세요.\n",
|
| 390 |
-
"\n",
|
| 391 |
-
"### 입력:\n",
|
| 392 |
-
"1. 심리: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다. (주요 역량: 공감능력, 관심 분야: 감정)\n",
|
| 393 |
-
"2. 교육: 인간의 학습과 발달을 연구하고 효과적인 교수법을 탐색하는 학문이다. (주요 역량: 소통능력, 관심 분야: 아동 발달)\n",
|
| 394 |
-
"3. 사회복지: 다양한 사회 구성원의 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다. (주요 역량: 대인관계능력, 관심 분야: 사회적 약자 지원)\n",
|
| 395 |
-
"\n",
|
| 396 |
-
"### 출력:\n",
|
| 397 |
-
"\"심리학을 통해 섬세한 감정의 깊이를 느끼고, 교육은 아이들의 잠재력을 깨우며 성장시키는 데 큰 기쁨을 느꼈습니다. 사회복지에서는 복잡한 사회 문제 속에서도 따뜻한 손길로 어려움을 겪는 이들을 돕는 것이 큰 보람이었습니다.\"\n"
|
| 398 |
-
]
|
| 399 |
-
}
|
| 400 |
-
],
|
| 401 |
-
"source": [
|
| 402 |
-
"# 사용자가 입력할 텍스트 또는 입력값\n",
|
| 403 |
-
"prompt = \"\"\"### 명령:\n",
|
| 404 |
-
"다음 전공 정보를 바탕으로 학생의 흥미와 활동을 반영한 생기부 문구를 작성하세요.\n",
|
| 405 |
-
"\n",
|
| 406 |
-
"### 입력:\n",
|
| 407 |
-
"1. 심리: 인간의 행동과 정신 과정을 과학적으로 탐구하는 학문이다. (주요 역량: 공감능력, 관심 분야: 감정)\n",
|
| 408 |
-
"2. 교육: 인간의 학습과 발달을 연구하고 효과적인 교수법을 탐색하는 학문이다. (주요 역량: 소통능력, 관심 분야: 아동 발달)\n",
|
| 409 |
-
"3. 사회복지: 다양한 사회 구성원의 삶의 질 향상을 위한 제도와 실천 방법을 연구하는 학문이다. (주요 역량: 대인관계능력, 관심 분야: 사회적 약자 지원)\n",
|
| 410 |
-
"\n",
|
| 411 |
-
"### 출력:\n",
|
| 412 |
-
"\"\"\"\n",
|
| 413 |
-
"\n",
|
| 414 |
-
"# 입력값을 토크나이저를 통해 숫자 토큰으로 변환\n",
|
| 415 |
-
"# return_tensors=\"pt\" 입력값을 숫자 토큰화하여 파이토지 텐서 형태로 리턴\n",
|
| 416 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n",
|
| 417 |
-
"\n",
|
| 418 |
-
"# gpt는 입력 자체가 항상 하나의 연속된 문장 스퀀스이기 때문에 문장 구분이 필요��음\n",
|
| 419 |
-
"if 'token_type_ids' in inputs:\n",
|
| 420 |
-
" inputs.pop('token_type_ids')\n",
|
| 421 |
-
"\n",
|
| 422 |
-
"# torch.no_grad() 추론 시에는 기울기 게산하지 않게하여 속도/메모리 절약 -> 왜 이렇게 해야하나?\n",
|
| 423 |
-
"with torch.no_grad():\n",
|
| 424 |
-
" # model.generate() 주어진 입력에 대해 텍스트를 생성함\n",
|
| 425 |
-
" ## 자세한 내용과 이해는 노션 참고\n",
|
| 426 |
-
" outputs = model.generate(\n",
|
| 427 |
-
" **inputs,\n",
|
| 428 |
-
" # 최대 80개의 새로운 토큰 생성\n",
|
| 429 |
-
" ## 모델이 새로 생성할 최대 토큰의 개수\n",
|
| 430 |
-
" max_new_tokens=150,\n",
|
| 431 |
-
" # 확률 기반 샘플링 활성화\n",
|
| 432 |
-
" ## 모델이 다음 토큰을 선택할 때 가장 확률 높은 단어를 무조건 고르는 것이 아니라 확률 분포에서 무작위로 하나 샘플링\n",
|
| 433 |
-
" do_sample=True,\n",
|
| 434 |
-
" # 확률 높은 상위 50개 중에서 선택\n",
|
| 435 |
-
" ## 샘플링할 때 상위 k개의 단어만으로 후보를 제한\n",
|
| 436 |
-
" top_k=50,\n",
|
| 437 |
-
" # 누적 확률 95%까지 포함한 후보군에서 선택\n",
|
| 438 |
-
" ## 상위 단위들의 누적화률이 95% 넘을 때까지 후보군을 누적시킴, 그 안에서 샘플링\n",
|
| 439 |
-
" top_p=0.95,\n",
|
| 440 |
-
" # 창의성 조절 값\n",
|
| 441 |
-
" temperature=0.8,\n",
|
| 442 |
-
" repetition_penalty=1.1\n",
|
| 443 |
-
" )\n",
|
| 444 |
-
"\n",
|
| 445 |
-
"# 토큰을 텍스트로 디코딩\n",
|
| 446 |
-
"# 모델이 생성한 토큰 시퀀스 중 첫번 째 결과를\n",
|
| 447 |
-
"# skip_special_tokens=True 특수토큰 제거\n",
|
| 448 |
-
"result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 449 |
-
"print(\"\\n📄 생성된 문장:\\n\")\n",
|
| 450 |
-
"print(result)"
|
| 451 |
-
]
|
| 452 |
-
},
|
| 453 |
-
{
|
| 454 |
-
"cell_type": "code",
|
| 455 |
-
"execution_count": null,
|
| 456 |
-
"id": "7f17e54f-824f-4c2c-9318-bfcf92c03315",
|
| 457 |
-
"metadata": {},
|
| 458 |
-
"outputs": [],
|
| 459 |
-
"source": []
|
| 460 |
-
}
|
| 461 |
-
],
|
| 462 |
-
"metadata": {
|
| 463 |
-
"kernelspec": {
|
| 464 |
-
"display_name": "Python [conda env:base] *",
|
| 465 |
-
"language": "python",
|
| 466 |
-
"name": "conda-base-py"
|
| 467 |
-
},
|
| 468 |
-
"language_info": {
|
| 469 |
-
"codemirror_mode": {
|
| 470 |
-
"name": "ipython",
|
| 471 |
-
"version": 3
|
| 472 |
-
},
|
| 473 |
-
"file_extension": ".py",
|
| 474 |
-
"mimetype": "text/x-python",
|
| 475 |
-
"name": "python",
|
| 476 |
-
"nbconvert_exporter": "python",
|
| 477 |
-
"pygments_lexer": "ipython3",
|
| 478 |
-
"version": "3.12.7"
|
| 479 |
-
}
|
| 480 |
-
},
|
| 481 |
-
"nbformat": 4,
|
| 482 |
-
"nbformat_minor": 5
|
| 483 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|