์ด ํ๋ก์ ํธ๋ ์ดํ์บก์คํคํ๋ก์ ํธ '์ด์ง-์คํก'์ ์ธ์ฑ ์๋น์คํ ์ฑ๋ด ์๋ฒ๋ก,
Flask ๊ธฐ๋ฐ์ ๐ธ ์ฃผ์ ๋ด์ค ํฌ๋กค๋ง ๋ฐ AI ๊ธฐ๋ฐ ๊ธ์ต ์ฑ๋ด ๐ธ์
๋๋ค.
- Yahoo Finance API๋ก tickers๋ค์ 2๋ ๊ฐ ์ฃผ์ ์ ๋ณด ์ ๊ทผ
- OpenAI GPT-4 Turbo๋ฅผ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์ฌ์ฉ์์ ๊ธ์ต ์ง๋ฌธ์ ์น๊ทผํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ๋ต๋ณ ์ ๊ณต
- Selenium๊ณผ BeautifulSoup์ ์ด์ฉํ ๋ค์ด๋ฒ ๊ธ์ต ๋ด์ค ํฌ๋กค๋ง
- Langchain ์ํฌํ๋ก์ฐ๋ก ๊ธ์ต ๋ด์ค ์์ฝ ๊ธฐ๋ฅ ์ ๊ณต
- Pinecone์ ํ์ฉํ ๋ฒกํฐ DB ๊ตฌ์ถ
| ๊ตฌ๋ถ | ๊ธฐ์ ์คํ |
|---|---|
| Backend | Flask |
| AI Model | OpenAI GPT-4 Turbo |
| Database | Pinecone (Vector DB) |
| Web Scraping | Selenium + BeautifulSoup |
| Summarization | Langchain |
| Stock Data | Yahoo Finance API |
๐ TechPing-AI-Server/
โโโ app.py # Flask API ์๋ฒ
โโโ news_crawler.py # ๋ค์ด๋ฒ ๊ธ์ต ๋ด์ค ํฌ๋กค๋ฌ (Selenium + BeautifulSoup)
โโโ openai_service.py # OpenAI GPT-4 Turbo ์ฑ๋ด API
โโโ essential_package.txt # ํ๋ก์ ํธ ์์กด์ฑ ํจํค์ง ๋ชฉ๋ก
โโโ .env # ํ๊ฒฝ ๋ณ์ (API ํค ํฌํจ)
์์ฒญ ๋ฐฉ์: POST
{
"company_name": "์ผ์ฑ์ ์",
"stock_field": "์ข
๊ฐ",
"date": "2024-02-01"
}์๋ต ์์:
{
"message": "2024๋
2์ 1์ผ, ์ผ์ฑ์ ์์ ์ข
๊ฐ๋ 70,000์์
๋๋ค."
}์์ฒญ ๋ฐฉ์: POST
{
"prompt": "PBR์ด๋ ๋ฌด์์ธ๊ฐ์?"
}์๋ต ์์:
{
"response": "PBR์ Price-to-Book Ratio์ ์ฝ์๋ก, ์ฃผ๊ฐ๋ฅผ ์ฃผ๋น ์ฅ๋ถ๊ฐ์น๋ก ๋๋ ๊ฐ์
๋๋ค."
}์์ฒญ ๋ฐฉ์: GET
ticker๋ฅผ Query Parameter๋ก ์ ๋ฌํ๋ฉด ํด๋น ์ข ๋ชฉ ๋ด์ค๋ง ํฌ๋กค๋ง ๊ฐ๋ฅ
GET /crawl-news?ticker=์ผ์ฑ์ ์์๋ต ์์:
{
"message": "๋ด์ค ํฌ๋กค๋ง ์๋ฃ",
"news": [
{
"title": "์ผ์ฑ์ ์, ๋ฐ๋์ฒด ์์ฅ์์์ ๋์ ",
"link": "https://n.news.naver.com/mnews/article/015/0005088180",
"summary": "์ผ์ฑ์ ์๋ AI ๋ฐ๋์ฒด ๊ธฐ์ ๊ฒฝ์์์ ์๋ก์ด ๋์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.",
"date": "2024-02-01",
"ticker": "์ผ์ฑ์ ์"
}
]
}OPENAI_API_KEY=sk-xxxxx
PINECONE_API_KEY=xxxxxx
PINECONE_ENV=us-east-1
pip install -r essential_package.txtpython app.py์๋ฒ ์คํ ํ, ๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:5000/apidocs/์ ์ ์
- ์๋ณ ์ฌ์ฉ์ ๋ง์ด ํฌ์ ๋ฆฌํฌํธ ๋ถ์ ๊ธฐ๋ฅ ์ ๊ณต
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.