๋งค์ผ ์์์ง๋ ์๋ง์ ์ฃผ์ ๋ด์ค ์ค, ์ง์ง ์์ฅ์ ์ํฅ์ ๋ฏธ์น ํต์ฌ ์ ๋ณด๋ ๋ช ๊ฐ ๋์ง ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ธ๋ถ AI ์๋น์ค๋ฅผ ์ฐ๋ฉด ๋ฏผ๊ฐํ ํฌ์ ์ ๋ณด๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ ์ํ์ด ์์ต๋๋ค โ.
๋๋ ธ ๋ฐ๋๋ ํ๋ก์ ๋ก์ปฌ LLM์ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํฉ๋๋ค. ๋น ๋ฅธ ์๋๋ก ๋๋์ ๋ด์ค๋ฅผ ์ฝ๊ณ , ์ฌ์ ์ธ ๊ธ์ต ์ ๋ณด๋ฅผ ์ธ๋ถ์ ์ ์ถํ์ง ์์ผ๋ฉด์ ํต์ฌ ๋ด์ฉ๊ณผ ์์ฅ ๋ฐ์์ ๋ถ์ํ์ฌ ์ฆ์ ์๋ฆผ์ ๋ณด๋ ๋๋ค.
๐ ํต์ฌ ๊ธฐ๋ฅ: ํฌ๋กค๋ง๋ ๋ด์ค ํํฐ๋ง $\rightarrow$ ๋ก์ปฌ LLM์ด ์์ฅ ์ฌ๋ฆฌ/์ํฅ ๋ถ์ $\rightarrow$ ์ํ ๊ฐ์ง ์ ํ ๋ ๊ทธ๋จ ์๋ฆผ
์ฑ๊ณต์ ์ธ ์ฃผ์ ๊ฐ์ง ์์คํ ์ ์ํด, LLM ์ด์ ์ โ์์ฅ ๋ด์คโ๋ผ๋ ์์ฌ๋ฃ๋ฅผ ํ๋ณดํด์ผ ํฉ๋๋ค.
feedparser ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ฃผ์ ๊ฒฝ์ ๋ด์ค ์ฑ๋(์: ์ฐํฉ๋ด์ค, ํ๊ตญ๊ฒฝ์ )์ RSS ํผ๋๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฝ์ด์ต๋๋ค. (์น ํฌ๋กค๋ง๋ณด๋ค ์์ ์ )pip install feedparser python-telegram-bot requests์์ง๋ ๋ด์ค ํ ์คํธ๋ฅผ ๋ก์ปฌ LLM์๊ฒ ์ ๋ฌํ์ฌ โ์ด ๋ด์ค๊ฐ ์์ฅ์ ๊ธ์ ์ ์ธ๊ฐ? ๋ถ์ ์ ์ธ๊ฐ? ์ํฅ๋๋ ์ด๋ ์ ๋์ธ๊ฐ?โ๋ฅผ ๋ถ์ํ๊ฒ ๋ง๋ญ๋๋ค.
์ด์ ๊ฐ์ด๋์์ ์์ฑํ LLM ํธ์ถ ํจ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค. ๋ค๋ง, ํ๋กฌํํธ๋ฅผ ๋ถ์ ํนํํ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
LLM์๊ฒ ๋จ์ ์์ฝ ๋์ , ๊ตฌ์กฐํ๋ JSON ํํ์ ๋ต๋ณ์ ์์ฒญํ์ฌ ํ์ฑ(Parsing)์ด ์ฝ๋๋ก ๋ง๋ญ๋๋ค.
LLM์๊ฒ ์ฃผ๋ ๋ช ๋ น(Prompt)
โ์๋ ๋ด์ค ๊ธฐ์ฌ๋ฅผ ์ฝ๊ณ ๋ค์ ์ธ ๊ฐ์ง ํญ๋ชฉ์ ๋ถ์ํ์ฌ JSON ํ์์ผ๋ก๋ง ์ถ๋ ฅํด์ค.
'summary'(2์ค ์ด๋ด ์์ฝ)'sentiment'(๊ธ์ , ๋ถ์ , ์ค๋ฆฝ ์ค ํ 1)'impact_score'(0์ (๋ฌด๊ด)๋ถํฐ 10์ (๋งค์ฐ ํผ) ์ฌ์ด์ ์ํฅ ์ ์)โ
LLM์ด ๋ถ์ํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ณด๋ผ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
impact_score๊ฐ 7์ ์ด์์ด๊ฑฐ๋, sentiment๊ฐ โ๋ถ์ โ์ผ ๊ฒฝ์ฐ์๋ง ์๋ฆผ์ ๋ณด๋
๋๋ค.json.loads()๋ก ํ์ฑํฉ๋๋ค.if score >= 7 or sentiment == '๋ถ์ ': ์ด ์ฐธ์ผ ๊ฒฝ์ฐ์๋ง ํ
๋ ๊ทธ๋จ ๋ฐ์ก ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.Python
import telegram
# ... LLM ๋ถ์ ๋ก์ง ์คํ ํ ...
# NBP์ ๋ก์ปฌ AI ๋ถ์ ๊ฒฐ๊ณผ ๋ฉ์์ง ์์ฑ
message = (
f"๐จ [AI ๊ธด๊ธ ๊ฐ์ง ์๋ฆผ] ๐จ\n"
f"์์ฅ ์ฌ๋ฆฌ: {sentiment}\n"
f"์ํฅ ์ ์: {score}์ \n"
f"์์ฝ: {summary}"
)
# ํ
๋ ๊ทธ๋จ ๋ด์ผ๋ก ๋ฉ์์ง ๋ฐ์ก
bot = telegram.Bot(token='์ค๋น๋ ํ
๋ ๊ทธ๋จ API ํ ํฐ')
bot.send_message(chat_id='์ค๋น๋ ์ฑ ID', text=message)
์คํฌ๋ฆฝํธ๊ฐ ํ๊ตญ ์ฃผ์ ์์ฅ ์๊ฐ(KST)์ ๋ง์ถฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋๋ก Crontab์ ์ค์ ํฉ๋๋ค.
Bash
crontab -e
์์ฅ ๊ฐ์ฅ ์ (์ค์ 8์ 50๋ถ)๊ณผ ์ฅ ์ค ์ฃผ์ ์๊ฐ๋(์ค์ 10์, ์คํ 1์ 30๋ถ)์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋๋ก ์ค์ ํฉ๋๋ค.
Plaintext
# ๋ถ ์ ์ผ ์ ์์ผ ๋ช
๋ น์ด
50 8 * * 1-5 python3 /path/to/script/stock_alert.py # 8์ 50๋ถ (๊ฐ์ฅ ์ )
0 10 * * 1-5 python3 /path/to/script/stock_alert.py # 10์ 00๋ถ (์ฅ ์ค)
30 13 * * 1-5 python3 /path/to/script/stock_alert.py # 13์ 30๋ถ (์คํ์ฅ)
Deep Tip: ์ฃผ๋ง(ํ , ์ผ, ์์ผ 0, 6)์๋ ์คํ๋์ง ์๋๋ก
1-5๋ฅผ ๋ช ์ํ์ต๋๋ค. ๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ ๋ฐ๋์ SSH ํ๊ฒฝ์์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์๋ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
| ๋ฌธ์ ์ํฉ | ์์ธ | ๊ทน๋ณต ๋ฐฉ์ |
| ๋ด์ค ๋ถ์ ์๋ ์ง์ฐ | LLM ๋ชจ๋ธ์ด ๋๋ฌด ํฌ๊ฑฐ๋(์: Llama 8B ์ด์), NPU๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํจ. | Q4 ์์ํ ๋ชจ๋ธ(TinyLlama ๋ฑ)์ ๊ณ ์ ์ฌ์ฉํ๊ณ , NPU ์ฐ๊ฒฐ ์ต์ ์ ์ฌํ์ธํฉ๋๋ค. |
| ์ค๋ณด ์๋ฆผ ๋ฐ์ก | AI๊ฐ ๊ธ์ต ์ฉ์ด์ ๋์์ค๋ฅผ ์คํดํจ. | ํ๋กฌํํธ์ โํฌ์ ์๋ฌธ์ด ์๋์ ์ธ์งํ๊ณ , ๊ฐ๊ด์ ์ธ ์ฌ์ค๋ง ๋ถ์ํ ๊ฒโ ๋ฑ์ ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํฉ๋๋ค. |
| ๋น๋ฒํ ์๋ฆผ | impact_score ๊ธฐ์ค์ด ๋๋ฌด ๋ฎ์ (์: 5์ ). | ์ด๊ธฐ์๋ ๊ธฐ์ค ์ ์๋ฅผ 8์ ์ด์์ผ๋ก ๋๊ฒ ์ค์ ํ๊ณ , ์ ์ฐจ ์ ์๋ฅผ ๋ฎ์ถฐ๊ฐ๋ฉฐ ์ต์ ์ ๋ฏผ๊ฐ๋๋ฅผ ์ฐพ์ต๋๋ค. |
๐ ๊ฒฐ๋ก : ๋๋ ธ ๋ฐ๋๋ ํ๋ก์ ๋ก์ปฌ LLM์ ๊ฒฐํฉํ ์ด ์์คํ ์ ๊ฐ์ธ ํฌ์์์๊ฒ ๋ง์ถคํ, ๋น๊ณต๊ฐ, ์๋ํ๋ ์์ฅ ๊ฐ์ ๋ฅ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด์ ์ฌ๋ฌ๋ถ์ NBP๋ ๋จ์ํ ์๋ฒ๊ฐ ์๋, 24์๊ฐ ์์ฅ์ ๋ถ์ํ๋ ๋๋ง์ ๊ธ์ต ๋น์๊ฐ ๋ฉ๋๋ค.
๋ก์ปฌ ๋คํธ์ํฌ ํ๊ฒฝ์ ์กฐ๊ธ์ด๋ผ๋ ๋ค๋ค๋ณธ ์ฌ๋์ด๋ผ๋ฉด ํ ๋ฒ์ฏค์ ๋ง์ฃผ์น๋ ์ต์ํ ๋จ์ด๊ฐ ์์ต๋๋ค. ๋ฐ๋ก NetBIOS์ NBT์ ๋๋ค.…
์๋ ํ์ธ์! ํ๋ ์น ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ ๊ตํ์ ํต์ฌ์ธ JSON(JavaScript Object Notation)์ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์์ ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ,…
โ ECMAScript 3(E3)๋ ๋ฌด์์ผ๊น ECMAScript 3๋ 1999๋ ์ ๊ณต์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค์ด๋ค. ์ง๊ธ ๋ณด๋ฉด ์ค๋๋ ๊ธฐ์ ๊ฐ์ง๋ง,…
CoffeeScript๋ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ํ๊ณ์์ ๋งค์ฐ ์ธ๊ธฐ ์์๋ ์ธ์ด์๊ณ , ์ง๊ธ๋ ํน์ ํ๋ก์ ํธ๋ ๋ ๊ฑฐ์ ์์คํ , ๊ฐ๊ฒฐํ…
ํ๋์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๋ ์ฌ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์ ํ์ ์ถฉ๋์ ์ผ์ผํค๋ ์ฃผ์ ์์ธ ์ค…
(Critical Rendering Path, ํต์ฌ ๋ ๋๋ง ๊ฒฝ๋ก ์๋ฒฝ ์ดํด) ์น ๋ธ๋ผ์ฐ์ ์ ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ณ ์ํฐ๋ฅผ ๋๋ฅด๋ ์๊ฐ,…