๐ค 8๋จ๊ณ : ์ต์ข ํตํฉ ์ค๊ณ ๋ฐ ํ๊ณ - 100-hours-a-week/7-team-ddb-wiki GitHub Wiki
Dolpin AI - ์ฅ์ ์ถ์ฒ ์์คํ
ํ๋ก์ ํธ ๊ฐ์
Dolpin AI๋ ์ฌ์ฉ์์ ์์ฐ์ด ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ฅ์๋ฅผ ์ถ์ฒํ๋ AI ์์คํ ์ ๋๋ค. LLM์ ํ์ฉํ์ฌ ํค์๋๋ฅผ ์ถ์ถํ๊ณ , ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด ์ ์ฌํ ์ฅ์๋ฅผ ์ฐพ์ ์ถ์ฒํฉ๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ
- ์์ฐ์ด ๊ธฐ๋ฐ ์ฅ์ ์ถ์ฒ
- LLM์ ํ์ฉํ ํค์๋ ์ถ์ถ
- ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์ ์ฌ๋ ๊ฒ์
- ์ค์๊ฐ ์ถ์ฒ ์ฒ๋ฆฌ
์๋น์ค ์ํคํ ์ณ
์๋น์ค ์ํคํ ์ณ ์ค๋ช
ํด๋น ์ด๋ฏธ์ง๋ ์ ์ฒด ์๋น์ค์์ AI ์๋ฒ์ ๋์์ ๋ํ๋ด๋ ์ํคํ ์ณ๋ก ์ฌ์ฉ์์ ์์ฒญ๊ณผ ์๋ฒ ๋ชจ๋ํฐ๋ง์ ๋ํ ํ๋ฆ์ ๋ํ๋ธ๋ค
- ์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด FE/BE๋ฅผ ๊ฑฐ์ณ AI ์๋ฒ์ ์์ฒญ์ด ์ ๋ฌ
- LLM์ ํตํด ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ์งํ
- ๋ฒกํฐ DB ์กฐํ๋ก ์ฅ์ ํ์
- BE์ ์ฅ์ ์ ๋ฌ
- Prometheus / Grafana๋ฅผ ํตํ ์๋ฒ ๋ชจ๋ํฐ๋ง ์งํ
AI ๋ด๋ถ ์ํคํ ์ณ
AI ์ํคํ ์ณ ์ค๋ช
- ๋ฒก์๋์์ endpoint๋ฅผ ํตํด ์ ์ ์ ๋ ฅ ์ ๋ฌ
- LLM์ ์ฌ์ฉํ์ฌ ์ ์ ์ ๋ ฅ์ผ๋ก๋ถํฐ ํค์๋ ์ถ์ถ ์งํ
- ์ถ์ถ๋ ํค์๋๋ฅผ ์๋ฒ ๋ฉํ์ฌ user query ๋ฒกํฐ ์์ฑ
- place ๋ฒกํฐ์ ์ ์ฌ๋ ๋น๊ต
- ์ ์ฌ๋ ์์๋๋ก ๋ฐํ
๊ธฐ์ ์คํ
- FastAPI: ๋ฐฑ์๋ ํ๋ ์์ํฌ
- LangChain: LLM ํตํฉ
- Chroma: ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Celery: ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ
- Redis: ์บ์ฑ
- Docker: ์ปจํ ์ด๋ํ
- Prometheus/Grafana: ๋ชจ๋ํฐ๋ง
ํ๋ก์ ํธ ๊ตฌ์กฐ
dolpin_ai/
โโโ app/
โ โโโ main.py # FastAPI ์ง์
์
โ โโโ api/ # ์๋ํฌ์ธํธ ์ ์
โ โ โโโ deps.py # Depends ์์กด์ฑ
โ โ โโโ v1/
โ โ โโโ endpoints/
โ โ โ โโโ recommend.py # ์ถ์ฒ ์์ฒญ ์๋ํฌ์ธํธ
โ โ โโโ router.py # v1 router ํตํฉ
โ โโโ services/ # ์๋น์ค ๋ก์ง
โ โ โโโ recommender.py # ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ
โ โ โโโ rag_engine.py # RAG ์ฒด์ธ
โ โ โโโ prompt_manager.py # ํ๋กฌํํธ ๊ด๋ฆฌ
โ โ โโโ vector_store.py # ๋ฒกํฐDB ์ฐ๋
โ โโโ ml/ # ๋ชจ๋ธ ๋ก๋ฉ ๋ฐ ์ถ๋ก
โ โ โโโ model_loader.py # ๋ชจ๋ธ ๋ก๋ฉ
โ โ โโโ inference.py # ์ถ๋ก ์์ง
โ โโโ schemas/ # Pydantic ๋ชจ๋ธ
โ โ โโโ recommend_schema.py # ์
๋ ฅ/์ถ๋ ฅ ์คํค๋ง
โ โโโ core/ # ์ค์ , ๋ณด์, CORS ๋ฑ
โ โ โโโ config.py # ๊ธฐ๋ณธ ์ค์
โ โ โโโ init_app.py # ์ฑ ๋ถํธ์คํธ๋ฉ
โ โ
โ โโโ models/ # DB ๋ชจ๋ธ ์ ์
โ โ โโโ base.py # ๊ธฐ๋ณธ ๋ชจ๋ธ
โ โ โโโ place.py # ์ฅ์ ๋ชจ๋ธ
โ โ
โ โโโ database/ # DB ์ค์
โ โ โโโ session.py # DB ์ธ์
๊ด๋ฆฌ
โ โ โโโ migrations/ # Alembic ๋ง์ด๊ทธ๋ ์ด์
โ โ
โ โโโ cache/ # ์บ์ฑ
โ โ โโโ redis.py # Redis ์ค์
โ โ โโโ decorators.py # ์บ์ ๋ฐ์ฝ๋ ์ดํฐ
โ โ
โ โโโ tasks/ # ๋น๋๊ธฐ ์์
โ โ โโโ celery.py # Celery ์ค์
โ โ โโโ workers/ # ์์ปค ์ ์
โ โ
โ โโโ exceptions/ # ์์ธ ์ฒ๋ฆฌ
โ โ โโโ handlers.py # ์์ธ ํธ๋ค๋ฌ
โ โ โโโ custom.py # ์ปค์คํ
์์ธ
โ โ
โ โโโ logging/ # ๋ก๊น
โ โ โโโ config.py # ๋ก๊น
์ค์
โ โ โโโ middleware.py # ๋ก๊น
๋ฏธ๋ค์จ์ด
โ โ
โ โโโ utils/ # ๋ณด์กฐ ์ ํธ ํจ์
โ โโโ logger.py # loguru/structlog ๊ธฐ๋ฐ ๋ก๊ฑฐ
โ โโโ text_cleaner.py # ํ
์คํธ ์ ์ฒ๋ฆฌ ์ ํธ
โ โโโ timer.py # ์ฑ๋ฅ ์ธก์ ๋ฐ์ฝ๋ ์ดํฐ
โ
โโโ tests/ # ํ
์คํธ
โ โโโ unit/ # ๋จ์ ํ
์คํธ
โ โโโ integration/ # ํตํฉ ํ
์คํธ
โ โโโ e2e/ # E2E ํ
์คํธ
โ
โโโ docs/ # ๋ฌธ์ํ
โ โโโ api/ # API ๋ฌธ์
โ โโโ architecture/ # ์ํคํ
์ฒ ๋ฌธ์
โ
โโโ scripts/ # ์ ํธ๋ฆฌํฐ
โ โโโ setup.sh # ํ๊ฒฝ ์ค์
โ โโโ deploy.sh # ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
โ
โโโ monitoring/ # ๋ชจ๋ํฐ๋ง
โ โโโ prometheus/ # Prometheus ์ค์
โ โโโ grafana/ # Grafana ๋์๋ณด๋
โ
โโโ config/ # ํ๊ฒฝ ์ค์
โ โโโ development.py # ๊ฐ๋ฐ ํ๊ฒฝ
โ โโโ testing.py # ํ
์คํธ ํ๊ฒฝ
โ โโโ production.py # ์ด์ ํ๊ฒฝ
โ
โโโ Dockerfile # ์ปจํ
์ด๋ ์ค์
โโโ docker-compose.yml # ์ปจํ
์ด๋ ๊ตฌ์ฑ
โโโ requirements.txt # ์์กด์ฑ
โโโ README.md # ํ๋ก์ ํธ ๋ฌธ์
-
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ
models/
: SQLAlchemy ๊ธฐ๋ฐ DB ๋ชจ๋ธ ์ ์database/
: DB ์ธ์ ๊ด๋ฆฌ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ vector_store.py
: FAISS/Chroma ๋ฒกํฐ DB ์ฐ๋
-
์บ์ฑ (cache/)
redis.py
: Redis ์ฐ๊ฒฐ ๋ฐ ์ค์ decorators.py
: ์บ์ ๋ฐ์ฝ๋ ์ดํฐ ๊ตฌํ- ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์บ์ฑ ์ ๋ต
-
๋น๋๊ธฐ ์์
tasks/
: Celery ๊ธฐ๋ฐ ๋น๋๊ธฐ ์์ ๊ด๋ฆฌworkers/
: ์๋ฒ ๋ฉ ์์ฑ ๋ฑ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์celery_app.py
: Celery ์ค์ ๋ฐ ์์ปค ์ ์
-
์์ธ ์ฒ๋ฆฌ (exceptions/)
handlers.py
: ์ ์ญ ์์ธ ํธ๋ค๋ฌcustom.py
: ์ปค์คํ ์์ธ ํด๋์ค- ์๋ฌ ์๋ต ํ์คํ
-
๋ก๊น (logging/)
config.py
: ๋ก๊น ์ค์ middleware.py
: ์์ฒญ/์๋ต ๋ก๊นutils/logger.py
: ๊ตฌ์กฐํ๋ ๋ก๊น
-
์ ํธ๋ฆฌํฐ (utils/)
text_cleaner.py
: ํ ์คํธ ์ ์ฒ๋ฆฌtimer.py
: ์ฑ๋ฅ ์ธก์ logger.py
: ๋ก๊น ์ ํธ๋ฆฌํฐ
-
ํ ์คํธ (tests/)
unit/
: ๋จ์ ํ ์คํธintegration/
: ํตํฉ ํ ์คํธe2e/
: End-to-End ํ ์คํธ
-
๋ฌธ์ํ (docs/)
api/
: API ๋ฌธ์architecture/
: ์์คํ ์ํคํ ์ฒ ๋ฌธ์README.md
: ํ๋ก์ ํธ ๊ฐ์
-
๋ชจ๋ํฐ๋ง (monitoring/)
prometheus/
: ๋ฉํธ๋ฆญ ์์งgrafana/
: ๋์๋ณด๋ ๋ฐ ์๊ฐํ- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
-
ํ๊ฒฝ ์ค์ (config/)
development.py
: ๊ฐ๋ฐ ํ๊ฒฝtesting.py
: ํ ์คํธ ํ๊ฒฝproduction.py
: ์ด์ ํ๊ฒฝ
-
๋ฐฐํฌ ๊ด๋ จ
Dockerfile
: ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ ์docker-compose.yml
: ์๋น์ค ๊ตฌ์ฑrequirements.txt
: ์์กด์ฑ ๊ด๋ฆฌ
-
API ์๋ํฌ์ธํธ (api/)
v1/endpoints/
: API ๋ฒ์ 1 ์๋ํฌ์ธํธdeps.py
: ์์กด์ฑ ์ฃผ์router.py
: ๋ผ์ฐํฐ ํตํฉ
-
์๋น์ค ๋ก์ง (services/)
recommender.py
: ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆrag_engine.py
: RAG ์ฒด์ธprompt_manager.py
: ํ๋กฌํํธ ๊ด๋ฆฌ
-
ML ๋ชจ๋ธ (ml/)
model_loader.py
: ๋ชจ๋ธ ๋ก๋ฉinference.py
: ์ถ๋ก ์์ง- LLM ๋ฐ ์๋ฒ ๋ฉ ๋ชจ๋ธ ๊ด๋ฆฌ
-
๋ฐ์ดํฐ ์คํค๋ง (schemas/)
recommend_schema.py
: ์ถ์ฒ ๊ด๋ จ ์คํค๋ง- Pydantic ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ฒ์ฆ
-
ํต์ฌ ์ค์ (core/)
config.py
: ๊ธฐ๋ณธ ์ค์ init_app.py
: ์ฑ ์ด๊ธฐํ- CORS, ๋ฏธ๋ค์จ์ด ๋ฑ ์ค์
ํ๋ก์ ํธ ๊ตฌ์กฐ ์ด์
- ๋ชจ๋ํ
- ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ
- ์ ์ง๋ณด์ ์ฉ์ด์ฑ
- ํ ์คํธ ์ฉ์ด์ฑ
- ๋ฐฐํฌ ์๋ํ
- ๋ชจ๋ํฐ๋ง ์ฉ์ด์ฑ
API ์๋ต ์์
POST /api/v1/recommend
Content-Type: application/json
{
"text": "๋ง์๋ ํ์์ง ์ถ์ฒํด์ค"
}
์๋ต:
{
"recommendations": [
{
"id": 1,
"similarity_score": 0.95
},
{
"id": 21,
"similarity_score": 0.95
},
{
"id": 32,
"similarity_score": 0.95
}
]
}
๋ชจ๋ํฐ๋ง ๊ธฐ์ ์คํ
- Prometheus: ๋ฉํธ๋ฆญ ์์ง
- Grafana: ๋์๋ณด๋ ๋ฐ ์๊ฐํ
- ๋ก๊น : ๊ตฌ์กฐํ๋ ๋ก๊ทธ ์์ง
๋ฒ์ ๋ณ ์ธํ๋ผ ๊ธฐ์ ๋ฐ ์๋น์ค ๋ช ์ธ
ํญ๋ชฉ | ์ด๊ธฐ (Jetson Orin Nano) | ํ์ฅ ์ (ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ EC2/K8s) |
---|---|---|
๋ชจ๋ธ ์๋ฒ | ๋จ์ผ FastAPI ์๋ฒ (Docker ์ปจํ ์ด๋) | ์ฌ๋ฌ EC2 ์ธ์คํด์ค์ ๋์ผํ ์ปจํ ์ด๋ ๋ฐฐํฌ (Kubernetes ๋๋ Auto Scaling) |
ํธ๋ํฝ ๋ถ์ฐ | GCP Load Balancer (๋จ์ผ ์๋ฒ ๋ด ๋ผ์ฐํ ) | AWS ALB ๋๋ Kubernetes Ingress๋ฅผ ํตํ ๋ถํ ๋ถ์ฐ |
์๋ฒ ์ด์ ๋ฐฉ์ | ์จํ๋ ๋ฏธ์ค Jetson ์ด์ (ํ๋ฃจ 15์๊ฐ) | ํธ๋ํฝ ํผํฌ ์๊ฐ๋์ EC2 ์คํ ์ธ์คํด์ค ์ถ๊ฐ ์ด์ฉ (์: ์์ฌ์๊ฐ๋) |
๋ชจ๋ํฐ๋ง | Prometheus + Grafana (Jetson ๋ด ๋ชจ๋ํฐ๋ง) | ๋์ผ ์คํ์ EC2 ์ธ์คํด์ค์๋ ์ ์ฉํ์ฌ ์ ์ฒด ๋ฆฌ์์ค ์ฌ์ฉ ๋ชจ๋ํฐ๋ง |
๋ชจ๋ํฐ๋ง ๋์ ์งํ ๋ชฉ๋ก๊ณผ ์์ง/์๊ฐํ ๋ฐฉ๋ฒ
๊ตฌ์ฑ์์ | ์ญํ | ๋๊ตฌ |
---|---|---|
์๋ฒ/์ ํ๋ฆฌ์ผ์ด์ | API ์์ฒญ ์, ์๋ต ์๊ฐ, ์๋ฌ์จ | FastAPI ๋ด Prometheus exporter |
์์คํ ๋ฆฌ์์ค | CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ I/O, ๋คํธ์ํฌ ์งํ | Node Exporter, DCGM Exporter |
์์คํ ๋์๋ณด๋ | ์ค์๊ฐ ์๊ฐํ ๋ฐ ๋ชจ๋ํฐ๋ง | Grafana |
์๋ฆผ | ์ด์ ์งํ ๋ฐ์ ์ ๊ฒฝ๊ณ ์ ์ก | Alertmanager (Discord) |
-> ๊ฐ์ด ๋ถํ ํ ์คํธ ๋๋ ์๋ฎฌ๋ ์ด์ ๊ฒฐ๊ณผ์ ๊ทธ์ ๋ฐ๋ฅธ ์์คํ ์์ ์ฌ์ฉ๋/์๋ต์๊ฐ ๋ณํ ๋ถ์
์ด์ ๊ด์ ์์ ์ธํ๋ผ ํ์ฅ ๋ฐ ๋ชจ๋ํฐ๋ง์ ์ด์
-
์ด๊ธฐ ์ด์:
- ๊ทน์์ ์ฌ์ฉ์ ๋์์ผ๋ก Jetson Orin Nano์์ Docker ์ปจํ ์ด๋ ๊ธฐ๋ฐ FastAPI ์๋ฒ๋ก ์ด์.
- Gemini API ํ๋ฆฌํฐ์ด ์ ํ ๋ด์์ ์ด์ํ๋ฉฐ, ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ ํตํด ๋ฌด๋ฃ ํ๋ ์ด๊ณผ ์ ์ ๋ฃ ์ ํ ์์ .
-
ํ์ฅ ์ ๋ต:
- ํน์ ์๊ฐ๋(์: ์์ฌ ์๊ฐ๋, ๋ถํ ํ ์คํธ ๊ธฐ๊ฐ) ๋ฐ ํธ๋ํฝ ์ฆ๊ฐ ์ EC2 ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ํ ํ์ฅ ๋์.
- AWS ALB ๋๋ K8s Ingress๋ก API ์์ฒญ ๋ถ์ฐ.
-
๋ชจ๋ํฐ๋ง ๋ฐ ๋์:
- Prometheus + Grafana๋ก ์ค์๊ฐ ์งํ ํ์ธ, Alertmanager๋ก ์๋ ์๋ฆผ ์ฐ๋.
๋จ๊ณ๋ณ ์ค๊ณ ์ ์ฉ ๊ณํ(์ถํ ์งํ ๋ฐฉํฅ)
- MVP : Gemini๋ฅผ ํ์ฉํ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์์ง ๋ฐ ์ฑ๋ฅ ๋ณด์ฅ
- v2 : Local LLM์ ์ฌ์ฉํ ํค์๋ ์ถ์ถ๋ชจ๋ธ ๊ฐ๋ฐ
- v3 : ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ฉํ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ ๊ณ ๋ํ