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` ์‹คํ–‰