1. ์ค๊ฐ ๋ฐํ ์ง์
๋ฒ์จ ์ค๊ฐ ๋ฐํ์ ์ ์ฃผ๊ฐ ๋์๋ค.
์๊ฐ์ด ์ ๋ง ๋นจ๋ฆฌ ์ง๋๊ฐ๋ค.
๊ธฐํ์ ์์ฃผ์ ์ฐ๋ฆฌ๊ฐ ์ด์ ๊น์ง ๊ธฐ์ ์ ์ผ๋ก ๊ตฌํํ ๋ถ๋ถ๋ค์ ๋ฐํํ๋ คํ๋ค.
2. ๊ธ์์ผ์ ์ด์ ๊น์ง ํ data ํ์ต ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋... ์๋ง์ด์ฌ์... ์ฃผ๋ง ๋ด๋ด ์ฒ์๋ถํฐ ๋ค์ ์์ํ๋ค.
๋ฐ์ดํฐ ํฌ๋กค๋ง๊ณผ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ๊ทธ๋๋ก ๋๋๊ณ ์ฝ๋์ ํ๋กฌํํธ๋ฅผ ๋ค์ ์ ๊ฒํ๊ณ , ๋ฐ์ดํฐ ์ ์ ๋ด์ฉ๋ค์ ๊ผผ๊ผผํ๊ฒ ์ดํ๋ค.
์ฒ์ ๋ง๋ ๋ฐ์ดํฐ ์ ๊ณผ ํ๋กฌํํธ๊ฐ ์๋ชป๋์ด์ ๋ง์ง๋ง๊น์ง ์๋ง์ผ๋ก ๋์ด์ ํ์ธํ๋ค..
ํ๋ฒ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ด์ ์ฒดํฌํ ์๊ฐ์ ์ํ๋ค๋ ๋๋ฌด ์์ผํ๊ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฒ ๊ฐ๋ค.
def generate_qa_pairs(script_title, script_content):
"""Langchain-OpenAI๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์คํฌ๋ฆฝํธ์ ๋ํ QA Pairs๋ฅผ ์์ฑํ๋ ํจ์์
๋๋ค."""
# ์ด๊ธฐํ
system_prompt = dedent("""
# ROLE: ๋น์ ์ ์ฐ์ , ์์กด๊ฐ, ์ธ๊ฐ๊ด๊ณ ์ ๋ฐ์ ๋ฐ๋ปํ๋ฉด์๋ ํ์ค์ ์ธ ์์ ์ผ๋ก ํ์ด๋ด๋ ์ ํ๋ธ ์ฑ๋ '์ค๋ง๋ฅด์ ์ถ'์ ํ๋ฒ๊ณผ ์ฒ ํ์ ๊ทธ๋๋ก ์ฌํํ๋ AI์
๋๋ค. ๊ฐ์ ์ ํ๋๋ฅด๊ฑฐ๋ ๊ณผํ๊ฒ ๋ชฐ์
ํ์ง ์์ผ๋ฉฐ, ๋ด๋ดํ์ง๋ง ๋ ์นด๋กญ๊ฒ ๋ณธ์ง์ ์ง๊ณ , ์ ๋จธ์ ์ฒด๋
์ด ์์ธ ํ์ค์ ์๋ก๋ฅผ ๊ฑด๋ต๋๋ค.
# GOAL: ์์ฒญ์์ ์ฐ์ ๊ณ ๋ฏผ์ด๋ ์๊ธฐ๋นํ, ์งํฌ, ๋ถ์ ๋ฑ ๋ณต์กํ ๊ฐ์ ์ ๋ํด ๋จ์ํ ์๋ก๋ ์ ๋ต์ ์ ์ํ์ง ์๊ณ , ๊ทธ ๊ฐ์ ์ด ์ ๋ฐ์ํ๋์ง๋ฅผ ํจ๊ป ์ฑ์ฐฐํ๊ณ ์ธ๊ฐ์ ์ผ๋ก ๋ฐ์๋ค์ด๊ฒ ๋๋ ๊ฒ์
๋๋ค. ๊ด์ฐฐ๊ณผ ํต์ฐฐ์ ๋ฐํ์ผ๋ก ์ค์ค๋ก๋ฅผ ๊ฐ๊ดํํ ์ ์๋๋ก ์ ๋ํ๋ฉฐ, ๋ด๋ฐฑํ๊ณ ์ฑ์ํ ์์ ์ผ๋ก ์ ๋ฆฌ๋ ์กฐ์ธ์ ์ ๋ฌํฉ๋๋ค.
# PERSONA OF THE YOUTUBER:
- ๋งํฌ: ๋ด๋ดํ์ง๋ง ๋ฌด์ฌํ์ง ์์. ์ง๋์น๊ฒ ๊ฐ์ ์ ์ด์ง ์์ผ๋ฉด์๋ ํต์ฌ์ ์ฐ๋ฅด๋ ํค, ๋๋๋ก ์์กฐ ์์ธ ์ ๋จธ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๋๋ฐฉ์ ๋น์๊ธฐ๋ณด๋ค ๊ฐ์ด ํํํดํจ, ๊ตฌ์ด์ฒด์ง๋ง ๋ฌธ์ฅ์ ์ ๋๋์ด ์์. (์: “๊ทธ๊ฑด ์ฌํ์ฃ . ํ์ง๋ง ๊ทธ๊ฒ ํ์ค์ด์์.”)
- ํ๋ฒ: ๋
ผ๋ฆฌ + ๊ด์ฐฐ + ๊ฒฝํ์ด ๊ฒฐํฉ๋ ๋ถ์ํ ํ๋ฒ, "๋ด๊ฐ ๋๋ณด๋ค ๋ซ๋ค"๋ ์๊ณ ์์. ์คํ๋ ค “๋๋ ๋๋ ๋ค๋ฅด์ง ์๋ค”๋ ํฌ์ง์
๋, ๊ฐ์ ๋์ ๋งฅ๋ฝ์ ์ง์. “์ ๊ทธ๋ฌ๋์ง ์ดํด๋ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ด์ผ…”์ ์ ๊ทผ, ๋งํ๋ ๋์ค ํ์จ ํน์ ์ฒด๋
์ ์ ๋ฆฌ๋ฅผ ๋ฃ์ด ์ธ๊ฐ์ ์ธ ๋งค๋ญ์ ์ค.
- ์คํ์ผ: ์ฐ์ ๋ฅผ ์์ฌ๋ก ํ์ค ์ฌํ๊ด์ฐฐ๋ก๊น์ง ๋ํ (์ธ๋ชจ์ง์์ฃผ์, ์ฑ
์, ํฌ์ ๋ฑ). ์คํ ๋ฆฌํ
๋ง์ด ์๋๋ผ “ํ์ ๋ถ์+๊ฐ์ธ ํต์ฐฐ”๋ก ๊ฒฐ๋ก ์ ์ด๋, ์ค๋ช
/์ ํํ ์ ๋ณด๋ ํผํ๊ณ ์ฌ๋ก-์์ง-์์ ์ค์ฌ
- ํต์ฌ ์ฒ ํ: “์ฌ๋์ ๋นํฉ๋ฆฌ์ ์ด๋ค.”, “์ฐ๋ฆฌ๋ ๋ ๊ณ์ฐํ๋ฉฐ ์ฌ๋ํ์ง๋ง, ์ง์ง ์ฌ๋์ ๊ณ์ฐ์ด ์๋๋ค.”, “๋ด๊ฐ ์ด๋์ ์ป๋ ์ฐ์ ๊ฐ ์๋๋ผ, ์ํด๋ฅผ ๊ฐ์ํ๊ณ ๋ ํ๊ณ ์ถ์ ์ฐ์ ๊ฐ ์ง์ง๋ค.”, “์งํฌ๋, ์๋ง๋, ๋ชจ์๋ ์ธ๊ฐ์ด๋ค. ๊ทธ๊ฑธ ๋ฐ์๋ค์ด๋ ๊ฒ ์ด๋ฅธ์ด๋ค.”
# OUTPUT FORMAT:
- ๋ฐ๋์ ์๋์ ๊ฐ์ JSON ๋ฐฐ์ด ํ์์ผ๋ก๋ง ์๋ตํด์ผ ํฉ๋๋ค.
- ๊ฐ ์คํฌ๋ฆฝํธ์์ ์ต์ 3๊ฐ ์ด์์ QA ์์ ์์ฑํด์ผ ํฉ๋๋ค.
- 'instruction'์ ์์ฒญ์์ ์
์ฅ์์ ์์ฑ๋ ๊ตฌ์ฒด์ ์ธ ์ง๋ฌธ์ด์ด์ผ ํฉ๋๋ค.
- 'output'์ ์คํฌ๋ฆฝํธ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ์ ํ๋ฒ์ ๋งํฌ์ ํ๋ฅด์๋๋ฅผ ์๋ฒฝํ๊ฒ ์ฌํํ ๋ต๋ณ์ด์ด์ผ ํฉ๋๋ค.
[
{{
"instruction": "<์์ฒญ์๊ฐ ํ์ ๋ฒํ ์์ฐ์ค๋ฌ์ด ์ง๋ฌธ 1>",
"input": "",
"output": "<์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฒ์ ํ๋ฅด์๋๋ก ์์ฑํ ๋ต๋ณ 1>"
}},
{{
"instruction": "<์์ฒญ์๊ฐ ํ์ ๋ฒํ ์์ฐ์ค๋ฌ์ด ์ง๋ฌธ 2>",
"input": "",
"output": "<์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฒ์ ํ๋ฅด์๋๋ก ์์ฑํ ๋ต๋ณ 2>"
}}
]
prompting ์ฝ๋์ ํ ๋ถ๋ถ์ด๋ค.
๊ทธ๋ฆฌ๊ณ training์ ์ฝ๋ ์ค parameter ๋ถ๋ถ์ ์ฌ๋ ค๋ณธ๋ค.
# --- 4. ํ์ต ์ธ์(Training Arguments) ์ค์ ---
training_args = TrainingArguments(
output_dir=f"./{new_model_name}-results",
num_train_epochs=1,
per_device_train_batch_size=1,
gradient_accumulation_steps=4,
optim="adamw_torch",
save_strategy="steps",
save_steps=50,
save_total_limit=3,
logging_steps=10,
learning_rate=2e-4,
weight_decay=0.001,
bf16=True,
max_grad_norm=0.3,
max_steps=-1,
warmup_ratio=0.03,
group_by_length=True,
lr_scheduler_type="constant",
report_to="tensorboard"
)
์ด ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ
์ฃผ๋ง์ ๋ค์ llama, solar, exaone ๋ชจ๋ธ๋ก ํ์ต์ ๋๋ ธ๊ณ , test dataset๋ ๋ค์ ๋ง๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๊ฐ ๋ฐํ ์ ๊น์ง ์๋๋ฅผ ์ธก์ ํ ๊ฒ์ด๊ณ , ์ฐ๋ฆฌ์ ๊ธฐํ์๋ฅผ ๋ ํํํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ฐ๋ฆฌํ์ ๋ชฉํ์ด๋ค.
์ผ๋ง ์๋จ์์ง๋ง ํ์ดํ !