STUDY/LLM

[LLM] Graph Schema ์„ค๊ณ„, ๋ฒกํ„ฐ ๊ฒ€์ƒ‰&Text-to-Cypher ์กฐํšŒ

seoyn 2026. 7. 12. 21:31

1. LLM ์ด์šฉํ•œ ๊ทธ๋ž˜ํ”„ ์Šคํ‚ค๋งˆ ์„ค๊ณ„(GraphRAG ๊ด€์ )

 : ๋น„์ •ํ˜• ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ LLM์— ๋„ฃ์–ด Neo4j์— ์ ์žฌ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ/๊ด€๊ณ„/์†์„ฑ ์Šคํ‚ค๋งˆ&Cypher ์ฟผ๋ฆฌ ์ž๋™ ์ƒ์„ฑ

โ—๏ธ LLM ์‚ฐ์ถœ๋ฌผ : ํ•ญ์ƒ ์ดˆ์•ˆ. ๋ฐ์ดํ„ฐ ์ค‘๋ณต·๊ด€๊ณ„ ๋ฐฉํ–ฅ·๋„ค์ด๋ฐ ๊ทœ์น™·๊ณ ์œ  ์‹๋ณ„์ž·๊ฒ€์ƒ‰ ๋ชฉ์  ๋“ฑ์€ ์‚ฌ๋žŒ์ด ๊ฒ€ํ† 

 

1-1. ๋…ธ๋“œ(Label) ์„ค๊ณ„ ์›์น™

 • ๋ฌธ์„œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์‹๋ณ„, ๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ์ฐธ์กฐ ๊ฐ€๋Šฅ. ํƒ์ƒ‰์˜ ์‹œ์ž‘์ ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด๋กœ ๋งŒ๋“ฆ

 • ํ›„๋ณด : ์‚ฌ๋žŒ, ์กฐ์ง, ์žฅ์†Œ, ์ƒํ’ˆ, ๋ฌธ์„œ, ์‚ฌ๊ฑด, ๊ฐœ๋…, ๊ธฐ์ˆ , ํ”„๋กœ์ ํŠธ ๋“ฑ

 • ๋ช…๋ช… ๊ทœ์น™ : Pascal(ex. Person, Company, Product)

 • ๋™์˜์–ด : ํ•˜๋‚˜์˜ Label๋กœ ํ†ตํ•ฉ(ex. ๊ธฐ์—…/ํšŒ์‚ฌ/์—…์ฒด → Company)

 • ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ์†Œ ํ•˜๋‚˜์˜ ์‹๋ณ„ ์†์„ฑ(name, id, code ๋“ฑ) ๊ฐ€์ ธ์•ผ ํ•จ

 

1-2. ๊ด€๊ณ„(Relationship) ์„ค๊ณ„ ์›์น™

 •  ๋‘ ๋…ธ๋“œ ์‚ฌ์ด ๋ฐฉํ–ฅ์„ฑ ์žˆ๋Š” ํ–‰์œ„/์—ญํ• /์—ฐ๊ด€ ๊ด€๊ณ„๋กœ ๋งŒ๋“ฆ(๋‹จ์ˆœํžˆ ๊ฐ™์€ ๋ฌธ์žฅ์— ๋“ฑ์žฅํ–ˆ๋‹ค๋Š” ์ด์œ  X)

 • ๋ช…๋ช… ๊ทœ์น™ : ๋Œ€๋ฌธ์ž SNAKE_CASE, ๋™์‚ฌ/๋™์‚ฌ๊ตฌ(WORKS_FOR, LOCATED_IN ๋“ฑ)

 • ๊ด€๊ณ„ ์†์„ฑ : ๊ด€๊ณ„ ์ž์ฒด์— ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด(ex. since, role ๋“ฑ)

 

