
๋ก์ปฌ ์ปดํจํฐ๋ก โ๋ฅ์ํฌ ์ฑ๋ดโ ๋ง๋ค์ด๋ดค์ต๋๋ค
๋ก์ปฌ ์ปดํจํฐ๋ก โ๋ฅ์ํฌ ์ฑ๋ดโ ๋ง๋ค์ด๋ดค์ต๋๋ค ๊ด๋ จ
์ฑ๋ฅ ์ข์ AI ์ธ์ด ๋ชจ๋ธ์ ์ด๋ฏธ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ์์ฉ ์๋น์ค๋ก ๋น์ฉ์ ์ง๋ถํ๊ณ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฐ์ธ ๊ฐ๋ฐ์๊ฐ API ์ฌ์ฉ๋ฃ๋ฅผ ์ง๋ถํ๋ ๊ฒ์ด ํฌ๊ฒ ๋ถ๋ด์ค๋ฌ์ด ๊ธ์ก์ ์๋ ์ ์์ง๋ง, ์ฌ๋ฆฌ์ ์ฅ๋ฒฝ์ ๋ถ๋ช ํ ์กด์ฌํฉ๋๋ค. ์นด๋๋ฅผ ๋ฑ๋กํ๋ ์๊ฐ โ์ค์๋ก API๋ฅผ ๊ณผ๋ํ๊ฒ ํธ์ถํด ํต์ฅ ์๊ณ ๊ฐ ๋ฐ๋ฅ๋๋ฉด ์ด์ฉ์ง?โ๋ผ๋ ๊ฑฑ์ ์ด ๋ฐ๋ผ์ต๋๋ค. AWS๋ฅผ ์ฌ์ฉํด ๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ๊ณต๊ฐํ ๊ฒ๋๋ค. ์ฌ์ฉ๋ ๊ธฐ๋ฐ ๋น์ฉ ๋ชจ๋ธ์ ๊ฐ๋ฐ์์ ์์ ์ค์ ํ๋๊ฐ ์์์น ๋ชปํ ๋น์ฉ ํญํ์ผ๋ก ๋์์ฌ ์ ์์ผ๋๊น์.
์๋ฅผ ๋ค์ด, GPT-4o๋ 10์ค ์ ๋์ ์ ๋ ฅ๊ฐ์ ํ๊ท 30~50์์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. ํ์ง๋ง ์ค์ ์๋น์ค์์๋ ๋ ๋ง์ ์ ๋ ฅ๊ฐ์ด ํ์ํ๊ณ , ๊ฒ์ ๊ฒฐ๊ณผ๊น์ง LLM์ ์ ๋ฌํ๊ฒ ๋๋ฉด ๋น์ฉ์ ๋๋ฉ์ด์ฒ๋ผ ๋ถ์ด๋ฉ๋๋ค. Claude 3.7 Sonnet, Anthropic์ o1, o1-pro๋ ๋์ฑ ๋น์๋๋ค. o1์ GPT-4o์ ๋นํด 10๋ฐฐ, o1-pro๋ o1๋ณด๋ค 150๋ฐฐ๋ ๋น์ผ ๋ชจ๋ธ์ ๋๋ค. ์ด์ฒ๋ผ ์์ฉ LLM์ ๊ฐ์ธ ๊ฐ๋ฐ์๋ ์๊ท๋ชจ ํ๋ก์ ํธ์ ๋ถ๋ด์ค๋ฌ์ด ๊ฐ๊ฒฉ๋๋ฅผ ํ์ฑํ๊ณ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์คํ์์ค๋ก ๋ก์ปฌ์์ ๊ตฌ๋ํ ์ ์๋ LLM์ ๋ํ ์์๊ฐ ์๊ฒจ๋ฌ์ต๋๋ค. ์ด๋ ๊ธฐ์ ๋ฟ๋ง ์๋๋ผ ๊ฐ์ธ ๊ฐ๋ฐ์์ ์ ์ฅ์์๋ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๊ตญ์ด๋ฅผ ์ง์ํ๋ฉด์ ๋๋ต์ ์ํ๋ ์คํ์์ค ๋ชจ๋ธ์ ์ฐพ๊ธฐ๋ ์ฝ์ง ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ๊ตญ์ด์ฒ๋ผ ์์ด ์ธ ์ธ์ด๋ฅผ ์ ์ง์ํ๋ LLM์ ์ํ๋ค๋ฉด, ์ผ๋ฐ์ ์ผ๋ก ๋ ํฐ ๋ชจ๋ธ์ด ํ์ํ์ต๋๋ค. ์ง๊ธ๊น์ง ์คํ์์ค๋ก ๊ณต๊ฐ๋ ๋ชจ๋ธ๋ค ์ค ์ผ๋ถ๋ ์์ฒ์ต ๊ฐ์ ํ๋ผ๋ฏธํฐ(600~700B)๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ์ด๋ฌํ ๋ํ ๋ชจ๋ธ๋ค์ โ์คํ์์คโ๋ผ๋ ์ด๋ฆ์ด ๋ฌด์ํ๊ฒ ์ผ๋ฐ ๊ฐ๋ฐ์์ ์ปดํจํฐ๋ก๋ ๋์ ํ ๊ตฌ๋ํ ์ ์๋ ์์ค์ ํ๋์จ์ด๋ฅผ ์๊ตฌํฉ๋๋ค. ์ ์ ์์ ํ๋ผ๋ฏธํฐ ๋ชจ๋ธ๋ค์ ํ๊ตญ์ด ๋ต๋ณ์ ์ด๋ ค์์ ๊ฒช์๊ณ , ๋์ ์์ค์ ์๋ต์ ์์ฑํ๋ ค๋ฉด ๋ ๋ง์ ํ๋ผ๋ฏธํฐ ๋ชจ๋ธ์ด ํ์ํ์ฃ . ๊ฐ์ธ ๊ฐ๋ฐ์๊ฐ ๋ก์ปฌ์์ ํ์ฉํ๊ธฐ์๋ ํฐ ์ฅ๋ฒฝ์ด์์ต๋๋ค.
14B์ ์์ ๋ชธ์ง, 200B์ ์ค๋ ฅ: ๋ฅ์ํฌ์ ๋ฑ์ฅ
๋คํํ ์ต๊ทผ์๋ ํ๋ผ๋ฏธํฐ ์๊ฐ ์ค์ด๋ ์ค์ํ ์ฑ๋ฅ์ ๋ณด์ด๋ LLM ๋ชจ๋ธ์ด ์คํ์์ค๋ก ๊ณต๊ฐ๋๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ดํฌ๋ก์ํํธ์ Phi-4 ๋ชจ๋ธ์ ๋งฅ ๋ฏธ๋์์๋ ๊ตฌ๋๋๋ฉด์ ํ๊ตญ์ด ๋ต๋ณ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฌํ ํ๋ฆ ์์์ ์ต๊ทผ ํฐ ํ์ฅ์ ์ผ์ผํจ ๋ฅ์ํฌ(DeepSeek)๊ฐ AI ์ปค๋ฎค๋ํฐ์ ์ฃผ๋ชฉ์ ๋ฐ์์ฃ . ๋ฅ์ํฌ๋ 671B ์์ค์ ๋ํ ๋ชจ๋ธ๋ ์์ง๋ง, ์ฃผ๋ชฉํ ๋งํ ๊ฒ์ deepseek-r1 14b ํฌ๊ธฐ์ ๋ชจ๋ธ์ ๋๋ค. ์ด ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ธ ๊ฒ์ด๋ฐ ์ปดํจํฐ(RTX 3070๊ธ ๊ทธ๋ํฝ์นด๋)์์๋ ์ถฉ๋ถํ ๊ตฌ๋๋ฉ๋๋ค. ์์ํ๋ ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ๋งฅ๋ถ์์๋ ๋ฌด๋ฆฌ ์์ด ์๋ํ์ฃ .
deepseek-r1์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ ์ฌ์ ํ๊ฒฝ์์๋ ๊ตฌ๋ ๊ฐ๋ฅํ ๋ชจ๋ธ์ ์คํ์์ค๋ก ์ ๊ณตํ๋ค๋ ์ ๊ณผ, ํ๋ผ๋ฏธํฐ ์๋ฅผ ๊ณ ๋ คํ์ ๋ ๋๋ผ์ด ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค๋ ์ ์ ๋๋ค. ํนํ Claude์ o1๊ณผ ๊ฐ์ โ์ถ๋ก ๋ชจ๋ธโ์ด๋ผ๋ ํน์ฑ์ ๋ฅ์ํฌ๊ฐ ๋จ์ํ ํฌ๊ธฐ ์ถ์๊ฐ ์๋ ์ง์ ํ์ ์ ์ด๋ฃธ์ ๋ณด์ฌ์ค๋๋ค. ์ด ๋ชจ๋ธ์ ์์ ์ ์ถ๋ ฅ ํ ํฐ์ ๋ค์ ์ ๋ ฅ ํ ํฐ์ผ๋ก ์ฃผ์ ํ๋ ์ผ์ข ์ ๋์๊น์ง์ ํตํด, Chain of Thought(COT)๋ฅผ ๊ตฌํํ์ต๋๋ค. ์ถ๋ก ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ธ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ๋ณด๋ค ์๋ต ์๋๋ ๋ค์ ๋๋ฆฌ์ง๋ง, ํนํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ํด๊ฒฐ์์ ์๋์ ์ผ๋ก ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๋ฏธ๋์ ๋ชจ๋ ์นํ์ด์ง๋ ์ฑ๋ด์ผ๋ก ๋์ฒด๋ ์ง๋ ๋ชจ๋ฆ ๋๋ค
๋ง์ ๋ถ๋ค์ด LLM ํ๋ฉด โ์ฑ๋ดโ์ ๋ ์ฌ๋ฆด ๊ฒ๋๋ค. ์ ๋ ์น์ด ์๋ก์ด ์ธํฐํ์ด์ค์ ์๋๋ก ์ง์ ํ๊ณ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๊ธฐ์กด์ ์น์ ๋ณต์กํ ๋ฒํผ, ๋ฉ๋ด, ํ์ ๊ฒฝ๋ก๋ก ๊ฐ๋ ์ฐผ์ต๋๋ค. ์ฌ์ฉ์๋ ์ํ๋ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๊ฑด๋๋ฐ๊ณ , ๋ณต์กํ UI๋ฅผ ์ดํดํด์ผ ํ์ต๋๋ค. ํ์ง๋ง ์ฑ๋ด ์ธํฐํ์ด์ค๋ ์ด ๋ชจ๋ ๋ณต์ก์ฑ์ ๋จ์ํ ๋ํ๋ก ๋ฐ๊ฟ๋๋ค. โ๋ด์ผ ์์ธ ๋ ์จ ์ด๋?โ๋ผ๊ณ ๋ฌผ์ผ๋ฉด ๋ณต์กํ ์น์ฌ์ดํธ ํ์ ์์ด ๋ฐ๋ก ๋ต์ ์ป์ ์ ์๋ ์ธ์์ด ์ค๊ณ ์์ต๋๋ค. ์ด๋ UI์ ํ๋ช ์ ๋จ์ํ๋ฅผ ์๋ฏธํ๋ฉฐ, ๋ฏธ๋์๋ ๋ง์ ์น์ฌ์ดํธ๊ฐ ์ฑ๋ด ์ธํฐํ์ด์ค๋ก ์ฌํ์ํ ์ ์์ต๋๋ค.
๋๋ง์ AI ๋น์๋ฅผ ์์ํด ๋ณด์ธ์. ๋ด ๋ฌธ์๋ฅผ ์ดํดํ๊ณ , ๋ด ์๊ฐ์ ์ ๋ฆฌํ๋ฉฐ, ํ๋ก์ ํธ ๊ณํ๊น์ง ๋์์ฃผ๋ ๊ฐ์ธ ๋ง์ถคํ AI๊ฐ ๊ณ์ ์๋ค๋ฉด ์ผ๋ง๋ ํธ๋ฆฌํ ๊น์? ๋ฏธ๋์ ๊ฐ์ธ ์์ฐ์ฑ ๋๊ตฌ๋ ๋จ์ํ ๋น์๊ฐ ์๋ โ์๊ฐ์ ํ์ฅโ์ ๋๋ค. ํ์ ๋ด์ฉ์ ์๋์ผ๋ก ์์ฝํ๊ณ ๋ณต์กํ ์ ๋ณด๋ฅผ ์ฒด๊ณํํ๋ฉฐ, ๋ด ์ฌ๊ณ ๋ฐฉ์๊ณผ ์์ ํจํด์ ํ์ตํด ๋ ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด๋ ์กฐ๋ ฅ์๊ฐ ๋์ด ์ค ๊ฒ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก์ ๋ฅ์ํฌ๋ฅผ ํ์ฉํ ์ค์ ๊ฒฝํ๊ณผ ์ฑ๋ด์ ๊ตฌํํด ๋ณธ ์ธ์ฌ์ดํธ๋ฅผ ๊ณต์ ํ๋ ค๊ณ ํฉ๋๋ค. ๋ฅ์ํฌ ๋ชจ๋ธ์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๋ง์ฃผ์น ๋ฌธ์ ๋ค, ํจ๊ณผ์ ์ธ ์ฑ๋ด์ ์ค๊ณํ๊ธฐ ์ํ ๊ณ ๋ฏผ๋ค, ๊ทธ๋ฆฌ๊ณ ์คํธ๋ฆฌ๋ฐ UI๋ฅผ ๊ตฌํํ๋ฉด์ ๋ฐฐ์ด ๊ตํ์ ๋ด์์ต๋๋ค. ๋ฅ์ํฌ์ ๋ํ ๊ธฐ๋์ ๊ฒช์๋ ํ๊ณ, ๊ทธ๋ฆฌ๊ณ LLM์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ด๋ค ๊ตฌํ์ด ํ์ํ์ง, ์ด ๊ธ์ ์ฝ๊ณ ๋์์ด ๋๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ฒ์ด๋ฐ ์ปดํจํฐ์์ ๋ฅ์ํฌ ์ฌ์ฉํ๊ธฐ
ํ์ฌ์์๋ ์ด๋ฏธ ๋ฅ์ํฌ ๋ชจ๋ธ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. โ๋ชจ๋ธ์คํ ์ดโ๋ฅผ ์ด์ฉํ๋ฉด ์คํ๋ผ์ฐํฐ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ชจ๋ธ์ ์ฝ๊ฒ ์ ํํ๋ฉด์ ์ฌ์ฉํ ์ ์๋๋ฐ์. ์ฌ๊ธฐ์ ํ์ฌ ์๋ฒ๋ฅผ ํฌ ๋ ์ ๋ก์ปฌ์์ ๋ฅ์ํฌ๋ฅผ ํธ์คํ ํ๊ฒ ํด๋ดค์ต๋๋ค. ํ์ฌ ์ฝ๋์ ์ฑ๋ด ์ฝ๋์ LLM ํธ์ถ ๋ถ๋ถ์ ๊ทธ๋๋ก ์ด์ฉํ๋, ํธ์คํ ์ฃผ์ฒด๋ง ์ ์ปดํจํฐ๋ก ๋ฐ๊ฟจ์ ๋ฟ์ด์ฃ .
์ผ๋ฐ์ ์ธ LLM ์ฌ์ฉ ๊ตฌ์กฐ์ ๋ก์ปฌ ํธ์คํ ๊ตฌ์กฐ์ ์ฐจ์ด๋ฅผ ๊ฐ๋จํ ๋์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

