Spaces:
Sleeping
Sleeping
| title: MarketSync | |
| emoji: ๐ | |
| colorFrom: blue | |
| colorTo: green | |
| sdk: streamlit | |
| app_file: streamlit_app.py | |
| pinned: false | |
| # ๐ MarketSync (๋ง์ผ์ฑํฌ) | |
| ... (๊ธฐ์กด README ๋ด์ฉ์ ๊ทธ๋๋ก ๋ ) ... | |
| # ๐ MarketSync (๋ง์ผ์ฑํฌ) | |
| ### Agentic RAG ๊ธฐ๋ฐ ์์๊ณต์ธ ๋ง์ถคํ ์ง์ญ ์ถ์ ์ถ์ฒ & ๋ง์ผํ AI ์ปจ์คํดํธ | |
| ์ ํ์นด๋ ๋น ๋ฐ์ดํฐ์ ์ ๊ตญ ์ถ์ ์ ๋ณด๋ฅผ ํตํฉ ๋ถ์ํ์ฌ, **AI ์์ด์ ํธ**๊ฐ ๊ฐ๊ฒ๋ณ๋ก ์ฐธ์ฌํ ๋งํ ์ง์ญ ์ถ์ ๋ฅผ ์ถ์ฒํ๊ณ ์ต์ ์ ๋ง์ผํ ์ ๋ต ๋ณด๊ณ ์๋ฅผ ์๋ ์์ฑํฉ๋๋ค. ๐ค | |
| --- | |
| ## ๐งญ ํ๋ก์ ํธ ๊ฐ์ | |
| MarketSync๋ **Streamlit ์น ์ธํฐํ์ด์ค, FastAPI ๋ฐ์ดํฐ ์๋ฒ, LangChain ์์ด์ ํธ**๋ฅผ ๊ฒฐํฉํ์ฌ ์์๊ณต์ธ์ ์ํ AI ์ปจ์คํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๋ ์์ ์ ๊ฐ๊ฒ๋ฅผ ์ ํํ์ฌ ์์ธ ํ๋กํ๊ณผ ๋ถ์ ๊ทธ๋ํ๋ฅผ ํ์ธํ ๋ค, "10์์ ์ด๋ฆฌ๋ ์ถ์ ์ถ์ฒํด์ค", "์ถ์ฒ๋ ์ถ์ ๋ค์ ๋ง์ผํ ์ ๋ต ์๋ ค์ค" ์ ๊ฐ์ ์์ฐ์ด ์ง๋ฌธ์ ํตํด ๋ง์ถคํ ์ปจ์คํ ์ ๋ฐ์ ์ ์์ต๋๋ค. | |
| **ํต์ฌ ์ํคํ ์ฒ๋ Agentic RAG**์ ๋๋ค. AI ์์ด์ ํธ(`Orchestrator`)๋ ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ๊ฐ๊ฒ์ ์์ธ ํ๋กํ(JSON)์ ๋ฐํ์ผ๋ก ์ํฉ์ ๋ง๋ **๋๊ตฌ(Tool)**๋ฅผ ์์จ์ ์ผ๋ก ์ ํํ๊ณ , ์ฌ์ฉ์์ ์ง๋ฌธ์ ๋ฐ๋ผ ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ฌ ์ต์ข ์ปจ์คํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค. | |
| --- | |
| ## ๐ ๏ธ ํต์ฌ ๋๊ตฌ ๋ฐ ์๋ ๋ฐฉ์ | |
| AI ์์ด์ ํธ๊ฐ ์ฌ์ฉํ๋ ์ฃผ์ ๋๊ตฌ์ ๋ด๋ถ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. | |
| | ๊ธฐ๋ฅ ๋ถ๋ฅ | ๋๊ตฌ ํจ์๋ช (`tools/`) | ์ฃผ์ ์ฒ๋ฆฌ ๊ณผ์ (`modules/`) | | |
| | :--------------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | |
| | **์ถ์ ์ถ์ฒ** | `recommend_festivals` (festival\_recommender.py) | **ํ์ด๋ธ๋ฆฌ๋ 5๋จ๊ณ ํ์ดํ๋ผ์ธ (`filtering.py`)**: <br> 1. LLM ์ฟผ๋ฆฌ ์ฌ์์ฑ <br> 2. FAISS ๋ฒกํฐ ๊ฒ์ (์ ์ฌ ์ถ์ ํ๋ณด ์ ์ ) <br> 3. LLM ๋์ ์์ฑ ํ๊ฐ (๊ฐ๊ฒ ๋ง์ถค์ฑ) <br> 4. ํ์ด๋ธ๋ฆฌ๋ ์ ์ ๊ณ์ฐ <br> 5. ์ต์ข Top3 ๊ฒฐ๊ณผ ํฌ๋งทํ (2026 ์์ธก ํฌํจ) | | |
| | **๋ง์ผํ (RAG)** | `search_contextual_marketing_strategy` (marketing\_strategy.py) | **์ปจํ ์คํธ ๊ธฐ๋ฐ RAG (`knowledge_base.py`)**: <br> 1. ๊ฐ๊ฒ ํ๋กํ + ์ง๋ฌธ โ LLM ๊ฒ์ ์ฟผ๋ฆฌ ์์ฑ <br> 2. FAISS ๋ฒกํฐ ๊ฒ์ (๊ด๋ จ ์ ๋ต ๋ฌธ์ ์ถ์ถ) <br> 3. LLM ๋ต๋ณ ์์ฑ (์ถ์ถ๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฐ์ค๋ฌ์ด ์ ๋ต ์ ์) | | |
| | **๋ง์ผํ (์์ฑ)** | `create_festival_specific_marketing_strategy` (marketing\_strategy.py) | **LLM ๊ธฐ๋ฐ ์ ๋ต ์์ฑ**: <br> 1. ์ถ์ ํ๋กํ ์กฐํ (`profile_analyzer.py`) <br> 2. ๊ฐ๊ฒ ํ๋กํ + ์ถ์ ํ๋กํ + RAG ๊ฒ์ โ LLM ํ๋กฌํํธ ๊ตฌ์ฑ <br> 3. LLM์ด ํน์ ์ถ์ ๋ง์ถค ์ ๋ต ์์ฑ | | |
| | **๋ง์ผํ (์์ฑ)** | `create_marketing_strategies_for_multiple_festivals` (marketing\_strategy.py) | **LLM ๊ธฐ๋ฐ ์ ๋ต ์์ฑ (๋ค์)**: <br> 1. ์ฌ๋ฌ ์ถ์ ์ด๋ฆ ์ ๋ ฅ๋ฐ์ <br> 2. ๊ฐ ์ถ์ ๋ณ๋ก `create_festival_specific_marketing_strategy` ๋ฐ๋ณต ํธ์ถ <br> 3. ๋ชจ๋ ์ ๋ต์ ํ๋์ ๋ณด๊ณ ์๋ก ์ทจํฉ | | |
| | **๊ฐ๊ฒ ๋ถ์** | `analyze_merchant_profile` (profile\_analyzer.py) | **LLM ๊ธฐ๋ฐ ๋ถ์**: <br> ๊ฐ๊ฒ ํ๋กํ(JSON) ์ ๋ ฅ โ LLM์ด SWOT ๋ถ์ ๋ฐ ํต์ฌ ๊ณ ๊ฐ ํน์ฑ ์์ฝ ๋ณด๊ณ ์ ์์ฑ | | |
| | **์ถ์ ๋ถ์** | `analyze_festival_profile` (profile\_analyzer.py) | **LLM ๊ธฐ๋ฐ ๋ถ์**: <br> ์ถ์ ํ๋กํ(JSON) ์ ๋ ฅ โ LLM์ด ์ถ์ ์ ํต์ฌ ํน์ง ๋ฐ ์ฃผ์ ๋ฐฉ๋ฌธ๊ฐ ํน์ฑ ์์ฝ ๋ณด๊ณ ์ ์์ฑ | | |
| | **์ถ์ ์กฐํ** | `get_festival_profile_by_name` (profile\_analyzer.py) | **๋จ์ ๋ฐ์ดํฐ ์กฐํ**: ์ถ์ ์ด๋ฆ ์ ๋ ฅ โ `festival_df.csv`์์ ํด๋น ์ถ์ ์ ๋ณด(JSON) ๋ฐํ (์บ์ฑ ํ์ฉ) | | |
| --- | |
| ## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฐ ์ฝ๋ ์ค๋ช | |
| ```plaintext | |
| MarketSync/ | |
| โโโ streamlit_app.py # Streamlit ์น ์ธํฐํ์ด์ค (UI) | |
| โโโ orchestrator.py # AI ์์ด์ ํธ: LangChain AgentExecutor, ๋๊ตฌ ๋ผ์ฐํ , ์ต์ข ๋ต๋ณ ์์ฑ ๋ก์ง | |
| โโโ config.py # ์ค์ ์ค์ํ: ๊ฒฝ๋ก, API ํค, ๋ชจ๋ธ๋ช , ๋ก๊น ์ค์ ๋ฑ | |
| โ | |
| โโโ api/ # ๋ฐ์ดํฐ ์ ๊ณต ๋ฐ ์ ์ฒ๋ฆฌ ์๋ฒ | |
| โ โโโ server.py # FastAPI ์๋ฒ: /profile, /merchants ์๋ํฌ์ธํธ ์ ๊ณต | |
| โ โโโ data_loader.py # ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ ์ฒ๋ฆฌ (final_df.csv, festival_df.csv) | |
| โ | |
| โโโ tools/ # LangChain @tool ๋๊ตฌ ์ ์ ๋ ์ด์ด | |
| โ โโโ festival_recommender.py # [Tool] recommend_festivals ๋๊ตฌ ์ ์ (filtering.py ํธ์ถ) | |
| โ โโโ marketing_strategy.py # [Tool] ๋ง์ผํ ์ ๋ต ๊ด๋ จ ๋๊ตฌ 3๊ฐ ์ ์ (knowledge_base.py, profile_analyzer.py ๋ฑ ํธ์ถ) | |
| โ โโโ profile_analyzer.py # [Tool] ๊ฐ๊ฒ/์ถ์ ๋ถ์ ๋ฐ ์ถ์ ํ๋กํ ์กฐํ ๋๊ตฌ 3๊ฐ ์ ์ (LLM ํธ์ถ, ๋ฐ์ดํฐ ์กฐํ) | |
| โ โโโ tool_loader.py # ๋ชจ๋ ๋๊ตฌ(@tool)๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฌถ์ด Orchestrator์ ์ ๊ณต | |
| โ | |
| โโโ modules/ # ํต์ฌ ๋ก์ง ๊ตฌํ ๋ชจ๋ | |
| โ โโโ filtering.py # [์ถ์ ์ถ์ฒ] FestivalRecommender ํด๋์ค (5๋จ๊ณ ํ์ดํ๋ผ์ธ ๊ตฌํ) | |
| โ โโโ knowledge_base.py # [RAG] FAISS ๋ฒกํฐ ์คํ ์ด ๋ก๋ฉ (์ถ์ , ๋ง์ผํ ), ์๋ฒ ๋ฉ ๋ชจ๋ธ ๊ด๋ฆฌ | |
| โ โโโ llm_provider.py # LLM ์ธ์คํด์ค ๊ด๋ฆฌ (์ ์ญ ๊ณต์ ๋ฐ Temperature ์กฐ์ ) | |
| โ โโโ profile_utils.py # ๊ฐ๊ฒ ํ๋กํ JSON ๊ฐ๊ณต ์ ํธ๋ฆฌํฐ (์ฑํ ์ฉ/๋ถ์์ฉ) | |
| โ โโโ visualization.py # Streamlit ์๊ฐํ: Matplotlib ๊ทธ๋ํ ์์ฑ ํจ์ | |
| โ | |
| โโโ utils/ # ๊ณตํต ์ ํธ๋ฆฌํฐ | |
| โ โโโ parser_utils.py # LLM ์๋ต์์ JSON ์ถ์ถ ํ์ | |
| โ | |
| โโโ data/ # ์๋ณธ ๋ฐ์ดํฐ | |
| โ โโโ final_df.csv # ์ ํ์นด๋ ๊ฐ๋งน์ ๋ฐ์ดํฐ | |
| โ โโโ festival_df.csv # ์ ๊ตญ ์ถ์ ์ ๋ณด ๋ฐ์ดํฐ | |
| โ | |
| โโโ vectorstore/ # FAISS ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ํด๋ | |
| โโโ faiss_festival # ์ถ์ ์ ๋ณด ๋ฒกํฐ DB | |
| โโโ faiss_marketing # ๋ง์ผํ ์ ๋ต ๋ฒกํฐ DB | |
| ``` | |
| ------------------------------------------------------------------------ | |
| ## ๐ ์ํคํ ์ฒ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ | |
| ์ด ์์คํ ์ **์์ด์ ํธ ์ค์ฌ์ ๋๊ตฌ ํธ์ถ (Tool-Calling)** ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค. ์ฌ์ฉ์์ ์์ฐ์ด ์ง๋ฌธ์ `Orchestrator`๋ผ๋ AI ์์ด์ ํธ์ ์ํด ํด์๋๋ฉฐ, ์์ด์ ํธ๋ ์ ๊ณต๋ `[๊ฐ๊ฒ ํ๋กํ]` ์ปจํ ์คํธ์ **์์คํ ํ๋กฌํํธ**์ ์ง์นจ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ์คํํฉ๋๋ค. ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ฌ ์ป์ ์ ๋ณด๋ฅผ ์ข ํฉํ ๋ค, ์ต์ข ์ปจ์คํ ๋ต๋ณ์ ์์ฑํฉ๋๋ค. | |
| ------------------------------------------------------------------------ | |
| ## ๐ ๋ฐ์ดํฐ ํ๋ฆ ์์ธ | |
| 1. **์ด๊ธฐ ์ค์ (UI โ API โ UI)** | |
| * `streamlit_app.py` ์คํ ์ `load_data()` ํจ์๊ฐ FastAPI ์๋ฒ(`api/server.py`)์ `/merchants` ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ์ ์ฒด ๊ฐ๋งน์ ๋ชฉ๋ก(ID, ์ด๋ฆ)์ ๋ฐ์์ต๋๋ค. | |
| * ์ฌ์ฉ์๊ฐ Streamlit ๋๋กญ๋ค์ด ๋ฉ๋ด์์ ์์ ์ ๊ฐ๊ฒ๋ฅผ ์ ํํฉ๋๋ค. | |
| * ์ ํ๋ ๊ฐ๊ฒ ID๋ก FastAPI ์๋ฒ์ `/profile` ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ํด๋น ๊ฐ๊ฒ์ ์์ธ ํ๋กํ(JSON)๊ณผ ์๊ถ/์ ์ข ํ๊ท ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค. | |
| * ๋ฐ์์จ ํ๋กํ ๋ฐ์ดํฐ๋ `modules/visualization.py`๋ฅผ ํตํด ๊ทธ๋ํ์ ํ๋ก ์๊ฐํ๋์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๊ณ , `st.session_state.profile_data`์ ์ ์ฅ๋ฉ๋๋ค. | |
| 2. **์ปจ์คํ ์์ฒญ (UI โ Orchestrator)** | |
| * ์ฌ์ฉ์๊ฐ Streamlit ์ฑํ ์ ๋ ฅ์ฐฝ์ ์ง๋ฌธ์ ์ ๋ ฅํฉ๋๋ค. | |
| * `streamlit_app.py`๋ `orchestrator.invoke_agent()` ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. | |
| * ์ด๋ **์ฌ์ฉ์ ์ง๋ฌธ(Query)**, **์ฑํ ์ฉ์ผ๋ก ๊ฐ๊ณต๋ ๊ฐ๊ฒ ํ๋กํ(JSON ๋ฌธ์์ด)**, **์ด์ ๋ํ ๊ธฐ๋ก(History)**, **๋ง์ง๋ง ์ถ์ฒ ์ถ์ ๋ชฉ๋ก(์ ํ์ )**์ด `Orchestrator`๋ก ์ ๋ฌ๋ฉ๋๋ค. | |
| 3. **์๋ ๋ถ์ ๋ฐ ๋๊ตฌ ๋ผ์ฐํ (Orchestrator โ LLM โ Tool)** | |
| * `orchestrator.py`์ `AgentExecutor`๋ ์์คํ ํ๋กฌํํธ์ ์ ๋ฌ๋ ์ปจํ ์คํธ(๊ฐ๊ฒ ํ๋กํ, ์ง๋ฌธ ๋ฑ)๋ฅผ ์กฐํฉํ์ฌ **์ฒซ ๋ฒ์งธ LLM(๋๊ตฌ ์ ํ์ฉ)**์ ํธ์ถํฉ๋๋ค. | |
| * LLM์ ์ง๋ฌธ์ ์๋๋ฅผ ๋ถ์ํ๊ณ , ์์คํ ํ๋กฌํํธ์ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ `tools/tool_loader.py`์ ์ ์๋ **๋๊ตฌ ๋ชฉ๋ก ์ค ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํ**ํ๊ณ ํ์ํ ์ ๋ ฅ๊ฐ(Arguments)์ ๊ฒฐ์ ํฉ๋๋ค. | |
| 4. **๋๊ตฌ ์คํ (Tool โ Modules/API/VectorDB/LLM)** | |
| * ์ ํ๋ ๋๊ตฌ ํจ์(`tools/*.py`)๊ฐ ์คํ๋ฉ๋๋ค. | |
| * ๋๊ตฌ๋ ํ์์ ๋ฐ๋ผ `modules/*.py`์ ํต์ฌ ๋ก์ง(์: `FestivalRecommender`), ์ธ๋ถ API(๋ ์จ ๋ฑ), VectorDB(`modules/knowledge_base.py` ๊ฒฝ์ ), ๋๋ ๋ณ๋์ LLM(`modules/llm_provider.py` ๊ฒฝ์ )์ ํธ์ถํ์ฌ ์์ ์ ์ํํฉ๋๋ค. | |
| 5. **๊ฒฐ๊ณผ ์ทจํฉ ๋ฐ ๋ฐ๋ณต (Tool โ Orchestrator โ LLM โ Tool ...)** | |
| * ๋๊ตฌ ์คํ ๊ฒฐ๊ณผ(Observation)๋ ๋ค์ `AgentExecutor`๋ก ๋ฐํ๋ฉ๋๋ค. | |
| * ์์ด์ ํธ๋ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก **๋ค์ ํ๋์ ๊ฒฐ์ **ํฉ๋๋ค. (์: ์ถ๊ฐ ์ ๋ณด๊ฐ ํ์ํ๋ฉด ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ชจ๋ ์ ๋ณด๊ฐ ๋ชจ์๋ค๊ณ ํ๋จ๋๋ฉด ์ต์ข ๋ต๋ณ ์์ฑ์ ์ค๋น) | |
| * ์ด "LLM ํ๋จ โ ๋๊ตฌ ํธ์ถ โ ๊ฒฐ๊ณผ ํ์ธ" ๊ณผ์ ์ ์ฌ์ฉ์์ ์์ฒญ์ด ์์ ํ ํด๊ฒฐ๋ ๋๊น์ง **์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต**๋ ์ ์์ต๋๋ค (Agentic ํน์ฑ). | |
| 6. **์ต์ข ๋ต๋ณ ์์ฑ ๋ฐ ์ถ๋ ฅ (Orchestrator โ LLM โ UI)** | |
| * `AgentExecutor`๊ฐ ์ต์ข ์ ์ผ๋ก ๋์ถํ ๊ฒฐ๊ณผ(`response['output']`) ๋๋ ํ์ ์ `orchestrator.py`๊ฐ ์ง์ **๋ ๋ฒ์งธ LLM(๋ต๋ณ ์์ฑ์ฉ)**์ ํธ์ถํ์ฌ, ๋ชจ๋ ์ค๊ฐ ๊ฒฐ๊ณผ์ ์ปจํ ์คํธ๋ฅผ ์ข ํฉํ **์ต์ข ์ปจ์คํ ๋ณด๊ณ ์(์์ฐ์ด)**๋ฅผ ์์ฑํฉ๋๋ค. | |
| * ์์ฑ๋ ๋ณด๊ณ ์๋ `streamlit_app.py`๋ก ๋ฐํ๋์ด ์ฌ์ฉ์ ํ๋ฉด์ ์ถ๋ ฅ๋ฉ๋๋ค. | |
| --- | |
| ## โ๏ธ ์ฃผ์ ํน์ง ์์ฝ | |
| | ๊ธฐ๋ฅ | ์ค๋ช | | |
| | :--------------------- | :------------------------------------------------------------------------------------------- | | |
| | **Agentic RAG** | LLM ์์ด์ ํธ๊ฐ ๊ฐ๊ฒ ํ๋กํ ์ปจํ ์คํธ๋ฅผ ๋ฐํ์ผ๋ก ์ค์ค๋ก ๋๊ตฌ๋ฅผ ์ ํํ๊ณ , ๋์ ์ผ๋ก RAG ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์คํ | | |
| | **Tool Calling Agent** | LangChain์ `create_tool_calling_agent`๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์์จ์ ์ผ๋ก ํธ์ถ ๋ฐ ์ฐ๊ณ | | |
| | **ํ์ด๋ธ๋ฆฌ๋ ์ถ์ฒ** | FAISS ๋ฒกํฐ ๊ฒ์(์ ์ฌ๋) + LLM ๋์ ํ๊ฐ(๋ง์ถค์ฑ) ์ ์๋ฅผ ๊ฒฐํฉํ์ฌ ์ถ์ ์ถ์ฒ ์ ํ๋ ํฅ์ | | |
| | **์ปจํ ์คํธ ๊ธฐ๋ฐ ๋ถ์** | ๋ชจ๋ ๋๊ตฌ ํธ์ถ ๋ฐ ์ต์ข ๋ต๋ณ ์์ฑ ์, ํ์ฌ ๋ถ์ ์ค์ธ ๊ฐ๊ฒ์ ํ๋กํ(JSON)์ ํต์ฌ ์ปจํ ์คํธ๋ก ํ์ฉ | | |
| | **๋ชจ๋ํ๋ ๊ตฌ์กฐ** | ๊ธฐ๋ฅ๋ณ(UI, API, Orchestrator, Modules, Tools)๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ ๋ฐ ํ์ฅ์ฑ ์ฆ๋ | | |
| | **๋ฐ์ดํฐ ์บ์ฑ** | Streamlit์ `@st.cache_data` / `@st.cache_resource`๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฐ ๋ชจ๋ธ ๋ก๋ฉ ์๋ ์ต์ ํ | | |
| --- | |
| ## ๐ก ๊ธฐ์ ์คํ | |
| * **Frontend:** Streamlit | |
| * **Backend (Data API):** FastAPI | |
| * **LLM:** Google Gemini 2.5 Flash (`gemini-2.5-flash`) | |
| * **AI Framework:** LangChain (Agents, Tool Calling, Prompts) | |
| * **VectorStore:** FAISS (Facebook AI Similarity Search) | |
| * **Embedding model:** HuggingFace `dragonkue/BGE-m3-ko` (ํ๊ตญ์ด ํนํ ๋ชจ๋ธ) | |
| * **Data Handling:** Pandas, NumPy | |
| * **Visualization:** Matplotlib | |
| --- | |
| ## ๐ ์คํ ๋ฐฉ๋ฒ | |
| ### 1๏ธโฃ ์ฌ์ ์ค๋น | |
| * Python 3.11 ์ด์ ์ค์น | |
| * `uv` (Python ํจํค์ง ์ค์น ๋๊ตฌ) ์ค์น (`pip install uv`) | |
| * Google API Key ๋ฐ๊ธ (Gemini ๋ชจ๋ธ ์ฌ์ฉ) | |
| ### 2๏ธโฃ FastAPI ์๋ฒ ์คํ | |
| FastAPI ์๋ฒ๋ ๊ฐ๋งน์ ๋ฐ์ดํฐ(`final_df.csv`)๋ฅผ ๋ก๋ํ๊ณ , `/profile` (๊ฐ๊ฒ ์์ธ ์ ๋ณด), `/merchants` (๊ฐ๊ฒ ๋ชฉ๋ก) ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. | |
| ```bash | |
| # 1. ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋ | |
| cd C:(๋ค์ด๋ฐ์ ํด๋ ์์น) | |
| # 2. ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ (์ต์ด 1ํ) | |
| uv venv | |
| # 3. ๊ฐ์ํ๊ฒฝ ํ์ฑํ (Windows) | |
| .\.venv\Scripts\activate.bat | |
| # (macOS/Linux: source .venv/bin/activate) | |
| # 4. ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น | |
| uv pip install -r requirements.txt | |
| # 5. FastAPI ์๋ฒ ์คํ (api ํด๋์ server.py๋ฅผ ๋ชจ๋๋ก ์คํ) | |
| python -m api.server | |
| ### 3๏ธโฃ Streamlit ์ฑ ์คํ | |
| Streamlit ์ฑ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ , FastAPI ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, `Orchestrator`๋ฅผ ํตํด AI ์ปจ์คํ ์ ์ํํฉ๋๋ค. | |
| ```bash | |
| # 1. (FastAPI ์๋ฒ์ ๋ค๋ฅธ ํฐ๋ฏธ๋์์) ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋ | |
| cd C:\(๋ค์ด๋ฐ์ ํด๋ ์์น) | |
| # 2. ๊ฐ์ํ๊ฒฝ ํ์ฑํ (Windows) | |
| .\.venv\Scripts\activate.bat | |
| # (macOS/Linux: source .venv/bin/activate) | |
| # 3. Streamlit secrets ํ์ผ ์์ฑ (์ต์ด 1ํ) | |
| # - .streamlit ํด๋๋ฅผ ์์ฑํฉ๋๋ค. | |
| mkdir .streamlit | |
| # ์๋ ๋ช ๋ น์ด์ "(๋ฐ๊ธ๋ฐ์ gemini API key)" ๋ถ๋ถ์ ์ค์ ํค๋ก ๋์ฒดํ์ธ์. | |
| echo GOOGLE_API_KEY="(๋ฐ๊ธ๋ฐ์ gemini API key)" > .streamlit\secrets.toml | |
| # 4. Streamlit ์ฑ ์คํ | |
| uv run streamlit run streamlit_app.py | |
| ``` | |
| ์ด์ ์น ๋ธ๋ผ์ฐ์ ์์ Streamlit ์ฑ ์ฃผ์(๋ณดํต http://localhost:8501)๋ก ์ ์ํ์ฌ MarketSync๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. | |
| ------------------------------------------------------------------------ | |
| ## ๐ ์์ ์๋๋ฆฌ์ค | |
| | ์ฌ์ฉ์ ์ ๋ ฅ | ์ฃผ์ ์คํ ๋๊ตฌ | ์์ ๊ฒฐ๊ณผ | | |
| | :---------------------------------- | :------------------------------------------------------ | :-------------------------------------- | | |
| | "์ฐ๋ฆฌ ๊ฐ๊ฒ ๋ถ์ํด์ค" | `analyze_merchant_profile` | ๊ฐ๊ฒ SWOT ๋ถ์ ๋ฐ ํต์ฌ ๊ณ ๊ฐ ๋ฆฌํฌํธ | | |
| | "์ฃผ๋ง ๋ฐฉ๋ฌธ๊ฐ ๋๋ฆด ๋งํ ์ถ์ ์ถ์ฒํด์ค" | `recommend_festivals` | Top 3 ๋ง์ถค ์ถ์ ์ถ์ฒ ๋ฆฌ์คํธ | | |
| | "`์์ธ๋์ ํธํ์ด` ๋ง์ผํ ์ ๋ต ์๋ ค์ค" | `create_festival_specific_marketing_strategy` | ํด๋น ์ถ์ ๋ง์ถคํ ๋ง์ผํ ์ ๋ต ์ ์ | | |
| | "์ถ์ฒ๋ ์ถ์ ๋ค ๋ง์ผํ ๋ฐฉ๋ฒ ์๋ ค์ค" | `create_marketing_strategies_for_multiple_festivals` | ์ฌ๋ฌ ์ถ์ ์ ๋ํ ํตํฉ ๋ง์ผํ ์ ๋ต ์ ์ | | |
| | "์์ฆ ๋จ๋ ํ๋ณด ๋ฐฉ๋ฒ ์๋ ค์ค" | `search_contextual_marketing_strategy` (RAG) | ๊ฐ๊ฒ ํน์ฑ ๊ธฐ๋ฐ ์ต์ ๋ง์ผํ ํธ๋ ๋/ํ | | |
| --- | |
| ## ๐ง ํต์ฌ ์์ด๋์ด | |
| > "LLM์ด ์ค์ค๋ก ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ์คํํ๋ **Agentic RAG**" | |
| * **LangChain์ Tool-Calling Agent ๊ตฌ์กฐ**: LLM์ด ์ฌ์ฉ์์ ๋ณต์กํ ์์ฒญ์ ์ดํดํ๊ณ , ํ์ํ ๊ธฐ๋ฅ(๋๊ตฌ)์ ์์จ์ ์ผ๋ก ํธ์ถํ๋ฉฐ ์์ ์ ์ํํฉ๋๋ค. | |
| * **์ปจํ ์คํธ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ **: ๊ฐ๊ฒ ํ๋กํ(JSON) ๋ฐ์ดํฐ๋ฅผ ํต์ฌ ์ปจํ ์คํธ๋ก ํ์ฉํ์ฌ, ๋ชจ๋ ๋ถ์๊ณผ ์ถ์ฒ์ด ํ์ฌ ๋ถ์ ์ค์ธ ๊ฐ๊ฒ์ ๋ง์ถฐ ์ด๋ฃจ์ด์ง๋๋ค. | |
| * **ํ์ด๋ธ๋ฆฌ๋ ์ถ์ฒ ์์ง**: FAISS ๋ฒกํฐ ๊ฒ์(์ ์ฌ๋ ๊ธฐ๋ฐ)๊ณผ LLM ์ฌํ๊ฐ(๊ฐ๊ฒ ๋ง์ถค์ฑ ๊ธฐ๋ฐ)๋ฅผ ๊ฒฐํฉํ์ฌ ์ถ์ฒ์ ์ ํ์ฑ๊ณผ ๊ด๋ จ์ฑ์ ๊ทน๋ํํฉ๋๋ค. | |
| "# MarketSync" | |