| --- |
| title: FinGraph |
| emoji: ๐ธ๏ธ |
| colorFrom: indigo |
| colorTo: indigo |
| sdk: gradio |
| sdk_version: 4.44.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 ์ฟผ๋ฆฌ ์๋ ๋ณํ ๋ฐ ๋ฐ์ดํฐ ์ง๊ณ |
|
|
| --- |
|
|
| ## 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 ํค) ๋์ผํ๊ฒ ๋ฑ๋ก |
|
|