์ฌ๊ธฐ์ Ollama๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ํ๊ฒฝ์์ LLM์ ์ฝ๊ฒ ๊ตฌ๋ํ ์ ์์ต๋๋ค. Mac ์ฌ์ฉ์๋ผ๋ฉด ํฐ๋ฏธ๋์์ ๊ฐ๋จํ ๋ช ๋ น์ด๋ก ์ค์น๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
# Ollama ์ค์น (Mac ๊ธฐ์ค)
curl -fsSL https://ollama.com/install.sh | sh
ollama pull deepseek-r1:14b # ๋ฅ์ํฌ ๋ชจ๋ธ ๋ค์ด๋ก๋ (R1 14B ๋ฒ์ )
ollama run deepseek-r1:14b # ๋ชจ๋ธ ์คํ
Windows ์ฌ์ฉ์๋ผ๋ฉด Ollama ๊ณต์ ์น์ฌ์ดํธ์์ ์ค์น ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ก๋ํ์ฌ ์คํํ ํ, ๋ช ๋ น ํ๋กฌํํธ๋ PowerShell์์ ๋์ผํ ๋ช ๋ น์ผ๋ก ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
๊ฒฝํ์ ์ผ๋ก 14B ์ ๋๋ ๋์ด์ผ ํ๊ตญ์ด ์๋ต์ ๋์์ง ์๊ฒ ํ๋๋ผ๊ณ ์. 1.5B๋ 7B ๋ชจ๋ธ์ ํ๊ตญ์ด ์ฑ๋ฅ์ด ํฌ๊ฒ ๋จ์ด์ ธ ์ค์ ์ฌ์ฉ์ด ์ด๋ ค์ ์ต๋๋ค. 1.5B ๋ชจ๋ธ์ ๊ฑฐ์ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ์์ค์ด๋ผ, ์ฑ๋ด์ด๋ผ๊ธฐ๋ณด๋ค๋ ์ ์ฒ๋ฆฌ ๋๋์ผ๋ก ์ฌ์ฉํ๋ ์ฉ๋์ ๊ฐ๊น์ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 14B ๋ชจ๋ธ๋ ํ๊ตญ์ด ์์ค์ด ์๋ฒฝํ์ง ์์, ์์คํ ํ๋กฌํํธ ๊ฐ์ ๊ฒฝ์ฐ๋ ์์ด๋ก ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ ํจ๊ณผ์ ์ด์์ต๋๋ค.
RTX 3070 ๊ทธ๋ํฝ์นด๋๊ฐ ์๋ ์ ๋ฐ์คํฌ์์ ํ ์คํธํ๋๋ฐ, 14B ๋ชจ๋ธ์ ๋ฌด๋ฆฌ ์์ด ๊ตฌ๋ํ ์ ์์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ์ฝ 9GB์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ผ๋ฐ์ ์ธ ๊ฒ์ด๋ฐ PC ํ๊ฒฝ์์๋ ์ถฉ๋ถํ ์๋ํ์ต๋๋ค. ๋ฅ์ํฌ๋ 1.5B๋ถํฐ 671B๊น์ง ๋ค์ํ ํฌ๊ธฐ์ ๋ชจ๋ธ์ด ๊ณต๊ฐ๋์ด ์๋๋ฐ, ํ๋์จ์ด ์ํฉ์ ๋ง๊ฒ ์ ํํ ์ ์๋ค๋ ์ ์ด ์ข์์ต๋๋ค.
LLM ๋ชจ๋ธ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ํธ์ถํ ๋ ํต์ผํ๋๋ก ์ด๋ํฐ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ๋คํํ OpenAI SDK๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฅ์ํฌ ๋ชจ๋ธ๋ ์ฝ๊ฒ ํธ์ถํ ์ ์์ต๋๋ค.
const OpenAI = require("openai");
const openai = new OpenAI({
baseURL: "http://192.168.0.123:11434/v1", // ๋ด ์ปดํจํฐ IP์ Ollama ํฌํธ
apiKey: "ollama", // OpenAI SDK์์ ํ์ํ์ง๋ง Ollama๋ ๊ฒ์ฆํ์ง ์์
});
async function chatWithDeepSeek(prompt) {
try {
const response = await openai.chat.completions.create({
model: "deepseek-r1:14b", // ์คํ ์ค์ธ ๋ชจ๋ธ๋ช
messages: [{ role: "user", content: prompt }],
});
console.log(response.choices[0].message.content);
} catch (error) {
console.error("Error:", error.message);
}
}
์ค์ ์๋น์ค์์๋ ๋ค์ํ LLM ๋ชจ๋ธ์ ์ฝ๊ฒ ์ ํํ ์ ์๋๋ก ์ถ์ํ ๋ ์ด์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ๋ชจ๋ธ์ด ์ถ์๋๊ฑฐ๋ ๊ธฐ์กด ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ๋, ์ฝ๋ ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์์ต๋๋ค.
// ํ์ฌ ์ฝ๋ ์์
// ๋ชจ๋ธ ์ค์ ์ ์ถ์ํํ๋ ๊ฐ์ฒด
const LLMModels = {
// {...๋ค๋ฅธ ๋ชจ๋ธ...}
"deepseek-r1": {
model: "deepseek-r1:14b",
supportsTools: true,
createClient: createDeepSeek,
getStream: Stream.OpenAI,
},
"deepseek-v3": {
model: "deepseek-v3",
supportsTools: true,
createClient: createDeepSeek,
getStream: Stream.OpenAI,
},
}
// ๋ฅ์ํฌ ํด๋ผ์ด์ธํธ ์์ฑ ํจ์
export const createDeepSeek = () =>
new OpenAI({
apiKey: "ollama",
baseURL: "http://192.168.0.123:11434/v1", // ๋ด ์ปดํจํฐ IP
});
์ด๋ฌํ ์ถ์ํ ํจํด์ ์ฌ์ฉํ๋ฉด, ๋ชจ๋ธ์ด ์ถ๊ฐ๋ผ๋ ์ฝ๋ ๋ถ๊ธฐ ๋ถ๋ถ์ด ์ถ๊ฐ๋์ง ์์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค. ๊ฒฝํ์ ๋ฅ์ํฌ์ ํ์ ์ฝ์ ์ฒด๊ฐ์ ์ผ๋ก ์ ํธ์ถ๋์ง ์์์ต๋๋ค. ๊ฐ๋จํ ํจ์ ํธ์ถ์ ๊ฐ๋ฅํ์ง๋ง, ๋ณต์กํ ๊ตฌ์กฐ์ ํ์ ์ฝ์์๋ ๋ถ์์ ํ ๋ชจ์ต์ ๋ณด์์ต๋๋ค. ์ด ๋ถ๋ถ์ ์์ฉ API ๋ชจ๋ธ๋ค์ ๋นํด ์์ง ๊ฐ์ ์ด ํ์ํด ๋ณด์ ๋๋ค.
๊ทธ๋ผ์๋ ๋ฅ์ํฌ R1 14B ๋ชจ๋ธ์ ํฌ๊ธฐ ๋๋น ๋๋ผ์ด ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์๊ณ , ํนํ ๋ ผ๋ฆฌ์ ์ถ๋ก ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ฌ์ต๋๋ค. ๋น์ฉ ๊ฑฑ์ ์์ด ๋ง์๊ป ์คํํ ์ ์๋ค๋ ์ ์์, ๊ฐ์ธ ๊ฐ๋ฐ์์๊ฒ ๋ฅ์ํฌ ๋ชจ๋ธ์ ๋งค๋ ฅ์ ์ธ ์ ํ์ง๊ฐ ๋ ์ ์์ต๋๋ค.
LLM์ ์๋ฌด๊ฒ๋ ๊ธฐ์ตํ์ง ์๋๋ค
LLM์ผ๋ก ์ฑ๋ด์ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ์คํด๋ โLLM์ด ์์ฒด์ ์ผ๋ก ๋ํ๋ฅผ ๊ธฐ์ตํ๋คโ๋ผ๋ ๊ฒ์ ๋๋ค. ChatGPT๋ Claude์ ๊ฐ์ ์๋น์ค๋ฅผ ์ฌ์ฉํด ๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด, ๋ง์น AI๊ฐ ์ฐ๋ฆฌ์ ๋ํ๋ฅผ ๋ชจ๋ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํ์ง๋ง ์ค์ ๋ก ์ฑ๋ด์ ์ง์ ๊ฐ๋ฐํด ๋ณด๋ฉด ๋๋ผ์ด ์ฌ์ค์ ๋ฐ๊ฒฌํ๊ฒ ๋ฉ๋๋ค. LLM์ ์๋ฌด๊ฒ๋ ๊ธฐ์ตํ์ง ์์ผ๋ฉฐ, ๋ํ ๊ธฐ์ต ๊ธฐ๋ฅ์ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๋๋ถ๋ถ์ LLM ์๋น์ค๋ ์์ผ ์ฐ๊ฒฐ์ด ์๋ HTTP ํต์ ํํ๋ก ์ ๊ณต๋ฉ๋๋ค. ์ด๋ ๋ง์น REST API์ฒ๋ผ ์๋ํ๋ ๊ตฌ์กฐ์ ๋๋ค. ์ ๋ ฅ(input)์ ๋ณด๋ด๋ฉด ์ถ๋ ฅ(output)์ด ๋์์ค๋ ๋จ๋ฐฉํฅ ํต์ ๋ฐฉ์์ด์ฃ . ๋จ, ์ผ๋ฐ์ ์ธ REST API์ ๋ฌ๋ฆฌ ๊ฐ์ ์ ๋ ฅ์ด๋ผ๋ ํญ์ ๋์ผํ ์ถ๋ ฅ์ด ๋์ค์ง๋ ์์ต๋๋ค.
[๋ํ ์ธ์
์ ์ค์ ์๋ ๋ฐฉ์]
์ฌ์ฉ์ โ ๋ฉ์์ง ์ ์ก โ LLM ์๋ฒ โ ์๋ต ์์ฑ โ ์ฌ์ฉ์
(์ฐ๊ฒฐ ์ข
๋ฃ)
(์๋ก์ด ์์ฒญ)
์ฌ์ฉ์ โ ์ ๋ฉ์์ง ์ ์ก โ LLM ์๋ฒ โ ์๋ต ์์ฑ โ ์ฌ์ฉ์
(์ฐ๊ฒฐ ์ข
๋ฃ)
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ChatGPT๋ Claude์ ๋ํํ ๋ ์ด์ ๋ด์ฉ์ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด์ ๋ ๋ฌด์์ผ๊น์? ๋ฐ๋ก โ๋ํ ๊ธฐ๋ก(conversation history)โ์ ๋งค๋ฒ ํจ๊ป ์ ์กํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ด์ ๋ํ ๋ด์ฉ์ ์ ์ฅํด๋์๋ค๊ฐ, ์๋ก์ด ๋ฉ์์ง์ ํจ๊ป ๋ชจ๋ ๋ํ ๊ธฐ๋ก์ ๋ค์ ๋ณด๋ด๋ ๊ฒ์ด์ฃ .
[์ฑ๋ด์ด ๋งฅ๋ฝ์ ์ดํดํ๋ ๋ฐฉ์]
1์ฐจ ๋ํ:
์ฌ์ฉ์ โ "์๋
?" โ LLM โ "์๋
ํ์ธ์!" โ ์ฌ์ฉ์
(๋ํ ๊ธฐ๋ก ์ ์ฅ)
2์ฐจ ๋ํ:
์ฌ์ฉ์ โ "์ด๋ฆ์ด ๋ญ์ผ?" โ
[๋ฐฑ์๋์์ ์ฒ๋ฆฌ: "์๋
?" + "์๋
ํ์ธ์!" + "์ด๋ฆ์ด ๋ญ์ผ?"] โ
LLM โ "์ ๋ AI ์ด์์คํดํธ์
๋๋ค" โ ์ฌ์ฉ์
(๋ํ ๊ธฐ๋ก ์ถ๊ฐ ์ ์ฅ)
์ด๋ฌํ ๋ฐฉ์์ LLM์ด ๋ง์น ์ฐ๋ฆฌ์์ ๋ํ๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค์ง๋ง, ์ค์ ๋ก๋ ๋งค๋ฒ ์ฒ์๋ถํฐ ๋ํ๋ฅผ ๋ค์ ์ฝ๊ณ ๋งฅ๋ฝ์ ์ดํดํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ฑ๋ด ๊ฐ๋ฐ์๊ฐ ๋ํ ๊ธฐ๋ก์ ๊ด๋ฆฌํ๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํด์ผ๋ง ์ฌ์ฉ์์๊ฒ ์ฐ์์ ์ธ ๋ํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ํ ๋งฅ๋ฝ ๊ด๋ฆฌํ๊ธฐ: ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ
๋ํ๊ฐ ๊ธธ์ด์ง๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. LLM์๋ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ โ์ปจํ ์คํธ ์ฐฝ(context window)โ์ด๋ผ๋ ์ ๋ ฅ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฅ์ํฌ R1 14B ๋ชจ๋ธ์ ๋๋ต 8K ํ ํฐ(์ฝ 6,000๋จ์ด) ์ ๋์ ์ปจํ ์คํธ ์ฐฝ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ์ด๊ณผํ๋ฉด ๋ ์ด์ ์๋ก์ด ์ ๋ณด๋ฅผ ๋ฃ์ ์ ์๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์๋ต ํ์ง์ด ํฌ๊ฒ ์ ํ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก โ์ฌ๋ผ์ด๋ฉ ์๋์ฐ(sliding window)โ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ํ๋ง์ ํฌํจ์ํค๋ ๋ฐฉ์์ ๋๋ค.
[์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ ์ฉ ์์]
์ปจํ
์คํธ ์ฐฝ ํฌ๊ธฐ๊ฐ 10๊ฐ ๋ฉ์์ง๋ผ๊ณ ๊ฐ์
๋ํ 1~12๋ฒ๊น์ง ์งํ๋ ์ํ์์ ์ ๋ฉ์์ง:
โ ๋ฉ์์ง 4~12 + ์ ๋ฉ์์ง(13)๋ง LLM์ ์ ์ก
โ ๋ฉ์์ง 1~3์ ๋ฒ๋ ค์ง
๋ฌผ๋ก ๋จ์ํ ์ค๋๋ ๋ฉ์์ง๋ฅผ ๋ฒ๋ฆฌ๋ ๊ฒ๋ณด๋ค ๋ ๋๋ํ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์ต๊ทผ ๋ํ๋ ๋ชจ๋ ํฌํจํ๋, ์ฌ์ฉ์์ ํ์ฌ ์ง๋ฌธ๊ณผ ๊ด๋ จ์ฑ์ด ๋์ ๊ณผ๊ฑฐ ๋ฉ์์ง๋ง ์ ๋ณ์ ์ผ๋ก ํฌํจํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ ๋ฉ์์ง๋ฅผ ์๋ฒ ๋ฉ(๋ฒกํฐํ)ํ์ฌ ์ ์ฅํด๋๊ณ , ์ ์ง๋ฌธ๊ณผ ์ ์ฌํ ๊ณผ๊ฑฐ ๋ฉ์์ง๋ง ์ ํ์ ์ผ๋ก ํฌํจํ๋ ๊ฒ์ด์ฃ .
๋ ์ง๋ณด๋ ๋ฐฉ์์ผ๋ก๋ GraphRAG๋ Contexted RAG ๊ฐ์ ๊ธฐ์ ๋ ์์ต๋๋ค. ์ด๋ ๋ง์น ์ธ๊ฐ์ ๊ธฐ์ต์ด ๊ณ์ธตํ๋์ด ๋ถํธํ๋๊ณ ์ธ์ถ๋๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํ ๊ฒ์ ๋๋ค. ๋ํ์์ ๋์จ ์๋ต๋ ์ฃผ์ด๋ ๋ชฉ์ ์ด๋ฅผ ๋ณด๊ฐํ์ฌ ์ ์ฅํ๋ฉด, ๋์ค์ ํ์ํ ๋ ๋ ์ ํํ๊ฒ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
์ค์ ๊ตฌํ์์๋ ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ์กฐํฉํด์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ต์ ๋ํ 5๊ฐ๋ ํญ์ ํฌํจํ๊ณ , ๊ทธ ์ธ์ ์ถ๊ฐ๋ก ํ์ฌ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๊ณผ๊ฑฐ ๋ํ 3๊ฐ๋ฅผ ์ ํ์ ์ผ๋ก ํฌํจํ๋ ์์ผ๋ก์.
ํจ๊ณผ์ ์ธ ์์คํ ํ๋กฌํํธ ์์ฑํ๊ธฐ
์์คํ ํ๋กฌํํธ(system prompt)๋ LLM์ ์ฃผ๋ ์ผ์ข ์ ์ค์ ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๋ฅผ ํ ๋ฒ ์ค์ ํ๋ฉด ์๊ตฌ์ ์ผ๋ก ์ ์ฉ๋๋ ๊ฒ์ผ๋ก ์คํดํ์ง๋ง, ์ค์ ๋ก๋ ๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ํจ๊ป ์ ์ก๋๋ ํน๋ณํ ๋ฉ์์ง์ ๋ถ๊ณผํฉ๋๋ค. ์์ ์ค๋ช ํ ๋ํ ๋งฅ๋ฝ์ ์ฐ์ฅ์ ์์์, ์์คํ ํ๋กฌํํธ๋ ๋งค๋ฒ ์ ์ก๋๋ ๊ฒ์ ๋๋ค.
[์ค์ LLM ์์ฒญ ๊ตฌ์กฐ]
{
"model": "deepseek-r1:14b",
"messages": [
{"role": "system", "content": "๋น์ ์ ์น์ ํ AI ์ด์์คํดํธ์
๋๋ค..."},
{"role": "user", "content": "์๋
?"},
{"role": "assistant", "content": "์๋
ํ์ธ์!"},
{"role": "user", "content": "์ด๋ฆ์ด ๋ญ์ผ?"}
]
}
์์คํ ํ๋กฌํํธ๋ ์ฐ๋ฆฌ๊ฐ LLM์ ๋งฅ๋ฝ์ ๋ฏธ๋ฆฌ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ธ๊ฐ์ ๋ํ๋ ๊ต์ฅํ ๋งฅ๋ฝ ์์กด์ ์ ๋๋ค. ๋ชจ๋ ๋ง์ ๊ทธ ๋ํ๋ฅผ ์ดํดํ๊ธฐ ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ง ์๊ณ , ์๋ฌต์ ์ธ ๊ท์น์ด๋ ์ํฉ์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ฃ . ์์คํ ํ๋กฌํํธ๋ ์ด๋ฐ ์๋ฌต์ ์ธ ๊ท์น์ LLM์ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์๊ฐํด ๋ณผ๊ฒ์.
[์์คํ
ํ๋กฌํํธ ์์ด]
์ฌ์ฉ์: ์ด๊ฑฐ ์ด๋?
LLM: ๋ฌด์์ ๋ง์ํ์๋์ง ๋ ์์ธํ ์ค๋ช
ํด ์ฃผ์ค ์ ์์๊น์? ์ด๋ค ๊ฒ์ ๋ํ ์๊ฒฌ์ ๋ฌป๊ณ ๊ณ์ ์ง ์๋ ค์ฃผ์๋ฉด ๋์์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
[์์คํ
ํ๋กฌํํธ ์์]
์์คํ
: ๋น์ ์ ์จ๋ผ์ธ ์ผํ๋ชฐ์ ์ํ ์ถ์ฒ AI์
๋๋ค. ์ฌ์ฉ์๋ ์ง๊ธ ์ฒญ๋ฐ์ง๋ฅผ ๋ณด๊ณ ์์ผ๋ฉฐ, โ์ด๊ฑฐ ์ด๋?โ๋ผ๊ณ ๋ฌผ์ผ๋ฉด ํด๋น ์ฒญ๋ฐ์ง์ ๋ํ ์คํ์ผ ์กฐ์ธ๊ณผ ์ฝ๋ ํ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์: ์ด๊ฑฐ ์ด๋?
LLM: ์ด ์ฒญ๋ฐ์ง๋ ํด๋์ํ ์คํธ๋ ์ดํธ ํ์ผ๋ก ๋ค์ํ ์คํ์ผ์ ์ ์ด์ธ๋ฆฝ๋๋ค. ์บ์ฃผ์ผํ๊ฒ ํฐ์ ํฐ์
์ธ ์ ์ค๋์ปค์ฆ๋ฅผ ๋งค์นํ๊ฑฐ๋, ์
์ธ ์ ํจ๊ป ์ธ๋ฏธ์บ์ฃผ์ผ ๋ฃฉ์ผ๋ก ์ฐ์ถํ๊ธฐ๋ ์ข์ต๋๋ค. ์ ์ถ์ฑ ์๋ ์์ฌ๋ผ ํ๋์ฑ๋ ์ข์ ํธ์ด์์.
์ด์ฒ๋ผ ์์คํ ํ๋กฌํํธ๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ์ค๋ช ํ์ง ์์๋, LLM์ด ์ฌ๋ฐ๋ฅธ ๋งฅ๋ฝ์์ ๋ํ๋ฅผ ์ดํดํ๋๋ก ๋์์ค๋๋ค.
๋ชจ๋ธ์ ๋ฐ๋ผ ์์คํ ํ๋กฌํํธ์ ์ธ์ด ์ ํ๋ ์ค์ํฉ๋๋ค. ์ ๊ฒฝํ์ GPT-4o๋ Claude 3.7 sonnet ๊ฐ์ ์์ฉ ๋ชจ๋ธ์ ํ๊ตญ์ด ์์คํ ํ๋กฌํํธ๋ก๋ ์ถฉ๋ถํ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ, ๊ฐ๋ฐ ๊ฐ๋ ์ฑ์ ์ํด ํ๊ธ๋ก ์์ฑํ์ต๋๋ค. ํ์ง๋ง DeepSeek R1 14B์ ๊ฐ์ ์คํ์์ค ๋ชจ๋ธ์ ์์คํ ํ๋กฌํํธ๋ฅผ ์์ด๋ก ์์ฑํ์ ๋์ ํ๊ตญ์ด๋ก ์์ฑํ์ ๋์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์ด, ์์ด๋ก ์์ฑํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ด์์ต๋๋ค. ์ด๋ ๋๋ถ๋ถ์ ์คํ์์ค ๋ชจ๋ธ์ด ์์ด ๋ฐ์ดํฐ๋ก ๋ ๋ง์ด ํ๋ จ๋ ๊ฒ ๋๋ฌธ์ผ๋ก ๋ณด์ ๋๋ค. ํ์์ ๋ฐ๋ผ ์์คํ ํ๋กฌํํธ๋ ์์ด๋ก ์์ฑํ ์๋ ์๊ฒ ๋ค์.
์คํธ๋ฆฌ๋ฐ UI๋ก ์ฑ๋ด ์ฌ์ฉ์ฑ ๋์ด๊ธฐ
LLM ์ฑ๋ด์ ๊ตฌํํ๋ค๋ฉด ์ญ์ ์คํธ๋ฆฌ๋ฐ UI๋ ๋น ์ง ์ ์๊ฒ ์ฃ ? LLM์ ๋ชจ๋ธ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ์๋ต์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ๋ด๋ ค์ค ์ ์์ต๋๋ค. ๋๋ถ์ ์ฌ์ฉ์๋ ์๋ต์ด ๋ค ๋์ฌ ๋๊น์ง ๋น ๋ฉ์์ง์ฐฝ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ ์๋๋ผ, ๋ฉ์์ง๊ฐ ๋์ค๋ ๋๋ก ์ฝ์ด ๋ด๋ ค๊ฐ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์์ ์ธ๋ด์ฌ์ ๋ ์๊ตฌํ๊ฒ ๋์ฃ .
์ด ๋ถ๋ถ์ ์๊ฐ๋ณด๋ค ์ค์ํฉ๋๋ค. ์ด์ฐจํผ ์ฑ๋ด์ ์ฌ๋์ด ์ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ์ด๋ฌํ ๋ถํธํจ์ ์ต๋ํ ์ค์ด๋ ๊ฒ ํต์ฌ์ ๋๋ค. ์ ๊ฐ ์ฌ์ฉํ DeepSeek R1๋ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ stream ์ต์ ์ ์ผฐ์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ์ ์ค์์ฑ
๊ฐ๋ฐ์๋ก์ ์ฒ์ LLM API๋ฅผ ์ฌ์ฉํ ๋ ๋ง์ฃผ์น๋ ์ค์ํ ์ต์ ์ค ํ๋๊ฐ ๋ฐ๋ก โstreamโ ํ๋ผ๋ฏธํฐ์ ๋๋ค. ์ด ์ต์ ์ ํ์ฑํํ๋ฉด LLM์ด ์ ์ฒด ์๋ต์ ํ ๋ฒ์ ๋ฐํํ๋ ๋์ , ์์ฑ๋๋ ๋๋ก ์์ โ์ฒญํฌ(chunk)โ๋ก ๋๋์ด ์ค์๊ฐ์ผ๋ก ์ ์กํฉ๋๋ค.
// OpenAI SDK๋ฅผ ์ฌ์ฉํ ๋ฅ์ํฌ ์คํธ๋ฆฌ๋ฐ ์์
const response = await openai.chat.completions.create({
model: "deepseek-r1:14b",
messages: [{ role: "user", content: "ํ๊ตญ์ ๋ํ์ ์ธ ์์ 3๊ฐ์ง๋ฅผ ์๋ ค์ค" }],
stream: true // ์คํธ๋ฆฌ๋ฐ ํ์ฑํ
});
// ์คํธ๋ฆฌ๋ฐ ์๋ต ์ฒ๋ฆฌ
for await (const chunk of response) {
const content = chunk.choices[0]?.delta?.content || "";
// ํ๋ฉด์ content ํ์
document.getElementById('response').textContent += content;
}
์คํธ๋ฆฌ๋ฐ์ ๊ฐ์น๋ ๊ฒฝํํด ๋ณด๋ฉด ํ์คํ ์ ์ ์์ต๋๋ค. 3~5์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์๋ต์ด๋ผ๋ ๊ธ์๊ฐ ํ๋ฌ๋์ค๋ ๊ฒ์ ๋ณด๋ฉด ์ฌ์ฉ์๋ ๋๊ธฐํ๋ค๋ ๋๋๋ณด๋ค, ๋ํ ์ค์ด๋ผ๋ ๋๋์ ๋ฐ์ต๋๋ค. ํนํ ๋ฅ์ํฌ์ ๊ฐ์ ์ถ๋ก ๋ชจ๋ธ์์๋ ์ฌ๊ณ ๊ณผ์ ์ด ๋๋ฌ๋๋ ๊ฒ์ ๋ณผ ์ ์์ด, ๋์ฑ ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์คํธ๋ฆฌ๋ฐ UI์ ๋์ ๊ณผ์
ํ์ง๋ง ์คํธ๋ฆฌ๋ฐ ๊ตฌํ์๋ ์์๋ณด๋ค ๊น๋ค๋ก์ด ๋ฌธ์ ๊ฐ ์จ์ด ์์ต๋๋ค. API์์ ์ ์ก๋๋ ํ ์คํธ ์ฒญํฌ๋ ๊ท ์ผํ ํฌ๊ธฐ๋ ๊ฐ๊ฒฉ์ผ๋ก ์ค์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ถ๊ท์นํ ์ฒญํฌ ํฌ๊ธฐ: ๋ช ๊ธ์๋ถํฐ ์ฌ๋ฌ ๋จ์ด๊น์ง ๋ค์ํจ
- ๋ถ๊ท์นํ ๋์ฐฉ ๊ฐ๊ฒฉ: 100ms์์ 1,000ms๊น์ง ๊ฐ๊ฒฉ์ด ์ฒ์ฐจ๋ง๋ณ
- ๋ณ๋ ์์ธ: ๋ชจ๋ธ ์ข ๋ฅ, ์ ๋ ฅ ํ ํฐ ์, ์๋ฒ ์ํ ๋ฑ์ ๋ฐ๋ผ ํจํด์ด ๋ฌ๋ผ์ง
์ค์ ํ๋ก์ ํธ์์ ๊ฒฝํํ ์ฒญํฌ ๋์ฐฉ ํจํด์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
์๊ฐ(ms) |--100--|--100--|--800--|--50---|--400--|
์ฒญํฌํฌ๊ธฐ [ใ
ใ
ใ
] [ใ
ใ
] [ใ
ใ
ใ
ใ
][ใ
] [ใ
ใ
ใ
]
์ค์ ์๋ต โ์๋
ํโ โ์ธ์!โ โ์ด์ฌํโ โ์ฝโ โ๋ฉํด์โ
์ด๋ฐ ๋ถ๊ท์นํ ํจํด์ ๊ทธ๋๋ก ํ๋ฉด์ ํ์ํ๋ฉด ํ ์คํธ๊ฐ ๋๋ ๋๊ธฐ๋ฉด์ ๋ํ๋๊ณ , ์ด๋ ์ ๋ฌธ์ ์ด์ง ๋ชปํ ์ธ์์ ์ค๋๋ค.
์ฒ์ ์๋ํ๋ ์ ๊ทผ๋ฒ๋ค
์ฒ์์๋ โ์ฒญํฌ๊ฐ ์ค๋ ๋๋ก ํ์ํ๊ฑฐ๋, ์๋๋ฉด ์ผ์ ์๋๋ก ํ ๊ธ์์ฉ ํ์ํ๋ฉด ๋์ง ์์๊น?โ๋ผ๊ณ ๋จ์ํ๊ฒ ์๊ฐํ์ต๋๋ค.
1. ์ฒญํฌ ์ฆ์ ํ์ ๋ฐฉ์
์๋ฒ์์ ์ฒญํฌ๊ฐ ์ค๋ ๋๋ก ๋ฐ๋ก ํ๋ฉด์ ํ์ํ๋ ๋ฐฉ์์ ๋๋ค.
์๊ฐ(ms) |--100--|--100--|--800--|--50---|--400--|
์ฒญํฌ๋์ฐฉ โ์๋
ํโ โ์ธ์!โ โ์ด์ฌํโ โ์ฝโ โ๋ฉํด์โ
ํ๋ฉด๊ฐฑ์ ๋! ๋! ๋! ๋! ๋!
์ฒด๊ฐํจ๊ณผ ....๋ถ๊ท์นํ ๋๊น.... ....๋ต๋ตํ ๊ธฐ๋ค๋ฆผ....
๊ฒฐ๊ณผ๋ ๊ธฐ๋ ์ดํ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ฅ์์๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋ถ์์ ํ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ณ , ํนํ ๊ธด ๋น ๊ณต๋ฐฑ ์๊ฐ์๋ ์๋ต์ด ๋ฉ์ท๋?ํ๋ ์๋ฌธ๊น์ง ๋ค๊ฒ ํ์ต๋๋ค.
2. ๊ธ์ ๋จ์ ์ผ์ ์๋ ์ถ๋ ฅ ๋ฐฉ์
๋ ๋ฒ์งธ ์๋๋ requestAnimationFrame์ ์ฌ์ฉํด ์ผ์ ํ ์๋๋ก ํ ๊ธ์์ฉ ํ์ํ๋ ๋ฐฉ์์ด์์ต๋๋ค.
์๊ฐ(ms) |--16--|--16--|--16--|--16--|--16--|--16--|
์ค์ ์๋ต โ์๋
ํ์ธ์!โ(์ด๋ฏธ ์๋ฒ์์ ๋ฐ์)
ํ๋ฉด๊ฐฑ์ โ์โ โ๋
โ โํโ โ์ธโ โ์โ โ!โ
ํ๋ ์ RAF RAF RAF RAF RAF RAF
์ฒด๊ฐํจ๊ณผ ...์๋ฒ ์๋ต์ ์๋๋ฐ ํ๋ฉด์๋ ์ ์ด๋ ๊ฒ ์ฒ์ฒํ...
์ด๋ฒ์๋ ๋ฐ๋๋ก ๋๋ฌด ๋๋ฆฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์๋ฒ์์ ์๋ต์ ์ด๋ฏธ ๋ค ๋ฐ์๋๋ฐ๋, ๋ธ๋ผ์ฐ์ ์ ํ๋ ์ ๊ฐ๊ฒฉ(์ฝ 16.67ms)์ ๋ง์ถฐ ํ ๊ธ์์ฉ ์ถ๋ ฅํ๋ค ๋ณด๋ ๋ถํ์ํ ์ง์ฐ์ด ๋ฐ์ํ์ต๋๋ค.
์ต์ ์ ์๋ฃจ์ : ๋์ ์ค์ผ์ค๋ง ์์คํ
์ด๋ฌํ ์ํ์ฐฉ์ค ๋์ ๊ฐ๋ฐํ ๊ฒ์ด โ๋์ ์ค์ผ์ค๋ง ์์คํ โ์ ๋๋ค. ์ด ์์คํ ์ ์ฒญํฌ ๋์ฐฉ ํจํด์ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๊ณ , ์ํฉ์ ๋ง๊ฒ ์ต์ ์ ์ถ๋ ฅ ์ ๋ต์ ์ ํํฉ๋๋ค. ๊ธฐ๋ณธ ์์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋๋ฌ์ ์ฐ์ : ๊ฐ๋ฅํ ํ ๊ธ์์ฉ ํ์ํ์ฌ ์์ฐ์ค๋ฌ์ด ํ๋ฆ ์ ์ง
์ ํ์ ๋ฐฐ์น ์ฒ๋ฆฌ: ์๊ฐ์ด ๋ถ์กฑํ ๊ฒ์ผ๋ก ์์๋ ๋๋ง ์์์ ๊ธ์๋ฅผ ๋ฐฐ์น ์ฒ๋ฆฌ
ํจํด ์ ์: ๋์ฐฉ ํจํด์ด ๋ณํ๋ฉด ์ ๋ต๋ ์๋์ผ๋ก ์กฐ์
์์คํ ์ ํต์ฌ์ ๋ ๊ฐ์ง ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ํจํด ๋ถ์๊ธฐ (StreamPatternAnalyzer)
์ฒญํฌ ๋์ฐฉ ํจํด์ ๋ถ์ํ๊ณ ๋ค์ ์ฒญํฌ๊ฐ ์ธ์ ๋์ฐฉํ ์ง ์์ธกํฉ๋๋ค.
class StreamPatternAnalyzer {
// ์ต๊ทผ 8๊ฐ ์ฒญํฌ๋ง ๊ธฐ๋กํด ํ์ฌ ํจํด์ ์ง์ค
private chunks: Array<{ timestamp: number; queueSize: number }> = [];
private readonly MAX_HISTORY = 8;
// ํจํด ๋ถ์ ํต์ฌ ๋ก์ง
public analyzePattern(): StreamPattern {
// ์ถฉ๋ถํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋ณด์์ ์ด๊ธฐ๊ฐ ๋ฐํ
if (this.chunks.length < 3) {
return { avgInterval: 350, avgChunkSize: 4, confidence: 0 };
}
// ์ฒญํฌ ๊ฐ๊ฒฉ์ ํ๊ท ๊ณผ ๋ณ๋์ฑ ๊ณ์ฐ
const intervals = this.chunks
.slice(1)
.map((chunk, i) => chunk.timestamp - this.chunks[i].timestamp);
const avgInterval = intervals.reduce((a, b) => a + b) / intervals.length;
// ํจํด์ ์์ ์ฑ(์ ๋ขฐ๋) ๊ณ์ฐ
const variance = intervals.reduce(
(sum, interval) => sum + Math.pow(interval - avgInterval, 2), 0
) / intervals.length;
const stdDev = Math.sqrt(variance);
const confidence = Math.min(1.0,
(this.chunks.length / 5) * (1 - stdDev / avgInterval)
);
return {
// ๋ณด์์ ์ผ๋ก 25% ์ฌ์ ์๊ฐ ์ถ๊ฐ
avgInterval: avgInterval * 1.25,
avgChunkSize: Math.ceil(
this.chunks.reduce((sum, chunk) => sum + chunk.queueSize, 0) /
this.chunks.length
),
confidence: confidence
};
}
}
์ค์ผ์ค๋ฌ (StreamScheduler)
๋ถ์๋ ํจํด์ ๋ฐํ์ผ๋ก ์ต์ ์ ์ถ๋ ฅ ์ ๋ต์ ๊ฒฐ์ ํฉ๋๋ค.
private analyzeTimeConstraints(pattern: StreamPattern): {
needsBatch: boolean;
batchSize: number;
} {
const queueSize = this.updateQueue.length;
// ํจํด์ด ๋ถํ์คํ๋ฉด ๋ณด์์ ์ ๊ทผ
if (pattern.confidence < 0.8) {
return { needsBatch: queueSize > 8, batchSize: 2 };
}
// ๋ค์ ์ฒญํฌ ๋์ฐฉ ์ ๊น์ง ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ง ๊ณ์ฐ
const expectedNextChunkTime = pattern.lastChunkTime + pattern.avgInterval;
const timeUntilNextChunk = expectedNextChunkTime - performance.now();
// ํ์ฌ ํ ์ฒ๋ฆฌ์ ํ์ํ ์์ ์๊ฐ
const estimatedProcessingTime =
queueSize * (StreamScheduler.getDisplayInterval() * 1.05);
// ์๊ฐ์ด ๋น ๋ฏํ ๋๋ง ๋ฐฐ์น ์ฒ๋ฆฌ ๊ณ ๋ ค
if (
estimatedProcessingTime > timeUntilNextChunk * 0.3 &&
timeUntilNextChunk < pattern.avgInterval * 0.45 &&
queueSize > Math.max(2, pattern.avgChunkSize)
) {
// ํ์ ์ผ๋ถ๋ง ๋ฐฐ์น ์ฒ๋ฆฌ (์ต๋ 5๊ฐ)
const portionToBatch = Math.ceil(queueSize * 0.35);
return {
needsBatch: true,
batchSize: Math.max(2, Math.min(portionToBatch, this.MAX_BATCH_SIZE))
};
}
// ๊ธฐ๋ณธ: ํ ๊ธ์์ฉ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌ
return { needsBatch: false, batchSize: 1 };
}
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ํ๋ก๋์
ํ๊ฒฝ์์ ๊ฒ์ฆ๋ ์ฝ๋๋ก, ํ์ฌ ํ์ฌ์ ์ฑ๋ด ์๋น์ค์ ์ ์ฉ๋์ด ์์ต๋๋ค. ์ ์ฒด ์ฝ๋๋ ์ฌ๊ธฐ (Moon-DaeSeung/streaming-strategy
)์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ํ์ํ ๋ถ๋ค์ ์์ ๋กญ๊ฒ ํ์ฉํ๊ธธ ๋ฐ๋๋๋ค.
์ด ์ต์ ํ๊ฐ ์ ํ์ํ ๊น?
์คํธ๋ฆฌ๋ฐ UI๋ ์ฌ์ค ์์ ๋ํ ์ผ์ด์ง๋ง, ์ฌ์ฉ์์ ์ ์ฒด ๊ฒฝํ์ ํฌ๊ฒ ๋ฐ๊พธ๋ ์์์ ๋๋ค. ๋ชจ๋ธ์ด ์๋ฌด๋ฆฌ ๋๋ํด๋ ๋ต๋ตํ ์ธํฐํ์ด์ค๋ฉด ์ฌ์ฉ์๋ ๊ธ๋ฐฉ ๋ ๋๊ฐ๋๋ค. ์ฑ๋ด ๋ง๋ค ๋ ์ด ๋ถ๋ถ์ ๊ผญ ์ ๊ฒฝ ์ฐ์๊ธธ ์ถ์ฒํฉ๋๋ค.

๋๋ง์ ๋ก์ปฌ ์ฑ๋ด, ํ๋ฒ ๋ง๋ค์ด๋ณด์ธ์
์ง๊ธ๊น์ง ๋ก์ปฌ ์ปดํจํฐ์์ ๋ฅ์ํฌ ๋ชจ๋ธ์ ํ์ฉํ ์ฑ๋ด ๋ง๋ค๊ธฐ์ ๋ํด ์ดํด๋ดค์ต๋๋ค. ๊ฐ์ธ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ํฐ ์ฅ๋ฒฝ์ด์๋ ๋น์ฉ๊ณผ ํ๋์จ์ด ๋ฌธ์ ๊ฐ ์คํ์์ค LLM์ ๋ฐ์ ์ผ๋ก ๋ง์ด ํด์๋์์ต๋๋ค. ํนํ ๋ฅ์ํฌ R1 14B ๋ชจ๋ธ์ ์ผ๋ฐ ๊ฒ์ด๋ฐ PC์์๋ ์ถฉ๋ถํ ๊ตฌ๋๋๋ฉฐ, ํ๊ตญ์ด ์๋ต๋ ๋์์ง ์์ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
์คํ์์ค LLM์ ์ง๊ธ๋ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. 14B ํฌ๊ธฐ์ ๋ชจ๋ธ์ด ์ด ์ ๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค๋ฉด, ์์ผ๋ก๋ ๋ ์์ ๋ชจ๋ธ๋ ์ถฉ๋ถํ ํ์ฉ ๊ฐ๋ฅํ ์์ค์ ๋๋ฌํ ๊ฒ์ ๋๋ค. ํนํ ํ๊ตญ์ด์ ๊ฐ์ ๋น์์ด๊ถ ์ธ์ด ์ง์๋ ์ ์ ๊ฐ์ ๋๊ณ ์์ด, ๊ตญ๋ด ๊ฐ๋ฐ์๋ค์๊ฒ๋ ์ข์ ์์์ ๋๋ค. ์ฌ๋ฌ๋ถ๋ ์ด์ ๋ก์ปฌ ์ปดํจํฐ์์ ์ฑ๋ด์ ๊ตฌํํด ๋ณด์ธ์. Ollama๋ LLM Studio ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ฉด ๋ณต์กํ ์ค์ ์์ด๋ ์ฝ๊ฒ ์์ํ ์ ์์ต๋๋ค. ๋น์ฉ ๋ถ๋ด ์์ด ๋ค์ํ ์คํ์ ํด๋ณผ ์ ์๊ณ , ์์ ๋ง์ ๊ฐ์ธ ๋น์๋ฅผ ๋ง๋ค์ด ์์ฐ์ฑ์ ๋์ด๋ ๊ฒฝํ๋ ํด๋ณผ ์ ์์ ๊ฒ๋๋ค.