AWS Bedrock๊ณผ ๊ณ ๋ํ๋ Agent ์์คํ ์ ํ์ฉํ ์ง๋ฅํ ๊ฒฝ์ ๊ธฐ์ฌ ์๋ ์์ฑ ๋ฐ ์ค์๊ฐ ์๋ฆผ ์์คํ ์ ๋๋ค.
- ๊ธฐ์ ์ ๋ถ์: RSI, MACD, ๋ณผ๋ฆฐ์ ๋ฐด๋ ๋ฑ 13๊ฐ์ง ์งํ
- ๊ฐ์ ๋ถ์: ๋ด์ค ํผ๋ ๊ธฐ๋ฐ ์์ฅ ์ฌ๋ฆฌ ๋ถ์
- ์๊ด๊ด๊ณ ๋ถ์: ์์ฅ ๊ฐ ์๊ด๊ด๊ณ ์ดํ ๊ฐ์ง
- ์นํฐ ๋กํ ์ด์ : ์๊ธ ํ๋ฆ ํจํด ๋ถ์
- AWS Bedrock Claude: ๊ณ ํ์ง ๊ฒฝ์ ๊ธฐ์ฌ ์๋ ์์ฑ
- ๋ค์ค Agent ์์คํ : ์ ๋ฌธํ๋ Agent๋ค์ ํ์
- ์ฝํ ์ธ ์ต์ ํ: ๊ฐ๋ ์ฑ, SEO, ๋ ์ ์ฐธ์ฌ๋ ์ต์ ํ
- ์ฆ์ ์๋ฆผ: ๊ธด๊ธ ์์ฅ ์ด๋ฒคํธ ์ค์๊ฐ ์ ์ก
- ์์ฅ ์์ฝ: ์ ๊ธฐ์ ์ธ ์ข ํฉ ๋ถ์ ๋ฆฌํฌํธ
- ์ค๋งํธ ํํฐ๋ง: ์๋ฆผ ํผ๋ก๋ ์ต์ํ
- ๋ชจ๋ฐ์ผ ์ง์: Slack ์ฑ์ ํตํ ๋ชจ๋ฐ์ผ ์๋ฆผ
- ์ธํฐ๋ํฐ๋ธ ์ฐจํธ: ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ ์๊ฐํ
- AI ์์ฑ ๊ธฐ์ฌ: ์น ๊ธฐ๋ฐ ๊ธฐ์ฌ ๋ทฐ์ด
- ์๋ ์ด๋ฏธ์ง: ๊ธฐ์ฌ ์ผ๋ฌ์คํธ๋ ์ด์ ๋ฐ ์๋ํด๋ผ์ฐ๋
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Streamlit Dashboard โ
โ (์น ์ธํฐํ์ด์ค & ์๊ฐํ) โ
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Enhanced Monitor System โ
โ (๊ณ ๋ํ๋ ๋ชจ๋ํฐ๋ง ์์คํ
) โ
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโผโโโโโโโ โโโโโโผโโโโโโ โโโโโโผโโโโโโโโโโโ
โ Technical โ โ Sentimentโ โ Correlation โ
โ Analysis โ โ Analysis โ โ Analysis โ
โ Agent โ โ Agent โ โ Agent โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โ Slack Notifier โ
โ (์ค์๊ฐ ์๋ฆผ ์ ์ก) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Python 3.8+
- AWS ๊ณ์ ๋ฐ Bedrock ์ก์ธ์ค ๊ถํ
- Slack ์ํฌ์คํ์ด์ค (์๋ฆผ์ฉ)
- ์ธํฐ๋ท ์ฐ๊ฒฐ (๋ฐ์ดํฐ ์์ง์ฉ)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "*"
}
]
}
git clone https://github.com/jihwanwoo/Economic-News-System.git
cd Economic-News-System
pip install -r requirements.txt
# AWS CLI ์ค์
aws configure
# ๋๋ ํ๊ฒฝ ๋ณ์ ์ค์
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_DEFAULT_REGION=us-east-1
# Slack ์นํ
URL ์ค์
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
# ๋๋ ์ค์ ํ์ผ ์์ฑ
cp config/slack_config_template.json config/slack_config.json
# config/slack_config.json ํธ์ง
# ์ ์ฒด ์์คํ
ํ
์คํธ
python test_system.py
# Slack ์๋ฆผ ํ
์คํธ
python demo_slack_alerts.py
python demo_slack_alerts.py
# ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
./start_background_monitoring.sh
# ์ํ ํ์ธ
./check_monitoring_status.sh
# ์ค์ง
./stop_monitoring.sh
# ๋์๋ณด๋ ์คํ
python demo_streamlit.py
# ๋๋ ์ง์ ์คํ
python run_streamlit.py
# ์ ์ฒด ํ์ดํ๋ผ์ธ ์คํ
python main.py --mode full
# ํน์ ์ ํ์ ๊ธฐ์ฌ ์์ฑ
python main.py --mode full --market-summary --stock-focus
# ๊ณ ๋ํ๋ ์ด๋ฒคํธ ๊ฐ์ง๋ง ์คํ
python data_monitoring/integrated_event_system.py
- ๐ ์ฃผ์ ๊ธ๋ฑ/๊ธ๋ฝ (5% ์ด์)
- โก ๋์ ๋ณ๋์ฑ (15% ์ด์)
- ๐ ๊ฑฐ๋๋ ๊ธ์ฆ (ํ๊ท ๋๋น 3๋ฐฐ)
- ๐ ๊ธฐ์ ์ ๋ํ (๋ณผ๋ฆฐ์ ๋ฐด๋, RSI)
- ๐ญ ์์ฅ ๊ฐ์ ๊ธ๋ณ
- ๐ ๋ชจ๋ฉํ ๋ค์ด๋ฒ์ ์ค
- ์ ์ฒด ์ํ๋ ํ๊ฐ
- ๊ฐ์ง๋ ์ด๋ฒคํธ ์์ฝ
- ์ฃผ์ ์ธ์ฌ์ดํธ
- ํฌ์ ์์ฌ์
- AI ์์ฑ ๊ธฐ์ฌ ์๋ฃ ์๋ฆผ
- ์ฃผ์ ํฌ์ธํธ ์์ฝ
{
"notification_settings": {
"send_summary": true,
"send_critical_alerts": true,
"summary_interval_minutes": 60,
"min_alert_severity": 0.6,
"max_alerts_per_hour": 15,
"cooldown_minutes": 15
}
}
monitoring_symbols = [
# ์ฃผ์ ์ง์
"^GSPC", "^IXIC", "^DJI", "^VIX",
# ์ฃผ์ ๊ฐ๋ณ ์ข
๋ชฉ
"AAPL", "GOOGL", "MSFT", "TSLA", "NVDA",
# ์นํฐ ETF
"XLK", "XLF", "XLE", "XLV"
]
์์ฑ๋ ์ฝํ
์ธ ๋ output/
๋๋ ํ ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค:
output/
โโโ pipeline_result_20240804_143022.json # ์ ์ฒด ์คํ ๊ฒฐ๊ณผ
โโโ article_20240804_143022_1.html # HTML ํ์ ๊ธฐ์ฌ
โโโ slack_demo_20240804_143022.json # Slack ์๋ฆผ ๊ฒฐ๊ณผ
โโโ advanced_events_20240804_143022.json # ๊ณ ๊ธ ์ด๋ฒคํธ ๊ฐ์ง ๊ฒฐ๊ณผ
# ์ค์๊ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
tail -f logs/background_monitoring.log
# ์ค๋ฅ ๋ก๊ทธ ๊ฒ์
grep "ERROR" logs/slack_monitoring.log
# ์๋ฆผ ํต๊ณ
grep "Slack ์๋ฆผ ์ ์ก ์ฑ๊ณต" logs/slack_monitoring.log | wc -l
# ์์คํ
์ํ ํ์ธ
./check_monitoring_status.sh
# ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
du -sh logs/ output/
AWS ์๊ฒฉ ์ฆ๋ช ์ค๋ฅ
aws configure list
aws sts get-caller-identity
Slack ์นํ ์ค๋ฅ
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"ํ
์คํธ ๋ฉ์์ง"}' \
$SLACK_WEBHOOK_URL
์๋ฆผ์ด ๋๋ฌด ๋ง์
# config/slack_config.json์์ ์กฐ์
"min_alert_severity": 0.8, # 0.6์์ 0.8๋ก ์ฆ๊ฐ
"max_alerts_per_hour": 8 # 15์์ 8๋ก ๊ฐ์
- ์บ์ฑ: ๋ฐ์ดํฐ ์์ง ๊ฒฐ๊ณผ ์บ์ฑ์ผ๋ก API ํธ์ถ ์ต์ํ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ์ฌ๋ฌ Agent ๋์ ์คํ
- ๋ฐฐ์น ์ฒ๋ฆฌ: ๋๋ ๊ธฐ์ฌ ์์ฑ ์ ๋ฐฐ์น ๋ชจ๋ ์ฌ์ฉ
- ์๋ฆผ ์ต์ ํ: ์ค๋งํธ ํํฐ๋ง์ผ๋ก ์ค์ํ ์๋ฆผ๋ง ์ ์ก
- AWS ์๊ฒฉ ์ฆ๋ช ์์ ํ ๊ด๋ฆฌ
- Slack ์นํ URL ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
- ๋ฏผ๊ฐํ ์ ๋ณด
.gitignore
์ ์ถ๊ฐ - ์์ฑ๋ ์ฝํ ์ธ ๊ฒํ ๋ฐ ์น์ธ ํ๋ก์ธ์ค
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ง๋ฌธ์ด ์์ผ์๋ฉด:
- GitHub Issues์ ๋ฌธ์ ๋ณด๊ณ
- ๋ก๊ทธ ํ์ผ ํ์ธ (
logs/
๋๋ ํ ๋ฆฌ) - ์ค์ ํ์ผ ๋ฐ ํ๊ฒฝ ๋ณ์ ์ฌํ์ธ
์ฃผ์์ฌํญ:
- ์ด ์์คํ ์ ํฌ์ ์กฐ์ธ์ ์ ๊ณตํ์ง ์์ต๋๋ค
- ์์ฑ๋ ์ฝํ ์ธ ๋ ์ ๋ณด ์ ๊ณต ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉํ์ธ์
- ์ค์ํ ํฌ์ ๊ฒฐ์ ์ ์ ๋ฌธ๊ฐ์ ์๋ดํ์ธ์
- AWS Bedrock Claude ๋ชจ๋ธ
- Yahoo Finance API
- Slack API
- Streamlit ์ปค๋ฎค๋ํฐ
- ์๋ ๋ฐ์ดํฐ ์์ง: ์ฃผ์ ์์ฅ, ๊ฒฝ์ ์งํ, ๋ด์ค ํผ๋์์ ์ค์๊ฐ ๋ฐ์ดํฐ ์์ง
- ์ง๋ฅํ ๊ธฐ์ฌ ์์ฑ: AWS Bedrock Claude ๋ชจ๋ธ์ ํ์ฉํ ๊ณ ํ์ง ๊ฒฝ์ ๊ธฐ์ฌ ์์ฑ
- ์ฝํ ์ธ ์ต์ ํ: ๊ฐ๋ ์ฑ, SEO, ๋ ์ ์ฐธ์ฌ๋ ์ต์ ํ
- ๋ค์ค Agent ์์คํ : ์ ๋ฌธํ๋ Agent๋ค์ ํ์ ์ ํตํ ํจ์จ์ ์ํฌํ๋ก์ฐ
- ๐ Streamlit ๋์๋ณด๋: ์ธํฐ๋ํฐ๋ธ ์น ์ธํฐํ์ด์ค๋ก ๊ธฐ์ฌ์ ์ฐจํธ ์๊ฐํ
- ๐ผ๏ธ ์๋ ์ด๋ฏธ์ง ์์ฑ: ๊ธฐ์ฌ ๋ด์ฉ ๊ธฐ๋ฐ ์ผ๋ฌ์คํธ๋ ์ด์ ๋ฐ ์๋ํด๋ผ์ฐ๋
- ๐ข ๋ง์ถคํ ๊ด๊ณ : ๊ธฐ์ฌ ๋ด์ฉ ๋ถ์ ๊ธฐ๋ฐ ๊ด๋ จ ๊ด๊ณ ์ถ์ฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Streamlit Dashboard โ
โ (์น ์ธํฐํ์ด์ค & ์๊ฐํ) โ
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Orchestrator Agent โ
โ (์ ์ฒด ์์คํ
์กฐ์จ) โ
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โ โ โ
โโโโโโโโโผโโโโโโโ โโโโโโผโโโโโโ โโโโโโผโโโโโโโโโโโ
โ Data โ โ News โ โ Content โ
โ Collector โ โ Writer โ โ Optimizer โ
โ Agent โ โ Agent โ โ Agent โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ
- Data Collector Agent: ๊ฒฝ์ ๋ฐ์ดํฐ ์์ง ๋ฐ ๋ถ์
- News Writer Agent: ๊ฒฝ์ ๊ธฐ์ฌ ์์ฑ
- Content Optimizer Agent: ์ฝํ ์ธ ํ์ง ์ต์ ํ
- Orchestrator Agent: ์ ์ฒด ์ํฌํ๋ก์ฐ ๊ด๋ฆฌ
- Streamlit Dashboard: ์น ๊ธฐ๋ฐ ์๊ฐํ ๋ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค
- Python 3.8+
- AWS ๊ณ์ ๋ฐ Bedrock ์ก์ธ์ค ๊ถํ
- ์ธํฐ๋ท ์ฐ๊ฒฐ (๋ฐ์ดํฐ ์์ง์ฉ)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "*"
}
]
}
pip install -r requirements.txt
# AWS CLI ์ค์
aws configure
# ๋๋ ํ๊ฒฝ ๋ณ์ ์ค์
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_DEFAULT_REGION=us-east-1
# ๊ธฐ๋ณธ ์ค์ ํ์ผ ํ์ธ
cat config/default.json
# ํ์์ ์ค์ ์์
cp config/default.json config/custom.json
# config/custom.json ํธ์ง
# ์ ์ฒด ์์คํ
ํ
์คํธ
python test_system.py
# ๊ฐ๋ณ ์ปดํฌ๋ํธ ํ
์คํธ
python test_system.py aws # AWS ์ฐ๊ฒฐ ํ
์คํธ
python test_system.py data # ๋ฐ์ดํฐ ์์ง ํ
์คํธ
python test_system.py writer # ๊ธฐ์ฌ ์์ฑ ํ
์คํธ
# ๋์๋ณด๋ ๋ฐ๋ชจ ์คํ
python demo_streamlit.py
# ๋๋ ์ง์ ์คํ
python run_streamlit.py
๋์๋ณด๋ ๊ธฐ๋ฅ:
- ๐๏ธ ์ฌ์ด๋๋ฐ ์ ์ดํ: ์ ๊ธฐ์ฌ ์์ฑ, ๊ธฐ์ฌ ์ ํ, ํ์ ์ต์ ์ค์
- ๐ ์ค์๊ฐ ๋ฉํธ๋ฆญ: S&P 500, ๋์ค๋ฅ, VIX, ๋ฌ๋ฌ ์ธ๋ฑ์ค ํํฉ
- ๐ ์ธํฐ๋ํฐ๋ธ ์ฐจํธ: ์ฃผ์ ํํฉ, ๋ณํ์จ, ์นํฐ ์ฑ๊ณผ, VIX ๊ฒ์ด์ง
- ๐ฐ AI ์์ฑ ๊ธฐ์ฌ: ํค๋๋ผ์ธ, ๋ณธ๋ฌธ, ๊ฒฐ๋ก , ํ์ง ์ ์
- ๐ผ๏ธ ์๋ ์ด๋ฏธ์ง: ๊ธฐ์ฌ ์ผ๋ฌ์คํธ๋ ์ด์ , ์๋ํด๋ผ์ฐ๋
- ๐ข ๋ง์ถค ๊ด๊ณ : ๊ธฐ์ฌ ๋ด์ฉ ๊ธฐ๋ฐ ๊ด๋ จ ์๋น์ค ์ถ์ฒ
# ์ ์ฒด ํ์ดํ๋ผ์ธ ์คํ (๋ฐ์ดํฐ ์์ง + ๊ธฐ์ฌ ์์ฑ + ์ต์ ํ)
python main.py --mode full
# ํน์ ์ ํ์ ๊ธฐ์ฌ ์์ฑ
python main.py --mode full --market-summary --stock-focus
# ๋ฐ์ดํฐ ์์ง๋ง ์คํ
python main.py --mode data
# ๊ธฐ์ฌ ์์ฑ๋ง ์คํ
python main.py --mode article --article-type market_summary --length medium
# ์ฌ์ฉ์ ์ ์ ์ค์ ํ์ผ ์ฌ์ฉ
python main.py --config config/custom.json --mode full
# ๋ก๊ทธ ๋ ๋ฒจ ์กฐ์
python main.py --log-level DEBUG --mode full
# ์ค์ผ์ค ๋ชจ๋ (์๋ํ)
python main.py --mode schedule
๋ชจ๋ | ์ค๋ช | ์์ |
---|---|---|
full |
์ ์ฒด ํ์ดํ๋ผ์ธ ์คํ | --mode full |
data |
๋ฐ์ดํฐ ์์ง๋ง | --mode data |
article |
๊ธฐ์ฌ ์์ฑ๋ง | --mode article |
schedule |
์๋ํ ์ค์ผ์ค ์คํ | --mode schedule |
status |
์์คํ ์ํ ํ์ธ | --mode status |
market_summary
: ์์ฅ ์ข ํฉ ๋ถ์stock_focus
: ๊ฐ๋ณ ์ข ๋ชฉ ๋ถ์economic_outlook
: ๊ฒฝ์ ์ ๋งsector_analysis
: ์นํฐ๋ณ ๋ถ์
์์ฑ๋ ์ฝํ
์ธ ๋ output/
๋๋ ํ ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค:
output/
โโโ pipeline_result_20240804_143022.json # ์ ์ฒด ์คํ ๊ฒฐ๊ณผ
โโโ article_20240804_143022_1.html # HTML ํ์ ๊ธฐ์ฌ
โโโ article_20240804_143022_2.html
โโโ collected_data_20240804_143022.json # ์์ง๋ ๋ฐ์ดํฐ
- JSON: ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ๋ฐ ๋ฉํ๋ฐ์ดํฐ
- HTML: ์น ๊ฒ์์ฉ ์์ฑ๋ ๊ธฐ์ฌ
- Streamlit: ์ธํฐ๋ํฐ๋ธ ์น ๋์๋ณด๋
- ๋ก๊ทธ: ์คํ ๊ณผ์ ๋ฐ ์ค๋ฅ ์ ๋ณด
- ์ ๊ธฐ์ฌ ์์ฑ: ์ค์๊ฐ ๋ฐ์ดํฐ ์์ง ๋ฐ AI ๊ธฐ์ฌ ์์ฑ
- ๊ธฐ์ฌ ๋ชฉ๋ก: ์์ฑ๋ ๊ธฐ์ฌ ์ ํ ๋ฐ ํ์
- ํ์ ์ต์ : ์ฐจํธ, ์ด๋ฏธ์ง, ๊ด๊ณ ํ์ ์ค์
- ์์คํ ์ ๋ณด: ๋ง์ง๋ง ์ ๋ฐ์ดํธ ์๊ฐ ๋ฐ ์ํ
- S&P 500: ํ์ฌ๊ฐ, ๋ณํ์จ, ์ค์๊ฐ ์ ๋ฐ์ดํธ
- ๋์ค๋ฅ: ๊ธฐ์ ์ฃผ ์ค์ฌ ์ง์ ํํฉ
- VIX: ๊ณตํฌ ์ง์ ๋ฐ ์์ฅ ๋ณ๋์ฑ
- ๋ฌ๋ฌ ์ธ๋ฑ์ค: ๋ฌ๋ฌ ๊ฐ์ธ/์ฝ์ธ ์งํ
- ์ฃผ์ ํํฉ: ์ฃผ์ ์ข ๋ชฉ ๊ฐ๊ฒฉ ๋ฐ ๊ฑฐ๋๋
- ๋ณํ์จ: ์ข ๋ชฉ๋ณ ๋ฑ๋ฝ๋ฅ ๋น๊ต
- ์นํฐ ์ฑ๊ณผ: ์ ์ข ๋ณ ํ๊ท ์์ต๋ฅ
- VIX ๊ฒ์ด์ง: ๊ณตํฌ/ํ์ ์ง์ ์๊ฐํ
- ์๊ฐ์ด์ก: ์ฃผ์ ์ข ๋ชฉ ๋น์ค ํ์ด ์ฐจํธ
- ๊ธฐ์ฌ ์ผ๋ฌ์คํธ๋ ์ด์ : ๋ด์ฉ ๊ธฐ๋ฐ ๋ง์ถค ์ด๋ฏธ์ง
- ์๋ํด๋ผ์ฐ๋: ํต์ฌ ํค์๋ ์๊ฐํ
- ์ฐจํธ ์ด๋ฏธ์ง: ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ทธ๋ํ
- ํฌ์ ํ๋ซํผ: ์ค๋งํธ ํฌ์, ๋ก๋ณด์ด๋๋ฐ์ด์
- ํธ๋ ์ด๋ฉ ๋๊ตฌ: ์ค์๊ฐ ๊ฑฐ๋, ํ๋ฆฌ๋ฏธ์ ์ฐจํธ
- ๊ต์ก ์๋น์ค: ํฌ์ ๊ต์ก, ๊ฒฝ์ ๋ด์ค ๊ตฌ๋
- ์ปจํ ์คํธ ๋งค์นญ: ๊ธฐ์ฌ ๋ด์ฉ ๋ฐ ํ๊ทธ ๊ธฐ๋ฐ ๊ด๊ณ ์ ํ
{
"aws_region": "us-east-1",
"model_id": "anthropic.claude-3-sonnet-20240229-v1:0",
"temperature": 0.7,
"max_tokens": 4000,
"data_collection": {
"stock_symbols": ["AAPL", "GOOGL", "MSFT"],
"update_interval_minutes": 30
},
"article_generation": {
"default_types": ["market_summary"],
"default_length": "medium"
},
"schedule": {
"enabled": false,
"data_collection_interval": 30,
"article_generation_interval": 60
}
}
agents/
๋๋ ํ ๋ฆฌ์ ์ Agent ํด๋์ค ์์ฑBaseAgent
๋ฅผ ์์๋ฐ์ ๊ตฌํOrchestratorAgent
์ ํตํฉ
from agents.base_agent import BaseAgent, AgentConfig
class CustomAgent(BaseAgent):
def get_system_prompt(self) -> str:
return "Your custom prompt"
def process(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
# Your custom logic
return result
# streamlit_app/custom_components.py
import streamlit as st
def create_custom_chart(data):
# ์๋ก์ด ์ฐจํธ ์ปดํฌ๋ํธ
pass
def add_custom_widget():
# ์๋ก์ด ์์ ฏ ์ถ๊ฐ
pass
DataCollectorAgent
์ collect_*
๋ฉ์๋๋ฅผ ํ์ฅํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ ์์ค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์คํ ๋ก๊ทธ:
logs/economic_news_YYYYMMDD.log
- ์ค๋ฅ ๋ก๊ทธ: ์ฝ์ ๋ฐ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋ก
# ์์คํ
์ํ ํ์ธ
python main.py --mode status
# Streamlit ๋์๋ณด๋์์ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
python demo_streamlit.py
# ๋ก๊ทธ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
tail -f logs/economic_news_$(date +%Y%m%d).log
-
AWS ์๊ฒฉ ์ฆ๋ช ์ค๋ฅ
aws configure list aws sts get-caller-identity
-
Bedrock ๋ชจ๋ธ ์ก์ธ์ค ์ค๋ฅ
- AWS ์ฝ์์์ Bedrock ๋ชจ๋ธ ์ก์ธ์ค ๊ถํ ํ์ธ
- ์ง์๋๋ ๋ฆฌ์ ์์ ์คํ ํ์ธ
-
Streamlit ์คํ ์ค๋ฅ
# ํฌํธ ์ถฉ๋ ํ์ธ lsof -i :8501 # ์์กด์ฑ ์ฌ์ค์น pip install -r requirements.txt
-
๋ฐ์ดํฐ ์์ง ์คํจ
- ์ธํฐ๋ท ์ฐ๊ฒฐ ํ์ธ
- API ์ ํ ๋ฐ Rate Limiting ํ์ธ
-
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
max_tokens
์ค์ ์กฐ์ - ๋์ ์ฒ๋ฆฌ ์ ์ ํ
# ๋๋ฒ๊ทธ ๋ชจ๋ ์คํ
python main.py --log-level DEBUG --mode data
# ๊ฐ๋ณ ์ปดํฌ๋ํธ ํ
์คํธ
python test_system.py [component_name]
# Streamlit ๋๋ฒ๊ทธ ๋ชจ๋
streamlit run streamlit_app/app.py --logger.level debug
- ์บ์ฑ: ๋ฐ์ดํฐ ์์ง ๊ฒฐ๊ณผ ์บ์ฑ์ผ๋ก API ํธ์ถ ์ต์ํ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ์ฌ๋ฌ Agent ๋์ ์คํ
- ๋ฐฐ์น ์ฒ๋ฆฌ: ๋๋ ๊ธฐ์ฌ ์์ฑ ์ ๋ฐฐ์น ๋ชจ๋ ์ฌ์ฉ
- Streamlit ์บ์ฑ:
@st.cache_data
๋ฐ์ฝ๋ ์ดํฐ ํ์ฉ
- AWS ์๊ฒฉ ์ฆ๋ช ์์ ํ ๊ด๋ฆฌ
- API ํค ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
- ์์ฑ๋ ์ฝํ ์ธ ๊ฒํ ๋ฐ ์น์ธ ํ๋ก์ธ์ค
- Streamlit ๋ณด์ ์ค์ (HTTPS, ์ธ์ฆ)
python demo_streamlit.py
# Streamlit Cloud
streamlit run streamlit_app/app.py
# Docker ์ปจํ
์ด๋
docker build -t economic-news-dashboard .
docker run -p 8501:8501 economic-news-dashboard
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Create a Pull Request
๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ง๋ฌธ์ด ์์ผ์๋ฉด ์ด์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ฃผ์: ์ด ์์คํ ์ ํฌ์ ์กฐ์ธ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์์ฑ๋ ์ฝํ ์ธ ๋ ์ ๋ณด ์ ๊ณต ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉํ์ธ์.