[AI Hackathon] 2024 SmileGate FutureLab AI service weeklython ํ๊ณ
Introduction
๋ณธ ํฌ์คํธ๋ 2024๋ SmileGate FutureLab์์ ์ฃผ์ตํ ์ 1ํ AI service weeklython์์ ๋์์ ์์ํ AI-driven Game Scenario Generator์ ๋ํ ๋ด์ฉ๊ณผ ๋ํ ํ๊ณ ์ ๋ํ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค.
AI ์ํด๋ฆฌํค์ ๊ฒฝ์ฐ, 2024๋ 7์ 21์ผ์ ์ด๋ฆฐ "์จ๋ณด๋ฉ ์ํฌ์"์ ๋ฐํ์ผ๋ก ๊ฐ๋ฐ์์ ๊ธฐํ์๋ค์ด ๋ชจ์ฌ ํ๊ตฌ์ฑ ๋ฐ ์์ด๋์ด๋ฅผ ์ ์ ํ์์ผ๋ฉฐ, ์ฃผ์ค 5์ผ๋์ ์์ด๋์ด๋ฅผ ๊ตฌ์ฒดํํ๊ณ ๊ฐ๋ฐ์ด ์งํ๋์์ต๋๋ค. ์ดํ 7์ 26์ผ, 27์ผ์ ๊ฐ์ต๋ "์ง์ค๊ฐ๋ฐ๋ฐ์ด"์์ ๋ชจ๋ ํ๋ค์ด ๋ชจ์ฌ ํ๋กํ ํ์ ์ ๊ฐ๋ฐํ์ฌ ์๋น์ค๋ฅผ ์ ์ํจ์ผ๋ก์ ๋ชจ๋ ํ๋ค์ ์๋น์ค๋ฅผ ์ง์ ์ ์ผ๋ก ์ฒดํํ ์ ์์์ต๋๋ค.
๋ค์ ์ค๋ง์ผ๊ฒ์ดํธ ํจ์ณ๋ฉ ๊ธฐ์ฌ๋ฅผ ํตํด ๋ํ ๊ด๋ จ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
ํด๋น ์๋น์ค๋ ๋ค์ Github Repository์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ํ๋กํ ํ์ ์ ์ฌ์ง์ ๋ณธ ํฌ์คํธ ํ๋จ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค!
์ฌ์ฉ ๊ธฐ์ ์ ๋ฆฌ
- OpenAI GPT 4o Fine-tuning
- DALL-E3
- Gradio
1. OpenAI GPT 3.5 turbo & 4o Fine-tuning
OpenAI Platform - Authentication๊ณผ OpenAI Platform - Model optimization์ GPT fine-tuning๊ณผ ๊ด๋ จํ ๋ด์ฉ์ด ์์ธํ ๋ช ์๋์ด ์์ต๋๋ค.
์ ๋ฆฌํด๋ณด์๋ฉด ์ฐ์ OpenAI GPT Fine-tuning์ ์งํํ๊ธฐ ์ํด์๋ OPENAI API KEY๊ฐ ํ์ํฉ๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ํ์์ ์ฌ์ฉํ๋ ChatGPT์๋ ๋ฌ๋ฆฌ, ๋ค์ OpenAI Platform์์ ๊ณ์ ์ ์ฐ๊ฒฐํ๊ณ billing์ ์งํํด์ผ ํฉ๋๋ค.ChatGPT ๊ตฌ๋
์ ํด๋์๋๋ผ๋ ๋ณธ ์๋น์ค๋ ๋ณ๋์ ๊ฒฐ์ ๊ฐ ํ์ํฉ๋๋ค!!
๋ค์๊ณผ ๊ฐ์ด API key๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
pip install openai
from openai import OpenAI
api_key = "..."
client = OpenAI(api_key=api_key)
ํด๋น API key๋ฅผ ํตํด OpenAI์์ ์ ๊ณตํ๋ GPT Model์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋๋์๊ฐ fine-tuning์ ์งํํ ์ ์์ต๋๋ค.
ํ์ต์ ์งํํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ ํฌ๋งท์ ์ค์ ํด์ค์ผ ํฉ๋๋ค. OpenAI์ Fine-tuning ๊ณต์ Document๋ฅผ ๋ณด๋ฉด ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ค๋ช
์ด ๋์ด ์์ต๋๋ค.

