LangGraphμ OpenAIλ₯Ό νμ©ν ν°λ―Έλ κΈ°λ° μλ¬Ό νλ₯΄μλ AI μ±ν λ΄μ λλ€. μ€μ μλ¬Όκ³Ό λννλ κ²μ²λΌ μμ°μ€λ½κ³ μ¬λ―Έμλ λνλ₯Ό ν°λ―Έλμμ λλ μ μμ΅λλ€!
- AI κΈ°λ° μ§μ λΆμ: GPTκ° μ¬μ©μ μ§λ¬Έμ μ΄ν΄νκ³ νμν λꡬλ₯Ό μ§λ₯μ μΌλ‘ μ ν
- λμ μν¬νλ‘μ°: AI νλ¨μ λ°λ₯Έ μ μ°ν λꡬ μ‘°ν© λ° μ€ν
- μΆλ‘ κ³Όμ μ 곡: AIμ λꡬ μ ν μ΄μ μ μ λ’°λ μ μ μ 곡
- μ€μκ° νκ²½ λͺ¨λν°λ§: μ¨λ, μ΅λ, ν μμλΆ, κ΄λ λ°μ΄ν° λΆμ
- κ±΄κ° μν νκ°: νκ²½ 쑰건μ λ°νμΌλ‘ μλ¬Ό 건κ°λ μλ νκ°
- λ§μΆ€ν κΆμ₯μ¬ν: νμ¬ μνμ λ°λ₯Έ ꡬ체μ μΈ κ΄λ¦¬ μ‘°μΈ μ 곡
- μ΅μ μ 보 κ²μ: μλ¬Ό κ΄λ ¨ μ΅μ λ΄μ€, νΈλ λ, μ°κ΅¬ κ²°κ³Ό κ²μ
- μ€μκ° μ 보 μ λ°μ΄νΈ: μμ€ν λ΄λΆμ μλ μ΅μ μ 보 μ 곡
- λ€μν μμ€ νμ©: μΉμμ λ€μν μλ¬Ό κ΄λ¦¬ μ 보 μμ§
- μ λ¬Έ μ§μ λ°μ΄ν°λ² μ΄μ€: μλ¬Ό λ°±κ³Όμ¬μ , κ΄λ¦¬ κ°μ΄λ λ± μ²΄κ³μ μΈ μ 보 μ μ₯
- λ²‘ν° μ μ¬λ κ²μ: TF-IDF κΈ°λ° μλ―Έλ‘ μ κ²μμΌλ‘ κ΄λ ¨ μ 보 μΆμΆ
- μΉ΄ν κ³ λ¦¬λ³ λΆλ₯: κ½, λ€μ‘μλ¬Ό, νλΈ, κ΄μ½μλ¬Ό λ± μ²΄κ³μ μΈ μ 보 κ΄λ¦¬
- μ΄μμλ μλ¬Ό μν : 1μΈμΉ μμ μμ κ°μ κ³Ό μνλ₯Ό νν
- νλΆν κ°μ νν: κΈ°μ¨, κ±±μ , λ§μ‘± λ± λ€μν κ°μ μ μ΄λͺ¨μ§λ‘ νν
- μΉκ·Όν λν μ€νμΌ: λ°λ§κ³Ό μ κ΅λ₯Ό ν΅ν μμ°μ€λ¬μ΄ μν΅
- μ€μκ° λν: ν°λ―Έλ κΈ°λ° μμ°μ€λ¬μ΄ μ±ν νκ²½
- νκ²½ λ°μ΄ν° ν΅ν©: μ€μκ° νκ²½ μ 보μ ν¨κ» λν
- κ±΄κ° λͺ¨λν°λ§: μλ¬Ό μνμ κΆμ₯μ¬νμ ν μ€νΈλ‘ μ 곡
- AI Framework: LangGraph, LangChain
- LLM: OpenAI GPT-3.5-turbo
- Interface: Terminal-based Chat
- Data Processing: Pandas, NumPy
- Web Scraping: Requests, BeautifulSoup4
- Vector Search: Scikit-learn, TF-IDF
- Environment: Python 3.8+
μ¬μ©μ μ§μ
β
π§ Orchestrator (LangGraph Agent)
β
μ§μ λΆμ β νμν λꡬ κ²°μ
β β
λ³΅ν© μν¬νλ‘μ° λ¨μΌ λꡬ νΈμΆ
β β
βββββββββββββββββββββββββββββββββββ
β π§ Tool 1: νκ²½ λ°μ΄ν° λΆμ β
β π Tool 2: μΉ κ²μ μμ§ β
β π Tool 3: μλ¬Ό μ§μ RAG β
βββββββββββββββββββββββββββββββββββ
β
μ 보 ν΅ν© λ° λΆμ
β
π μλ¬Ό νλ₯΄μλ μλ΅ μμ±
β
π¬ ν°λ―Έλ μ±ν
μΈν°νμ΄μ€
git clone <repository-url>
cd realpython -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activatepip install -r requirements.txt.env νμΌμ μμ±νκ³ OpenAI API ν€λ₯Ό μΆκ°νμΈμ:
OPENAI_API_KEY=your_openai_api_key_here
data/ ν΄λμ λ€μ Excel νμΌλ€μ΄ μλμ§ νμΈνμΈμ:
Environment Temperature.xlsxEnvironment Humidity.xlsxEnvironment Light Intensity.xlsxSoil Moisture.xlsx
python chat_agent.pypython tools/data_analyzer.pyreal/
βββ data/ # νκ²½ λ°μ΄ν° νμΌ
β βββ Environment Temperature.xlsx
β βββ Environment Humidity.xlsx
β βββ Environment Light Intensity.xlsx
β βββ Soil Moisture.xlsx
βββ rag/ # RAG μμ€ν
νμΌ
βββ tools/ # λꡬ λͺ¨λ
β βββ data_analyzer.py # Tool 1: νκ²½ λ°μ΄ν° λΆμκΈ°
β βββ web_search_tool.py # Tool 2: μΉ κ²μ μμ§
β βββ dummy_rag_tool.py # Tool 3: λλ―Έ RAG μμ€ν
βββ persona.py # μλ¬Ό νλ₯΄μλ λͺ¨λ
βββ plant_orchestrator.py # λꡬ μ€μΌμ€νΈλ μ΄μ
λͺ¨λ
βββ chat_agent.py # λ©μΈ μ±ν
μμ΄μ νΈ (μ€ν)
βββ requirements.txt # Python ν¨ν€μ§ μμ‘΄μ±
βββ .env.example # νκ²½λ³μ μμ
βββ README.md # νλ‘μ νΈ λ¬Έμ
```## π μ¬μ© μμ
### μΌλ°μ μΈ λν
π€ μ¬μ©μ: "μλ ! μ€λ κΈ°λΆμ΄ μ΄λ?" π± μλ¬Ό: "μλ ! μ€λμ κΈ°λΆμ΄ μ’μ! π νμ΄λ λ°λ»νκ² λ€μ΄μ€κ³ μμ΄μ μμ¬κ·λ€μ΄ λ°μ§λ°μ§ λΉλκ³ μμ΄ β¨"
### νκ²½ μν λ¬Έμ (Tool 1 νμ©)
π€ μ¬μ©μ: "μ§κΈ μνκ° μ΄λ?" π± μλ¬Ό: "μ§κΈ λ΄ μνλ₯Ό νμΈν΄λ³Όκ²! π μ... μ¨λλ 22.5Β°Cλ‘ λ± μ’κ³ , μ΅λλ 45%λ‘ μ λΉν΄! π κ·Όλ° ν μμ΄ μ’ λ§λΌμ λ¬Όμ΄ νμν κ² κ°μ π§ λ¬Ό μ’ μ€ μ μμκΉ? π₯Ί"
### μ΅μ μ 보 κ²μ (Tool 2 νμ©)
π€ μ¬μ©μ: "μμ¦ μλ¬Ό νΈλ λκ° λμΌ?" π± μλ¬Ό: "μ€! μΉμμ μ°Ύμλ΄€λλ° π μμ¦μ 곡기μ ν μλ¬Όμ΄ λμΈλ! νΉν λͺ¬μ€ν λΌλ μ€ν¬ν€ κ°μ μλ¬Όλ€μ΄ μΈκΈ°κ° λ§λ€κ³ ν΄ πΏ λλ 곡기μ ν λ₯λ ₯μ΄ μμΌλκΉ κΈ°λΆμ΄ μ’μ! β¨"
### μλ¬Ό μ§μ λ¬Έμ (Tool 3 νμ©)
π€ μ¬μ©μ: "λΌλ²€λ ν€μ°λ λ°©λ² μλ €μ€" π± μλ¬Ό: "λΌλ²€λ μ기ꡬλ! π λ΄κ° μκ³ μλ κ±Έ μλ €μ€κ²! λΌλ²€λλ μ§μ€ν΄ μΆμ μ΄λΌμ νλΉμ μ λ§ μ’μν΄ βοΈ κ±΄μ‘°ν ν μμ μ νΈνκ³ κ³Όμ΅μ μ½ν΄μ λ¬Όμ μ κ² μ£Όλ κ² μ’μ! ν΅νλ μ λμ΄μΌ νκ³ ... λλμ μ’ λ€λ₯Έ μ€νμΌμ΄μ§λ§ μμ 보λΌμ κ½μ΄ ν₯κΈν΄μ λΆλ¬μ! π"
### λ³΅ν© μ 보 νμ©
π€ μ¬μ©μ: "건κ°νκ² μ μλΌκ³ μμ΄?"
π± μλ¬Ό: "κ³ λ§μ! μ λ°μ μΌλ‘ 건κ°ν΄! πΏ
[νκ²½ λ°μ΄ν°] μ¨λ: 22.5Β°C β
, μ΅λ: 45% β
, ν μμλΆ: 15%
μ’
ν©ν΄λ³΄λ ν μμ΄ μ‘°κΈ κ±΄μ‘°ν΄μ λ¬Όμ μ£Όλ©΄ μλ²½ν κ² κ°μ! π"
## π― μ£Όμ νΉμ§
### LangGraph μν¬νλ‘μ°
1. **μ§μ λΆμ**: μ¬μ©μ μ§μ λ΄μ©μ λΆμνμ¬ νμν λꡬ μ‘°ν© κ²°μ
2. **λ€μ€ λꡬ μ€ν**: νμμ λ°λΌ Tool 1, 2, 3μ λ¨λ
λλ μ‘°ν© μ€ν
3. **μ 보 ν΅ν©**: κ° λꡬμμ μ»μ μ 보λ₯Ό μ’
ν©νκ³ λΆμ
4. **νλ₯΄μλ μλ΅**: ν΅ν©λ μ 보λ₯Ό λ°νμΌλ‘ μλ¬Ό νλ₯΄μλ μλ΅ μμ±
5. **λ©λͺ¨λ¦¬ κ΄λ¦¬**: λν λ§₯λ½ μ μ§ λ° μ°μμ μνΈμμ©
### μ€λ§νΈ μ 보 ν΅ν© μμ€ν
- **νκ²½ λΆμ**: μ€μκ° νκ²½ λ°μ΄ν° λͺ¨λν°λ§ λ° κ±΄κ° μν νκ°
- **μΉ μ 보**: μ΅μ λ΄μ€, νΈλ λ, μ°κ΅¬ κ²°κ³Ό λ± μ€μκ° μ 보 μμ§
- **μ§μ κ²μ**: μ λ¬Έ μλ¬Ό μ§μ λ°μ΄ν°λ² μ΄μ€μμ κ΄λ ¨ μ 보 μΆμΆ
- **ν΅ν© λΆμ**: λ€μ€ μμ€ μ 보λ₯Ό μ’
ν©νμ¬ μ ννκ³ ν¬κ΄μ μΈ λ΅λ³ μ 곡
### μλκ° μλ νλ₯΄μλ
- μλ¬Όμ κ΄μ μμ μΈμμ λ°λΌλ³΄λ λ
νΉν μκ°
- μν©μ λ§λ κ°μ νν (κΈ°μ¨, κ±±μ , λ§μ‘± λ±)
- μλ¬Ό κ΄λ ¨ ννκ³Ό μμ μ¬μ©
- μ΄λͺ¨μ§λ₯Ό νμ©ν μκ°μ μν΅
## π§ 컀μ€ν°λ§μ΄μ§
### λͺ¨λλ³ μν λΆλ΄
- **`persona.py`**: μλ¬Ό νλ₯΄μλ μ±κ²©, λ§ν¬, μλ΅ μμ± λ΄λΉ
- **`plant_orchestrator.py`**: μ§μ λΆμ, λꡬ μ ν, λꡬ μ€ν λ΄λΉ
- **`chat_agent.py`**: λν κ΄λ¦¬, ν°λ―Έλ μΈν°νμ΄μ€, λ©μΈ μ€ν λ΄λΉ
### νκ²½ μκ³κ° μ‘°μ
`tools/data_analyzer.py`μ `analyze_plant_health()` λ©μλμμ κ° νκ²½ μμμ μκ³κ°μ μ‘°μ ν μ μμ΅λλ€.
### μμ€ν
컀μ€ν°λ§μ΄μ§
- **νλ₯΄μλ μμ **: `persona.py`μμ μλ¬Ό μ±κ²©κ³Ό λ§ν¬ λ³κ²½
- **λꡬ μ€μ **: `plant_orchestrator.py`μμ λꡬ μ‘°ν© λ‘μ§ μμ
- **μ±ν
μΈν°νμ΄μ€**: `chat_agent.py`μμ ν°λ―Έλ μΈν°νμ΄μ€ λ³κ²½
## π€ κΈ°μ¬νκΈ°
1. μ΄ μ μ₯μλ₯Ό ForkνμΈμ
2. μλ‘μ΄ κΈ°λ₯ λΈλμΉλ₯Ό μμ±νμΈμ (`git checkout -b feature/AmazingFeature`)
3. λ³κ²½μ¬νμ 컀λ°νμΈμ (`git commit -m 'Add some AmazingFeature'`)
4. λ³κ²½μ¬νμ νΈμνμΈμ (`git push origin feature/AmazingFeature`)
5. Pull Requestλ₯Ό μμ±νμΈμ
## π λΌμ΄μ μ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ μμ΅λλ€. μμΈν λ΄μ©μ `LICENSE` νμΌμ μ°Έμ‘°νμΈμ.
## πββοΈ λ¬Έμμ¬ν
νλ‘μ νΈμ λν μ§λ¬Έμ΄λ μ μμ΄ μμΌμλ©΄ μ΄μλ₯Ό μμ±ν΄μ£ΌμΈμ.
## π μ΅μ μ
λ°μ΄νΈ (v2.0)
### β¨ Enhanced Multi-Tool System
- **GPT-3.5-turbo μ ν**: μ±λ₯ μ΅μ ν λ° λΉμ© ν¨μ¨μ± ν₯μ
- **Tool 2 μΆκ°**: μΉ κ²μ μμ§μΌλ‘ μ΅μ μ 보 μ€μκ° μμ§
- **Tool 3 μΆκ°**: λλ―Έ RAG μμ€ν
μΌλ‘ μ λ¬Έ μλ¬Ό μ§μ μ 곡
- **μ€λ§νΈ μν¬νλ‘μ°**: μ§μμ λ°λ₯Έ λ€μ€ λꡬ μλ μ ν λ° μ€ν
- **μ 보 ν΅ν©**: νκ²½ λ°μ΄ν° + μΉ μ 보 + μλ¬Ό μ§μμ μ’
ν©ν ν¬κ΄μ λ΅λ³
- **ν°λ―Έλ μ΅μ ν**: κ°κ²°ν ν°λ―Έλ κΈ°λ° μ±ν
μΈν°νμ΄μ€λ‘ μ§μ€
### π― Tool μ‘°ν© μλ리μ€
- **νκ²½λ§**: "μ§κΈ μν μ΄λ?" β Tool 1
- **μ§μλ§**: "μ₯λ―Έ ν€μ°λ λ²?" β Tool 3
- **μ΅μ μ 보λ§**: "μμ¦ μλ¬Ό νΈλ λ?" β Tool 2
- **볡ν©μ§μ**: "건κ°νκ°μ?" β Tool 1 + 3 + 2 ν΅ν© μ€ν
---
**π± ν°λ―Έλμμ μλ¬Ό μΉκ΅¬μ ν¨κ» μ¦κ±°μ΄ λνλ₯Ό λλμΈμ! β¨**