1. AI Wiki - 100-hours-a-week/7-team-ddb-wiki GitHub Wiki
Dolpin [๋ฐ๋ก๊ฐ๊ธฐ]
AI Repository [๋ฐ๋ก๊ฐ๊ธฐ]
๋ณธ ํ๋ก์ ํธ์ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ์ด๊ธฐ GitHub ๋ธ๋์น ์ ๋ต๊ณผ GCP Bastion ์๋ฒ๋ฅผ ํ์ฉํ ์๋ ๋ฐฐํฌ์์ ์์ํ์ฌ, ์ดํ ์ ์ฐจ์ ์ผ๋ก CI/CD ์๋ํ, ์ปจํ ์ด๋ํ, Kubernetes ์ค์ผ์คํธ๋ ์ด์ , ๋ฐฐํฌ ์๋ํ ๋๊ตฌ๊น์ง ํ์ฅ์ ์งํํฉ๋๋ค
๊ฐ ๋จ๊ณ๋ ์ค ์ด์ ๊ฒฝํ๊ณผ ๊ธฐ์ ๋์ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์ํ๋๋ฉฐ, ๋จ๊ณ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ํ์ผ์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
- 1๋จ๊ณ - Git ๋ธ๋์น ๊ธฐ๋ฐ + Bastion ์๋ ๋ฐฐํฌ [๋ฐ๋ก๊ฐ๊ธฐ]
- 2๋จ๊ณ - Jenkins + Terraform์ ํตํ ๋ฐฐํฌ ์๋ํ [๋ฐ๋ก๊ฐ๊ธฐ]
- 3๋จ๊ณ - Docker ๊ธฐ๋ฐ ์ปจํ ์ด๋ํ ๋ฐฐํฌ [๋ฐ๋ก๊ฐ๊ธฐ]
- 4๋จ๊ณ - kubeadm์ ํ์ฉํ ์ค์ผ์คํธ๋ ์ด์ [๋ฐ๋ก๊ฐ๊ธฐ]
- 5๋จ๊ณ - k8s๋ฅผ ํ์ฉํ ๋ฐฐํฌ ์๋ํ ๋ฐ ๋ชจ๋ํฐ๋ง [๋ฐ๋ก๊ฐ๊ธฐ]
- AI ์๋ฒ: FastAPI + Uvicorn
- ๋ฐฐํฌ ํ๊ฒฝ: GCP
- CI/CD ๋๊ตฌ: Jenkins + Docker ๊ธฐ๋ฐ
- ์๋ฒ ๋ฐฐํฌ ํ๋ฆ:
- Github branch push ๊ฐ์ง(Jenkins)
- Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
- GCP ์๋ฒ ์๋ ๋ฐฐํฌ
- ๋ฐฐํฌ ๊ฒฐ๊ณผ ๋์ค์ฝ๋ ์๋ฆผ
- ์์ ์ผ์ : 2025-05-27 (3๋จ๊ณ)
3๋จ๊ณ ๋ฐฐํฌ ์ดํ ๊ณผ์ ๋ถํฐ๋ AI ์๋ฒ์ ๊ดํ logs, metrics์ ์๊ฐํ ํ ์ ์๋๋ก ๋ชจ๋ํฐ๋ง ์์คํ ์ ๋์ ํ์์ต๋๋ค.
๋ชจ๋ํฐ๋ง ์ด๋ฏธ์ง ํ์ธ