์ฆ, Fine-tuning์ ์งํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ค๋นํฉ๋๋ค.
- JSONL ํํ์ ๋ฐ์ดํฐ
- Prompt, completion ํํ์ ๋ฐ์ดํฐ
- Prompt์์๋ ์ํ๋ ํ๋กฌํํธ๋ฅผ ๊ตฌ์ฑ
- Completion์์๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฑ
์ ํฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ์กด์ ๋ง๋ค์ด๋์ ๋ฐ์ดํฐ์ ์ ๋ฐํ์ผ๋ก GPT 4o์ ์ ๋ ฅ์ผ๋ก ๋ค์ด๊ฐ ์ ์๋๋ก ํฌ๋งท์ ์์ ํ์์ต๋๋ค.
import jsonlines
train_data = OrderedDict()
message_list = list()
with jsonlines.open("./data/minimal_cookie_data.jsonl") as f:
for line in f.iter():
message = []
message.append({"role": "system", "content": "์ ๋ ์
๋ ฅ๋ฐ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก game scenario๋ฅผ ์์ฑํด์ค๋๋ค."})
prompt_content, answer_content = line['prompt'], line['completion']
message.append({"role": "user", "content": prompt_content})
message.append({"role": "assistant", "content": answer_content})
message_dict = {"messages": message}
message_list.append(message_dict)
message_list
๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด ๋ค์ ์ฌ์ง๊ณผ ๊ฐ์ด Platform์ ํตํด ํ์ต์ ์งํํ ์ ์์ต๋๋ค.

์ค์ ์๋น์ค ํ๋กํ ํ์ ์์๋ ํ์ตํด๋์ ๋ชจ๋ธ๊ณผ ๋๋ถ์ด ๋ค์ Prompt Engineering์ ์ ์ฉํ์์ต๋๋ค.
PROMPT_ENGINEERING = "์ด์ ๋ถํฐ ํํ์ง rpg ๊ฒ์์ ๋ง๋ค๊ฑฐ์ผ. ๋ฐ์ ์กฐ๊ฑด๋ค ๋ชจ๋ ๋ฐ๋ผ์ผ๋งํด \
1. ๋งต ๋ ๋ฒจ์ ์ ์ด๋ 3๊ฐ ํ์ํ๊ณ ์ฌ์ด๋จ๊ณ๋ถํฐ ์ด๋ ค์ด ๋จ๊ณ์์ ๋๋ด์ผ๋ผ. \
2. ์ฃผ์ ํ์คํธ์ ์๋ธ ํ์คํธ๊ฐ ์ ์ ํ ๋์ด๋๋ก ์ค๊ณํ๊ธฐ. \
3. ๋ณด์์ ๋ค์ํ ์ง๋ง ๋ค์ ๋ ๋ฒจ๋ก ์ฌ๋ผ๊ฐ๋ ๋ณด์์ ๋ฌด์กฐ๊ฑด ํ์ํด. \
4. ๊ฒ์ ์ค๋ช
์ 50-70์ ์ ์ด์ค \
5. ๋ฐฐ๊ฒฝ์ ์ต๋ํ ์์ธํ๊ฒ 50-70์ ์ ์ด์ฃผ๊ณ ๋ค์์ฑ์ด ์ค์ํด. \
6. ๋งค๋ฒ ๊ฒ์์ ์ ์ธ๊ณ์ ์ผ๋ก ์ธ๊ธฐ๋ฅผ ์ป์๋ ๊ทธ๋ฆฌ๊ณ ์ต์ rpg ๊ฒ์์ reference๋ก ์ก๊ณ ํ์คํธ ๋ง๋ค์ด์ค. \
7. ์ถ๋ ฅํ ๋ ์ ์ด๋ 50๋ฒ์ ์ ํ ์ผ์นํ์ง ์๋ ๋ด์ฉ์ผ๋ก ์ถ๋ ฅํด์ค \
8. ์ดํดํ๊ธฐ ํธํ๊ฒ ํค์๋๋ ๋ฐ๋ก ์ ๋ฆฌํด์ค."
์ดํ ๋ชจ๋ธ์ ํธ์ถํ์ฌ ์ ์ ์ input๊ณผ ๋๋ถ์ด prompt engineering์ ์ ์ฉํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๊ณ , ๋ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ฒ์์ ์คํ ๋ฆฌ, ํ์คํธ, ๋ณด์ ๋ฑ์ ๊ตฌ์ฑํ์์ต๋๋ค. ์๋ ์ฝ๋๋ fine-tuning ๋ชจ๋ธ์ด ์๋ ์ผ๋ฐ gpt-4o-mini๋ฅผ ์ ์ฉํ ์์์ ๋๋ค.
def call_model(text, quest_item, event):
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "๋ ์ฐฝ์์ ์ธ ํํ์ง RPG ๊ฒ์ ์๋๋ฆฌ์ค ์๊ฐ์ผ."},
{"role": "user", "content": f"{PROMPT_ENGINEERING} ๋ฑ์ฅ์ธ๋ฌผ์ {text} ์ด๊ณ , ์ฃผ์ ์ด๋ฒคํธ๋ {event}์ด์ผ. ์ด ์กฐ๊ฑด๋ค๋ก 3๊ฐ ํ์คํธ ๋ง๋ค์ด์ค"}
]
)
answer = completion.choices[0].message.content
2. DALL-E3
์์์ ๋ง์๋๋ฆฐ ๋ฐ์ ๊ฐ์ด GPT๋ฅผ fine-tuningํ๊ธฐ ์ํด์ API๋ฅผ ์ฐ๊ฒฐํ๊ณ billing์ ์งํํ์์ต๋๋ค. ๋ ๋จ๊ณ๊ฐ ์๋ฃ๋๊ณ platform์ ์ดํด๋ณด๋ค๋ณด๋, Dall-E3 ๋ํ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ์์ต๋๋ค.
์ด ๊ณผ์ ์์๋ ๋ฐ๋ก ๋ชจ๋ธ์ ํ์ตํ ํ์์์ด ์ฐ๊ฒฐ๋ Dall-E3 model์ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ฉด ๋๋ ๊ฒ์ ๋๋ค.
์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
response = client.images.generate(
model="dall-e-3",
prompt=f'{quest_item}, ๊ฒ์ ์์
, ๊ฒ์ ์์ดํ
, 3d ๋ชจ๋ธ ๋น๋์ค ๋ชจ๋ธ ์์
, ๊ฒ์ ๋ฐฐ๊ฒฝ, ํ๋ คํ ์์, ํํ์ง ๊ฒ์, ๊ณ ๋์ ์คํ์ผ',
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
res = request.urlopen(image_url).read()
quest_item = Image.open(io.BytesIO(res))
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋์์ธ์ prompt๋ก ์ ๋ฌํจ์ผ๋ก์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค!
3. Gradio
๋ชจ๋ธ์ ํ์ตํ๋ค๋ฉด ์ ์ ๋ก ํ์ฌ๊ธ ์ฌ์ฉํ ์ ์๋๋ก UI๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
๋ณธ ๊ณผ์ ์ ๊ฐ์ด ์ฐธ์ฌํ ๊ฐ๋ฐ์ ์ด์คํ์จ๊ฐ ์ ์ํด์ฃผ์์ต๋๋ค!
Gradio ์ฌ์ฉ๋ฒ์ ํ์ด์ฌ ํ๊ฒฝ์์ pip install gradio๋ก ์ค์น ํ, import gradio as gr๋ก ์ํฌํธํ์ฌ gr.Interface ๋๋ gr.Blocks ํด๋์ค์ ํจ์, ์ ๋ ฅ(inputs), ์ถ๋ ฅ(outputs) ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํด ์น UI๋ฅผ ๋ง๋ค๊ณ .launch() ๋ฉ์๋๋ก ์คํํ๋ ๊ฒ์ ๋๋ค.
ํต์ฌ์ ๋จธ์ ๋ฌ๋ ํจ์๋ฅผ ์น ์ฑ์ผ๋ก ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๊ฒ์ผ๋ก, ํ ์คํธ, ์ด๋ฏธ์ง, ์์ฑ ๋ฑ ๋ค์ํ ์ ์ถ๋ ฅ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํด ๋ชจ๋ธ ๋ฐ๋ชจ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
Gradio๋ Gradio ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ง๋ค์์ต๋๋ค.
์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด UI๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.


[ํ๊ธฐ] ๋ํ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ..
ํ๋กํ ํ์ ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ ๋ฐ์ดํฐ ์์ง, ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ ์งํํ๊ณ , LLM-finetuning (GPT4o API)์ ํตํด ๋ชจ๋ธ์ ํ์ต์ ์งํํ์์ต๋๋ค. LLM Fine-tuning์ ๋ฐ์ดํฐ์ ์ง๊ณผ ๊ตฌ์ฑ์ด ์ค์ํ๊ฒ ์์ฉํ์๊ณ , ์ ์ ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์ด ์ ๊ณตํ ์ ์๋๋ก ํ๊ธฐ ์ํด Prompt Engineering์ ์ถ๊ฐ๋ก ์ ์ฉํ์ฌ ์๋น์ค์ ์ง์ ๋์ผ ์ ์์์ต๋๋ค.
๋ํ ๊ธ๋ก๋ง ์ ์ ์๊ฒ ์ ๊ณต๋๋ค๋ฉด, ์๊ฐ์ ์ธ ์์๊ฐ ๋ถ์กฑํ ๋ฟ๋ง ์๋๋ผ ํผ๋ก๋๊ฐ ๋์ ๊ฒ์ด๋ผ ํ๋จํด, Dall-E3 API๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ ์๋น์ค์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ ์ํ๊ณ ์ ์ฉํจ์ผ๋ก์จ ํ๊ฐ์์ ์ข์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์์ต๋๋ค.
๋ํ๊ฐ ๋๋๊ณ ๋ค๋ฅธ ํ๋ค๊ณผ์ ์ง์์๋ต์ ํตํด ๋ํ ๋น์ LLM-finetuning์ ๋ฐฉ๋ฒ๋ก ์์ ์ฐ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ ๋ถ๋ถ์ ํ์ ํ ์ ์์๋๋ฐ, ํ์ต ์ ์ฒ์๋ถํฐ ํ์ต ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, few-shot learning์ ์ ์ฉํ๋ฉด ๊ธฐ์กด GPT์ ์ฑ๋ฅ์ ์ ์งํ๋ฉด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ ์ ์ ๋ฐฐ์ ์ต๋๋ค.
๊ธฐ์กด ์ฅ๋ฅด ์๋๋ฆฌ์ค ์์ฑํ AI ์๋น์ค๋ฅผ ๋ถ์ํด๋ณด๊ณ ์ธ๋๊ฒ์ ๊ฐ๋ฐ์๋ค์ ๋์์ผ๋ก ๋ณธ ํ๋ก์ ํธ์ ํ์์ฑ ๋ฐ ์์๋ฅผ ์กฐ์ฌํด๋ณด์์๋๋ฐ, ๊ธฐ์กด ์๋น์ค๋ค์ด ์กด์ฌํจ์๋ ๋ถ๊ตฌํ๊ณ ์์ง ๋ง์ ๊ฐ์ ์ด ํ์ํจ์ ํ์ธํ๊ณ , ์ด๋ฅผ ํตํด ๋ณธ ํ๋ก์ ํธ ์์ด๋์ด์ ํ๋น์ฑ์ ํ์ธํ ์ ์์์ต๋๋ค. ์ด๋ฌํ ์ ์ ์ ์ ์ ์ฅ์์ ๊ทธ๋ค์ด ์ํ๋ ์๋น์ค๋ ๋ฌด์์ธ์ง, ์ด๋ ํ ์ ๋ค์ ๋ฐํ์ผ๋ก ์๋ฃ ๋ฐ ์์ ์กฐ์ฌ๊ฐ ์งํ๋์ด์ผ ํ๋์ง ๊น๊ฒ ์๊ฐํด ๋ณผ ์ ์์์ต๋๋ค.
๋ ๋์๊ฐ ๊ธฐ์ ์ ์ผ๋ก๋ ChatGPT, Dall-E3์ ์ฌ์ฉ๋ฒ ๋ฐ API๋ฅผ ํตํ ์๋น์ค๋ฅผ ์ง์ ๊ตฌํํด๋ด์ผ๋ก์ AI Researcher/Engineer๋ก์์ ์ญ๋์ ํค์ธ ์ ์์์ผ๋ฉฐ ์ต์ข ์ ์ผ๋ก ๋ณธ ๋ํ์์ ๋์์ ์์ํ ์ ์์์ต๋๋ค. :)
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ ์๊ฒ ์ฐ๋ฝ์ ์ฃผ๊ณ ์ถ์ผ์ ๊ฒ์ด ์์ผ์๋ค๋ฉด
- LinkedIn : www.linkedin.com/in/sehoon-park-575b8b22a
- Github : https://github.com/sehooni
- Email : 74sehoon@gmail.com
- ๋ธ๋ก๊ทธ ๋๊ธ
์ผ๋ก ์ฐ๋ฝ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
