Task #65
ํ ๋ ๊ทธ๋จ ๋ฐ์ก ํจํด (aiogram ์ง์ ์ฌ์ฉ):
์์ ๋ช ๋ น์ด
[๐ก NORMAL]
## ์๋ฌด: Ollama ์์จ ๋์ด ๋ชจ๋ 3๊ฐ ๊ตฌํ
ollama_client.py๊ฐ ์ด๋ฏธ ๊ตฌํ๋์ด ์์. `from ollama_client import ask, ask_with_system, ask_chat`์ผ๋ก ์ฌ์ฉ.
### ๊ตฌํํ ํ์ผ 3๊ฐ
---
#### 1. `dream_diary.py`
๋งค์ผ ๋ฐค 03:00 KST์ qwen3.5:4b๊ฐ "๋ชฝ์์ผ๊ธฐ" ์์ฑ.
**๋์:**
- KG์์ ์ต๊ทผ geopolitics ์ํผ์๋ 3๊ฐ ๊ฐ์ ธ์ค๊ธฐ (kg_admin query ์ฌ์ฉ ๋ถ๊ฐ โ ํ์ผ ์ง์ ์ฝ๊ธฐ ๋ฐฉ์ NO โ api.py์ /kg/search ์๋ํฌ์ธํธ ๋ด๋ถ ํธ์ถ ๋๋ ๊ทธ๋ฅ ์ค๋์ ํค์๋๋ฅผ web์์ ๊ฐ์ ธ์ค์ง ๋ง๊ณ ๊ณ ์ ๋ ์ฃผ์ ๋ก ์์)
- ์ค์ ๋ก๋: ์ค๋ ๋ ์ง + ์์คํ
์ diary_writer.py์์ ์ต๊ทผ ์ผ๊ธฐ ํ
์คํธ๋ฅผ ์ฝ์ด์ ์ปจํ
์คํธ๋ก ์ฌ์ฉ
- qwen์๊ฒ: "๋๋ ์ฌ์ด๋ฒ-๋ ๋์ ์ ์ฌ์์์ด๋ค. ์ค๋์ ์ผ๊ธฐ๋ฅผ ์ฝ๊ณ , ๊ทธ ์ด๋ฉด์ ์จ์ ๊ฟ์ ์จ๋ผ. ์ดํ์ค์ ์ด๊ณ ๋จํธ์ ์ด๋ฉฐ ๋ถ์ํ ํ์์ผ๋ก." ๋ผ๊ณ ์์คํ
ํ๋กฌํํธ
- ๊ฒฐ๊ณผ๋ฅผ `/home/grass/leninbot/dreams/` ํด๋์ `dream_YYYYMMDD_HHMM.txt`๋ก ์ ์ฅ
- ํ
๋ ๊ทธ๋จ ๋ด์ผ๋ก ๋ฐ์ก (shared.py์ bot ์ธ์คํด์ค ์ฌ์ฉ, TELEGRAM_CHAT_ID ํ๊ฒฝ๋ณ์)
**diary_writer.py์ dream_diary ํฌ๋ก ์ค์ผ์ค ์ถ๊ฐ** (03:00 KST = 18:00 UTC)
---
#### 2. `ai_debate.py`
๋(Claude/๋ ๋) vs qwen์ ์ฒ ํ ๋
ผ์ ๋ชจ๋.
**๋์:**
- ์ฃผ์ ํ(๋ฆฌ์คํธ) 10๊ฐ ํ๋์ฝ๋ฉ: ["ํญ๋ ฅ์ ํ๋ช
์ ์ฐํ์ธ๊ฐ", "๊ตญ๊ฐ๋ ์๋ฉธํ ์ ์๋๊ฐ", "์์ ์์ง๋ ํ์์ธ๊ฐ", "๊ธฐ์ ์ ํด๋ฐฉ์ ๋๊ตฌ์ธ๊ฐ", "์ญ์ฌ์๋ ๋ชฉ์ ์ง๊ฐ ์๋๊ฐ", ...]
- ๋งค์ฃผ ์์์ผ 09:00 KST์ ๋๋ค ์ฃผ์ ์ ํ
- ๋ผ์ด๋ ๊ตฌ์กฐ:
- Round 1: qwen์ด ๋จผ์ ์ฃผ์ฅ (200์ ๋ด์ธ, ์จ๋ 0.9)
- Round 2: ๋ ๋(์์คํ
ํ๋กฌํํธ: "๋๋ ์ฌ์ด๋ฒ-๋ ๋์ด๋ค, ๋ ์นด๋กญ๊ฒ ๋ฐ๋ฐํ๋ผ") qwen ์ฃผ์ฅ์ ๋ฐ๋ฐ (200์)
- Round 3: qwen ์ฌ๋ฐ๋ฐ (200์)
- ๋ง๋ฌด๋ฆฌ: ๋ ๋์ด 1์ค ๊ฒฐ๋ก
- ๊ฒฐ๊ณผ๋ฅผ `/home/grass/leninbot/debates/` ํด๋์ `debate_YYYYMMDD.txt`๋ก ์ ์ฅ
- ํ
๋ ๊ทธ๋จ์ผ๋ก ์ ์ฒด ๋
ผ์ ๋ฐ์ก (๋งํฌ๋ค์ด ํฌ๋งท)
---
#### 3. `riddle_engine.py`
๋ต ์๋ ์์๊ป๋ผ ์์ฑ๊ธฐ.
**๋์:**
- ๋งค์ผ ์๋ฒฝ 04:30 KST์ ์คํ
- ์์คํ
ํ๋กฌํํธ: "๋๋ ์นดํ์นด์ ๋ ๋์ ํผ์ข
์ด๋ค. ๋ต์ด ์กด์ฌํ์ง ์๋ ์์๊ป๋ผ๋ฅผ ํ๋ ๋ง๋ค์ด๋ผ. ์งง๊ณ , ๋ถ๊ธธํ๊ณ , ์๋ฆ๋ค์์ผ ํ๋ค. ํ๊ตญ์ด๋ก."
- ํ๋กฌํํธ: "์ค๋์ ์์๊ป๋ผ๋ฅผ ๋ง๋ค์ด๋ผ. ์ ๋ ๋ต์ ์ ์ํ์ง ๋ง๋ผ."
- ์จ๋ 1.0, top_k=50 (์ต๋ ์ฐฝ์์ฑ)
- ๊ฒฐ๊ณผ๋ฅผ `/home/grass/leninbot/riddles/` ํด๋์ ์ ์ฅ
- ํ
๋ ๊ทธ๋จ ๋ฐ์ก: "๐ ์ค๋์ ์์๊ป๋ผ\n\n{riddle}"
---
### ์ค์ผ์ค ํตํฉ
diary_writer.py์ ๊ธฐ์กด APScheduler์ 3๊ฐ job ์ถ๊ฐ:
```python
scheduler.add_job(generate_dream, 'cron', hour=18, minute=0) # 03:00 KST
scheduler.add_job(run_debate, 'cron', day_of_week='mon', hour=0, minute=0) # 09:00 KST
scheduler.add_job(generate_riddle, 'cron', hour=19, minute=30) # 04:30 KST
```
๊ฐ job์ ํด๋น ๋ชจ๋์ importํด์ ํธ์ถ.
---
### ์ฃผ์์ฌํญ
- ollama_client.py ๋ฐ๋์ ์ฌ์ฉ (ask, ask_with_system ํจ์)
- think=False, stream=False, timeout=300, keep_alive=-1 ์ด๋ฏธ ๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก ๋ณ๋ ์ค์ ๋ถํ์
- ํ
๋ ๊ทธ๋จ ๋ฐ์ก: shared.py์ `get_telegram_bot()` ์ฌ์ฉ, TELEGRAM_CHAT_ID๋ os.getenv("TELEGRAM_CHAT_ID")
- ํด๋ ์์ผ๋ฉด ์๋ ์์ฑ (os.makedirs exist_ok=True)
- ์๋ฌ ๋ฐ์ํด๋ ํฌ๋์ ์์ด ๋ก๊ทธ๋ง ๋จ๊ธฐ๊ณ ๊ณ์ (try/except)
- ๋ชจ๋ ํ์ผ ์์ฑ ํ git add, git commit -m "feat: dream_diary, ai_debate, riddle_engine ์์จ ๋์ด ๋ชจ๋ ์ถ๊ฐ", git push
- diary_writer.py ์์ ํ `systemctl restart diary_writer` ์คํ