- Python 3.10
- Linux os
ํ๋ก์ ํธ ๊ตฌ์กฐ ์์ธํ ๋ณด๊ธฐ [github]
git clone https://github.com/100-hours-a-week/7-team-ddb-ai.git
cd fastapi_app/
# env ํ์ผ ์์ฑ
pip install -r requirements.txt
uvicorn main:app --reload [--no-access-log] #http ์์ฒญ ์๋ต ์ฝ์ ๋ก๊ทธ ๋ฏธ์ถ๋ ฅ
์ถ์ฒ ๊ธฐ๋ฅ ํ๋ฆ๋
graph LR
A["ํด๋ผ์ด์ธํธ ์์ฒญ (/v1/recommend)"]
B["FastAPI ๋น๋๊ธฐ ์๋ํฌ์ธํธ<br/>(async def get_recommendation)"]
C["RecommenderService.get_recommendation<br/>(async, LLM ํธ์ถ)"]
D["await self.chain.ainvoke<br/>(๋น๋๊ธฐ LLM ํค์๋ ์ถ์ถ)"]
E["ํค์๋ ์ถ์ถ ๊ฒฐ๊ณผ"]
F["await asyncio.to_thread(get_recommendations, keywords)"]
G["RecommendationEngine.get_recommendations<br/>(๋๊ธฐ, ์ค๋ ๋ํ)"]
H["PlaceStore.search_places<br/>(๋๊ธฐ, ์ค๋ ๋ํ)"]
I["์ถ์ฒ ๊ฒฐ๊ณผ ์์ฑ ๋ฐ ๋ฐํ"]
J["RecommenderService์์ ๊ฒฐ๊ณผ ๋ฐํ"]
K["FastAPI๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ต"]
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G --> H
H --> I
I --> J
J --> K
์ถ์ฒ API
์์ฒญ :
POST /api/v1/recommend
Content-Type: application/json
{
"text": "๊ณต๋ถํ๊ธฐ ์ข์ ์นดํ ์ถ์ฒํด์ค"
}
์๋ต:
{
"recommendations": [
{
"id": 1075919317,
"similarity_score": 4.545190393924713,
"keyword": [
"ํธ์ํ ๋ถ์๊ธฐ",
"์์ดํ์ด",
"์นดํ"
]
},
{
"id": 18612362,
"similarity_score": 4.5237778425216675,
"keyword": [
"๋ถ์๊ธฐ ์ข์",
"์์ดํ์ด",
"์นดํ"
]
}
]
}
- 1๋จ๊ณ : ๋ชจ๋ธ API ์ค๊ณ
- 2๋จ๊ณ : ๋ชจ๋ธ ์ถ๋ก ์ฑ๋ฅ ์ต์ ํ
- 3๋จ๊ณ : ์๋น์ค ์ํคํ ์ฒ ๋ชจ๋ํ
- 4๋จ๊ณ : LangChain ๊ธฐ๋ฐ ๋ฉํฐ์คํ AI ๊ตฌํ ๊ฒํ
- 5๋จ๊ณ : RAG ๋์ ๊ฐ๋ฅ์ฑ ์ ๊ฒ
- 6๋จ๊ณ : MCP ๋์ ๊ฐ๋ฅ์ฑ ์ ๊ฒ
- 7๋จ๊ณ : ์๋น์ค ์ธํ๋ผ ํ์ฅ์ฑ๊ณผ ๋ชจ๋ํฐ๋ง ์ค๊ณ
- 8๋จ๊ณ : ์ต์ข ํตํฉ ์ค๊ณ ๋ฐ ํ๊ณ
์คํ๋ฆฐํธ | ๊ธฐ๊ฐ | ์ฃผ์ ์์ |
---|---|---|
2 | 4/14 ~ 4/25 (9์ผ) | - AI ์
์ถ๋ ฅ ๋ฐ์ดํฐ ํ์
์ ์ - ๋ฐ์ดํฐ ์์ง, ์ ์ฒ๋ฆฌ - Local LLM ์๋น ๊ฐ๋ฅ์ฑ ๊ฒํ - AI ๋ชจ๋ธ ์ ์ - ์ฅ์ ์ถ์ฒ API ํ์ดํ๋ผ์ธ ์ค๊ณ |
3 | 4/28 ~ 5/9 (7์ผ) | - AI API์ BE ์ฐ๋ ์์
- ์ฅ์ ๋ํ ํค์๋ ์ถ์ถ - ๊ฒ์์ด ๊ธฐ๋ฐ ์ฅ์ ์ถ์ถ ๊ธฐ๋ฅ ๊ตฌํ |
4 | 5/12 ~ 5/23 (9์ผ) | - Local LLM ์๋น ์ค๋น - ๊ธฐ๋ก ๋ฐ์ดํฐ ์๋ฒ ๋ฉํ ํ์ดํ๋ผ์ธ ์ค๊ณ - FAISS ๊ธฐ๋ฐ Vector Store ๊ตฌ์ถ |
5 | 5/26 ~ 6/13 (13์ผ) | - LLM ๋ชจ๋ธ Fine-Tuning (LoRA ๋์
๊ฐ๋ฅ์ฑ ๊ฒํ ) - Prompt Engineering |
6 | 6/16 ~ 6/20 (4์ผ) | - MCP(Multi-Context Processing) ํ์ฉ ์ ๋ ฅ Context ๊ด๋ฆฌ |
7 | 6/23 ~ 7/4 (9์ผ) | - ์ ๋์ , ์ ์ฑ์ ์ฑ๋ฅ ๊ฐ์ ๊ณ ๋ํ |
8 | 7/7 ~ 7/18 (9์ผ) | - ์ฌ์ฉ์ ํ๊ฐ ๊ธฐ๋ฐ ์ฑ๋ฅ ๊ฐ์ |
9 | 7/21 ~ 8/1 (7์ผ) | - ๋ถํ ํ ์คํธ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ ์ฑ๋ฅ ๊ฐ์ |
- ๊ธฐ๋ฐ ๋ชจ๋ธ: Gemini Embedding, (๋๋ ๋์ฒด ๋ก์ปฌ LLM ๊ฒํ ์ค)
- ํ์ต ๋ฐ์ดํฐ: ์ฅ์ ๋ฉํ๋ฐ์ดํฐ, ์ฌ์ฉ์ ๊ธฐ๋ก(์ผ๊ธฐ) ํ ์คํธ
-
ํ์ต ํ๋ฆ:
- ๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ฒ๋ฆฌ (์ ์ , ํ ์คํธ ํด๋ ์ง)
- ๊ธฐ๋ก ๋ฐ์ดํฐ Embedding ์์ฑ
- FAISS ๊ธฐ๋ฐ Vector Store์ ์ ์ฅ
-
์ฑ๋ฅ ๊ฐ์ :
- ์ฌ์ฉ์ ํ๊ฐ ๊ธฐ๋ฐ ์ ์ฑ์ , ์ ๋์ ์ฑ๋ฅ ํฅ์
- Fine-Tuning (LoRA ํ์ฉ ๊ฐ๋ฅ์ฑ ๊ฒํ )
-
์ฌ์ฉ ๊ธฐ์ :
- MCP (Multi-Context Processing) ๊ธฐ๋ฒ์ ํตํ ์ ๋ ฅ ๊ฐํ
- Embedding ์ ์ฅ: FAISS ๊ธฐ๋ฐ Vector Store
-
๊ฒ์ ๋ฐฉ์:
- Cosine Similarity ๊ธฐ๋ฐ ์ต๊ทผ์ ์ด์ ๊ฒ์
-
FAISS ์ค์ :
- HNSW (Hierarchical Navigable Small World) ๊ตฌ์กฐ ์ฌ์ฉ ์์
-
Pipeline:
- ๊ฒ์์ด โ ์ ์ฌ ์ฅ์ ๊ฒ์ โ ์ถ์ฒ ๊ฒฐ๊ณผ ์ ๊ณต
-
On-Device Serving:
- Local LLM ์๋น ๊ฒํ ์ค (๋ก์ปฌ ๋ชจ๋ธ ํ์ฉ ๊ฐ๋ฅ์ฑ)
-
(์ถ๊ฐ ์์ ): ์คํ๋ฆฐํธ ํ ๋ฐ์ํ ์ฃผ์ ์ด์๋ฅผ ์ ๋ฆฌํ ์์
- ์: FAISS ์ธ๋ฑ์ค ๋ถํ ์ด์
- ์: ๋ก์ปฌ ์๋น ๋ชจ๋ธ ์ต์ ํ ์คํจ ๋ฑ