1-3. ์†์„ฑ(Property) ์„ค๊ณ„ ์›์น™

 • String, Integer, Float, Boolean, Date, List

 • ๋ช…๋ช… ๊ทœ์น™ : camelCase

 • ๊ฐ’์€ ๋ฌธ์„œ์— ์žˆ๋Š” ๊ฒƒ๋งŒ ์‚ฌ์šฉ(์—†๋Š” ์ •๋ณด ์ž„์˜ ์ƒ์„ฑ X)

 • ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ณ„๋„ ์†์„ฑ์œผ๋กœ ๋ถ„๋ฆฌ(ex. ๋‚ ์งœ/๊ธˆ์•ก/์ˆ˜๋Ÿ‰/์ƒํƒœ/์—ญํ• )

 

1-4. ์ œ์•ฝ์กฐ๊ฑด/์ธ๋ฑ์Šค ์„ค๊ณ„

 • ์ฃผ์š” ๋…ธ๋“œ์˜ ๊ณ ์œ  ์‹๋ณ„ ์†์„ฑ : UNIQUE ์ œ์•ฝ์กฐ๊ฑด

 • ์ž์ฃผ ๊ฒ€์ƒ‰๋  ์†์„ฑ : ์ธ๋ฑ์Šค(ex. ์ด๋ฆ„·์ œ๋ชฉ·์ฝ”๋“œ·๋‚ ์งœ·์ƒํƒœ·์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ)

  - UNIQUE ์ œ์•ฝ ์†์„ฑ์—๋Š” ์ค‘๋ณต์œผ๋กœ ์ผ๋ฐ˜ ์ธ๋ฑ์Šค ์ƒ์„ฑ X

 

1-5. ์ƒ์„ฑ ์ „๋žต 

 • ๋ฌธ์„œ ๋ถ„๋Ÿ‰ ์ ์Œ : ํ•˜๋‚˜์˜ ํ”„๋กฌํ”„ํŠธ๋กœ ์Šคํ‚ค๋งˆ+์ฟผ๋ฆฌ+๋ช…์„ธ์„œ ์ƒ์„ฑ ๊ฐ€๋Šฅ

 • ๋ฌธ์„œ ๋ถ„๋Ÿ‰ ๋งŽ์Œ : ๋‹จ๊ณ„์  ์ฒด์ธ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ํ’ˆ์งˆ์— ์ข‹์Œ

 

1-6. ์„ค๊ณ„ ๊ทผ๊ฑฐ(Rationale) ์ž‘์„ฑ ํ•„์š”ํ•œ ์ด์œ 

 - LLM์ด ์ƒ์„ฑํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ๋žŒ์ด ๊ฒ€ํ†  ์‹œ ํ•จ๊ป˜ ์ œ์‹œ๋˜์–ด์•ผ ์‹ ๋ขฐ ๊ฐ€๋Šฅ

 • ์™œ ์ด ๊ฐœ์ฒด๋ฅผ ๋…ธ๋“œ๋กœ, ์™œ ์ € ์—ฐ๊ฒฐ์„ ๊ด€๊ณ„๋กœ ์‚ผ์•˜๋Š”์ง€

 • ์–ด๋–ค ์†์„ฑ์„ ์‹๋ณ„์ž/๊ฒ€์ƒ‰ ๋Œ€์ƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋Š”์ง€

 • ๋ฌธ์„œ์— ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ด ํ™•์ •ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„

 

2. ์˜๋ฏธ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰(Semantic Search) ์œ„ํ•œ ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ

2-1. ํ•„์š”์„ฑ

 : Neo4j๋Š” ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์œผ๋กœ, ์˜๋ฏธ ๊ธฐ๋ฐ˜ ์งˆ์˜๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์–ด ๋…ธ๋“œ์— ์ž„๋ฒ ๋”ฉ ํ•„๋“œ ์ถ”๊ฐ€

 - ํ•„๋“œ ์ƒ์„ฑ ์‹œ ํ•„์š”ํ•œ 3๊ฐ€์ง€

 โž€ ์ž„๋ฒ ๋”ฉ ๋Œ€์ƒ ํ…์ŠคํŠธ : ๊ธฐ์กด ์†์„ฑ ๋˜๋Š” ์ƒˆ ํ…์ŠคํŠธ 

 โž ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ : Neo4j๋Š” ๋ฒกํ„ฐ ์ง์ ‘ ์ƒ์„ฑ X → OpenAI ๋“ฑ ์™ธ๋ถ€ ์ž„๋ฒ ๋”ฉ API ํ˜ธ์ถœ ํ•„์š”(๋ชจ๋ธ์— ๋”ฐ๋ผ ์ถœ๋ ฅ ๋ฒก์ฒ˜ ์ฐจ์› ์ˆ˜ ๊ฒฐ์ •)

 โž‚ ๋ฒกํ„ฐ ์ €์žฅํ•  ๋…ธ๋“œ ์†์„ฑ : ์ด ์†์„ฑ์— ๋ฒกํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์•ผ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

 

