Microsoft GraphRAG vs. Neo4j GraphRAG - k82022603/k82022603.github.io GitHub Wiki
Microsoft GraphRAG vs. Neo4j GraphRAG #
๊ฐ์ ์ด๋ฆ, ์์ ํ ๋ค๋ฅธ ์ ๊ทผ๋ฒ
์ํคํ ์ฒํ ๊ธฐ์ ์ธ๋ฏธ๋ โ ๋ณ์ฒจ ์๋ฃ
์์ ๋ฌธ์: Microsoft GraphRAG โ ์ง์ ๊ทธ๋ํ ๊ธฐ๋ฐ ์ฐจ์ธ๋ RAG ์์คํ
๋ชฉ์ฐจ
- ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ ์ด์ โ ๋จผ์ ๊ฐ๋ ๋ถํฐ
- ์ ๊ณต ์ฃผ์ฒด์ ์ฑ๊ฒฉ
- ํต์ฌ ์ฒ ํ์ ์ฐจ์ด โ ๋ฌด์์ ๊ธฐ๋ฐ์ผ๋ก ์ง์์ ํํํ๋๊ฐ
- ์ธ๋ฑ์ฑ ํ์ดํ๋ผ์ธ ๋น๊ต
- Microsoft GraphRAG๊ฐ ์ง์ ์ผ๋ก ๋ฐ์ด๋ ๊ฒ๋ค
- ๊ฒ์ ๋ฐฉ์ ๋น๊ต โ ์ง์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๊ฐ
- ์ ์ฅ์ ๊ตฌ์กฐ ๋น๊ต
- Neo4j GraphRAG์ ๊ฒ์๊ธฐ ์ข ๋ฅ
- ํตํฉ ๊ฐ๋ฅ์ฑ โ ๋์ด ํจ๊ป ์ธ ์ ์๋๊ฐ
- ์ฑ๋ฅ๊ณผ ๋น์ฉ ๋น๊ต
- ์ธ์ ์ด๋ ๊ฒ์ ์ ํํ๋๊ฐ
- ๊ฒฐ๋ก
1. ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ ์ด์ โ ๋จผ์ ๊ฐ๋ ๋ถํฐ
"GraphRAG"๋ผ๋ ๋จ์ด๋ฅผ ๊ฒ์ํ๋ฉด ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์์คํ ์ด ๋ฑ์ฅํฉ๋๋ค. Microsoft GraphRAG์ Neo4j GraphRAG์ ๋๋ค. ์ด๋ฆ์ด ๋น์ทํด์ ํผ๋ํ๊ธฐ ์ฝ์ง๋ง, ํ์ ๋ฐฐ๊ฒฝ๊ณผ ์๋ ๋ฐฉ์์ด ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ ๋๋ค.
์ฌ๋๋ค์ด "GraphRAG"๋ผ๊ณ ๋งํ ๋ ์๋ฏธํ๋ ๊ฒ์ด ๋ ๊ฐ์ง์ ๋๋ค.
- Microsoft๊ฐ ์ ์ํ GraphRAG: LLM์ผ๋ก ๋ฌธ์ ์ ์ฒด๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ปค๋ฎค๋ํฐ ๊ตฌ์กฐ์ ๊ณ์ธต์ ์์ฝ์ ๋ง๋๋ Knowledge-based ์ ๊ทผ๋ฒ (MS๋ ๋ด๋ถ์ ์ผ๋ก "graph index"๋ผ๊ณ ๋ ๋ถ๋ฆ)
- ๊ทธ๋ํ DB๋ฅผ ํ์ฉํ GraphRAG: ์ง์ ๊ทธ๋ํ์ ์ํฐํฐ์ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ณ Cypher ํ์์ผ๋ก ๊ฒ์ํ๋ Knowledge-based ์ ๊ทผ๋ฒ
Neo4j GraphRAG๋ ์ฃผ๋ก ๋ ๋ฒ์งธ ์๋ฏธ์ ๋๋ค. ์ฆ, Neo4j๋ฅผ ๊ทธ๋ํ ์ ์ฅ์๋ก ์ผ์ ๊ด๊ณ ๊ธฐ๋ฐ ๊ฒ์์ ์ํํ๋ ๋ฐฉ์์ ๋๋ค.
flowchart TB
subgraph MS["Microsoft GraphRAG (Knowledge-based โ ์ปค๋ฎค๋ํฐ ๋ฐฉ์)"]
MS_KEY["ํต์ฌ: ์ปค๋ฎค๋ํฐ ๊ณ์ธต ๊ตฌ์กฐ\n\n๋ฌธ์ โ LLM ์ ์ฒด ์ฒ๋ฆฌ\nโ Leiden ์ปค๋ฎค๋ํฐ ํ์ง\nโ ๊ณ์ธต์ ์์ฝ ์์ฑ\nโ ํ์ผ(Parquet) ์ ์ฅ\nโ Local/Global ์ง์"]
end
subgraph NEO["Neo4j GraphRAG (Knowledge-based)"]
NEO_KEY["ํต์ฌ: ๊ด๊ณ ๊ธฐ๋ฐ ํ์\n\n๋ฌธ์ โ ์ํฐํฐ/๊ด๊ณ ์ถ์ถ\nโ Neo4j ๊ทธ๋ํ DB ์ ์ฅ\nโ Cypher + ๋ฒกํฐ ๊ฒ์\nโ ์ง์ ๊ด๊ณ ํ์ ๊ฐ๋ฅ"]
end
SHARED["๊ณตํต์ :\n๋ ๋ค ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ\nRAG ํ์ง์ ํฅ์์ํค๋ ๋ชฉํ"]
MS -.->|"๊ฐ์ ๋ชฉํ"| SHARED
NEO -.->|"๋ค๋ฅธ ๋ฐฉ๋ฒ"| SHARED
2. ์ ๊ณต ์ฃผ์ฒด์ ์ฑ๊ฒฉ
๋ ์์คํ ์ ๋ง๋ ์ฃผ์ฒด๋ถํฐ ๋ค๋ฆ ๋๋ค.
| ํญ๋ชฉ | Microsoft GraphRAG | Neo4j GraphRAG |
|---|---|---|
| ๊ฐ๋ฐ ์ฃผ์ฒด | Microsoft Research | Neo4j (๊ทธ๋ํ DB ํ์ฌ) |
| ํจํค์ง๋ช | graphrag |
neo4j-graphrag |
| ์ค์น | pip install graphrag |
pip install neo4j-graphrag |
| ๋ผ์ด์ ์ค | MIT (์คํ์์ค) | Apache 2.0 (์คํ์์ค) |
| ๊ณต์ ์ง์ | ์ฐ๊ตฌ ํ๋ก์ ํธ (๋น๊ณต์ ์ง์) | 1st-party ๊ณต์ ์ง์ (Neo4j ์ง์ ์ ์ง) |
| Github | github.com/microsoft/graphrag | github.com/neo4j/neo4j-graphrag-python |
| ์ ์ฅ์ | Parquet ํ์ผ (๊ธฐ๋ณธ) | Neo4j Graph DB (ํ์) |
| ์ฒ์ ๊ณต๊ฐ | 2024๋ 7์ | 2024๋ (neo4j-genai โ neo4j-graphrag ๊ฐ๋ช ) |
Neo4j GraphRAG๋ Neo4j๊ฐ ์ง์ ์ ๊ณตํ๋ 1st-party ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์, ๊ฐ๋ ฅํ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํ๋ฉฐ ๊ณ ์ฑ๋ฅ ์๋ฃจ์ ์ ์ ๊ณตํ๊ณ , Neo4j์์ ์ง์ ์ฅ๊ธฐ ์ง์ ๋ฐ ์ ์ง๋ณด์๋ฅผ ๋ณด์ฅํฉ๋๋ค.
๋ฐ๋ฉด Microsoft GraphRAG๋ LLM ์ถ๋ ฅ์ ํฅ์ํ๊ธฐ ์ํด ์ง์ ๊ทธ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ก ์ ์ ์ํ๋ ๋ฐ๋ชจ ๋ชฉ์ ์ ์ฝ๋์ด๋ฉฐ, Microsoft์ ๊ณต์ ์ง์ ์ ํ์ด ์๋์ ๋ช ์ํ๊ณ ์์ต๋๋ค.
3. ํต์ฌ ์ฒ ํ์ ์ฐจ์ด โ ๋ฌด์์ ๊ธฐ๋ฐ์ผ๋ก ์ง์์ ํํํ๋๊ฐ
์ด๊ฒ์ด ๋ ์์คํ ์ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ๋๋ค.
flowchart LR
subgraph MS_PHIL["Microsoft GraphRAG ์ฒ ํ '๋ฌธ์ ์ ์ฒด๋ฅผ ์์ฝํด ๋์'"]
direction TB
MP1["LLM์ด ๋ชจ๋ ์ฒญํฌ๋ฅผ ์ฝ๊ณ \n์ํฐํฐยท๊ด๊ณ๋ฅผ ์์ ๋กญ๊ฒ ์ถ์ถ"]
MP2["Leiden ์๊ณ ๋ฆฌ์ฆ์ผ๋ก\n์๋ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ"]
MP3["์ปค๋ฎค๋ํฐ๋ง๋ค\nLLM์ด ์์ฝ ๋ณด๊ณ ์ ์์ฑ"]
MP4["์ง์ ์ ์ปค๋ฎค๋ํฐ ์์ฝ์\n์ปจํ
์คํธ๋ก ํ์ฉ"]
MP1 --> MP2 --> MP3 --> MP4
MS_NOTE["โ ์จํจ๋ก์ง/์คํค๋ง ๋ถํ์\nโ ์๋ํ ๋์\nโ ์ ์ฒด ์กฐ๋ง์ ๊ฐํจ"]
end
subgraph NEO_PHIL["Neo4j GraphRAG ์ฒ ํ '๊ตฌ์กฐํ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ์'"]
direction TB
NP1["์คํค๋ง(์จํจ๋ก์ง) ์ฌ์ ์ ์\nPerson, Technology, Topic ๋ฑ"]
NP2["LLM์ด ์คํค๋ง์ ๋ฐ๋ผ\n์ํฐํฐยท๊ด๊ณ๋ฅผ ๊ตฌ์กฐํ ์ถ์ถ"]
NP3["Neo4j์ ๋
ธ๋์ ์ฃ์ง๋ก ์ ์ฅ\n(Cypher ํ์ ๊ฐ๋ฅ)"]
NP4["์ง์ ์ ๋ฒกํฐ ๊ฒ์ +\nCypher ๊ทธ๋ํ ํ์ ๊ฒฐํฉ"]
NP1 --> NP2 --> NP3 --> NP4
NEO_NOTE["โ ๋๋ฉ์ธ ์จํจ๋ก์ง ํ์\nโ ์ ๋ฐํ ๊ด๊ณ ํ์ ๊ฐ๋ฅ\nโ ํน์ ์ํฐํฐ ์ง์์ ๊ฐํจ"]
end
Microsoft์ ์์คํ ์ ์ ์ฒด ์ฝํผ์ค์ ๋ํด LLM์ ์คํํ์ฌ ์ํฐํฐ์ ๊ด๊ณ๋ฅผ ์ถ์ถํ๊ณ , ์ง์ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ถํ๋ฉฐ, Leiden ์ปค๋ฎค๋ํฐ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ๊ด๋ จ ์ํฐํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ์ฌ๋ฌ ๊ณ์ธต ์์ค์์ ์์ฝ์ ๋ฏธ๋ฆฌ ์์ฑํฉ๋๋ค. ๋ฐ๋ฉด Neo4j ๊ตฌํ์ Cypher ๊ทธ๋ํ ์ฟผ๋ฆฌ์ ํ ์คํธ ์ฒญํฌ ๊ฒ์์ ๊ฒฐํฉํฉ๋๋ค. ์์ด์ ํธ๊ฐ ์ฌ์ฉ์ ์ง๋ฌธ์์ ํต์ฌ ์ํฐํฐ๋ฅผ ์๋ณํ๊ณ , ๊ทธ๋ํ์์ Nํ ๋ด์ ์ฐ๊ฒฐ๋ ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉฐ, ํด๋น ์ํฐํฐ์ ์ฐ๊ด๋ ํ ์คํธ ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์ ๊ฒฐํฉ๋ ์ปจํ ์คํธ๋ฅผ LLM์ ์ ๋ฌํฉ๋๋ค.
4. ์ธ๋ฑ์ฑ ํ์ดํ๋ผ์ธ ๋น๊ต
๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋จ๊ณ๋ณ๋ก ๋น๊ตํฉ๋๋ค.
flowchart TB
DOC["์๋ณธ ๋ฌธ์"]
subgraph MS_PIPE["Microsoft GraphRAG ์ธ๋ฑ์ฑ (graphrag index)"]
direction TB
MS1["โ ํ
์คํธ ์ฒญํฌ ๋ถํ \n(๊ธฐ๋ณธ 1,200 ํ ํฐ)"]
MS2["โก LLM ์์ ์ํฐํฐ/๊ด๊ณ ์ถ์ถ\n(์คํค๋ง ์์, ๋ชจ๋ ์ฒญํฌ ์ฒ๋ฆฌ)"]
MS3["โข Leiden ์ปค๋ฎค๋ํฐ ์๋ ํ์ง\n(๊ณ์ธต ๊ตฌ์กฐ ์์ฑ)"]
MS4["โฃ LLM ์ปค๋ฎค๋ํฐ ์์ฝ ์์ฑ\n(๋ ๋ฒจ๋ณ ๋ณด๊ณ ์)"]
MS5["โค ์๋ฒ ๋ฉ ์์ฑ + ์ ์ฅ\nParquet ํ์ผ ์ถ๋ ฅ"]
MS1 --> MS2 --> MS3 --> MS4 --> MS5
MS_OUT["๐ Parquet ํ์ผ๋ค\n(entities, relationships,\ncommunity_reports ๋ฑ)"]
MS5 --> MS_OUT
end
subgraph NEO_PIPE["Neo4j GraphRAG ์ธ๋ฑ์ฑ (SimpleKGPipeline)"]
direction TB
NE1["โ ์คํค๋ง ์ ์\n(Person, Technology, USES ๋ฑ)"]
NE2["โก ํ
์คํธ ์ฒญํฌ ๋ถํ \n(chunk_size ์ค์ )"]
NE3["โข LLM ์คํค๋ง ๊ธฐ๋ฐ ์ถ์ถ\n(์ ์๋ ์ํฐํฐ/๊ด๊ณ๋ง ์ถ์ถ)"]
NE4["โฃ ์ํฐํฐ ์ค๋ณต ์ ๊ฑฐ\n(FuzzyMatch / Semantic)"]
NE5["โค ์๋ฒ ๋ฉ ์์ฑ + Neo4j ์ ์ฅ\n(๋
ธ๋/์ฃ์ง/๋ฒกํฐ ์ธ๋ฑ์ค)"]
NE1 --> NE2 --> NE3 --> NE4 --> NE5
NEO_OUT["๐๏ธ Neo4j Graph DB\n(Document, Chunk, Entity ๋
ธ๋\n+ MENTIONS, RELATED_TO ๊ด๊ณ)"]
NE5 --> NEO_OUT
end
DOC --> MS_PIPE
DOC --> NEO_PIPE
4.1 ์ธ๋ฑ์ฑ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด โ ์ปค๋ฎค๋ํฐ ์์ฝ์ ์๋ํ
Microsoft GraphRAG์ ์ธ๋ฑ์ฑ์์ ๊ฐ์ฅ ๋ ์ฐฝ์ ์ด๊ณ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ถ๋ถ์ ์ปค๋ฎค๋ํฐ ํ์ง์ ์์ฝ ์์ฑ ๋จ๊ณ์ ๋๋ค. LLM์ด ์๋ฐฑ~์์ฒ ๊ฐ์ ์ปค๋ฎค๋ํฐ๋ง๋ค ํฌ๊ด์ ์ธ ์์ฝ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์์ฝ์ด ๋์ค์ Global Search๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
ํ ๊ฐ์ง ์ค์ํ ์ฌ์ค์ ์ง๊ณ ๋์ด๊ฐ์ผ ํฉ๋๋ค. Neo4j ์์ฒด์ ์ปค๋ฎค๋ํฐ ๊ฐ๋ ์ด ์๋ ๊ฒ์ ์๋๋๋ค. Neo4j๋ Graph Data Science(GDS) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด Leiden, Louvain ๋ฑ ์ปค๋ฎค๋ํฐ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ๊ณต์ ์ง์ํฉ๋๋ค. Cypher ํ ์ค๋ก ์คํํ ์ ์์ต๋๋ค.
-- Neo4j GDS๋ก Leiden ์ปค๋ฎค๋ํฐ ํ์ง ์คํ
CALL gds.leiden.write('my-graph', { writeProperty: 'community' })
YIELD communityCount, modularity
์ฐจ์ด๋ ์๋ํ ์์ค์ ์์ต๋๋ค. neo4j-graphrag Python ํจํค์ง๋ ์ปค๋ฎค๋ํฐ ํ์ง์ LLM ์์ฝ ์์ฑ์ ์ธ๋ฑ์ฑ ํ์ดํ๋ผ์ธ์ ํฌํจํ์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ง์ GDS๋ฅผ ์คํํ๊ณ LLM ์์ฝ์ ๋ณ๋๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด Microsoft GraphRAG๋ graphrag index ๋ช
๋ น ํ๋๋ก ์ด ๋ชจ๋ ๊ณผ์ ์ ์๋์ผ๋ก ์ํํฉ๋๋ค.
| ๊ตฌ๋ถ | Microsoft GraphRAG | Neo4j GraphRAG (ํจํค์ง) |
|---|---|---|
| ์ปค๋ฎค๋ํฐ ํ์ง ์๊ณ ๋ฆฌ์ฆ | โ ์๋ (Leiden ๋ด์ฅ) | โ๏ธ GDS๋ก ๊ฐ๋ฅํ๋ ์๋ |
| LLM ์ปค๋ฎค๋ํฐ ์์ฝ ์์ฑ | โ ์๋ | โ ํจํค์ง ๋ฏธ์ง์ (์ง์ ๊ตฌํ) |
| Global Search ๋ด์ฅ | โ ์์ | โ ์์ |
| ํ์ดํ๋ผ์ธ ์๋ํ | โ ์์ ์๋ | โ๏ธ ๋จ๊ณ๋ณ ์๋ ๊ตฌ์ฑ |
5. Microsoft GraphRAG๊ฐ ์ง์ ์ผ๋ก ๋ฐ์ด๋ ๊ฒ๋ค
Neo4j๋ ์ปค๋ฎค๋ํฐ ํ์ง๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด, Microsoft GraphRAG๊ฐ ์ง์ ์ผ๋ก ์ฐ์ํ ๋ถ๋ถ์ ๋ฌด์์ธ์ง ๋ช ํํ ์ง์ด์ผ ํฉ๋๋ค. ํต์ฌ์ ๊ธฐ๋ฅ์ ์ ๋ฌด๊ฐ ์๋๋ผ ์๋ํ์ ์์ฑ๋์ ์ค๊ณ ์ฌ์์ ์ฐจ๋ณ์ฑ์ ์์ต๋๋ค.
5.1 ์คํค๋ง ์์ด๋ ์๋ํ๋ ์์ ์๋ ํ์ดํ๋ผ์ธ
Neo4j GraphRAG๋ก ์ง์๊ทธ๋ํ๋ฅผ ๊ตฌ์ถํ๋ ค๋ฉด ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๊ฐ ์จํจ๋ก์ง๋ฅผ ๋จผ์ ์ค๊ณํด์ผ ํฉ๋๋ค. "์ด๋ค ์ํฐํฐ๋ฅผ ์ถ์ถํ ๊ฒ์ธ๊ฐ(Person, Technology, Projectโฆ)", "์ด๋ค ๊ด๊ณ๋ฅผ ์ ์ํ ๊ฒ์ธ๊ฐ(USES, BELONGS_TOโฆ)"๋ฅผ ์ฌ๋์ด ๊ฒฐ์ ํด์ผ ํ์ดํ๋ผ์ธ์ด ๊ทธ ๊ธฐ์ค์ ๋ฐ๋ผ ์์ง์ ๋๋ค.
Microsoft GraphRAG๋ ์ด ๊ณผ์ ์ด ํ์ ์์ต๋๋ค. ๋๋ฉ์ธ ์ง์ ์์ด๋ graphrag index ๋ช
๋ น ํ๋๋ก ๋ฌธ์ ์ ์ฒด๋ฅผ ๋ถ์ํ๊ณ , LLM์ด ์ค์ค๋ก ์๋ฏธ ์๋ ์ํฐํฐ์ ๊ด๊ณ๋ฅผ ์ถ์ถํ๋ฉฐ, Leiden ์๊ณ ๋ฆฌ์ฆ์ด ์๋์ผ๋ก ์ปค๋ฎค๋ํฐ๋ฅผ ํ์งํ๊ณ , LLM์ด ๊ฐ ์ปค๋ฎค๋ํฐ์ ์์ฝ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค. ์ฒ์ ๋ณด๋ ๋๋ฉ์ธ์์๋ ๋น ๋ฅด๊ฒ ์ง์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
flowchart LR
subgraph MS_AUTO["MS GraphRAG โ ์์ ์๋"]
DOC1["๋ฌธ์\n(๋๋ฉ์ธ ๋ฌด๊ด)"]
ONE_CMD["graphrag index\n๋ช
๋ น ํ๋"]
RESULT1["์ปค๋ฎค๋ํฐ ๊ตฌ์กฐ\n+ LLM ์์ฝ\n์๋ ์์ฑ"]
DOC1 --> ONE_CMD --> RESULT1
NOTE1["์ฌ์ ์ง์ ๋ถํ์"]
end
subgraph NEO_MANUAL["Neo4j GraphRAG โ ์๋ ์ค๊ณ ํ์"]
DOC2["๋ฌธ์"]
DESIGN["โ ์จํจ๋ก์ง ์ค๊ณ\n(๋๋ฉ์ธ ์ ๋ฌธ๊ฐ ํ์)"]
EXTRACT["โก ์คํค๋ง ๊ธฐ๋ฐ ์ถ์ถ"]
OPT_GDS["โข GDS ์ปค๋ฎค๋ํฐ ํ์ง\n(์ ํ, ์๋)"]
OPT_SUM["โฃ LLM ์์ฝ ๊ตฌ์ฑ\n(์ ํ, ์๋)"]
DOC2 --> DESIGN --> EXTRACT --> OPT_GDS --> OPT_SUM
NOTE2["๋จ๊ณ๋ง๋ค ์ฌ๋์ด ๊ฐ์
"]
end
5.2 Global Search โ ๋์ฒด ๋ถ๊ฐ๋ฅํ ์ ์ฒด ์กฐ๋ง ์ง์
Global Search๋ Microsoft GraphRAG๋ง์ด ์ ๊ณตํ๋ ๊ณ ์ ๊ธฐ๋ฅ์ ๋๋ค. "์ด ๋ฌธ์ ์งํฉ ์ ์ฒด์ ์ฃผ์ ์ฃผ์ ๋?", "์ด ๋ฐ์ดํฐ์์ ๋ฐ๋ณต๋๋ ํจํด์?" ๊ฐ์ ์ง์๋ ์ผ๋ถ ์ฒญํฌ๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ํน์ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ผ๋ก๋ ๊ตฌ์กฐ์ ์ผ๋ก ๋ตํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์กฐ๋งํด์ผ ํฉ๋๋ค.
Global Search๋ ๋ฏธ๋ฆฌ ์์ฑ๋ ์ปค๋ฎค๋ํฐ ์์ฝ๋ค์ Map-Reduce ํจํด์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌํ์ฌ, ์ ์ฒด ์ฝํผ์ค๋ฅผ ํ ๋ฒ๋ ๋น ๋จ๋ฆฌ์ง ์๊ณ ์ง์์ ๋์ํฉ๋๋ค. Microsoft์ ์ฐ๊ตฌ ๊ฒฐ๊ณผ Global Search๋ ํฌ๊ด์ฑ๊ณผ ๋ค์์ฑ ์งํ์์ ๊ธฐ์กด RAG ๋๋น ์ฝ 70~80%์ ์น๋ฅ ์ ๊ธฐ๋กํ์ต๋๋ค.
5.3 DRIFT Search โ ๊ธ๋ก๋ฒ ๋งฅ๋ฝ + ๋ก์ปฌ ์ ๋ฐ๋์ ์ตํฉ
2024๋ 10์ ์ถ๊ฐ๋ DRIFT Search๋ Global Search์ ํฌ๊ด์ฑ๊ณผ Local Search์ ์ ๋ฐ๋๋ฅผ ๊ฒฐํฉํฉ๋๋ค. ์ปค๋ฎค๋ํฐ ์์ฝ์ผ๋ก ์ ์ฒด ๋งฅ๋ฝ์ ํ์ ํ ๋ค, LLM์ด ํ๋ก์ ์ง๋ฌธ์ ์๋ ์์ฑํ๊ณ ๋ฐ๋ณต์ ๋ก์ปฌ ํ์์ผ๋ก ๋ต์ ์ ๊ตํํฉ๋๋ค. ์ด ํจํด์ neo4j-graphrag ํจํค์ง์ ์๋นํ ์ปค์คํ ์์ ์์ด๋ ๊ตฌํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
5.4 LazyGraphRAG โ ์ธ๋ฑ์ฑ ๋น์ฉ์ ํ์
2024๋ 11์ ๋ฐํ๋ LazyGraphRAG๋ ์ธ๋ฑ์ฑ ๋จ๊ณ์์ LLM ํธ์ถ์ ๊ฑฐ์ ์ ๊ฑฐํฉ๋๋ค. NLP๋ก ๋ช ์ฌ๊ตฌ๋ฅผ ์ถ์ถํ๊ณ ์ปค๋ฎค๋ํฐ๋ฅผ ํ์งํ๋, ์ปค๋ฎค๋ํฐ ์์ฝ์ ์ง์ ์์ ์ ์จ๋๋งจ๋๋ก ์์ฑํฉ๋๋ค. ์ด ๋ฐฉ์์ผ๋ก ์ธ๋ฑ์ฑ ๋น์ฉ์ Standard GraphRAG ๋๋น 0.1% ์์ค์ผ๋ก ๋ฎ์ถ๋ฉด์๋ ๋๋ฑํ ์ง์ ํ์ง์ ๋ฌ์ฑํฉ๋๋ค.
5.5 ์ฌ์ ์ง๋ฌธ ์์ด ํ ๋ง๋ฅผ ๋ฐ๊ฒฌํ๋ค
Neo4j GraphRAG๋ "์ด๋ค ๊ฒ์ ์ฐพ๊ฒ ๋ค"๋ ์๋๊ฐ ์์ด์ผ ํฉ๋๋ค. ์คํค๋ง๋ฅผ ์ค๊ณํ๋ค๋ ๊ฒ ์์ฒด๊ฐ ์ด๋ฏธ ์ด๋ค ์ํฐํฐ์ ๊ด๊ณ๊ฐ ์ค์ํ์ง ์๊ณ ์๋ค๋ ์ ์ ๋ฅผ ๋ด์ต๋๋ค.
Microsoft GraphRAG๋ ๋ฐ๋์ ๋๋ค. ์ด๋ค ์ง๋ฌธ์ ํด์ผ ํ ์ง ๋ชจ๋ฅด๋ ์ํ์์๋ ์ปค๋ฎค๋ํฐ ๊ตฌ์กฐ๊ฐ ๋ฐ์ดํฐ์ ์ ์ฒด ์๋ฏธ ์งํ์ ๋ฏธ๋ฆฌ ๋๋ฌ๋ ๋๋ค. ์ฐ๊ตฌ ๋ ผ๋ฌธ ๋ชจ์, ํ์๋ก ์์นด์ด๋ธ, ํ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฒ๋ผ ๋ฏธ๋ฆฌ ์ ์ ์๋ ํจํด์ ๋ฐ๊ฒฌํด์ผ ํ๋ ํ์์ ๋ถ์์์ ๋ ๋ณด์ ์ ๋๋ค.
flowchart TB
subgraph MSAdvantages["Microsoft GraphRAG์ ์ง์ ํ ๊ฐ์ 5๊ฐ์ง"]
direction LR
A1["โ ์์ ์๋ ํ์ดํ๋ผ์ธ\n์คํค๋ง ์ค๊ณ ์์ด ์์"]
A2["โก Global Search\n์ ์ฒด ์กฐ๋ง ์ง์ ๋
์ "]
A3["โข DRIFT Search\n๊ธ๋ก๋ฒ+๋ก์ปฌ ์ตํฉ"]
A4["โฃ LazyGraphRAG\n์ธ๋ฑ์ฑ ๋น์ฉ 0.1%"]
A5["โค ํ์์ ํ
๋ง ๋ฐ๊ฒฌ\n์ฌ์ ์ง๋ฌธ ๋ถํ์"]
end
6. ๊ฒ์ ๋ฐฉ์ ๋น๊ต โ ์ง์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๊ฐ
flowchart TB
Q["์ฌ์ฉ์ ์ง์"]
subgraph MS_QUERY["Microsoft GraphRAG ์ง์"]
direction TB
subgraph LOCAL_Q["Local Search"]
LS1["์ง์ ์๋ฒ ๋ฉ\nโ ๊ด๋ จ ์ํฐํฐ ํ์"]
LS2["์ํฐํฐ ์ฃผ๋ณ ์ ๋ณด ์์ง\n(์ฒญํฌ, ์ปค๋ฎค๋ํฐ ์์ฝ, ๊ด๊ณ, ๊ณต๋ณ๋)"]
LS3["LLM ๋ต๋ณ ์์ฑ"]
LS1 --> LS2 --> LS3
end
subgraph GLOBAL_Q["Global Search"]
GS1["์ปค๋ฎค๋ํฐ ์์ฝ ์ ์ฒด ์ฒ๋ฆฌ\n(Map ๋จ๊ณ โ ๋ณ๋ ฌ)"]
GS2["์ค์๋ ๊ธฐ๋ฐ ํตํฉ\n(Reduce ๋จ๊ณ)"]
GS3["LLM ์ ์ฒด ์กฐ๋ง ๋ต๋ณ"]
GS1 --> GS2 --> GS3
end
subgraph DRIFT_Q["DRIFT Search (์ ๊ท)"]
DR1["HyDE๋ก ์ปค๋ฎค๋ํฐ ๊ฒ์\n+ ํ๋ก์
์ง๋ฌธ ์์ฑ"]
DR2["๋ฐ๋ณต Local ํ์"]
DR3["๊ณ์ธต์ ๋ต๋ณ ํตํฉ"]
DR1 --> DR2 --> DR3
end
end
subgraph NEO_QUERY["Neo4j GraphRAG ์ง์"]
direction TB
subgraph VR_Q["VectorRetriever"]
VR1["์ง์ ์๋ฒ ๋ฉ\nโ ๋ฒกํฐ ์ ์ฌ๋ ๊ฒ์\nโ ์ฒญํฌ ๋ฐํ"]
end
subgraph VCR_Q["VectorCypherRetriever"]
VC1["๋ฒกํฐ ๊ฒ์์ผ๋ก ์ง์
์ ํ์\nโ Cypher๋ก ๊ทธ๋ํ ํ์ฅ\nโ ๊ด๋ จ ๋
ธ๋/๊ด๊ณ ์์ง"]
end
subgraph HCR_Q["HybridCypherRetriever"]
HC1["๋ฒกํฐ + ์ ๋ฌธ๊ฒ์(BM25)\nโ Cypher ๊ทธ๋ํ ํ์\nโ ํ์ด๋ธ๋ฆฌ๋ ๊ฒฐ๊ณผ"]
end
subgraph T2C_Q["Text2CypherRetriever"]
TC1["์์ฐ์ด โ LLM์ด Cypher ์์ฑ\nโ Neo4j์์ ์ง์ ์คํ\nโ ์ ํํ ๊ด๊ณ ์กฐํ"]
end
end
Q --> MS_QUERY
Q --> NEO_QUERY
6.1 Microsoft GraphRAG๋ง ๊ฐ๋ฅํ ๊ฒ
Global Search๋ Microsoft GraphRAG ๊ณ ์ ์ ๊ธฐ๋ฅ์ ๋๋ค. "์ด ๋ฌธ์ ์งํฉ ์ ์ฒด์ ์ฃผ์ ์ฃผ์ ๋ ๋ฌด์์ธ๊ฐ?"์ฒ๋ผ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ฐ๋ฅด๋ ์ง์๋ ์ปค๋ฎค๋ํฐ ์์ฝ ๊ธฐ๋ฐ Map-Reduce ์์ด๋ ๊ตฌ์กฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต์ต๋๋ค. Neo4j GraphRAG ํจํค์ง์๋ ์ด์ ์์ํ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. Neo4j GDS๋ก ์ปค๋ฎค๋ํฐ๋ฅผ ํ์งํ๊ณ LLM ์์ฝ์ ์ง์ ๊ตฌ์ฑํ๋ฉด ์ ์ฌํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ง๋ง, ์๋นํ ์ปค์คํ ์์ ์ด ํ์ํฉ๋๋ค.
DRIFT Search ์ญ์ MS GraphRAG ๊ณ ์ ์ ๋๋ค. ๊ธ๋ก๋ฒ ์ปค๋ฎค๋ํฐ ๋งฅ๋ฝ์์ ์ถ๋ฐํ์ฌ ํ๋ก์ ์ง๋ฌธ์ ์๋ ์์ฑํ๊ณ ๋ฐ๋ณต ๋ก์ปฌ ํ์์ผ๋ก ์ ๊ตํํ๋ ํจํด์ ๋๋ค.
6.2 Neo4j GraphRAG๋ง ๊ฐ๋ฅํ ๊ฒ
์ ๋ฐํ ๊ด๊ณ ํ์์ Neo4j GraphRAG์ ๊ณ ์ ์์ญ์ ๋๋ค. "A๊ฐ B๋ฅผ ํตํด C์ ์ฐ๊ฒฐ๋๋ ๊ฒฝ๋ก๋?"์ฒ๋ผ ๊ตฌ์ฒด์ ์ธ Cypher ์ฟผ๋ฆฌ๋ก ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๊ฒ์ Microsoft GraphRAG๋ก๋ ์ง์ ์ํํ ์ ์์ต๋๋ค.
Text2Cypher๋ ์์ฐ์ด๋ฅผ Cypher ์ฟผ๋ฆฌ๋ก ๋ณํํ์ฌ Neo4j๋ฅผ ์ง์ ์ง์ํฉ๋๋ค. ์ ํํ๋ ๊ด๊ณ ์ง์์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
7. ์ ์ฅ์ ๊ตฌ์กฐ ๋น๊ต
๋ ์์คํ ์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋์ง๊ฐ ํฌ๊ฒ ๋ค๋ฆ ๋๋ค.
flowchart LR
subgraph MS_STORE["Microsoft GraphRAG ์ ์ฅ์"]
direction TB
P1["entities.parquet\n์ํฐํฐ + ์๋ฒ ๋ฉ + ์ปค๋ฎค๋ํฐ ์ ๋ณด"]
P2["relationships.parquet\n๊ด๊ณ + ์ค๋ช
"]
P3["community_reports.parquet\nโญ ์ปค๋ฎค๋ํฐ ์์ฝ ๋ณด๊ณ ์"]
P4["text_units.parquet\nํ
์คํธ ์ฒญํฌ + ์ํฐํฐ ์ฐธ์กฐ"]
P5["๋ฒกํฐ ์ ์ฅ์\n(LanceDB / Azure AI Search)"]
PNOTE["ํ์ผ ๊ธฐ๋ฐ ์ ์ฅ\nโ ๋์ ์ ๊ทผ ์ ํ\nโ ์ค์๊ฐ ๊ฐฑ์ ์ด๋ ค์\nโ Parquet ๋ถ์ ๋๊ตฌ๋ก ํ์"]
end
subgraph NEO_STORE["Neo4j GraphRAG ์ ์ฅ์"]
direction TB
N1["Document ๋
ธ๋\n(๋ฌธ์ ๋ฉํ๋ฐ์ดํฐ)"]
N2["Chunk ๋
ธ๋\n(ํ
์คํธ + ์๋ฒ ๋ฉ ๋ฒกํฐ)"]
N3["Entity ๋
ธ๋\n(Person, Technology ๋ฑ)"]
N4["๊ด๊ณ ์ฃ์ง\n(MENTIONS, RELATED_TO ๋ฑ)"]
N5["๋ฒกํฐ ์ธ๋ฑ์ค\n(Neo4j ๋ด์ฅ ANN)"]
N6["์ ๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค\n(Full-text / BM25)"]
NNOTE["๊ทธ๋ํ DB ์ ์ฅ\nโ ๋์ ์ ๊ทผ ์ง์\nโ ์ค์๊ฐ ๊ฐฑ์ ๊ฐ๋ฅ\nโ Cypher๋ก ์ง์ ํ์\nโ ์๊ฐํ ๋๊ตฌ ์ง์"]
end
7.1 ์ ์ฅ์ ์ ํ์ด ์ด์์ ๋ฏธ์น๋ ์ํฅ
Microsoft GraphRAG์ Parquet ํ์ผ ๊ธฐ๋ฐ ์ ์ฅ์ ๋ฐ์ดํฐ ๋ถ์๊ณผ ์ผ๊ด ์ฒ๋ฆฌ์ ์ ํฉํ์ง๋ง, ์ด์ ์์คํ ์์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค. ์ ๋ฌธ์๊ฐ ์ถ๊ฐ๋๋ฉด ์ ์ฒด ๋๋ ๋ถ๋ถ ์ฌ์ธ๋ฑ์ฑ์ด ํ์ํฉ๋๋ค.
Neo4j๋ ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฏ๋ก ๋ ธ๋์ ๊ด๊ณ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ถ๊ฐยท์์ ยท์ญ์ ํ ์ ์์ต๋๋ค. ์ด์ ์ค์ธ ์์คํ ์์ ๋ฌธ์๊ฐ ์ฆ๊ฐํด๋ ์ฆ๋ถ ์ ๋ฐ์ดํธ๊ฐ ์์ฐ์ค๋ฝ์ต๋๋ค.
8. Neo4j GraphRAG์ ๊ฒ์๊ธฐ ์ข ๋ฅ
๊ณต์ Neo4j GraphRAG Python ํจํค์ง๋ ๋ค์ํ ๊ฒ์๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ ๊ฒ์๊ธฐ์ ํน์ฑ์ ์ดํดํ๋ฉด ์ง์ ์ ํ์ ๋ง๋ ์ต์ ์ ๊ฒ์๊ธฐ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
flowchart TB
subgraph Retrievers["Neo4j GraphRAG ๊ฒ์๊ธฐ 6์ข
"]
direction TB
VR["VectorRetriever\n๋ฒกํฐ ์ ์ฌ๋๋ง ์ฌ์ฉ\nโ ์๋ฏธ ๊ธฐ๋ฐ ์ฒญํฌ ๊ฒ์\n๊ฐ์ฅ ๋จ์ํ๊ณ ๋น ๋ฆ"]
VCR["VectorCypherRetriever\n๋ฒกํฐ ๊ฒ์ ํ Cypher ๊ทธ๋ํ ํ์\nโ '์ด ์ฒญํฌ์ ์ฐ๊ฒฐ๋ ์ํฐํฐ๋ค'\n๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ GraphRAG ํจํด"]
HR["HybridRetriever\n๋ฒกํฐ + ์ ๋ฌธ๊ฒ์(BM25)\nโ ๋ ๋ฐฉ์์ ์ฅ์ ๊ฒฐํฉ\nCypher ํ์ ์์"]
HCR["HybridCypherRetriever\n๋ฒกํฐ + BM25 + Cypher ํ์\nโ ์ธ ๋ฐฉ์ ๋ชจ๋ ๊ฒฐํฉ\n๊ฐ์ฅ ํฌ๊ด์ ์ธ ๊ฒ์"]
T2C["Text2CypherRetriever\n์์ฐ์ด โ LLM์ด Cypher ์์ฑ\nโ ์ ํํ ๊ตฌ์กฐ์ ์ง์\nLLM ์์ฑ Cypher ๋ถ์์ ๊ฐ๋ฅ"]
TR["ToolsRetriever\nLLM์ด ๊ฒ์๊ธฐ๋ฅผ ์๋ ์ ํ\nโ ์ง์ ์ ํ์ ๋ฐ๋ผ ๋์ ์ ํ\n๊ฐ์ฅ ์ ์ฐํ์ง๋ง ๋ณต์ก"]
end
VectorCypherRetriever๋ ๋ฒกํฐ ๊ธฐ๋ฐ ์ ์ฌ๋ ๊ฒ์๊ณผ ๊ทธ๋ํ ํ์ ๊ธฐ๋ฒ์ ๊ฒฐํฉํ์ฌ Neo4j์ ๊ทธ๋ํ ๊ธฐ๋ฅ์ ์์ ํ ํ์ฉํฉ๋๋ค. ์ฟผ๋ฆฌ ์๋ฒ ๋ฉ์ ์ฒ๋ฆฌํ์ฌ ์ง์ ๋ ๋ฒกํฐ ์ธ๋ฑ์ค์ ๋ํ ์ ์ฌ๋ ๊ฒ์์ ์ํํ๊ณ , ๊ด๋ จ ๋ ธ๋๋ฅผ ๊ฒ์ํ ๋ค์, Cypher ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ์ด ๋ ธ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ทธ๋ํ๋ฅผ ํ์ํฉ๋๋ค.
9. ํตํฉ ๊ฐ๋ฅ์ฑ โ ๋์ด ํจ๊ป ์ธ ์ ์๋๊ฐ
๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ๋๋ค. ๋ ์์คํ ์ ๊ฒฝ์์ด ์๋๋ผ ํตํฉํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
9.1 Microsoft GraphRAG ๊ฒฐ๊ณผ๋ฌผ์ Neo4j์ ์ ์ฅํ๊ธฐ
Microsoft GraphRAG๊ฐ ์์ฑํ Parquet ํ์ผ์ ๋ ธ๋์ ์ปค๋ฎค๋ํฐ ๋ฐ์ดํฐ๋ฅผ Neo4j์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. Neo4j์ ์ ์ฅํ๋ฉด Local๊ณผ Global ๊ฒ์๊ธฐ๋ฅผ LangChain์ด๋ LlamaIndex์ ํตํฉํ ์ ์์ต๋๋ค.
์ด ํตํฉ ๊ตฌ์ฑ์์ Neo4j๋ ๋ ๊ฐ์ง ์ญํ ์ ๋์์ ์ํํฉ๋๋ค. MS GraphRAG์ ์ปค๋ฎค๋ํฐ ๊ณ์ธต๊ณผ ์์ฝ์ ์ ์ฅํ๋ ์ ์ฅ์ ์ญํ ๊ณผ, Cypher ๊ทธ๋ํ ํ์์ ์ํ ๊ทธ๋ํ DB ์ญํ ์ ๋๋ค. MS GraphRAG๊ฐ ์์ฑํ Community ๋ ธ๋, CommunityReport ๋ ธ๋๊ฐ Neo4j์ ๊ทธ๋๋ก ์ ์ฌ๋๋ฏ๋ก, Neo4j ์์์ ์ปค๋ฎค๋ํฐ ๊ฐ๋ ์ด ์์ ํ ์ด์์๊ฒ ๋ฉ๋๋ค.
flowchart TB
DOC["์๋ณธ ๋ฌธ์"]
subgraph Step1["Step 1: MS GraphRAG ์ธ๋ฑ์ฑ"]
MSRAG["graphrag index\n(์ปค๋ฎค๋ํฐ ๊ตฌ์กฐ ์์ฑ)"]
PARQUET["Parquet ํ์ผ\n(entities, community_reports ๋ฑ)"]
MSRAG --> PARQUET
end
subgraph Step2["Step 2: Neo4j ์ ์ฌ"]
IMPORT["Parquet โ Neo4j ์ํฌํธ\n(CSV ๋ณํ + LOAD CSV)"]
NEO4J_DB[("Neo4j Graph DB\n- Entity ๋
ธ๋\n- Community ๋
ธ๋ โญ\n- CommunityReport ๋
ธ๋ โญ\n- Chunk ๋
ธ๋\n- ๋ฒกํฐ ์ธ๋ฑ์ค ์์ฑ")]
IMPORT --> NEO4J_DB
end
subgraph Step3["Step 3: ํตํฉ ๊ฒ์"]
LOCAL_NEO["Local Search\n(๋ฒกํฐ ๊ฒ์ + ๊ทธ๋ํ ํ์)"]
GLOBAL_NEO["Global Search\n(์ปค๋ฎค๋ํฐ ์์ฝ Map-Reduce)"]
LANGCHAIN["LangChain / LlamaIndex ํตํฉ"]
NEO4J_DB --> LOCAL_NEO
NEO4J_DB --> GLOBAL_NEO
LOCAL_NEO --> LANGCHAIN
GLOBAL_NEO --> LANGCHAIN
end
DOC --> Step1 --> Step2 --> Step3
9.2 Neo4j GraphRAG์ ์ปค๋ฎค๋ํฐ ์์ฝ์ ์ง์ ์ถ๊ฐํ๊ธฐ
๋ฐ๋์ MS GraphRAG๋ฅผ ๋จผ์ ๊ฑฐ์น ํ์๋ ์์ต๋๋ค. Neo4j GraphRAG๋ก ๊ตฌ์ถํ ๊ทธ๋ํ ์์์๋ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Neo4j GDS(Graph Data Science) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Leiden, Louvain ๋ฑ ์ปค๋ฎค๋ํฐ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ๊ณต์ ์ง์ํฉ๋๋ค. GDS๋ก ์ปค๋ฎค๋ํฐ๋ฅผ ํ์งํ ๋ค, ๊ฐ ์ปค๋ฎค๋ํฐ์ ์ํฐํฐยท๊ด๊ณ ์ ๋ณด๋ฅผ ์์งํ์ฌ LLM์ ์ ๋ฌํ๋ฉด ์ปค๋ฎค๋ํฐ ์์ฝ ๋ ธ๋๋ฅผ ์ง์ ์์ฑํ ์ ์์ต๋๋ค.
-- Neo4j GDS๋ก Leiden ์ปค๋ฎค๋ํฐ ํ์ง ์คํ
CALL gds.leiden.write('my-graph', {
writeProperty: 'community',
maxLevels: 10
})
YIELD communityCount, modularity, levels
์ด ๋ฐฉ์์ MS GraphRAG์ ์์ ์๋ํ ํ์ดํ๋ผ์ธ์ ๋นํด ์๋นํ ์๋ ์์ ์ด ํ์ํ์ง๋ง, ์ด๋ฏธ Neo4j์ ์ด์ ์ค์ธ ๊ทธ๋ํ๊ฐ ์๋ค๋ฉด ์ฌ์ธ๋ฑ์ฑ ์์ด ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
10. ์ฑ๋ฅ๊ณผ ๋น์ฉ ๋น๊ต
flowchart LR
subgraph Cost["๋น์ฉ ๊ตฌ์กฐ"]
MS_COST["Microsoft GraphRAG\n\n์ธ๋ฑ์ฑ(Standard): ๋งค์ฐ ๋์\nโ 500ํ์ด์ง ์ฝ $50~100+\n\n์ธ๋ฑ์ฑ(LazyGraphRAG): ๊ทน์ \nโ Standard ๋๋น 0.1% ๋น์ฉ\n\n์ง์ Global: ์ค๊ฐ~๋์\n(์ปค๋ฎค๋ํฐ ์ ์ฒด Map-Reduce)"]
NEO_COST["Neo4j GraphRAG\n\n์ธ๋ฑ์ฑ: ์ค๊ฐ\n(์คํค๋ง ๊ธฐ๋ฐ ์ ํ์ ์ถ์ถ)\nโ 500ํ์ด์ง ์ฝ $0.5~5\n\n์ง์: ๋ฎ์\n(Cypher ์ง์ ํ์)"]
end
subgraph Speed["์๋ ๋น๊ต"]
MS_SPD["MS GraphRAG\n\n์ธ๋ฑ์ฑ: ๋๋ฆผ (์์๊ฐ)\n์ ์ฒด ๋ฌธ์ LLM ์ฒ๋ฆฌ ํ์\n(LazyGraphRAG: ์๋ถ)\n\n์ง์ Local: ๋น ๋ฆ\n์ง์ Global: ๋๋ฆผ (Map-Reduce)"]
NEO_SPD["Neo4j GraphRAG\n\n์ธ๋ฑ์ฑ: ๋น ๋ฆ (์์ญ๋ถ)\nํ์ํ ์ํฐํฐ๋ง ์ถ์ถ\n\n์ง์: ๋งค์ฐ ๋น ๋ฆ\n(๊ทธ๋ํ ํฌ์ธํฐ ์ถ์ )"]
end
๋์ผํ 500ํ์ด์ง ์ฝํผ์ค๋ฅผ ์ธ๋ฑ์ฑํ๋ ๋ฐ Neo4j ๋ฐฉ์์ ์ฝ 3๋ถ์ด ์์๋๊ณ ๋น์ฉ์ ์ฝ $0.50์ ๋๋ค. ํ์ง ๋ฒค์น๋งํฌ์์๋ GraphRAG ์ฑ๋ฅ์ 70-90%๋ฅผ 1/100์ ๋น์ฉ์ผ๋ก ๋ฌ์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ neo4j-graphrag ํจํค์ง ์์ฒด์ ์ปค๋ฎค๋ํฐ ์์ฝ ํ์ดํ๋ผ์ธ์ด ์์ด ์ ์ฒด ์กฐ๋ง ์ง์("๋ชจ๋ ๋ฌธ์์ ์ฃผ์ ์ฃผ์ ๋?")์์๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋จ์ด์ง๋๋ค.
Microsoft GraphRAG๋ Standard ๋ฐฉ์์ ๋น์ฉ์ด ๋์ง๋ง, 2024๋ 11์ ๋ฐํ๋ LazyGraphRAG๋ฅผ ์ฌ์ฉํ๋ฉด Standard ๋๋น 0.1% ๋น์ฉ์ผ๋ก ๋๋ฑํ ์ง์ ํ์ง์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
11. ์ธ์ ์ด๋ ๊ฒ์ ์ ํํ๋๊ฐ
11.1 ๊ฒฐ์ ํธ๋ฆฌ
flowchart TD
START["GraphRAG ์ ํ ์์"]
Q1{"์ฃผ์ ์ง์ ์ ํ์?"}
Q2{"๋๋ฉ์ธ์ด\n๋ช
ํํ๊ฐ?"}
Q3{"๋ฐ์ดํฐ ์
๋ฐ์ดํธ\n๋น๋๋?"}
Q4{"์ ์ฒด ์กฐ๋ง์ด\nํ์ํ๊ฐ?"}
MS_ONLY["Microsoft GraphRAG\n\n์ ์ฒด ๋ฌธ์ ์กฐ๋ง ์ง์ ์ฐ์ \n'์ด ๋ฐ์ดํฐ์ ์ฃผ์ ์ฃผ์ ๋?'"]
NEO_ONLY["Neo4j GraphRAG\n\n๊ด๊ณ ํ์ ์ง์ ์ฐ์ \n'A์ B์ ๊ด๊ณ๋?'"]
HYBRID["๋ ์์คํ
ํตํฉ\n\nMS GraphRAG๋ก ์ธ๋ฑ์ฑ ํ\nNeo4j์ ์ ์ฅ\nโ ์ ์ฒด ์กฐ๋ง + ๊ด๊ณ ํ์ ๋ชจ๋"]
Q1 --> |"์ ์ฒด ์ฃผ์ /ํจํด ํ์
"| Q4
Q1 --> |"ํน์ ๊ด๊ณ/์ํฐํฐ ํ์"| Q2
Q4 --> |"ํ์"| MS_ONLY
Q4 --> |"๋ถํ์"| NEO_ONLY
Q2 --> |"๋ช
ํ (์จํจ๋ก์ง ๊ฐ๋ฅ)"| Q3
Q2 --> |"๋ถ๋ช
ํ"| MS_ONLY
Q3 --> |"์์ฃผ ๋ณ๊ฒฝ"| NEO_ONLY
Q3 --> |"๊ฑฐ์ ์ ๋ณ๊ฒฝ"| MS_ONLY
MS_ONLY --> |"๊ด๊ณ ํ์๋ ํ์"| HYBRID
NEO_ONLY --> |"์ ์ฒด ์กฐ๋ง๋ ํ์"| HYBRID
11.2 ์ํฉ๋ณ ์ถ์ฒ
| ์ํฉ | ์ถ์ฒ | ์ด์ |
|---|---|---|
| "์ด ๋ณด๊ณ ์๋ค์ ํต์ฌ ํจํด์ ํ์ ํ๊ณ ์ถ๋ค" | MS GraphRAG | Global Search๊ฐ ์ ์ฒด ์กฐ๋ง์ ์ต์ |
| "A ๊ธฐ์ ์ด B ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ์ฐ์ด๋์ง ์ถ์ " | Neo4j GraphRAG | Cypher๋ก ์ ๋ฐํ ๊ด๊ณ ํ์ |
| "์ฅ์ ๋ณด๊ณ ์ ์ ์ฒด์์ ๋ฐ๋ณต ํจํด ๋ถ์" | MS GraphRAG | ๊ธ๋ก๋ฒ ์์ค ์๋ ๋ถ์ |
| "์์คํ ์ทจ์ฝ์ ์ํฅ๋ ๋ถ์" | Neo4j GraphRAG | ๋ฉํฐํ ๊ด๊ณ ํ์ |
| "๋๋ฉ์ธ์ด ์ ์ ์๋ ๊ธฐ์ ์ง์ ๊ด๋ฆฌ" | Neo4j GraphRAG | ์คํค๋ง ๊ธฐ๋ฐ ์ ๋ฐ ์ถ์ถ |
| "์ฒ์ ๋ณด๋ ๋๋ฉ์ธ, ์ด๋ค ์ฃผ์ ๊ฐ ์๋์ง ๋ชจ๋ฆ" | MS GraphRAG | ์๋ ํ ๋ง ๋ฐ๊ฒฌ |
| "์ธ๋ฑ์ฑ ๋น์ฉ์ ์ต์ํํ๊ณ ์ถ๋ค" | MS LazyGraphRAG | Standard ๋๋น 0.1% ๋น์ฉ |
| "์ด์ ์์คํ ์ ์ค์๊ฐ ์ง์ ์ถ๊ฐ" | Neo4j GraphRAG | ์ฆ๋ถ ์ ๋ฐ์ดํธ + GDS ์ปค๋ฎค๋ํฐ |
| "๋ ์ ํ์ ์ง์๊ฐ ๋ชจ๋ ํ์" | ํตํฉ ๊ตฌ์ฑ | MS GraphRAG โ Neo4j ์ ์ฅ |
12. ๊ฒฐ๋ก
๋ ์์คํ ์ ๊ฒฝ์ ๊ด๊ณ๊ฐ ์๋๋ผ ๊ฐ์ ์ํ๋ ์์ญ์ด ๋ค๋ฅธ ์ํธ๋ณด์์ ๋๊ตฌ์ ๋๋ค.
Microsoft GraphRAG์ ๊ฐ์ : ๋๋ฉ์ธ ์ง์์ด๋ ์จํจ๋ก์ง ์์ด๋ ๋๊ท๋ชจ ๋น์ ํ ๋ฌธ์์์ ์ฃผ์ ์ ํจํด์ ์๋์ผ๋ก ๋ฐ๊ฒฌํฉ๋๋ค. Global Search๋ก ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์กฐ๋งํ๋ ์ง์์์ ๋ ๋ณด์ ์ ๋๋ค. LazyGraphRAG๋ก ์ธ๋ฑ์ฑ ๋น์ฉ์ 0.1% ์์ค์ผ๋ก ๋ฎ์ถ ์ ์์ผ๋ฉฐ, DRIFT Search๋ก ๊ธ๋ก๋ฒ ๋งฅ๋ฝ๊ณผ ๋ก์ปฌ ์ ๋ฐ๋๋ฅผ ์ตํฉํฉ๋๋ค. ๋จ, ํ์ค ๋ฐฉ์์ ์ธ๋ฑ์ฑ ๋น์ฉ์ด ๋๊ณ ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ ต์ต๋๋ค.
Neo4j GraphRAG์ ๊ฐ์ : ๋๋ฉ์ธ ์คํค๋ง๋ฅผ ์ ์ํ๋ฉด ์ ๋ฐํ๊ณ ์ถ์ ๊ฐ๋ฅํ ๊ด๊ณ ํ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ์์คํ ์ ํตํฉํ๊ธฐ ์ฝ๊ณ , ์ค์๊ฐ ๋ฐ์ดํฐ ์ถ๊ฐ๊ฐ ์์ฐ์ค๋ฝ์ต๋๋ค. Neo4j GDS๋ก ์ปค๋ฎค๋ํฐ ํ์ง ์์ฒด๋ ๊ฐ๋ฅํ์ง๋ง, neo4j-graphrag ํจํค์ง๊ฐ Global Search ์์ค์ ์๋ํ๋ ์ ์ฒด ์กฐ๋ง ๊ธฐ๋ฅ์ ๋ด์ฅํ์ง๋ ์์ต๋๋ค.
์ค๋ฌด์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ตฌ์ฑ์ ๋ ์ ๊ทผ๋ฒ์ ๊ฒฐํฉํ๋ ๊ฒ์ ๋๋ค. Microsoft GraphRAG๋ก ์ธ๋ฑ์ฑํ๊ณ ๊ฒฐ๊ณผ๋ฅผ Neo4j์ ์ ์ฅํ๋ฉด, ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฐ ๊ธ๋ก๋ฒ ์กฐ๋ง๊ณผ Cypher ๊ธฐ๋ฐ ์ ๋ฐ ๊ด๊ณ ํ์์ ํ๋์ ์์คํ ์์ ๋ชจ๋ ํ์ฉํ ์ ์์ต๋๋ค.
flowchart LR
subgraph Summary["ํ๋์ ๋น๊ต"]
direction TB
MS_S["Microsoft GraphRAG\n\nโ
์ ์ฒด ์กฐ๋ง (Global Search)\nโ
์จํจ๋ก์ง ๋ถํ์\nโ
์๋ ์ปค๋ฎค๋ํฐ ํ์ง + LLM ์์ฝ\nโ
DRIFT Search (๊ธ๋ก๋ฒ+๋ก์ปฌ ์ตํฉ)\nโ
LazyGraphRAG (๋น์ฉ 0.1%)\nโ
๋ฏธ์ง ํ
๋ง ์๋ ๋ฐ๊ฒฌ\nโ Standard ์ธ๋ฑ์ฑ ๋น์ฉ ๋์\nโ ์ค์๊ฐ ์
๋ฐ์ดํธ ์ด๋ ค์\nโ ์ ๋ฐ ๊ด๊ณ ํ์ ์ ํ"]
NEO_S["Neo4j GraphRAG\n\nโ
์ ๋ฐ ๊ด๊ณ ํ์ (Cypher)\nโ
์ค์๊ฐ ์
๋ฐ์ดํธ\nโ
๋ฉํฐํ ์ถ๋ก \nโ
๋ฎ์ ์ธ๋ฑ์ฑ ๋น์ฉ\nโ
๊ณต์ ์ง์ (1st-party)\nโ
GDS๋ก ์ปค๋ฎค๋ํฐ ํ์ง ๊ฐ๋ฅ\nโ Global Search ํจํค์ง ๋ฏธ๋ด์ฅ\nโ ์คํค๋ง ์ฌ์ ์ค๊ณ ํ์\nโ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ ํ์"]
INT_S["ํตํฉ ๊ตฌ์ฑ\n(MS + Neo4j)\n\nโ
์ ์ฒด ์กฐ๋ง ๊ฐ๋ฅ\nโ
์ ๋ฐ ๊ด๊ณ ํ์ ๊ฐ๋ฅ\nโ
Cypher ํ์ฉ\nโ ๏ธ ๊ตฌ์ฑ ๋ณต์ก๋ ์ฆ๊ฐ\nโ ๏ธ ๋ ์์คํ
์ด์ ํ์"]
end
์์ฑ์ผ: 2026-05-18
์ํคํ
์ฒํ
์์ ๋ฌธ์: Microsoft GraphRAG โ ์ง์ ๊ทธ๋ํ ๊ธฐ๋ฐ ์ฐจ์ธ๋ RAG ์์คํ