Spaces:
Sleeping
Sleeping
Upload README.md
Browse files
README.md
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ๐ MarketSync (๋ง์ผ์ฑํฌ)
|
| 2 |
+
|
| 3 |
+
### Agentic RAG ๊ธฐ๋ฐ ์์๊ณต์ธ ๋ง์ถคํ ์ง์ญ ์ถ์ ์ถ์ฒ & ๋ง์ผํ
AI ์ปจ์คํดํธ
|
| 4 |
+
|
| 5 |
+
์ ํ์นด๋ ๋น
๋ฐ์ดํฐ์ ์ ๊ตญ ์ถ์ ์ ๋ณด๋ฅผ ํตํฉ ๋ถ์ํ์ฌ, **AI ์์ด์ ํธ**๊ฐ ๊ฐ๊ฒ๋ณ๋ก ์ฐธ์ฌํ ๋งํ ์ง์ญ ์ถ์ ๋ฅผ ์ถ์ฒํ๊ณ ์ต์ ์ ๋ง์ผํ
์ ๋ต ๋ณด๊ณ ์๋ฅผ ์๋ ์์ฑํฉ๋๋ค. ๐ค
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## ๐งญ ํ๋ก์ ํธ ๊ฐ์
|
| 10 |
+
|
| 11 |
+
MarketSync๋ **Streamlit ์น ์ธํฐํ์ด์ค, FastAPI ๋ฐ์ดํฐ ์๋ฒ, LangChain ์์ด์ ํธ**๋ฅผ ๊ฒฐํฉํ์ฌ ์์๊ณต์ธ์ ์ํ AI ์ปจ์คํ
์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๋ ์์ ์ ๊ฐ๊ฒ๋ฅผ ์ ํํ์ฌ ์์ธ ํ๋กํ๊ณผ ๋ถ์ ๊ทธ๋ํ๋ฅผ ํ์ธํ ๋ค, "10์์ ์ด๋ฆฌ๋ ์ถ์ ์ถ์ฒํด์ค", "์ถ์ฒ๋ ์ถ์ ๋ค์ ๋ง์ผํ
์ ๋ต ์๋ ค์ค" ์ ๊ฐ์ ์์ฐ์ด ์ง๋ฌธ์ ํตํด ๋ง์ถคํ ์ปจ์คํ
์ ๋ฐ์ ์ ์์ต๋๋ค.
|
| 12 |
+
|
| 13 |
+
**ํต์ฌ ์ํคํ
์ฒ๋ Agentic RAG**์
๋๋ค. AI ์์ด์ ํธ(`Orchestrator`)๋ ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ๊ฐ๊ฒ์ ์์ธ ํ๋กํ(JSON)์ ๋ฐํ์ผ๋ก ์ํฉ์ ๋ง๋ **๋๊ตฌ(Tool)**๋ฅผ ์์จ์ ์ผ๋ก ์ ํํ๊ณ , ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ฐ๋ผ ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ฌ ์ต์ข
์ปจ์คํ
๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## ๐ ๏ธ ํต์ฌ ๋๊ตฌ ๋ฐ ์๋ ๋ฐฉ์
|
| 18 |
+
|
| 19 |
+
AI ์์ด์ ํธ๊ฐ ์ฌ์ฉํ๋ ์ฃผ์ ๋๊ตฌ์ ๋ด๋ถ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
|
| 20 |
+
|
| 21 |
+
| ๊ธฐ๋ฅ ๋ถ๋ฅ | ๋๊ตฌ ํจ์๋ช
(`tools/`) | ์ฃผ์ ์ฒ๋ฆฌ ๊ณผ์ (`modules/`) |
|
| 22 |
+
| :--------------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| 23 |
+
| **์ถ์ ์ถ์ฒ** | `recommend_festivals` (festival\_recommender.py) | **ํ์ด๋ธ๋ฆฌ๋ 5๋จ๊ณ ํ์ดํ๋ผ์ธ (`filtering.py`)**: <br> 1. LLM ์ฟผ๋ฆฌ ์ฌ์์ฑ <br> 2. FAISS ๋ฒกํฐ ๊ฒ์ (์ ์ฌ ์ถ์ ํ๋ณด ์ ์ ) <br> 3. LLM ๋์ ์์ฑ ํ๊ฐ (๊ฐ๊ฒ ๋ง์ถค์ฑ) <br> 4. ํ์ด๋ธ๋ฆฌ๋ ์ ์ ๊ณ์ฐ <br> 5. ์ต์ข
Top3 ๊ฒฐ๊ณผ ํฌ๋งทํ
(2026 ์์ธก ํฌํจ) |
|
| 24 |
+
| **๋ง์ผํ
(RAG)** | `search_contextual_marketing_strategy` (marketing\_strategy.py) | **์ปจํ
์คํธ ๊ธฐ๋ฐ RAG (`knowledge_base.py`)**: <br> 1. ๊ฐ๊ฒ ํ๋กํ + ์ง๋ฌธ โ LLM ๊ฒ์ ์ฟผ๋ฆฌ ์์ฑ <br> 2. FAISS ๋ฒกํฐ ๊ฒ์ (๊ด๋ จ ์ ๋ต ๋ฌธ์ ์ถ์ถ) <br> 3. LLM ๋ต๋ณ ์์ฑ (์ถ์ถ๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฐ์ค๋ฌ์ด ์ ๋ต ์ ์) |
|
| 25 |
+
| **๋ง์ผํ
(์์ฑ)** | `create_festival_specific_marketing_strategy` (marketing\_strategy.py) | **LLM ๊ธฐ๋ฐ ์ ๋ต ์์ฑ**: <br> 1. ์ถ์ ํ๋กํ ์กฐํ (`profile_analyzer.py`) <br> 2. ๊ฐ๊ฒ ํ๋กํ + ์ถ์ ํ๋กํ + RAG ๊ฒ์ โ LLM ํ๋กฌํํธ ๊ตฌ์ฑ <br> 3. LLM์ด ํน์ ์ถ์ ๋ง์ถค ์ ๋ต ์์ฑ |
|
| 26 |
+
| **๋ง์ผํ
(์์ฑ)** | `create_marketing_strategies_for_multiple_festivals` (marketing\_strategy.py) | **LLM ๊ธฐ๋ฐ ์ ๋ต ์์ฑ (๋ค์)**: <br> 1. ์ฌ๋ฌ ์ถ์ ์ด๋ฆ ์
๋ ฅ๋ฐ์ <br> 2. ๊ฐ ์ถ์ ๋ณ๋ก `create_festival_specific_marketing_strategy` ๋ฐ๋ณต ํธ์ถ <br> 3. ๋ชจ๋ ์ ๋ต์ ํ๋์ ๋ณด๊ณ ์๋ก ์ทจํฉ |
|
| 27 |
+
| **๊ฐ๊ฒ ๋ถ์** | `analyze_merchant_profile` (profile\_analyzer.py) | **LLM ๊ธฐ๋ฐ ๋ถ์**: <br> ๊ฐ๊ฒ ํ๋กํ(JSON) ์
๋ ฅ โ LLM์ด SWOT ๋ถ์ ๋ฐ ํต์ฌ ๊ณ ๊ฐ ํน์ฑ ์์ฝ ๋ณด๊ณ ์ ์์ฑ |
|
| 28 |
+
| **์ถ์ ๋ถ์** | `analyze_festival_profile` (profile\_analyzer.py) | **LLM ๊ธฐ๋ฐ ๋ถ์**: <br> ์ถ์ ํ๋กํ(JSON) ์
๋ ฅ โ LLM์ด ์ถ์ ์ ํต์ฌ ํน์ง ๋ฐ ์ฃผ์ ๋ฐฉ๋ฌธ๊ฐ ํน์ฑ ์์ฝ ๋ณด๊ณ ์ ์์ฑ |
|
| 29 |
+
| **์ถ์ ์กฐํ** | `get_festival_profile_by_name` (profile\_analyzer.py) | **๋จ์ ๋ฐ์ดํฐ ์กฐํ**: ์ถ์ ์ด๋ฆ ์
๋ ฅ โ `festival_df.csv`์์ ํด๋น ์ถ์ ์ ๋ณด(JSON) ๋ฐํ (์บ์ฑ ํ์ฉ) |
|
| 30 |
+
|
| 31 |
+
---
|
| 32 |
+
|
| 33 |
+
## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฐ ์ฝ๋ ์ค๋ช
|
| 34 |
+
|
| 35 |
+
```plaintext
|
| 36 |
+
MarketSync/
|
| 37 |
+
โโโ streamlit_app.py # Streamlit ์น ์ธํฐํ์ด์ค (UI)
|
| 38 |
+
โโโ orchestrator.py # AI ์์ด์ ํธ: LangChain AgentExecutor, ๋๊ตฌ ๋ผ์ฐํ
, ์ต์ข
๋ต๋ณ ์์ฑ ๋ก์ง
|
| 39 |
+
โโโ config.py # ์ค์ ์ค์ํ: ๊ฒฝ๋ก, API ํค, ๋ชจ๋ธ๋ช
, ๋ก๊น
์ค์ ๋ฑ
|
| 40 |
+
โ
|
| 41 |
+
โโโ api/ # ๋ฐ์ดํฐ ์ ๊ณต ๋ฐ ์ ์ฒ๋ฆฌ ์๋ฒ
|
| 42 |
+
โ โโโ server.py # FastAPI ์๋ฒ: /profile, /merchants ์๋ํฌ์ธํธ ์ ๊ณต
|
| 43 |
+
โ โโโ data_loader.py # ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ ์ฒ๋ฆฌ (final_df.csv, festival_df.csv)
|
| 44 |
+
โ
|
| 45 |
+
โโโ tools/ # LangChain @tool ๋๊ตฌ ์ ์ ๋ ์ด์ด
|
| 46 |
+
โ โโโ festival_recommender.py # [Tool] recommend_festivals ๋๊ตฌ ์ ์ (filtering.py ํธ์ถ)
|
| 47 |
+
โ โโโ marketing_strategy.py # [Tool] ๋ง์ผํ
์ ๋ต ๊ด๋ จ ๋๊ตฌ 3๊ฐ ์ ์ (knowledge_base.py, profile_analyzer.py ๋ฑ ํธ์ถ)
|
| 48 |
+
โ โโโ profile_analyzer.py # [Tool] ๊ฐ๊ฒ/์ถ์ ๋ถ์ ๋ฐ ์ถ์ ํ๋กํ ์กฐํ ๋๊ตฌ 3๊ฐ ์ ์ (LLM ํธ์ถ, ๋ฐ์ดํฐ ์กฐํ)
|
| 49 |
+
โ โโโ tool_loader.py # ๋ชจ๋ ๋๊ตฌ(@tool)๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฌถ์ด Orchestrator์ ์ ๊ณต
|
| 50 |
+
โ
|
| 51 |
+
โโโ modules/ # ํต์ฌ ๋ก์ง ๊ตฌํ ๋ชจ๋
|
| 52 |
+
โ โโโ filtering.py # [์ถ์ ์ถ์ฒ] FestivalRecommender ํด๋์ค (5๋จ๊ณ ํ์ดํ๋ผ์ธ ๊ตฌํ)
|
| 53 |
+
โ โโโ knowledge_base.py # [RAG] FAISS ๋ฒกํฐ ์คํ ์ด ๋ก๋ฉ (์ถ์ , ๋ง์ผํ
), ์๋ฒ ๋ฉ ๋ชจ๋ธ ๊ด๋ฆฌ
|
| 54 |
+
โ โโโ llm_provider.py # LLM ์ธ์คํด์ค ๊ด๋ฆฌ (์ ์ญ ๊ณต์ ๋ฐ Temperature ์กฐ์ )
|
| 55 |
+
โ โโโ profile_utils.py # ๊ฐ๊ฒ ํ๋กํ JSON ๊ฐ๊ณต ์ ํธ๋ฆฌํฐ (์ฑํ
์ฉ/๋ถ์์ฉ)
|
| 56 |
+
โ โโโ visualization.py # Streamlit ์๊ฐํ: Matplotlib ๊ทธ๋ํ ์์ฑ ํจ์
|
| 57 |
+
โ
|
| 58 |
+
โโโ utils/ # ๊ณตํต ์ ํธ๋ฆฌํฐ
|
| 59 |
+
โ โโโ parser_utils.py # LLM ์๋ต์์ JSON ์ถ์ถ ํ์
|
| 60 |
+
โ
|
| 61 |
+
โโโ data/ # ์๋ณธ ๋ฐ์ดํฐ
|
| 62 |
+
โ โโโ final_df.csv # ์ ํ์นด๋ ๊ฐ๋งน์ ๋ฐ์ดํฐ
|
| 63 |
+
โ โโโ festival_df.csv # ์ ๊ตญ ์ถ์ ์ ๋ณด ๋ฐ์ดํฐ
|
| 64 |
+
โ
|
| 65 |
+
โโโ vectorstore/ # FAISS ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ํด๋
|
| 66 |
+
โโโ faiss_festival # ์ถ์ ์ ๋ณด ๋ฒกํฐ DB
|
| 67 |
+
โโโ faiss_marketing # ๋ง์ผํ
์ ๋ต ๋ฒกํฐ DB
|
| 68 |
+
```
|
| 69 |
+
|
| 70 |
+
------------------------------------------------------------------------
|
| 71 |
+
|
| 72 |
+
## ๐ ์ํคํ
์ฒ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ
|
| 73 |
+
|
| 74 |
+
์ด ์์คํ
์ **์์ด์ ํธ ์ค์ฌ์ ๋๊ตฌ ํธ์ถ (Tool-Calling)** ์ํคํ
์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค. ์ฌ์ฉ์์ ์์ฐ์ด ์ง๋ฌธ์ `Orchestrator`๋ผ๋ AI ์์ด์ ํธ์ ์ํด ํด์๋๋ฉฐ, ์์ด์ ํธ๋ ์ ๊ณต๋ `[๊ฐ๊ฒ ํ๋กํ]` ์ปจํ
์คํธ์ **์์คํ
ํ๋กฌํํธ**์ ์ง์นจ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ์คํํฉ๋๋ค. ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ฌ ์ป์ ์ ๋ณด๋ฅผ ์ข
ํฉํ ๋ค, ์ต์ข
์ปจ์คํ
๋ต๋ณ์ ์์ฑํฉ๋๋ค.
|
| 75 |
+
|
| 76 |
+
---
|
| 77 |
+
|
| 78 |
+
## ๐งฉ ์์คํ
๊ตฌ์ฑ๋
|
| 79 |
+
|
| 80 |
+
### (1) ์ ์ฒด ๊ฐ์: UI - ์์ด์ ํธ - API ์ํธ์์ฉ
|
| 81 |
+
|
| 82 |
+
์ฌ์ฉ์๊ฐ UI๋ฅผ ํตํด ์ง๋ฌธํ๋ฉด, **์์ด์ ํธ(Orchestrator)** ๊ฐ ์๋ํ๊ณ , ํ์ ์ FastAPI ์๋ฒ๋ **์ฌ๋ฌ ๋๊ตฌ(Tool)** ์ ์ํธ์์ฉํฉ๋๋ค.
|
| 83 |
+
|
| 84 |
+
```mermaid
|
| 85 |
+
graph TD
|
| 86 |
+
%% ========================
|
| 87 |
+
%% AI ์ปจ์คํ
์์ง (์ต์๋จ)
|
| 88 |
+
%% ========================
|
| 89 |
+
subgraph SG_Engine ["๐ง AI ์ปจ์คํ
์์ง"]
|
| 90 |
+
direction TB
|
| 91 |
+
C["๐ค Orchestrator (ํต์ฌ ์์ด์ ํธ)\n(orchestrator.py)\nAgentExecutor (LangChain)"]
|
| 92 |
+
D{"๐ฆ Tool Routing\nLLM ์๋ ๋ถ์ & ๋๊ตฌ ์ ํ"}
|
| 93 |
+
|
| 94 |
+
subgraph SG_Tools ["๐ง ๋ฑ๋ก๋ ๋๊ตฌ ๋ชฉ๋ก (tools/)"]
|
| 95 |
+
T1["recommend_festivals\n(์ถ์ ์ถ์ฒ)"]
|
| 96 |
+
T2["search_contextual_marketing_strategy\n(RAG ๋ง์ผํ
์ ๋ต)"]
|
| 97 |
+
T3["create_festival_specific_marketing_strategy\n(๋จ์ผ ์ถ์ ์ ๋ต)"]
|
| 98 |
+
T3_multi["create_marketing_strategies_for_multiple_festivals\n(๋ค์ ์ถ์ ์ ๋ต)"]
|
| 99 |
+
T4["analyze_merchant_profile\n(๊ฐ๊ฒ ๋ถ์)"]
|
| 100 |
+
T5["analyze_festival_profile\n(์ถ์ ๋ถ์)"]
|
| 101 |
+
T6["get_festival_profile_by_name\n(์ถ์ ํ๋กํ ์กฐํ)"]
|
| 102 |
+
end
|
| 103 |
+
|
| 104 |
+
LLM_Final["๐ช LLM (Final Report Generation)\n์ต์ข
๋ณด๊ณ ์ ์์ฑ"]
|
| 105 |
+
end
|
| 106 |
+
|
| 107 |
+
%% ========================
|
| 108 |
+
%% ์ฌ์ฉ์ ์ธํฐํ์ด์ค & ๋ฐ์ดํฐ ์๋ฒ (ํ๋จ)
|
| 109 |
+
%% ========================
|
| 110 |
+
subgraph SG_UserServer ["๐ป ์ฌ์ฉ์ ์ธํฐํ์ด์ค & ๋ฐ์ดํฐ ์๋ฒ"]
|
| 111 |
+
direction LR
|
| 112 |
+
A["๐ฅ๏ธ Streamlit UI\n(streamlit_app.py)\n์ฌ์ฉ์ ์ํธ์์ฉ"] <--> B["๐ FastAPI Server\n(api/server.py)\n๐ ๊ฐ๊ฒ ํ๋กํ / ๋ชฉ๋ก ์กฐํ"]
|
| 113 |
+
end
|
| 114 |
+
|
| 115 |
+
%% ========================
|
| 116 |
+
%% ์ฐ๊ฒฐ ๊ด๊ณ (์์ )
|
| 117 |
+
%% ========================
|
| 118 |
+
A -- "์์ฐ์ด ์ง๋ฌธ ์
๋ ฅ" --> C
|
| 119 |
+
C -- "์๋ ๋ถ์ ์์ฒญ" --> D
|
| 120 |
+
D -- "์ ํฉ ๋๊ตฌ ์ ํ/์คํ" --> SG_Tools
|
| 121 |
+
SG_Tools -- "๋๊ตฌ ์คํ ๊ฒฐ๊ณผ" --> C
|
| 122 |
+
C -- "์ต์ข
๋ณด๊ณ ์ ์์ฑ ์์ฒญ" --> LLM_Final
|
| 123 |
+
LLM_Final -- "์ต์ข
๊ฒฐ๊ณผ ์ ๋ฌ" --> A
|
| 124 |
+
|
| 125 |
+
%% ========================
|
| 126 |
+
%% ์คํ์ผ ์ง์ (GitHub ํธํ)
|
| 127 |
+
%% ========================
|
| 128 |
+
style A fill:#4CAF50,color:#fff,stroke:#388E3C,stroke-width:2px
|
| 129 |
+
style B fill:#FF9800,color:#fff,stroke:#EF6C00,stroke-width:2px
|
| 130 |
+
style C fill:#E91E63,color:#fff,stroke:#C2185B,stroke-width:2px
|
| 131 |
+
style D fill:#9C27B0,color:#fff,stroke:#7B1FA2,stroke-width:2px,shape:diamond
|
| 132 |
+
style SG_Tools fill:#E1F5FE, stroke:#0277BD,color:#000
|
| 133 |
+
style T1,T2,T3,T3_multi,T4,T5,T6 fill:#03A9F4,color:#fff,stroke:#0288D1,stroke-width:2px,shape:hexagon
|
| 134 |
+
style LLM_Final fill:#BA68C8,color:#fff,stroke:#8E24AA,stroke-width:2px
|
| 135 |
+
```
|
| 136 |
+
|
| 137 |
+
---
|
| 138 |
+
|
| 139 |
+
### (2) ์ถ์ ์ถ์ฒ ๋๊ตฌ ์์ธ โ `recommend_festivals`
|
| 140 |
+
|
| 141 |
+
LLM ๊ธฐ๋ฐ **ํ์ด๋ธ๋ฆฌ๋ 5๋จ๊ณ ํ์ดํ๋ผ์ธ**์ ํตํด,
|
| 142 |
+
๊ฐ๊ฒ ๋ง์ถคํ ์ถ์ ๋ฅผ ์ถ์ฒํฉ๋๋ค.
|
| 143 |
+
```mermaid
|
| 144 |
+
graph TD
|
| 145 |
+
%% ========================
|
| 146 |
+
%% Orchestrator ์์ฒญ
|
| 147 |
+
%% ========================
|
| 148 |
+
subgraph SG_Orchestrator_Req ["๐ง Orchestrator ์์ฒญ"]
|
| 149 |
+
Agent["๐ค AgentExecutor"] -- "์ถ์ ์ถ์ฒ ์์ฒญ" --> Tool_Rec["๐งฉ Tool: recommend_festivals"]
|
| 150 |
+
end
|
| 151 |
+
|
| 152 |
+
%% ========================
|
| 153 |
+
%% ์ง์ ๋ฒ ์ด์ค (์์ )
|
| 154 |
+
%% ========================
|
| 155 |
+
subgraph SG_KnowledgeBase ["๐ ์ง์ ๋ฒ ์ด์ค (modules/knowledge_base.py)"]
|
| 156 |
+
direction LR
|
| 157 |
+
EM["๐งฌ Embedding Model\n(HuggingFace)"]
|
| 158 |
+
VSF["๐ FAISS (์ถ์ DB)"]
|
| 159 |
+
EM -- "์๋ฒ ๋ฉ ์์ฑ (Offline)" --> VSF
|
| 160 |
+
end
|
| 161 |
+
|
| 162 |
+
%% ========================
|
| 163 |
+
%% Filtering Pipeline
|
| 164 |
+
%% ========================
|
| 165 |
+
subgraph SG_Filtering_Pipeline ["๐ Filtering Pipeline (modules/filtering.py)"]
|
| 166 |
+
Tool_Rec --> Step1["1๏ธโฃ LLM ์ฟผ๋ฆฌ ์ฌ์์ฑ"]
|
| 167 |
+
Step1 --> Step2["2๏ธโฃ FAISS ๋ฒกํฐ ๊ฒ์\n(์ ์ฌ ์ถ์ ํ๋ณด ํ์)"]
|
| 168 |
+
|
| 169 |
+
%% RAG ํ๋ฆ ๋ช
ํํ (์์ )
|
| 170 |
+
Step2 -- "์ฟผ๋ฆฌ ์๋ฒ ๋ฉ" --> EM
|
| 171 |
+
Step2 -- "์ ์ฌ๋ ๊ฒ์" --> VSF
|
| 172 |
+
|
| 173 |
+
Step2 --> Step3["3๏ธโฃ LLM ๋์ ์์ฑ ํ๊ฐ\n(๊ฐ๊ฒ ๋ง์ถค์ฑ ํ๋จ)"]
|
| 174 |
+
Step3 --> LLM1["๐ค LLM (Dynamic Evaluation)"]
|
| 175 |
+
Step3 --> Step4["4๏ธโฃ ํ์ด๋ธ๋ฆฌ๋ ์ ์ ๊ณ์ฐ\n(์ ์ฌ๋ + ๋ง์ถค์ฑ)"]
|
| 176 |
+
Step4 --> Step5["5๏ธโฃ ์ต์ข
๊ฒฐ๊ณผ ํฌ๋งทํ
\n(Top3 + 2026 ์์ธก ํฌํจ)"]
|
| 177 |
+
end
|
| 178 |
+
|
| 179 |
+
%% ========================
|
| 180 |
+
%% ๊ฒฐ๊ณผ ๋ฐํ
|
| 181 |
+
%% ========================
|
| 182 |
+
subgraph SG_Result_Return ["๐ฆ ๊ฒฐ๊ณผ ๋ฐํ"]
|
| 183 |
+
Step5 -- "Top3 ์ถ์ ์ถ์ฒ ๊ฒฐ๊ณผ" --> Agent
|
| 184 |
+
end
|
| 185 |
+
|
| 186 |
+
%% ========================
|
| 187 |
+
%% ์คํ์ผ
|
| 188 |
+
%% ========================
|
| 189 |
+
style Agent fill:#E91E63,color:#fff
|
| 190 |
+
style Tool_Rec fill:#03A9F4,color:#fff
|
| 191 |
+
style Step1,Step2,Step3,Step4,Step5 fill:#81D4FA,color:#000
|
| 192 |
+
style VSF fill:#FFC107,color:#000
|
| 193 |
+
style EM fill:#4DD0E1,color:#000
|
| 194 |
+
style LLM1 fill:#BA68C8,color:#fff
|
| 195 |
+
style SG_KnowledgeBase fill:#F5F5F5,stroke:#9E9E9E
|
| 196 |
+
```
|
| 197 |
+
|
| 198 |
+
---
|
| 199 |
+
|
| 200 |
+
### (3) ๋ง์ผํ
์ ๋ต (RAG) ๋๊ตฌ ์์ธ โ `search_contextual_marketing_strategy`
|
| 201 |
+
|
| 202 |
+
**RAG** ๊ธฐ๋ฐ์ผ๋ก **๊ฐ๊ฒ ํ๋กํ + ์ง๋ฌธ ์ปจํ
์คํธ**๋ฅผ ์ด์ฉํด
|
| 203 |
+
๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ๋ง์ผํ
์ ๋ต ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ณ , LLM์ด ์์ฐ์ค๋ฝ๊ฒ ์์ฝ/์ ์ํฉ๋๋ค.
|
| 204 |
+
|
| 205 |
+
```mermaid
|
| 206 |
+
graph TD
|
| 207 |
+
%% ========================
|
| 208 |
+
%% Orchestrator ์์ฒญ
|
| 209 |
+
%% ========================
|
| 210 |
+
subgraph SG_Orchestrator_Req_RAG ["๐ง Orchestrator ์์ฒญ"]
|
| 211 |
+
Agent["๐ค AgentExecutor"] -- "๋ง์ผํ
์ ๋ต (RAG) ์์ฒญ" --> Tool_RAG["๐งฉ Tool: search_contextual_marketing_strategy"]
|
| 212 |
+
end
|
| 213 |
+
|
| 214 |
+
%% ========================
|
| 215 |
+
%% ์ง์ ๋ฒ ์ด์ค (์์ )
|
| 216 |
+
%% ========================
|
| 217 |
+
subgraph SG_KnowledgeBase_RAG ["๐ ์ง์ ๋ฒ ์ด์ค (modules/knowledge_base.py)"]
|
| 218 |
+
direction LR
|
| 219 |
+
EM["๐งฌ Embedding Model\n(HuggingFace)"]
|
| 220 |
+
VSM["๐ FAISS (๋ง์ผํ
DB)"]
|
| 221 |
+
EM -- "์๋ฒ ๋ฉ ์์ฑ (Offline)" --> VSM
|
| 222 |
+
end
|
| 223 |
+
|
| 224 |
+
%% ========================
|
| 225 |
+
%% RAG Logic
|
| 226 |
+
%% ========================
|
| 227 |
+
subgraph SG_RAG_Logic ["โ๏ธ RAG Logic (tools/marketing_strategy.py)"]
|
| 228 |
+
Tool_RAG --> Step1["1๏ธโฃ LLM ๊ฒ์ ์ฟผ๋ฆฌ ์์ฑ\n(๊ฐ๊ฒ ํ๋กํ + ์ง๋ฌธ ๊ธฐ๋ฐ)"]
|
| 229 |
+
Step1 --> Step2["2๏ธโฃ FAISS ๋ฒกํฐ ๊ฒ์\n(๋ง์ผํ
DB ํ์)"]
|
| 230 |
+
|
| 231 |
+
%% RAG ํ๋ฆ ๋ช
ํํ (์์ )
|
| 232 |
+
Step2 -- "์ฟผ๋ฆฌ ์๋ฒ ๋ฉ" --> EM
|
| 233 |
+
Step2 -- "์ ์ฌ๋ ๊ฒ์" --> VSM
|
| 234 |
+
|
| 235 |
+
Step2 --> Step3["3๏ธโฃ LLM ๋ต๋ณ ์์ฑ\n(๊ฒ์๋ ์ปจํ
์คํธ ๊ธฐ๋ฐ)"]
|
| 236 |
+
Step3 --> LLM2["๐ค LLM (Answer Synthesis)"]
|
| 237 |
+
end
|
| 238 |
+
|
| 239 |
+
%% ========================
|
| 240 |
+
%% ๊ฒฐ๊ณผ ๋ฐํ
|
| 241 |
+
%% ========================
|
| 242 |
+
subgraph SG_Result_Return_RAG ["๐ฆ ๊ฒฐ๊ณผ ๋ฐํ"]
|
| 243 |
+
Step3 -- "์์ฑ๋ ๋ง์ผํ
์ ๋ต ํ
์คํธ" --> Agent
|
| 244 |
+
end
|
| 245 |
+
|
| 246 |
+
%% ========================
|
| 247 |
+
%% ์คํ์ผ
|
| 248 |
+
%% ========================
|
| 249 |
+
style Agent fill:#E91E63,color:#fff
|
| 250 |
+
style Tool_RAG fill:#03A9F4,color:#fff
|
| 251 |
+
style Step1,Step2,Step3 fill:#81D4FA,color:#000
|
| 252 |
+
style VSM fill:#FFC107,color:#000
|
| 253 |
+
style EM fill:#4DD0E1,color:#000
|
| 254 |
+
style LLM2 fill:#BA68C8,color:#fff
|
| 255 |
+
style SG_KnowledgeBase_RAG fill:#F5F5F5,stroke:#9E9E9E
|
| 256 |
+
```
|
| 257 |
+
|
| 258 |
+
---
|
| 259 |
+
|
| 260 |
+
### (4) LLM ๊ธฐ๋ฐ ๋ถ์ ๋๊ตฌ ์์ธ โ `analyze_merchant_profile` / `analyze_festival_profile`
|
| 261 |
+
|
| 262 |
+
๊ฐ๊ฒ ๋๋ ์ถ์ ์ ํ๋กํ(JSON)์ ์
๋ ฅ๋ฐ์
|
| 263 |
+
LLM์ด **SWOT ๋ถ์ / ์ฃผ์ ํน์ง ์์ฝ**์ ์ํํฉ๋๋ค.
|
| 264 |
+
|
| 265 |
+
```mermaid
|
| 266 |
+
graph TD
|
| 267 |
+
%% ========================
|
| 268 |
+
%% Orchestrator ์์ฒญ
|
| 269 |
+
%% ========================
|
| 270 |
+
subgraph SG_Orchestrator_Req_Analyze ["๐ง Orchestrator ์์ฒญ"]
|
| 271 |
+
Agent["๐ค AgentExecutor"] -- "๊ฐ๊ฒ/์ถ์ ๋ถ์ ์์ฒญ" --> Tool_Analyze["๐งฉ Tool: analyze_merchant_profile / analyze_festival_profile"]
|
| 272 |
+
end
|
| 273 |
+
|
| 274 |
+
%% ========================
|
| 275 |
+
%% LLM ๋ถ์
|
| 276 |
+
%% ========================
|
| 277 |
+
subgraph SG_LLM_Analysis ["๐ LLM ๋ถ์ (tools/profile_analyzer.py)"]
|
| 278 |
+
Tool_Analyze -- "ํ๋กํ(JSON) ์ ๋ฌ" --> LLM_Analyze["๐ค LLM (SWOT / ์์ฝ ๋ถ์)"]
|
| 279 |
+
end
|
| 280 |
+
|
| 281 |
+
%% ========================
|
| 282 |
+
%% ๊ฒฐ๊ณผ ๋ฐํ
|
| 283 |
+
%% ========================
|
| 284 |
+
subgraph SG_Result_Return_Analyze ["๐ฆ ๊ฒฐ๊ณผ ๋ฐํ"]
|
| 285 |
+
LLM_Analyze -- "๋ถ์ ๋ณด๊ณ ์ ํ
์คํธ" --> Agent
|
| 286 |
+
end
|
| 287 |
+
|
| 288 |
+
%% ========================
|
| 289 |
+
%% ์คํ์ผ
|
| 290 |
+
%% ========================
|
| 291 |
+
style Agent fill:#E91E63,color:#fff
|
| 292 |
+
style Tool_Analyze fill:#03A9F4,color:#fff
|
| 293 |
+
style LLM_Analyze fill:#BA68C8,color:#fff
|
| 294 |
+
```
|
| 295 |
+
|
| 296 |
+
------------------------------------------------------------------------
|
| 297 |
+
|
| 298 |
+
## ๐ ๋ฐ์ดํฐ ํ๋ฆ ์์ธ
|
| 299 |
+
|
| 300 |
+
1. **์ด๊ธฐ ์ค์ (UI โ API โ UI)**
|
| 301 |
+
* `streamlit_app.py` ์คํ ์ `load_data()` ํจ์๊ฐ FastAPI ์๋ฒ(`api/server.py`)์ `/merchants` ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ์ ์ฒด ๊ฐ๋งน์ ๋ชฉ๋ก(ID, ์ด๋ฆ)์ ๋ฐ์์ต๋๋ค.
|
| 302 |
+
* ์ฌ์ฉ์๊ฐ Streamlit ๋๋กญ๋ค์ด ๋ฉ๋ด์์ ์์ ์ ๊ฐ๊ฒ๋ฅผ ์ ํํฉ๋๋ค.
|
| 303 |
+
* ์ ํ๋ ๊ฐ๊ฒ ID๋ก FastAPI ์๋ฒ์ `/profile` ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ํด๋น ๊ฐ๊ฒ์ ์์ธ ํ๋กํ(JSON)๊ณผ ์๊ถ/์
์ข
ํ๊ท ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค.
|
| 304 |
+
* ๋ฐ์์จ ํ๋กํ ๋ฐ์ดํฐ๋ `modules/visualization.py`๋ฅผ ํตํด ๊ทธ๋ํ์ ํ๋ก ์๊ฐํ๋์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๊ณ , `st.session_state.profile_data`์ ์ ์ฅ๋ฉ๋๋ค.
|
| 305 |
+
|
| 306 |
+
2. **์ปจ์คํ
์์ฒญ (UI โ Orchestrator)**
|
| 307 |
+
* ์ฌ์ฉ์๊ฐ Streamlit ์ฑํ
์
๋ ฅ์ฐฝ์ ์ง๋ฌธ์ ์
๋ ฅํฉ๋๋ค.
|
| 308 |
+
* `streamlit_app.py`๋ `orchestrator.invoke_agent()` ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
|
| 309 |
+
* ์ด๋ **์ฌ์ฉ์ ์ง๋ฌธ(Query)**, **์ฑํ
์ฉ์ผ๋ก ๊ฐ๊ณต๋ ๊ฐ๊ฒ ํ๋กํ(JSON ๋ฌธ์์ด)**, **์ด์ ๋ํ ๊ธฐ๋ก(History)**, **๋ง์ง๋ง ์ถ์ฒ ์ถ์ ๋ชฉ๋ก(์ ํ์ )**์ด `Orchestrator`๋ก ์ ๋ฌ๋ฉ๋๋ค.
|
| 310 |
+
|
| 311 |
+
3. **์๋ ๋ถ์ ๋ฐ ๋๊ตฌ ๋ผ์ฐํ
(Orchestrator โ LLM โ Tool)**
|
| 312 |
+
* `orchestrator.py`์ `AgentExecutor`๋ ์์คํ
ํ๋กฌํํธ์ ์ ๋ฌ๋ ์ปจํ
์คํธ(๊ฐ๊ฒ ํ๋กํ, ์ง๋ฌธ ๋ฑ)๋ฅผ ์กฐํฉํ์ฌ **์ฒซ ๋ฒ์งธ LLM(๋๊ตฌ ์ ํ์ฉ)**์ ํธ์ถํฉ๋๋ค.
|
| 313 |
+
* LLM์ ์ง๋ฌธ์ ์๋๋ฅผ ๋ถ์ํ๊ณ , ์์คํ
ํ๋กฌํํธ์ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ `tools/tool_loader.py`์ ์ ์๋ **๋๊ตฌ ๋ชฉ๋ก ์ค ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํ**ํ๊ณ ํ์ํ ์
๋ ฅ๊ฐ(Arguments)์ ๊ฒฐ์ ํฉ๋๋ค.
|
| 314 |
+
|
| 315 |
+
4. **๋๊ตฌ ์คํ (Tool โ Modules/API/VectorDB/LLM)**
|
| 316 |
+
* ์ ํ๋ ๋๊ตฌ ํจ์(`tools/*.py`)๊ฐ ์คํ๋ฉ๋๋ค.
|
| 317 |
+
* ๋๊ตฌ๋ ํ์์ ๋ฐ๋ผ `modules/*.py`์ ํต์ฌ ๋ก์ง(์: `FestivalRecommender`), ์ธ๋ถ API(๋ ์จ ๋ฑ), VectorDB(`modules/knowledge_base.py` ๊ฒฝ์ ), ๋๋ ๋ณ๋์ LLM(`modules/llm_provider.py` ๊ฒฝ์ )์ ํธ์ถํ์ฌ ์์
์ ์ํํฉ๋๋ค.
|
| 318 |
+
|
| 319 |
+
5. **๊ฒฐ๊ณผ ์ทจํฉ ๋ฐ ๋ฐ๋ณต (Tool โ Orchestrator โ LLM โ Tool ...)**
|
| 320 |
+
* ๋๊ตฌ ์คํ ๊ฒฐ๊ณผ(Observation)๋ ๋ค์ `AgentExecutor`๋ก ๋ฐํ๋ฉ๋๋ค.
|
| 321 |
+
* ์์ด์ ํธ๋ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก **๋ค์ ํ๋์ ๊ฒฐ์ **ํฉ๋๋ค. (์: ์ถ๊ฐ ์ ๋ณด๊ฐ ํ์ํ๋ฉด ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ชจ๋ ์ ๋ณด๊ฐ ๋ชจ์๋ค๊ณ ํ๋จ๋๋ฉด ์ต์ข
๋ต๋ณ ์์ฑ์ ์ค๋น)
|
| 322 |
+
* ์ด "LLM ํ๋จ โ ๋๊ตฌ ํธ์ถ โ ๊ฒฐ๊ณผ ํ์ธ" ๊ณผ์ ์ ์ฌ์ฉ์์ ์์ฒญ์ด ์์ ํ ํด๊ฒฐ๋ ๋๊น์ง **์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต**๋ ์ ์์ต๋๋ค (Agentic ํน์ฑ).
|
| 323 |
+
|
| 324 |
+
6. **์ต์ข
๋ต๋ณ ์์ฑ ๋ฐ ์ถ๋ ฅ (Orchestrator โ LLM โ UI)**
|
| 325 |
+
* `AgentExecutor`๊ฐ ์ต์ข
์ ์ผ๋ก ๋์ถํ ๊ฒฐ๊ณผ(`response['output']`) ๋๋ ํ์ ์ `orchestrator.py`๊ฐ ์ง์ **๋ ๋ฒ์งธ LLM(๋ต๋ณ ์์ฑ์ฉ)**์ ํธ์ถํ์ฌ, ๋ชจ๋ ์ค๊ฐ ๊ฒฐ๊ณผ์ ์ปจํ
์คํธ๋ฅผ ์ข
ํฉํ **์ต์ข
์ปจ์คํ
๋ณด๊ณ ์(์์ฐ์ด)**๋ฅผ ์์ฑํฉ๋๋ค.
|
| 326 |
+
* ์์ฑ๋ ๋ณด๊ณ ์๋ `streamlit_app.py`๋ก ๋ฐํ๋์ด ์ฌ์ฉ์ ํ๋ฉด์ ์ถ๋ ฅ๋ฉ๋๋ค.
|
| 327 |
+
|
| 328 |
+
---
|
| 329 |
+
|
| 330 |
+
## โ๏ธ ์ฃผ์ ํน์ง ์์ฝ
|
| 331 |
+
|
| 332 |
+
| ๊ธฐ๋ฅ | ์ค๋ช
|
|
| 333 |
+
| :--------------------- | :------------------------------------------------------------------------------------------- |
|
| 334 |
+
| **Agentic RAG** | LLM ์์ด์ ํธ๊ฐ ๊ฐ๊ฒ ํ๋กํ ์ปจํ
์คํธ๋ฅผ ๋ฐํ์ผ๋ก ์ค์ค๋ก ๋๊ตฌ๋ฅผ ์ ํํ๊ณ , ๋์ ์ผ๋ก RAG ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์คํ |
|
| 335 |
+
| **Tool Calling Agent** | LangChain์ `create_tool_calling_agent`๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์จ์ ์ผ๋ก ํธ์ถ ๋ฐ ์ฐ๊ณ |
|
| 336 |
+
| **ํ์ด๋ธ๋ฆฌ๋ ์ถ์ฒ** | FAISS ๋ฒกํฐ ๊ฒ์(์ ์ฌ๋) + LLM ๋์ ํ๊ฐ(๋ง์ถค์ฑ) ์ ์๋ฅผ ๊ฒฐํฉํ์ฌ ์ถ์ ์ถ์ฒ ์ ํ๋ ํฅ์ |
|
| 337 |
+
| **์ปจํ
์คํธ ๊ธฐ๋ฐ ๋ถ์** | ๋ชจ๋ ๋๊ตฌ ํธ์ถ ๋ฐ ์ต์ข
๋ต๋ณ ์์ฑ ์, ํ์ฌ ๋ถ์ ์ค์ธ ๊ฐ๊ฒ์ ํ๋กํ(JSON)์ ํต์ฌ ์ปจํ
์คํธ๋ก ํ์ฉ |
|
| 338 |
+
| **๋ชจ๋ํ๋ ๊ตฌ์กฐ** | ๊ธฐ๋ฅ๋ณ(UI, API, Orchestrator, Modules, Tools)๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ ๋ฐ ํ์ฅ์ฑ ์ฆ๋ |
|
| 339 |
+
| **๋ฐ์ดํฐ ์บ์ฑ** | Streamlit์ `@st.cache_data` / `@st.cache_resource`๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฐ ๋ชจ๋ธ ๋ก๋ฉ ์๋ ์ต์ ํ |
|
| 340 |
+
|
| 341 |
+
---
|
| 342 |
+
|
| 343 |
+
## ๐ก ๊ธฐ์ ์คํ
|
| 344 |
+
|
| 345 |
+
* **Frontend:** Streamlit
|
| 346 |
+
* **Backend (Data API):** FastAPI
|
| 347 |
+
* **LLM:** Google Gemini 2.5 Flash (`gemini-2.5-flash`)
|
| 348 |
+
* **AI Framework:** LangChain (Agents, Tool Calling, Prompts)
|
| 349 |
+
* **VectorStore:** FAISS (Facebook AI Similarity Search)
|
| 350 |
+
* **Embedding model:** HuggingFace `dragonkue/BGE-m3-ko` (ํ๊ตญ์ด ํนํ ๋ชจ๋ธ)
|
| 351 |
+
* **Data Handling:** Pandas, NumPy
|
| 352 |
+
* **Visualization:** Matplotlib
|
| 353 |
+
|
| 354 |
+
---
|
| 355 |
+
|
| 356 |
+
## ๐ ์คํ ๋ฐฉ๋ฒ
|
| 357 |
+
|
| 358 |
+
### 1๏ธโฃ ์ฌ์ ์ค๋น
|
| 359 |
+
|
| 360 |
+
* Python 3.11 ์ด์ ์ค์น
|
| 361 |
+
* `uv` (Python ํจํค์ง ์ค์น ๋๊ตฌ) ์ค์น (`pip install uv`)
|
| 362 |
+
* Google API Key ๋ฐ๊ธ (Gemini ๋ชจ๋ธ ์ฌ์ฉ)
|
| 363 |
+
|
| 364 |
+
### 2๏ธโฃ FastAPI ์๋ฒ ์คํ
|
| 365 |
+
|
| 366 |
+
FastAPI ์๋ฒ๋ ๊ฐ๋งน์ ๋ฐ์ดํฐ(`final_df.csv`)๋ฅผ ๋ก๋ํ๊ณ , `/profile` (๊ฐ๊ฒ ์์ธ ์ ๋ณด), `/merchants` (๊ฐ๊ฒ ๋ชฉ๋ก) ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
|
| 367 |
+
|
| 368 |
+
```bash
|
| 369 |
+
# 1. ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋
|
| 370 |
+
cd C:(๋ค์ด๋ฐ์ ํด๋ ์์น)
|
| 371 |
+
|
| 372 |
+
# 2. ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ (์ต์ด 1ํ)
|
| 373 |
+
uv venv
|
| 374 |
+
|
| 375 |
+
# 3. ๊ฐ์ํ๊ฒฝ ํ์ฑํ (Windows)
|
| 376 |
+
.\.venv\Scripts\activate.bat
|
| 377 |
+
# (macOS/Linux: source .venv/bin/activate)
|
| 378 |
+
|
| 379 |
+
# 4. ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
|
| 380 |
+
uv pip install -r requirements.txt
|
| 381 |
+
|
| 382 |
+
# 5. FastAPI ์๋ฒ ์คํ (api ํด๋์ server.py๋ฅผ ๋ชจ๋๋ก ์คํ)
|
| 383 |
+
python -m api.server
|
| 384 |
+
|
| 385 |
+
### 3๏ธโฃ Streamlit ์ฑ ์คํ
|
| 386 |
+
|
| 387 |
+
Streamlit ์ฑ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ , FastAPI ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, `Orchestrator`๋ฅผ ํตํด AI ์ปจ์คํ
์ ์ํํฉ๋๋ค.
|
| 388 |
+
|
| 389 |
+
```bash
|
| 390 |
+
# 1. (FastAPI ์๋ฒ์ ๋ค๋ฅธ ํฐ๋ฏธ๋์์) ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋
|
| 391 |
+
cd C:\(๋ค์ด๋ฐ์ ํด๋ ์์น)
|
| 392 |
+
|
| 393 |
+
# 2. ๊ฐ์ํ๊ฒฝ ํ์ฑํ (Windows)
|
| 394 |
+
.\.venv\Scripts\activate.bat
|
| 395 |
+
# (macOS/Linux: source .venv/bin/activate)
|
| 396 |
+
|
| 397 |
+
# 3. Streamlit secrets ํ์ผ ์์ฑ (์ต์ด 1ํ)
|
| 398 |
+
# - .streamlit ํด๋๋ฅผ ์์ฑํฉ๋๋ค.
|
| 399 |
+
mkdir .streamlit
|
| 400 |
+
# ์๋ ๋ช
๋ น์ด์ "(๋ฐ๊ธ๋ฐ์ gemini API key)" ๋ถ๋ถ์ ์ค์ ํค๋ก ๋์ฒดํ์ธ์.
|
| 401 |
+
echo GOOGLE_API_KEY="(๋ฐ๊ธ๋ฐ์ gemini API key)" > .streamlit\secrets.toml
|
| 402 |
+
|
| 403 |
+
# 4. Streamlit ์ฑ ์คํ
|
| 404 |
+
uv run streamlit run streamlit_app.py
|
| 405 |
+
```
|
| 406 |
+
์ด์ ์น ๋ธ๋ผ์ฐ์ ์์ Streamlit ์ฑ ์ฃผ์(๋ณดํต http://localhost:8501)๋ก ์ ์ํ์ฌ MarketSync๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
|
| 407 |
+
|
| 408 |
+
------------------------------------------------------------------------
|
| 409 |
+
|
| 410 |
+
## ๐ ์์ ์๋๋ฆฌ์ค
|
| 411 |
+
|
| 412 |
+
| ์ฌ์ฉ์ ์
๋ ฅ | ์ฃผ์ ์คํ ๋๊ตฌ | ์์ ๊ฒฐ๊ณผ |
|
| 413 |
+
| :---------------------------------- | :------------------------------------------------------ | :-------------------------------------- |
|
| 414 |
+
| "์ฐ๋ฆฌ ๊ฐ๊ฒ ๋ถ์ํด์ค" | `analyze_merchant_profile` | ๊ฐ๊ฒ SWOT ๋ถ์ ๋ฐ ํต์ฌ ๊ณ ๊ฐ ๋ฆฌํฌํธ |
|
| 415 |
+
| "์ฃผ๋ง ๋ฐฉ๋ฌธ๊ฐ ๋๋ฆด ๋งํ ์ถ์ ์ถ์ฒํด์ค" | `recommend_festivals` | Top 3 ๋ง์ถค ์ถ์ ์ถ์ฒ ๋ฆฌ์คํธ |
|
| 416 |
+
| "`์์ธ๋์ ํธํ์ด` ๋ง์ผํ
์ ๋ต ์๋ ค์ค" | `create_festival_specific_marketing_strategy` | ํด๋น ์ถ์ ๋ง์ถคํ ๋ง์ผํ
์ ๋ต ์ ์ |
|
| 417 |
+
| "์ถ์ฒ๋ ์ถ์ ๋ค ๋ง์ผํ
๋ฐฉ๋ฒ ์๋ ค์ค" | `create_marketing_strategies_for_multiple_festivals` | ์ฌ๋ฌ ์ถ์ ์ ๋ํ ํตํฉ ๋ง์ผํ
์ ๋ต ์ ์ |
|
| 418 |
+
| "์์ฆ ๋จ๋ ํ๋ณด ๋ฐฉ๋ฒ ์๋ ค์ค" | `search_contextual_marketing_strategy` (RAG) | ๊ฐ๊ฒ ํน์ฑ ๊ธฐ๋ฐ ์ต์ ๋ง์ผํ
ํธ๋ ๋/ํ |
|
| 419 |
+
|
| 420 |
+
---
|
| 421 |
+
|
| 422 |
+
## ๐ง ํต์ฌ ์์ด๋์ด
|
| 423 |
+
|
| 424 |
+
> "LLM์ด ์ค์ค๋ก ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ์คํํ๋ **Agentic RAG**"
|
| 425 |
+
|
| 426 |
+
* **LangChain์ Tool-Calling Agent ๊ตฌ์กฐ**: LLM์ด ์ฌ์ฉ์์ ๋ณต์กํ ์์ฒญ์ ์ดํดํ๊ณ , ํ์ํ ๊ธฐ๋ฅ(๋๊ตฌ)์ ์์จ์ ์ผ๋ก ํธ์ถํ๋ฉฐ ์์
์ ์ํํฉ๋๋ค.
|
| 427 |
+
* **์ปจํ
์คํธ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ **: ๊ฐ๊ฒ ํ๋กํ(JSON) ๋ฐ์ดํฐ๋ฅผ ํต์ฌ ์ปจํ
์คํธ๋ก ํ์ฉํ์ฌ, ๋ชจ๋ ๋ถ์๊ณผ ์ถ์ฒ์ด ํ์ฌ ๋ถ์ ์ค์ธ ๊ฐ๊ฒ์ ๋ง์ถฐ ์ด๋ฃจ์ด์ง๋๋ค.
|
| 428 |
+
* **ํ์ด๋ธ๋ฆฌ๋ ์ถ์ฒ ์์ง**: FAISS ๋ฒกํฐ ๊ฒ์(์ ์ฌ๋ ๊ธฐ๋ฐ)๊ณผ LLM ์ฌํ๊ฐ(๊ฐ๊ฒ ๋ง์ถค์ฑ ๊ธฐ๋ฐ)๋ฅผ ๊ฒฐํฉํ์ฌ ์ถ์ฒ์ ์ ํ์ฑ๊ณผ ๊ด๋ จ์ฑ์ ๊ทน๋ํํฉ๋๋ค.
|
| 429 |
+
"# MarketSync"
|