๐ฌ SSAFY 11๊ธฐ ๊ดํต ํ๋ก์ ํธ - ์ํ ์ถ์ฒ ์ฌ์ดํธ
๐ฅ 1ํ๊ธฐ ํ๋ก์ ํธ ์ต์ฐ์์
ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ
ํ ๊ตฌ์ฑ ๋ฐ ์ญํ
ํ๋ก์ ํธ ์ผ์
ํ๋ก์ ํธ ๊ธฐํ์
ํ๋ก์ ํธ ์ํ ์ ์ฐจ ๋ฐ ๋ฐฉ๋ฒ
ํ๋ก์ ํธ ์ํ ๊ฒฐ๊ณผ
AI ํ์ฉ - ChatGPT
ํ๋ก์ ํธ ์๊ฐ
๊ฐ์กฑ/์น๊ตฌ/์ฐ์ธ ๋ฑ๊ณผ ํจ๊ป ์ํ๋ฅผ ๋ณผ ๋ โ์ํ ๋ญ ๋ณด์ง?โ ๊ณ ๋ฏผํ๋ ๊ฒฝํ์ด ๋ค์ ์์๋ค. ๊ทธ๋ฌ๋ ์ ๋ณด ๊ณผ๋ถํ ์๋์์ ๊ทธ๋๊ทธ๋ ์ ํฉํ ์ถ์ฒ ์ํ๋ฅผ ๊ณ ๋ฅด๊ธฐ๋ ์ฝ์ง ์์ ์ผ์ด๋ค. ๊ฐ์กฑ ์ํ๋ผ๊ณ ์ถ์ฒ์ ๋ฐ์๋ ์ฅ๋ฉด ์ค ๋
ธ๊ณจ์ ์ด๊ฑฐ๋ ์์ธํ ์ฅ๋ฉด ๋ฑ์ด ์์ด ๋ถํธํ๋ ๊ฒฝํ์ด ์๋ค.
โ ํ์ํ ๋์ ๋น ๋ฅด๊ฒ, ๊ฐ๋จํ๊ฒ โํจ๊ปโ ๋ณด๊ธฐ์ ์ ํฉํ ์ํ๋ฅผ ์ฐพ์ ๋ฐฉ๋ฒ ์์๊น?
โ ๋ฉ์ธ ํ๋ฉด์ ๊ฒ์์ฐฝ์ ๋๊ณ ํ๊ทธ๋ฅผ ํตํด ๊ฒ์ํ๋ค๋ฉด ์ด๋จ๊น? ๊ฒ์ ์๊ฐ์ ์ค์ด๊ณ ์ ๊ทผ์ฑ์ ๋์ผ ์ ์์ง ์์๊น?
๐ก MEOVA?
โ์ํ ๋ญ ๋ด?โ์์ ์ฐฉ์ํ ์ด๋ฆ MEOVA(๋จธ๋ฐ)
๋ฐ์ํ๊ธฐ ์ฌ์ด ๊ท์ฌ์ด ์ด๊ฐ๊ณผ MOVIE์ ๋น์ทํ ์คํ ๋ง์ผ๋ก ์ด์ฉ์์๊ฒ ์น์ํ ์ด๋ฏธ์ง๋ฅผ ์ ์ฌํจ
๊ธฐ์กด ์ํ ํ๋ซํผ์ ๊ฒฝ์ฐ ๋ฉ์ธ ํ๋ฉด์ ์ต์ /์ธ๊ธฐ/์ ์ ๊ธฐ๋ฐ ์ถ์ฒ ์ํ๋ค์ด ๋์ด๋์ด์ ํ์ฌ ์ด์ฉ์์ ์ํฉ์ ์ ํฉํ ์ํ๋ฅผ ๊ฐ๋จํ๊ฒ ์ฐพ๊ธฐ์๋ ์ด๋ ค์์ด ์์์
๋จธ๋ฐ๋ ๋ฉ์ธ ํ๋ฉด์ ์ง๊ด์ ์ผ๋ก ๊ฒ์์ฐฝ์ ๋์ฐ๊ณ , ์ ์ ๊ฐ ์ํ๋ ํ๊ทธ๋ฅผ ์ ํํด ๊ทธ์ ๊ธฐ๋ฐํด ์ํ ์ ๋ณด๋ฅผ ํํฐ๋งํ๊ณ ์ ๊ณต
์ํ ํ๊ทธ์ ๋ํ ๊ฐ๋ตํ ์ฝ๋ฉํธ๋ฅผ ๊ตฌํํด ์ด์ฉ์ ๊ฒฝํ ํฅ์์ ์ํ ์๋น์ค ์ ๊ณต
AI ๊ธฐ์ ์ ํ์ฉํด ๋งค์ผ ์น์ฌ์ดํธ๋ง์ ๋
์ฐฝ์ ์ธ ์ถ์ฒ ์ํ 3๊ฐ ์ ๊ณต
์ต์ ์ํ, ์ธ๊ธฐ ์ํ ์ ๋ณด ๋ฐ ๊ฐ์ข
์ํ์ ์์ธ ์ ๋ณด ๋ฐ ๊ฐ๋
/์ถ์ฐ ๋ฐฐ์ฐ ์์ธ ์ ๋ณด ์ ๊ณต
๐ฌ ๋ชฉ์
์ต์ ์๊ฐ ์ต์ ๋น์ฉ์ผ๋ก ๊ด๋ํ ์ํ๋ฅผ ์์ฝ๊ฒ ์ถ์ฒ๋ฐ์ ์ ์๋, ๊ฒ์ ๊ธฐ๋ฅ์ ์ค์ ์ ๋ ์น์ฌ์ดํธ
๊น์์ด (ํ์ฅ)
๋ฐฑ์๋ / ํ๋ก ํธ์๋
ํ๋ก์ ํธ ๊ธฐํ ๋ฐ ์ ๋ฆฌ
์ํ ๋ฐ ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ ๊ตฌํ
CSS, JavaScript
์ค์ฑ์
๋ฐฑ์๋ / ํ๋ก ํธ์๋
๋ก๊ทธ์ธ ์๋ฒ, ์ํ ๋ฐ ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ ๊ตฌํ
CSS, JavaScript
๋๋ฒ๊น
๋ฐ ์ค๋ฅ ์์
์๋ฒ ๋ฐฐํฌ
5/5-5/10 ํ๋ก์ ํธ ๊ตฌ์ ๋ฐ ๊ธฐํ
5/13-5/16 ํ๋ก์ ํธ ๋ชจ๋ธ ๋ฐ DB ์ค๊ณ, API ์์ฒญ
5/16-5/22 ํ๋ก์ ํธ ๋ฐฑ์๋ ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ์์
5/18-5/23 ํ๋ก์ ํธ ํ๋ก ํธ ๊ตฌํ ๋ฐ ์์
4. ํ๋ก์ ํธ ๊ธฐํ์
๐ป ํ๋ฉด ์ค๊ณ
๋ฉ์ธ ํ๋ฉด
๊ฒ์ ํ๋ฉด
๋ฉ์ธ ์ํ
๊ฒ์ ์ํ
์ํ ์์ธ ์ ๋ณด
๋ฐฐ์ฐ ์ ๋ณด
์ ์ ์ ๋ณด
๋ฆฌ๋ทฐ
โ ๊ธฐํ ๊ธฐ๋ฅ
- ์ํ ์ถ์ฒ
- ์ํ ์์ธ ์ ๋ณด ์กฐํ
- ํ์ ๋ฐ ๋ฆฌ๋ทฐ ๊ณต์
- ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ
- ํ๊ทธ ๊ฒ์ ๊ธฐ๋ฅ
- ํ๊ทธ ์ฝ๋ฉํธ
- ๊ด๋ ๊ธฐ๋ก ์บ๋ฆฐ๋
- ์ ์ ์ถ์ฒ ์ํ ๋ฆฌ์คํธ
- ๋คํฌ ๋ชจ๋
๊ธฐ๋ฅ ๋ช
์ธ์
API ๋ช
์ธ์
USER Sequence Diagram
MOVIE Sequence Diagram
5. ํ๋ก์ ํธ ์ํ ์ ์ฐจ ๋ฐ ๋ฐฉ๋ฒ
์๊ฐ ์ผ์
์ฃผ๊ฐ ์ผ์
์ผ์ผ ์ผ์
github1
github2
6. ํ๋ก์ ํธ ์ํ ๊ฒฐ๊ณผ
โ ๊ตฌํ ๊ธฐ๋ฅ
- ์ํ ํ๊ทธ ๊ฒ์
- AI ์ํ ์ถ์ฒ
- ์ํ ์์ธ ์ ๋ณด ์ ๊ณต (์ํ, ๊ฐ๋
, ๋ฐฐ์ฐ)
- ํ๊ทธ ์ฝ๋ฉํธ
- ๊ด๋ ๊ธฐ๋ก ์บ๋ฆฐ๋
- ํ์ ๋ฐ ๋ฆฌ๋ทฐ ๊ณต์
์ถ์ฒ ์ํ
๐ค ๊ธฐ๋ฅ
AI๊ฐ ์ง์ ๋
์ฐฝ์ ์ธ ํ
๋ง ํ๋๋ฅผ ์ ์ ํ ๋ค,
MEOVA์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐธ์กฐํด ํ
๋ง์ ์ ํฉํ ์ํ ์ธ ๊ฐ์ง๋ฅผ ์ ์ ํด ์ถ์ฒ
๐พ AI ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ
์๋ฒ์์ ์ถ์ฒ์ ์ฐธ์กฐํ ๋จธ๋ฐ์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ '๋
์ฐฝ์ ์ธ ์ปจ์
ํ๋๋ฅผ ์ ํด์ ๊ทธ ์ปจ์
์ ๋ง๋ ์ํ 3๊ฐ๋ฅผ ์ถ์ฒํด์ค'๋ผ๋ ๊ตฌ์ฒด์ ์ธ ์๊ตฌ๋ฅผ AI์๊ฒ input์ผ๋ก ์ ๋ฌ
์คํฌ๋ฆฝํธ๋ฅผ ํตํด AI์ ๋ต๋ณ ํ์ ์ง์
โ ์ง์ ํ
๋ง, ํด๋น ์ํ์ ID๋ฅผ ๋ฐํํ๋๋ก ํจ
movies = Movie .objects .all ()
movie_list = "\n " .join ([f"{ movie .title } ({ movie .id } ) " for movie in movies ])
input_message = request .query_params .get ('message' ,
'๋
์ฐฝ์ ์ธ ์ปจ์
ํ๋๋ฅผ ์ ํด์ ๊ทธ ์ปจ์
์ ๋ง๋ ์ํ 3๊ฐ๋ฅผ ์ถ์ฒํด์ค' )
prompt = f"{ input_message } \n ์ํ ๋ชฉ๋ก:\n { movie_list } "
messages = [
{"role" : "system" , "content" : (
"๋๋ ์ํ ์ถ์ฒ์ ์ํ chatbot์ด๊ณ ํ๊ธ๋ก ๊ผญ ๋๋ตํด์ผ ํด."
"์๋ต ํ์์ ํญ์ ๋์ผํด์ผ ํ๋ฉฐ, ๋ค์ ํ์์ ๋ฐ๋ผ์ผ ํฉ๋๋ค:\n \n "
"\" <ํ
๋ง>\" ๋ผ๋ ์ปจ์
์ผ๋ก ์ํ๋ฅผ ์ถ์ฒํด๋๋ฆด๊ฒ์:\n \n "
"1. **<์ํ ์ ๋ชฉ> (<์ํ ID>)** - <์ํ ์ค๋ช
>\n "
"2. **<์ํ ์ ๋ชฉ> (<์ํ ID>)** - <์ํ ์ค๋ช
>\n "
"3. **<์ํ ์ ๋ชฉ> (<์ํ ID>)** - <์ํ ์ค๋ช
>\n \n "
"์ด ์ธ ๊ฐ์ ์ํ์ <ํ
๋ง> ์ปจ์
์ ๋ง์ถ์ด ์ ์ ๋์์ต๋๋ค.\" "
)
},
{"role" : "user" , "content" : f"{ prompt } " }]
๋ฐํ๊ฐ์์ ๊ณตํต๋ ํจํด์ ๊ธฐ์ค์ผ๋ก ์ง์ ๋ ํ
๋ง ๋ฐ ์ํ์ id ๊ฐ ์ถ์ถ
{
"id" : 59 ,
"message" : "\"๋
์ฐฝ์ ์ธ ์ธ๊ณ๊ด ์์์ ๋ชจํ์ ๋ ๋๋ ์์
๋ค\"์ด๋ผ๋ ์ปจ์
์ผ๋ก ์ํ๋ฅผ ์ถ์ฒํด๋๋ฆด๊ฒ์:\n\n1. \
**์คํ์์ฆ ์ํผ์๋ 4: ์๋ก์ด ํฌ๋ง (11)** - ์ํ๊ณ๋ฅผ ๋ฌด๋๋ก ํ ์์ฌ์ ์ ํฌ์ ์ ์ ๋ฃจํฌ ์ค์นด์ด์์ปค์ ์ฌ์ ์ \
๊ทธ๋ฆฐ ์ํ์
๋๋ค.\n2. **๋ฐ์ง์ ์ ์: ๋ฐ์ง ์์ ๋ (120)** - ์ค๊ฐ๊ณ๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก ํ ํํ์ง ๋ชจํ ์ํ๋ก, \
ํ๋ก๋ ๋ฐฐ๊ธด์ค๊ฐ ์ฌ์ฐ๋ก ์ ๋ฐ์ง๋ฅผ ํ๊ดดํ๊ธฐ ์ํด ๋ ๋๋ ์ฌ์ ์ ๊ทธ๋ฆฝ๋๋ค.\n3. **์๋ฐํ (19995)** - \
ํ๋๋ผ ํ์ฑ์์ ๋ฒ์ด์ง๋ ์ธ๋ฅ์ ๋๋น ์กฑ ๊ฐ์ ์ถฉ๋์ ๊ทธ๋ฆฌ๋ฉฐ, ๋
์ฐฝ์ ์ด๊ณ ํ์์ ์ธ ์ธ๊ณ๊ด ์์์ ํผ์ณ์ง๋ ์ด์ผ๊ธฐ์
๋๋ค.\n\n
์ด ์ธ ๊ฐ์ ์ํ์ \" ๋
์ฐฝ์ ์ธ ์ธ๊ณ๊ด ์์์ ๋ชจํ์ ๋ ๋๋ ์์
๋ค \" ์ปจ์
์ ๋ง์ถ์ด ์ ์ ๋์์ต๋๋ค . "
}
const themeMatch =
recommendations . value . message . match ( / " ( .+ ?) " ์ด ๋ผ ๋ ์ปจ ์
/ ) ||
recommendations . value . message . match ( / " ( .+ ?) " ๋ผ ๋ ์ปจ ์
/ ) ;
theme . value = themeMatch ? themeMatch [ 1 ] : "ํ
๋ง ์์" ;
const movieIdPattern = / \* \* .* ?\( ( \d + ) \) \* \* / g;
์๊ฐ ๋ถ์กฑ์ผ๋ก ๊ตฌํํ๊ณ ์ถ์๋ ๊ธฐ๋ฅ์ ๋ค ๊ตฌํํ์ง ๋ชปํด์ ์์ฌ์์ด ๋จ์ต๋๋ค. ์ฌ์ํ ์ค์๋ก ํ๋นํ ์๊ฐ์ด ๋ง์๋ฐ ๋ค์ ํ๋ก์ ํธ ๋๋ ๋ ๋์ ๋ชจ์ต์ด์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง๊น์ง ์ค๋ฅ ์ก์๋ด๋๋ผ ๊ณ ์ํ ์ค์ฑ์ ์จ์๊ฒ ๊ฐ์ฌ ์ธ์ฌ๋ฅผ ์ ํฉ๋๋ค.
ํํ๊ธฐ๋์ ๋งค์ฃผ ๊ดํต ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ ๋๋ก ๋ ํ๋ก์ ํธ๋ฅผ ํ๋ ๋๋ด๊ณ ์ถ์ด ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ์ ์ฑ์ ๋ง์ด ๋ค์๋๋ฐ ๊ทธ๋งํผ ์์ฌ์๋ ๋ง์ด ๋จ๊ณ ๋ค์ ํ๋ก์ ํธ๋ ๋ง์ด ๊ธฐ๋๊ฐ ๋ฉ๋๋ค. ๋ฐ๋นด์ง๋ง ํ๊ธฐ์ค์ ๊ฐ์ฅ ์ฆ๊ฑฐ์ ๋ ์๊ฐ์ด์๊ณ ๋ฐค๋ฎ์์ด ๊ฐ์ด ํ๋ก์ ํธ ์งํํด์ค ํ์์ด ์์๊ธฐ์ ๊ฐ๋ฅํ๋ ํ๋ก์ ํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.