๐ฅ 1์ฐจ ์คํ๋ฆฐํธ ์์: AI ์๋น์ค์ ์ฌ์ฅ์ ๋ง๋ค๋ค
๋๋ง์ ์ฒซ ๋ฒ์งธ ์คํ๋ฆฐํธ. ์ด๋ฒ ๋ชฉํ๋ AI ์๋ด ๋ถ์ ์์คํ ์ ํต์ฌ, LLM์ ํ์ FastAPI ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด์๋ค. ๋ชจ๋ ๊ฒ์ด ์ฒ์์ด๋ผ ์ค๋ ๋ฉด์๋ ๋ง๋งํ์ง๋ง, ์ผ๋จ ๋ถ๋ชํ๋ณด๊ธฐ๋ก ํ๋ค. ๊ณผ์ฐ ์ฒซ ๋จ์ถ๋ฅผ ์ ๊ฟฐ์์๊น? ๐ค
๐ฆด ๋ผ๋๋ถํฐ ์ธ์ฐ๊ธฐ: LLM ์๋ฒ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ํ๋ก์ ํธ์ ๋ผ๋๋ฅผ ์ก๋ ๊ฒ์ด์๋ค. ๊ธฐ๋ฅ๋ณ๋ก ์ญํ ์ ๋ช ํํ ๋๋์ด ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ค.
LLM_server/
โโโ app/
โ โโโ main.py # FastAPI ์ฑ ์ด๊ธฐํ ๋ฐ ๋ผ์ฐํฐ ์ค์
โ โโโ schemas.py # ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฆ (Pydantic)
โ โโโ services.py # ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง (LLM ํธ์ถ)
โ โโโ api/
โ โโโ endpoints/
โ โโโ summary.py # ์๋ด ์์ฝ API
โ โโโ tagging.py # ํค์๋ ํ๊น
API
โโโ core/
โ โโโ config.py # ์ค์ ๊ด๋ฆฌ (API ํค ๋ฑ)
โโโ tests/
โ โโโ test_api.py # API ํ
์คํธ ์ฝ๋
โโโ .env # ํ๊ฒฝ ๋ณ์ ํ์ผ (๋ฏผ๊ฐ ์ ๋ณด)
โโโ requirements.txt # ํ๋ก์ ํธ ์์กด์ฑ
โโโ README.md # ํ๋ก์ ํธ ์ค๋ช
์
app/
: FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ์ฝ๋๊ฐ ๋ค์ด์๋ค.core/
: ํ๋ก์ ํธ์ ํต์ฌ ์ค์ ์ ๊ด๋ฆฌํ๋ค.tests/
: ํ ์คํธ ์ฝ๋๋ฅผ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ๊ตฌ์กฐ๋ฅผ ์ก์๋๋ ์์ผ๋ก ์ด๋ค ์ฝ๋๋ฅผ ์ด๋์ ์์ฑํด์ผ ํ ์ง ๋ช ํํด์ก๋ค.
๐ ๏ธ ๋ก์ปฌ LLM, ์ด๋ป๊ฒ ์ฐ๋ํ ๊น?: ๊ธฐ์ ์คํ ๊ฒฐ์
๋ก์ปฌ์์ LLM์ ์ด๋ป๊ฒ ์ฐ๋ํ ์ง ๊น์ด ๊ณ ๋ฏผํ๋ค. transformers
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ Ollama
๊ฐ์ ์ถ๋ก ์๋ฒ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ, ๋ ๊ฐ์ง ์ ํ์ง๊ฐ ์์๋ค.
โ๏ธ
transformers
vs.Ollama
(์ถ๋ก ์๋ฒ)
ํญ๋ชฉ transformers
๋ผ์ด๋ธ๋ฌ๋ฆฌOllama
(์ถ๋ก ์๋ฒ)๊ฐ๋ Python ์ฝ๋์์ ์ง์ ๋ชจ๋ธ์ ๋ถ๋ฌ์ ์คํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฉ์ ๋ชจ๋ธ์ ๋ณ๋ ์๋ฒ๋ก ์คํํ๊ณ , ๋ด ์ฑ์ API๋ก ์์ฒญํ๋ ๋ฐฉ์ ์ฌ์ฉ ํธ์์ฑ - ๋ณดํต: ์ง์ ํ ๊ฒ ๋ง๋ค. - ๋งค์ฐ ์ฌ์: ๋ช ๋ น์ด๋ก ๋ชจ๋ธ ๋ค์ด๋ก๋์ ์๋ฒ ์คํ์ด ๋๋๋ค. โจ ์์ ๊ด๋ฆฌ - FastAPI ์ฑ๊ณผ LLM์ด ์์์ ๊ณต์ ํ๋ค. - FastAPI ์ฑ๊ณผ LLM ์๋ฒ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค. ํ์ฅ์ฑ - ํ์ฌ ์ฑ์ ์ข ์์ ์ด๋ค. - ์ฌ๋ฌ ์๋น์ค์์ ํ๋์ LLM ์๋ฒ์ ๋์ ์์ฒญํ ์ ์์ด MSA์ ๋ฑ ๋ง๋๋ค.
๐ ์ต์ข ์ ํ: Ollama!
๊ฒฐ๊ตญ ์ด ํ๋ก์ ํธ์์๋ Ollama๋ฅผ ์ฐ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
- ์๋์ ์ธ ํธ์์ฑ: ๋ช ๊ฐ ๋ช ๋ น์ด๋ก ๋ฐ๋ก ๋ก์ปฌ LLM API ์๋ฒ๋ฅผ ๋ง๋ค ์ ์์๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: FastAPI ์๋ฒ๋ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ๊ณ , ๋ฌด๊ฑฐ์ด LLM ์คํ์ Ollama๊ฐ ์ ๋ดํ๋ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๊น๋ํด์ก๋ค.
- ์ํคํ ์ฒ์ ์ผ๊ด์ฑ: ์ ์ฒด ์์คํ ์ด ์งํฅํ๋ MSA์ ๋ฐฉํฅ์ด ๋ฑ ๋ง์๋ค.
๐ง ์ด๋ค ๋ชจ๋ธ์ ์ธ๊น?: gemma:2b
๋ก ์์ํ๊ธฐ
์๋ฒ๋ ์ ํด์ก๊ณ , ์ด์ ์ด๋ค LLM์ ์ฌ๋ฆด์ง ์ ํ ์ฐจ๋ก์๋ค. ์ด๊ธฐ ๋จ๊ณ์ธ ๋งํผ, ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ชจ๋ธ์ด ํ์ํ๋ค.
๐
gemma:2b
vs. ๋ค๋ฅธ ๋ชจ๋ธ๋ค
gemma:2b
: ์์ฝ ์ฑ๋ฅ์ ์ข์ง๋ง, ํค์๋ ์ถ์ถ์ฒ๋ผ ์ ํด์ง ํ์์ ์ถ๋ ฅ์ ์ ๋ฐ๋ฅด์ง ๋ชปํ๋ ๊ฒฝํฅ์ด ์์๋ค.Phi-3-mini
:gemma:2b
์ ๋น์ทํ ์ฒด๊ธ์์ ์ฑ๋ฅ์ด ์์ฃผ ์ข๋ค๊ณ ์๋ ค์ง ๋ชจ๋ธ.Llama-3-8B
: ๋ ํฌ๊ณ ๊ฐ๋ ฅํ์ง๋ง, ๋์ ํ๋์จ์ด ์ฌ์์ ์๊ตฌํ๋ค.๐ฏ ์ฐ๋ฆฌ์ ์ ๋ต
๊ฒฐ๋ก :
gemma:2b
๋ก ์์ํ๋ ๊ฒ ์ง๊ธ ๊ฐ์ฅ ํจ์จ์ ์ธ ์ ๋ต์ด์๋ค.
- ์ ์ํ ๊ฐ๋ฐ:
gemma:2b
๋ ๊ฐ๋ณ๊ณ ๋นจ๋ผ์, ์ ์ฒด API ํ๋ฆ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ๋ ๋ฐ ์ต์ ์ด์๋ค.- ์ ์ง์ ๊ฐ์ : ๋จผ์
gemma:2b
๋ก ํ๋กํ ํ์ ์ ์์ฑํ๊ณ , ์ฑ๋ฅ์ด ๋ถ์กฑํ๋ฉดphi-3-mini
๊ฐ์ ๋ ์ข์ ๋ชจ๋ธ๋ก ์ฝ๊ฒ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ๋ก ํ๋ค. Ollama๋ฅผ ์ฐ๋ ๋ชจ๋ธ ๊ต์ฒด ๋น์ฉ์ด ๋งค์ฐ ๋ฎ๋ค๋ ๊ฒ ํฐ ์ฅ์ ์ด์๋ค.
๐ป Sprint Log: ์ฝ์ง๊ณผ ์ฑ์ฅ์ ๊ธฐ๋ก
๋ ์ง: 2025๋ 8์ 30์ผ
1. FastAPI ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค์ โ
main.py
,schemas.py
,endpoints
๋ฑ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ก๊ณ Pydantic ๋ชจ๋ธ๋ก ๋ฐ์ดํฐ ํ์์ ์ ์ํ๋ค.
2. LLM ์ฐ๋ ์๋น์ค ๊ตฌํ โ
httpx.AsyncClient
๋ก Ollama API์ ๋น๋๊ธฐ ์์ฒญ์ ๋ณด๋ด๋ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค.- ์์ฝ๊ณผ ํค์๋ ํ๊น ์ ์ํ ๊ธฐ๋ณธ ํ๋กฌํํธ๋ฅผ ์์ฑํ๋ค.
3. ํธ๋ฌ๋ธ์ํ : ์ญ์ ์ํ์น ์์๋ค ๐ญ
ModuleNotFoundError
:requirements.txt
์pydantic-settings
์ถ๊ฐ๋ฅผ ๊น๋นกํ๋ค. (๊ธฐ๋ณธ์ ์ธ ์ค์!)422 Unprocessable Content
์ค๋ฅ: FastAPI์/docs
UI๊ฐ ๊ธด ํ ์คํธ์ ์ค๋ฐ๊ฟ ์ฒ๋ฆฌ๋ฅผ ๋ชปํด์ ์๊ธด ๋ฌธ์ ์๋ค.curl
๋ก ์ง์ ํ ์คํธํ๋ ํด๊ฒฐ๋๋ค.gemma:2b
์ ๋ฐฐ์ (!): โํค์๋๋ง ์คโ๋ผ๊ณ ์๋ฌด๋ฆฌ ๋งํด๋ ๋ง์ ๋ฃ์ง ์๊ณ ์๊พธ ์ค๊ธ๋ก ๋ตํ๋ค. ๋ชจ๋ธ์ ์ง์ ์ฌํญ ์ค์ ๋ฅ๋ ฅ์ ๋ช ํํ ํ๊ณ๊ฐ ์์์ ํ์ธํ๋ค.
๐ ์ฒซ API ํธ์ถ ์ฑ๊ณต์ ์๊ฐ!
์๋ง์ ์ค๋ฅ๋ฅผ ๊ฑฐ์ณ, ํฐ๋ฏธ๋์์
curl
๋ก ๋ณด๋ธ ์์ฒญ์gemma:2b
๊ฐ ์์ฝํ ๊ฒฐ๊ณผ๊ฐ ๋ฑ! ํ๊ณ ์ฐํ์ ๋. ๊ทธ ์ง๋ฆฟํจ์ ์ ๋ง ์์ ์๊ฐ ์๋ค. ๋๋์ด AI ์๋น์ค์ ์ฌ์ฅ์ด ๋ฐ๊ธฐ ์์ํ ์๊ฐ์ด์๋ค.
๋ค์ ์คํ๋ฆฐํธ๋ฅผ ํฅํด
์ฒซ ์คํ๋ฆฐํธ๋ ์ฑ๊ณต์ ์ด์๋ค. ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ , LLM์ ์ฐ๋ํ์ผ๋ฉฐ, ์ฌ์ง์ด ๋ชจ๋ธ์ ํ๊ณ๊น์ง ํ์ ํ๋ค. ๋ค์ ์คํ๋ฆฐํธ ๋ชฉํ๋ ๋ช ํํด์ก๋ค.
- ๋ชจ๋ธ ๊ต์ฒด ๋ฐ ์ฑ๋ฅ ํ
์คํธ:
gemma:2b
๋์ , ์ง์๋ฅผ ๋ ์ ๋ฐ๋ฅด๋phi-3-mini
๋ชจ๋ธ๋ก ๊ต์ฒดํ๊ณ ์์ฝ ๋ฐ ํค์๋ ์ถ์ถ ์ฑ๋ฅ์ ๋ค์ ํ๊ฐํ ๊ฒ์ด๋ค.
์ฒซ์ ์ ๋ฐฐ๋ถ๋ฅผ ์ ์์ง๋ง, ๋ฐฉํฅ์ ์ ์ก์๋ค๋ ํ์ ์ด ๋ ๋ค. ๋ค์ ์คํ๋ฆฐํธ๊ฐ ๋ ๊ธฐ๋๋๋ค. ๐ฅ