| --- |
| 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) |
|
|