2-2. ๋ฒกํ„ฐ ์ธ๋ฑ์Šค

 : ๊ณ ์ฐจ์› ๋ฒกํ„ฐ ๊ณต๊ฐ„์—์„œ ์œ ์‚ฌ ๋ฒกํ„ฐ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•œ ํŠน์ˆ˜ ์ธ๋ฑ์Šค(ANN ์•Œ๊ณ ๋ฆฌ์ฆ˜)

 - ์ธ๋ฑ์Šค ์—†์ด๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ ๋น„๊ต(๋น„ํšจ์œจ์ )

 

2-3. ๋ฒกํ„ฐ ๊ฐ’ ์ €์žฅ

 - ๋…ธ๋“œ์˜ ์ž„๋ฒ ๋”ฉ ์†์„ฑ์— ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ ์ €์žฅ : db.create.setNodeVectorProperty() ํ•จ์ˆ˜(ํ”„๋กœ์‹œ์ €) ์‚ฌ์šฉ

 

2-4. SEARCH์ ˆ(์‹ ๊ทœ ๋ฌธ๋ฒ•)

 : MATCH / OPTIONAL MATCH์— ์ข…์†๋œ ์„œ๋ธŒ์ ˆ(๋…๋ฆฝ์ ˆ X)

[OPTIONAL] MATCH (์กฐํšŒํ•  ๋…ธ๋“œ)
SEARCH ๋…ธ๋“œ IN(
    VECTOR INDEX vector_index_name
    FOR embedding_vector  // ์งˆ์˜ ๋ฒกํ„ฐ
    [WHERE ํ•„ํ„ฐ์กฐ๊ฑด]        // ์ธ๋ฑ์Šค ๋‚ด ํ•„ํ„ฐ๋ง(์„ ํƒ)
    LIMIT ์กฐํšŒ๊ฐœ์ˆ˜          // ํ•„์ˆ˜ : top_k
)
[SCORE AS ๋ณ„์นญ]            // ์œ ์‚ฌ๋„ ์ ์ˆ˜(์„ ํƒ)

 

3. Text-to-Cypher

 : ์ž์—ฐ์–ด ์งˆ์˜๋ฅผ Neo4j์˜ Cypher๋กœ ๋ณ€ํ™˜ → ๊ทธ๋ž˜ํ”„๋ฅผ ์ž์—ฐ์–ด๋กœ ์กฐํšŒ

3-1. GraphCypherQAChain ๋™์ž‘ ๊ตฌ์กฐ

 ์‚ฌ์šฉ์ž ์ž์—ฐ์–ด ์งˆ๋ฌธ
             ↓ [1๋‹จ๊ณ„ LLM] ๊ทธ๋ž˜ํ”„ ์Šคํ‚ค๋งˆ ์ฐธ๊ณ 
Cypher ์ฟผ๋ฆฌ ์ƒ์„ฑ
             ↓ Neo4j ์‹คํ–‰
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ(์ปจํ…์ŠคํŠธ)
             ↓ [2๋‹จ๊ณ„ LLM] ์ปจํ…์ŠคํŠธ + ์›๋ž˜ ์งˆ๋ฌธ
์ตœ์ข… ์ž์—ฐ์–ด ๋‹ต๋ณ€

 - ๊ฐ์ฒด : ์ƒ์„ฑ์ž ๋Œ€์‹  from_llm() ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋กœ ์ƒ์„ฑ

 

3-2. ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ

 • ํ•„์ˆ˜

