File size: 6,708 Bytes
08fb91a 8d44475 1ecde19 08fb91a cb92864 79ef842 cb92864 f0b1337 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | ---
title: FinGraph
emoji: ๐ธ๏ธ
colorFrom: indigo
colorTo: indigo
sdk: gradio
sdk_version: 6.14.0
python_version: 3.10.14
app_file: app.py
pinned: false
---
# FinNode ๐ธ๏ธ
**Neo4j GraphRAG ๊ธฐ๋ฐ AI ๋ด์ค ์ง์ ๊ทธ๋ํ ํ๋ซํผ**
[](https://www.python.org/)
[](https://neo4j.com/)
[](https://langchain.com/)
[](https://gradio.app/)
[](https://github.com/yuje/FinGraph/actions/workflows/ci.yml)
---
## ๐ ๋ณด๊ณ ์
> [์ต์ข
๊ธฐํ์ ๋ฐ ํ๋ก์ ํธ ๋ณด๊ณ ์ (์
๋ฐ์ดํธ ์์ )]()
## ๐ฅ ์์ฐ ์์
> [์๋น์ค ์์ฐ ์์ ๋งํฌ (์
๋ฐ์ดํธ ์์ )]()
---
## 1. ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉ์
์ต์ AI ๊ธฐ์ ๊ณผ ํํ
ํฌ ํธ๋ ๋๋ ๋น ๋ฅด๊ฒ ๋ณํํ๋ฉฐ, ์ผ๋ฐ์ ์ธ RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ) ๊ธฐ์ ๋ง์ผ๋ก๋ ์ฌ๋ฌ ๋ด์ค ๊ธฐ์ฌ์ ํฉ์ด์ ธ ์๋ **'๊ธฐ์
-๊ธฐ์ -์๋น์ค' ๊ฐ์ ๋ณต์กํ ๊ด๊ณ**๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
**FinNode**๋ ๋ค์ด๋ฒ ๋ด์ค์์ AI ๊ด๋ จ ๊ธฐ์ฌ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๊ณ , **LangGraph ํ์ดํ๋ผ์ธ**์ ํตํด ์ํฐํฐ์ ๊ด๊ณ๋ฅผ ์๋ ์ถ์ถํ์ฌ **Neo4j ์ง์ ๊ทธ๋ํ**์ ์ ์ฌํฉ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Vector ๋ฐ Cypher ๋ณตํฉ ๊ฒ์(GraphRAG)์ ์ํํ์ฌ, ๋จ์ํ ๋ฌธ์ ๊ฒ์์ ๋์ด **"ํ์ฌ ๊ธ์ตAI ๋ถ์ผ์์ ๊ฐ์ฅ ์ ๊ทน์ ์ธ ๊ธฐ์
๊ณผ ๊ธฐ์ ํธ๋ ๋"**๋ฅผ ์๋ฒฝํ ๊ทผ๊ฑฐ์ ํจ๊ป ์ถ๋ก ํ๊ณ ๋ต๋ณํ๋ ์ฐจ์ธ๋ ์ฑ๋ด ์์คํ
์
๋๋ค.
---
## 2. ์์คํ
์ํคํ
์ฒ
```text
[Naver News]
โ Selenium ํฌ๋กค๋ง
โผ
[LangGraph Pipeline] (gpt-4o-mini)
check_ai โโ(AI ์๋)โโโถ ์คํต
โ (AI ๊ด๋ จ)
โผ
extract_entities
โ
โผ
extract_relations
โ
โผ
[Neo4j AuraDB]
Article / Content / AICompany / AITechnology / AIService / AIField / Media
โ
โผ
[GraphRAG ToolsRetriever] โโโถ gpt-4o ์ต์ข
๋ต๋ณ ์์ฑ
โ
โผ
[Gradio ์ฑ๋ด UI (Hugging Face Spaces ๋ฐฐํฌ)]
```
---
## 3. ์ฃผ์ ๊ธฐ๋ฅ
- **์ค์๊ฐ ๋ด์ค ํฌ๋กค๋ง**: Selenium ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ก ๋ค์ด๋ฒ ๋ด์ค ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ธฐ์ฌ ์๋ ์์ง
- **LangGraph AI ํ์ดํ๋ผ์ธ**: ์์ง๋ ๊ธฐ์ฌ๋ฅผ 3๋จ๊ณ ์๋ ๋ถ์ (`ํ๋ณ` โ `์ํฐํฐ ์ถ์ถ` โ `๊ด๊ณ ์ถ์ถ`)
- **Neo4j ์ง์ ๊ทธ๋ํ ์ ์ฌ**: ์ถ์ถ๋ ์ํฐํฐ(Company, Tech, Service ๋ฑ)์ ๊ด๊ณ๋ฅผ MERGE ํธ๋์ญ์
์ผ๋ก ์ค๋ณต ์์ด DB ์ ์ฌ
- **GraphRAG ์ฑ๋ด**: 3๊ฐ์ง Retriever๋ฅผ ํตํฉํ ToolsRetriever ๊ธฐ๋ฐ ์์ฐ์ด ์ง์์๋ต
- `Vector Retriever`: ๋ณธ๋ฌธ ์ฒญํฌ ์๋ฏธ ์ ์ฌ๋ ๊ฒ์
- `VectorCypher Retriever`: ๋ฒกํฐ ๊ฒ์ ํ ํด๋น ๊ธฐ์ฌ์ ์ฐ๊ด ๊ทธ๋ํ(๊ธฐ์
ยท๊ธฐ์ ยท์๋น์ค) ๋ฐํ (ํธ๋ ๋ ๋ถ์์ ์ต์ ํ)
- `Text2Cypher Retriever`: ์์ฐ์ด โ Cypher ์ฟผ๋ฆฌ ์๋ ๋ณํ ๋ฐ ๋ฐ์ดํฐ ์ง๊ณ
- **๋ํ ๋งฅ๋ฝ ๋ฐ์ ํ์ด๋ธ๋ฆฌ๋ RAG & ์ง๋ฅํ Fallback ๋ผ์ฐํ
**:
- Neo4j์์ ๊ฒ์๋ ์ง์ ๊ทธ๋ํ ์ ๋ณด์ ์ฌ์ฉ์์ ์ง๋ฌธ, ๊ทธ๋ฆฌ๊ณ **์ต๊ทผ ๋ํ ํ์คํ ๋ฆฌ(์ต๊ทผ 3๊ฐ ๋ฉ์์ง)**๋ฅผ ์ข
ํฉ ๋ถ์ํ์ฌ GPT-4o ๊ธฐ๋ฐ ์๊ฐ ํ์ ๊ฐ๋๋ ์ผ(`_is_context_sufficient`)์ ์ค์๊ฐ ๊ตฌ๋.
- ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ง๋ฌธ์ ๋ต๋ณํ๊ธฐ ์ถฉ๋ถํ ๊ฒฝ์ฐ `GraphRAG` ๋ชจ๋๋ก ๊ตฌ๋ํ์ฌ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ฌ ์ถ์ฒ ๋งํฌ(URL, ์ ๋ชฉ ๋ฑ)๋ฅผ ํฌํจํ ํฉํธ ๊ธฐ๋ฐ ๋ต๋ณ ์ ๊ณต.
- ๊ด๋ จ ์ ๋ณด๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๊ธ์ต/IT ๋ด์ค๋ฅผ ๋ฒ์ด๋ ์ผ๋ฐ ์ง๋ฌธ(์: ์ํ ๊ณต์, ์ผ์ ๋ํ ๋ฑ), ํน์ ์ด์ ๋ํ ๋งฅ๋ฝ์ ์์กดํ๋ ์ง๋ฌธ์ ๋ํด์๋ ํ์คํ ๋ฆฌ๋ฅผ ์ข
ํฉ ๋ถ์ํ์ฌ ์ผ๋ฐ ์ง์ ๋ต๋ณ(`general` ๋ชจ๋)์ผ๋ก ์ ์ฐํ๊ฒ ์ค์์นญํ์ฌ ํ๊ฐ(Hallucination) ๋ฐฉ์ง ๋ฐ ์์ ์ฑ ๊ทน๋ํ.
- **์ฌ์ฉ์ ๊ฒฝํ(UX) ๋ฐ ํ๋ฆฌ๋ฏธ์ UI ์ต์ ํ**:
- **์ฌ๋ฆผ ์ฑ ๋ฒ๋ธ**: Gradio ๋งํฌ๋ค์ด ๋ ๋๋ฌ๊ฐ ๋ด๋ถ `<p>`, `<li>` ํ๊ทธ ๋ฑ์ ๋ถ์ฌํ๋ ๋น์ ์์ ์ผ๋ก ํฐ ์ํ ์ฌ๋ฐฑ๊ณผ ๋ง์ง์ ์ถ์(`.message` ํจ๋ฉ `10px 14px` ์กฐ์ ๋ฐ ๋ด๋ถ ๋ง์ง ์ต์ ํ)ํ์ฌ ๊ฐ๋
์ฑ ๋๊ณ ์ฌ๋ฆผํ ํ๋ฆฌ๋ฏธ์ ๋งํ์ UI ๊ตฌํ.
- **์ค์๊ฐ ํ์ ์งํ์ํฉ ์๊ฐํ**: LangGraph ๋ํ ์คํธ๋ฆผ(Stream) ์ฐ๋์ ํตํด `"๐ ๊ฒ์ ์งํ ์ค..."`, `"๐ก ๋ต๋ณ ์์ฑ ์ค..."` ๊ณผ์ ์ ์ค์๊ฐ์ผ๋ก ๋
ธ์ถํ์ฌ ๋ค๋จ๊ณ RAG์ ์ง์ฐ ์๊ฐ ๋์์ ์ฌ์ฉ์ ์ฒด๊ฐ ๋๊ธฐ ์ฑ๋ฅ ํ์ .
---
## 4. ๊ธฐ์ ์คํ
- **Language**: Python 3.10
- **AI / LLM**: LangChain, LangGraph, OpenAI (`gpt-4o`, `text-embedding-3-small`)
- **Database**: Neo4j (AuraDB Cloud)
- **Web / Crawling**: Gradio, Selenium, Pandas
- **CI/CD**: GitHub Actions, Hugging Face Spaces
---
## 5. ๊ทธ๋ํ ์คํค๋ง
### ๋
ธ๋ ๋ฐ ๊ด๊ณ
| ๊ตฌ๋ถ | ๋ด์ฉ |
|------|-----------|
| **๋
ธ๋ (Nodes)** | `Article`, `Content`, `AICompany`, `AITechnology`, `AIService`, `AIField`, `Media`, `Category` |
| **๊ด๊ณ (Edges)** | `HAS_CHUNK`, `PUBLISHED`, `BELONGS_TO`, `MENTIONS`, `DEVELOPS`, `INVESTS_IN`, `PARTNERS_WITH`, `APPLIES`, `USED_IN`, `RELATED_TO` |
---
## 6. ์ค์น ๋ฐ ์คํ ๊ฐ์ด๋
### ์ฌ์ ์ค๋น
- Python 3.10+
- Neo4j AuraDB ์ธ์คํด์ค (๋๋ ๋ก์ปฌ Neo4j)
- OpenAI API Key
### ๋ก์ปฌ ์คํ
```bash
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/yuje/FinGraph.git
cd FinGraph
# 2. ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ์์กด์ฑ ์ค์น
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 3. ํ๊ฒฝ ๋ณ์ ์ค์
cp .env.example .env
# .env ํ์ผ์ OpenAI Key, Neo4j ์ ์ ์ ๋ณด ์
๋ ฅ
# 4. Gradio ์ฑ ์คํ
python app.py
```
๋ธ๋ผ์ฐ์ ์์ `http://localhost:7860` ์ ์
---
## 7. ๋ฐฐํฌ (Hugging Face Spaces)
GitHub โ Hugging Face Spaces ์๋ ๋ฐฐํฌ๊ฐ `deploy.yml`์ ํตํด ์ค์ ๋์ด ์์ต๋๋ค.
`main` ๋ธ๋์น์ Push ์ ์๋์ผ๋ก ๋๊ธฐํ๋ฉ๋๋ค.
1. **Hugging Face ํ ํฐ ๋ฐ๊ธ**: Settings โ Tokens์์ Write ๊ถํ ํ ํฐ ์์ฑ
2. **GitHub Secrets ๋ฑ๋ก**: `HF_TOKEN`, `HF_REPO` (์: yuje/FinNode) ๋ฑ๋ก
3. **HF Space Secrets ๋ฑ๋ก**: `.env` ํญ๋ชฉ(OpenAI, Neo4j ํค) ๋์ผํ๊ฒ ๋ฑ๋ก
---
## 8. ์ฐธ๊ณ ์๋ฃ ๋ฐ ์คํ์์ค ํฌ๋ ๋ง (References & Credits)
- **GraphRAG ToolsRetriever**: [graphrag-tools-retriever (GitHub)](https://github.com/gongwon-nayeon/graphrag-tools-retriever)
- ๋ณธ ํ๋ก์ ํธ์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๋ฐ GraphRAG ๋ผ์ฐํ
(Context-Sufficient Fallback) ์ค๊ณ์ ํต์ฌ ์ฐธ๊ณ ๋ชจ๋ธ๋ก ํ์ฉ๋์์ต๋๋ค.
- **Neo4j ๋ฐ LLM ์ฐ๋ ์ค๋ฌด**: [์ํค๋
์ค Neo4j GraphRAG ๊ฐ์ด๋](https://wikidocs.net/340866)
|