graph ์—ฐ๊ฒฐํ•  Neo4jGraph ๊ฐ์ฒด
allow_dangerous_requests True ๋ช…์‹œ ํ•„์ˆ˜(DB ๋ณ€๊ฒฝ ์ฟผ๋ฆฌ ํ—ˆ์šฉ์— ๋Œ€ํ•œ ๋™์˜)

 

 • LLM ๋ถ„๋ฆฌ

llm Cypher ์ƒ์„ฑ + ๋‹ต๋ณ€ ์ƒ์„ฑ์— ๋™์ผ LLM ์‚ฌ์šฉ
cypher_llm Cypher ์ƒ์„ฑ ์ „์šฉ LLM
qa_llm ๋‹ต๋ณ€ ์ƒ์„ฑ ์ „์šฉ LLM

 

 • ํ”„๋กฌํ”„ํŠธ / ์Šคํ‚ค๋งˆ ์ œ์–ด

cypher_prompt Cypher ์ƒ์„ฑ์šฉ ์ปค์Šคํ…€ ํ”„๋กฌํ”„ํŠธ
({schema}, {question} ๋ณ€์ˆ˜ ํฌํ•จ)
qa_prompt ๋‹ต๋ณ€ ์ƒ์„ฑ์šฉ ์ปค์Šคํ…€ ํ”„๋กฌํ”„ํŠธ
include_types / exclude_types LLM์— ๋…ธ์ถœ / ์ œ์™ธํ•  ๋…ธ๋“œ•๊ด€๊ณ„ ํƒ€์ž… ์ง€์ •

 

 • ๊ฒฐ๊ณผ ์ œ์–ด

top_k LLM์— ์ „๋‹ฌํ•  ์ตœ๋Œ€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฑด์ˆ˜(๊ธฐ๋ณธ๊ฐ’ 10)
return_intermediate_steps True์‹œ ์ƒ์„ฑ๋œ Cypher์™€ ์กฐํšŒ ๊ฒฐ๊ณผ๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜(๊ธฐ๋ณธ๊ฐ’ False)
return_direct True์‹œ 2๋‹จ๊ณ„(์ž์—ฐ์–ด ๋‹ต๋ณ€ ์ƒ์„ฑ) ์ƒ๋žต, DB ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜(๊ธฐ๋ณธ๊ฐ’ False)
validate_cypher True์‹œ ๊ด€๊ณ„ ๋ฐฉํ–ฅ ์˜ค๋ฅ˜ ๋“ฑ ์ž๋™ ๊ต์ •(๊ธฐ๋ณธ๊ฐ’ False)
use_function_response True์‹œ DB ๊ฒฐ๊ณผ๋ฅผ tool/function ์‘๋‹ต ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ → ์ •ํ™•๋„ ํ–ฅ์ƒ(๊ธฐ๋ณธ๊ฐ’ False)
verbose ์ค‘๊ฐ„ ๊ณผ์ •(Cypher, ์ปจํ…์ŠคํŠธ) ์ถœ๋ ฅ(๊ธฐ๋ณธ๊ฐ’ False)

 

3-3. ์ฃผ์š” ์†์„ฑ

graph_schema LLM์— ์ „๋‹ฌ๋˜๋Š” ํ˜„์žฌ ๊ทธ๋ž˜ํ”„ ์Šคํ‚ค๋งˆ ๋ฌธ์ž์—ด
input_key ์ž…๋ ฅ ํ‚ค(๊ธฐ๋ณธ๊ฐ’ "query")
output_key ์ถœ๋ ฅ ํ‚ค(๊ธฐ๋ณธ๊ฐ’ "result")

'STUDY > LLM' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LLM] Neo4jGraph์™€ Cypher ์ฟผ๋ฆฌ - 2  (0) 2026.07.09
[LLM] Neo4jGraph์™€ Cypher ์ฟผ๋ฆฌ  (0) 2026.07.07
[LLM] RAG - evaluation  (0) 2026.07.06
[LLM] Advanced RAG  (0) 2026.07.05
[LLM] RAG - Retriever  (0) 2026.07.04