Knowledge Graphs and LLMs in Action · Chapter 15 · pp. 397-434

질문이 흐름을 얻을 때,
그래프는 조언자가 된다

LangGraph의 공유 상태와 조건부 흐름, Neo4j의 스키마, LLM의 자연어 해석, Streamlit의 대화형 화면을 한데 엮어 전문가의 조사 절차를 닮은 지식그래프 QA 에이전트를 구현한다.

좋은 에이전트는 한 번에 영리한 답을 뱉는 기계가 아니다. 질문을 분류하고, 지도를 펼치고, 길을 고르고, 오류가 나면 되돌아가며, 끝내 사람이 판단할 수 있는 형태로 증거를 내놓는 작업의 짜임이다.
LangGraphStreamlitNeo4j · CypherShared StateExpert EmulationSpatial · Temporal · Historical Analysis
Chapter thesis

제14장의 설계를, 실행 가능한 한 채의 집으로 세우다

제15장은 앞 장에서 정리한 의도 탐지, 스키마 추출, Text-to-Cypher, 질의 실행, 시각화, 요약을 실제 애플리케이션으로 묶는다. 핵심은 LLM 하나에 모든 일을 떠맡기는 데 있지 않다. 서로 다른 책무를 가진 단계들을 명시적 그래프로 배치하고, 그 사이를 공유 상태가 오가게 하며, 오류와 출력 유형에 따라 길을 갈라 주는 데 있다.

01 · INPUT질문·선택

자연어 요청과 화면에서 선택한 노드·관계를 함께 받는다.

02 · INTENT의도 탐지

표·그래프·지도 가운데 결과가 놓일 형식을 판정한다.

03 · SCHEMA스키마 추출

기술 스키마를 LLM이 읽는 개념 언어로 번역한다.

04 · QUERYText-to-Cypher

질문·스키마·선택·예시를 Cypher로 엮는다.

05 · EXECUTION실행·재시도

DB 결과를 받고 오류면 최대 세 번 질의를 고친다.

06 · OUTPUT시각화·요약

그래프·지도는 설명을 더하고, 표는 곧장 반환한다.

1

전문가 모사

“전문가라면 무엇을 먼저 보고, 어떤 중간 판단을 거쳐, 무엇을 증거로 제시하는가”를 시스템 단계로 옮긴다.

2

관찰 가능성

각 단계의 입력·출력·오류·이유를 상태와 이벤트로 남겨 디버깅뿐 아니라 개선 자료로 삼는다.

3

인간 중심 결론

에이전트는 최종 판정을 대신하지 않는다. 사람이 탐색하고 검증할 수 있는 그래프·지도·요약을 조직한다.

이 장이 만드는 것 — LangGraph가 백엔드의 판단 흐름을 지휘하고, 구성 공급자가 프롬프트와 도메인 주석을 관리하며, 스키마 공급자가 Neo4j의 구조를 번역하고, 질문 처리 인터페이스가 상태 변화를 이벤트로 바꾸며, Streamlit이 이를 대화·선택·그래프·지도·표로 보여 주는 종단 QA 시스템이다.
15.1 · 398-400

LangGraph의 문법: 함수가 아니라 상태 위에서 만나는 행위자들

기본 RAG는 문서를 찾고 답을 생성한다. LangGraph에서는 두 함수가 값을 서로 직접 건네기보다 하나의 공유 상태를 읽고 자신의 결과만 덧붙인다. 교재는 이를 여러 사람이 함께 쓰는 백판에 비유한다. 누구도 다른 구성요소의 내부를 알 필요가 없고, 다음 단계는 축적된 상태만 읽으면 된다.

STARTquestionRetrievedocuments 추가Generateanswer 추가GLOBAL STATE · question · documents · answer각 노드는 필요한 항목을 읽고, 새 항목만 반환한다
그림 15.2의 핵심: 에이전트는 결합도가 낮고, 진화하는 상태 객체가 파이프라인의 공용 기억이 된다.
DIRECTED GRAPH

노드는 책무, 간선은 실행 순서

각 노드는 하나의 에이전트 함수다. 간선은 다음 실행 대상을 정한다. 따라서 아키텍처 다이어그램이 곧 실행 가능한 프로그램 구조가 된다.

DYNAMIC EDGES

결과에 따라 길이 갈린다

질의 오류면 Text-to-Cypher로 되돌아가고, 그래프·지도면 요약으로 간다. 표라면 추가 설명 없이 종료할 수 있다.

LangGraph의 장점은 LLM을 전면에 세우는 데 있지 않다. 어떤 단계에서는 LLM을 쓰고, 어떤 단계에서는 규칙과 DB를 쓰며, 그 선택을 한눈에 보이는 흐름으로 만드는 데 있다.

15.1.1 · 399-401

백엔드는 네 덩어리로 나뉜다

코어에는 LangGraph 워크플로가 있고, 양옆에는 구성 공급자와 스키마 공급자가 놓인다. 아래에는 질문 처리 인터페이스가 있어 백엔드의 상태 변화를 프런트엔드가 소비할 수 있는 이벤트로 바꾼다. 책임을 나누되 맥락은 상태로 잇는 구조다.

Configuration ProviderYAML · notes · examplesJinja2 prompt templatesLangGraphintent → schema → query → executeretry / summarize / endSchema ProviderNeo4j · APOCtechnical → conceptualQuestion Processing Interfacestate updates → typed event streamStreamlit FrontendQuestionUpdates · Response
그림 15.4-15.6과 15.9를 하나로 압축한 구조. 각 공급자와 인터페이스가 코어 파이프라인의 부담을 분리한다.

LangGraph

질문 처리의 실행 순서와 조건 분기를 맡는다.

Configuration

프롬프트·도메인 메모·예시를 코드 밖에서 관리한다.

Schema

DB의 기술 구조를 업무 개념과 설명이 있는 문장으로 바꾼다.

Processing Interface

중간 상태를 update·result·visualization 이벤트로 바꾼다.

15.1.2 · 401-404

구성은 코드의 장식이 아니라, 도메인 지식의 저장소다

구성 공급자는 긴 프롬프트 문자열을 구현 코드에서 떼어 낸다. YAML에는 운용 메모, 질의 예시, 프롬프트 템플릿 경로가 놓이고, Jinja2는 실행 시점의 질문·스키마·선택 상태를 템플릿에 채운다. 이 분리는 유지보수와 버전 비교, 프롬프트 실험을 가능하게 한다.

NOTES

DB 사용법과 업무 규칙

Neo4j Point의 거리 함수, 카메라 이벤트를 확장할 조건, ‘기존 범죄자’를 판정하는 관계 등 스키마만으로 알 수 없는 운용 지식을 기록한다.

EXAMPLES

질문·Cypher·이유

날짜 접두사 검색, 연령·성별·범죄 관계를 결합한 질의처럼 기대 패턴을 few-shot 예시로 보여 준다.

PROMPTS

단계별 템플릿

의도 탐지, Text-to-Cypher, 요약 프롬프트를 별도 파일로 두어 독립적으로 수정하고 비교한다.

configuration/ ├─ chain_config.yaml │ ├─ notes │ ├─ examples │ └─ prompts └─ templates/ ├─ intent_detection.template ├─ text_to_cypher.template └─ summary.template get_prompt(name, **context) → system_message + rendered_prompt get_annotations() → notes + examples
설계상의 이익 — 프롬프트를 고칠 때 코어 로직을 건드리지 않고, 새로운 단계가 생겨도 텍스트 자원을 같은 체계에 추가하며, 실험별 프롬프트 버전을 추적할 수 있다. 코드와 지식의 경계가 분명할수록 시스템은 오래 버틴다.
15.1.3 · 404-408

데이터베이스의 뼈대를, 전문가가 읽는 언어로 번역하다

프로그램으로 얻을 수 있는 것은 apoc.meta.schema가 돌려주는 기술 스키마다. 그러나 LLM이 질의를 만들려면 업무 개념, 관계의 뜻, 속성 값의 문맥이 필요하다. 장에서는 YAML 기반의 skip 목록과 descriptions를 적용해 기술 구조를 개념 구조로 바꾸는 세 단계 서비스를 제시한다.

Technical Schema

Crime {id, uuid, created_on, updated_on, position, status}
ANPRCameraEvent {internal_id, timestamp, position}
AuditEvent {actor, created_at}
Vehicle {color, plate, make, style, state}
TECH_LINK / HAS_EVENT / COMMITTED

LLM-ready Conceptual Schema

Crime /* 수사 대상 사건 */ {date, primary_type, description, position, status}
ANPRCameraEvent /* 카메라의 차량 탐지 */ {timestamp, position}
Vehicle /* 번호판과 외형을 가진 차량 */ {color, plate, make, style, state}
Vehicle -[PLATE_READ]→ CameraEvent
Person -[COMMITTED]→ Crime

스키마 번역 실험

불필요한 클래스·속성·관계를 제거하고 설명을 붙이는 과정을 단계별로 본다.

버튼을 누르면 변환된 Markdown 스키마가 표시된다.

구현 객체의 역할

Property

속성명·타입·선택적 설명을 보존하고, LLM이 읽는 name: TYPE /* description */ 형식으로 출력한다.

Node / Relationship

노드·관계 유형과 속성을 전역 레지스트리에 모으고 skip 목록에 따라 항목을 거른다.

Neo4jSchema

APOC 결과를 파싱하고, 설정을 적용하며, 최종 Markdown 스키마를 만들고 질의를 실행한다.

스키마 번역은 정보를 줄이는 일이지만, 의미를 잃는 일은 아니다. 기술적 소음을 걷어 내고 업무의 표정을 되찾는 일이다.

15.1.4 · 408-409

공유 상태는 파이프라인의 기억이자 사건 기록부다

각 필드는 현재 어느 단계까지 왔는지 말해 준다. 원 질문, 시각화 의도, 스키마, 생성 질의, 오류, 요약, 재시도 횟수가 하나의 TypedDict에 쌓인다. 이 상태는 전달 상자가 아니라 조건 분기와 오류 회복을 가능하게 하는 실행 문맥이다.

question원래 사용자 요청
output_type / reasongraph · map · table과 선택 이유
schemaLLM-friendly 그래프 구조
query / reasoning / messageCypher와 생성 근거·원 응답
results_error실행 실패 메시지
summary / reason / analysis결과 요약과 분석 여부
information재시도에 공급할 오류 맥락
retries질의 재생성 횟수
{ "question": "선택한 사건 주변 1km 카메라를 보여 줘", "output_type": null, "schema": null, "query": null, "results_error": null, "summary": null, "retries": 0 }
정합성 점검 메모 — 원문 목록에는 output_type_reason과 에이전트 반환값 output_reason이 함께 나타나며, summary_analysissummary_analisys 표기도 혼재한다. 코드를 그대로 옮길 때는 실제 저장소의 키 이름을 확인해 통일해야 한다. 여기서는 원문의 불일치를 감추지 않고 구분해 둔다.
15.1.5 · 409-415

여섯 에이전트와 하나의 분기점

각 단계는 작고 분명한 함수로 구현된다. 에이전트는 전체 상태를 받지만 자신이 책임지는 필드만 채운다. 실행 실패와 출력 형식은 조건부 간선에서 처리하므로, 개별 함수는 자신의 일에 집중한다.

ENTRYIntent Detection

질문 → 출력 유형·이유

BRIDGESchema Extraction

Neo4j → 개념 스키마

GENERATIONText-to-Cypher

질문+스키마+선택 → 질의

DATABASEQuery Execution

실행·형식화·오류 포착

CONDITIONALPost Execution

retry · summarize · END

FINAL TOUCHGenerate Summary

결과+선택 → 설명·분석

Intent Detection

시스템 메시지와 사용자 질문으로 프롬프트를 실행한다. Markdown 코드펜스를 제거한 뒤 JSON5로 읽고, 시각화 유형과 이유를 상태에 기록한다.

input: question output: { output_type, output_reason }

조건부 파이프라인 시뮬레이터

출력 유형과 오류 여부에 따라 실제 흐름이 어떻게 달라지는지 확인한다.

1Intent

출력 형식 결정

2Schema

구조 번역

3Cypher

질의 생성

4Execute

실행·오류

5Route

재시도·요약

6Output

시각화·종료

대기 중...

에이전트별 구현 논리

에이전트추가 문맥상태에 쓰는 값핵심 동작
Intent Detection질문output_type, reason시각화 유형을 JSON으로 판정
Schema Extractionschema_configschema, retries=0APOC → 필터 → 설명 → 문자열
Text-to-Cyphernotes, examples, selectionquery, reasoning, message선택된 노드를 자연어 지시와 결합
Query Executionquery, output_typeresults_error, retries, informationgraph/map은 record list, table은 DataFrame
Post Execution오류·재시도·출력 유형다음 노드오류면 3회까지 retry, graph/map이면 summary
Generate Summaryrecords, selectionsummary, reason, analysis flag시각화에 담기지 않은 맥락과 패턴 설명
StateGraph(AgentState) intent_detection → schema_extraction → text_to_cypher → query_execution query_execution --error & retries<3→ text_to_cypher query_execution --graph/map→ generate_summary → END query_execution --table→ END
15.1.6 · 415-417

기다림을 보이지 않게 하지 말고, 진행으로 바꾸다

invoke는 마지막 결과가 나올 때까지 사용자를 침묵 속에 둔다. 장에서는 stream_mode="updates"와 generator 기반 질문 처리 인터페이스를 사용해 각 노드의 상태 변화를 프런트엔드 이벤트로 바꾼다. 실행은 복잡하지만 화면이 소비하는 계약은 단순해진다.

UPDATE

진행 알림

“의도 탐지 중”, “스키마 추출 중”, “질의 생성 중”처럼 현재 단계를 알려 준다.

RESULT

텍스트 중간 결과

질의 생성 이유, 오류 메시지, 최종 요약을 제목과 내용의 형태로 전달한다.

VISUALIZATION

구조화된 결과

graph·map·table·chart 데이터와 현재 상태를 함께 전달한다.

이벤트 스트림 재생기

한 질문이 프런트엔드에 도착하는 사건의 순서를 재생한다.

1 · update
2 · result
3 · graph/map
4 · result
5 · END
READY

질문 처리 인터페이스

실행할 때마다 고유 thread_id를 만들고, 선택된 노드를 label·properties 사전으로 바꾼다. 이벤트는 항상 (response_type, payload, current_state) 세 항목으로 흘러간다.

아키텍처적 의미 — 인터페이스는 LangGraph의 내부 상태를 화면 요소로 직접 번역하지 않는다. “진행·텍스트 결과·시각화·종료”라는 안정된 사건 계약으로 바꾼다. 그래서 프런트엔드가 Streamlit에서 다른 UI로 바뀌어도 코어 파이프라인은 유지될 수 있다.
15.2 · 417-422

Streamlit: 그래프를 보고, 고르고, 다시 묻는 작업대

화면은 단순 채팅창이 아니다. 그래프 캔버스에서 노드와 관계를 탐색하고, 선택 목록에 맥락을 모으며, 자연어 질문을 보내고, 진행 상황과 질의 이유·요약·지도를 확인하는 조사 작업대다. Python-first 구조는 LangGraph와 같은 런타임에서 상태를 공유하게 해 초기 구현과 검증을 빠르게 만든다.

Graph Canvas
Crime
ANPR
Camera
Vehicle
Person
노드를 더블클릭하면 Selection에 추가되고, 클릭하면 속성 패널이 열린다.

MessageHistory의 두 시간

TEMPORARY

실시간 placeholder

에이전트가 움직이는 동안 현재 단계, 생성 이유, 표·그래프를 즉시 보여 준다. 다음 이벤트가 오면 같은 영역이 갱신된다.

PERMANENT

완료된 대화 기록

END 이벤트가 오면 최종 상태를 메시지 기록에 확정하고 화면을 다시 그린다. 임시 표시가 사라져도 질의·요약·시각화가 남는다.

display_message

Markdown, pandas 표, Folium 지도, 그래프 캔버스, 접이식 디버깅 정보를 내용 유형에 맞게 렌더링한다.

update

하나의 메시지 사전에 파이프라인 상태를 점진적으로 합치고, 완료 시 메시지 목록에 확정한다.

input handler

질문·선택을 파이프라인에 보내고, 이벤트 유형별로 placeholder·canvas·table·history를 갱신한다.

교재는 Streamlit을 빠른 프로토타이핑과 기능 검증에 적합한 선택으로 본다. 운영 환경에서는 더 전문화된 프런트엔드가 필요할 수 있으나, 이 장의 목적은 UI 복잡도보다 전문가 모사형 파이프라인 자체를 시험하는 데 있다.

15.3 · 422-432

한 사건을 따라가며, 공간·시간·이력을 겹쳐 읽다

실습은 범죄 사건, ANPR 카메라, 탐지 이벤트, 차량, 소유자, 과거 범죄를 연결하는 지식그래프를 사용한다. 질문은 한 번에 모든 사실을 요구하지 않는다. 사건을 고르고, 주변 감시망을 찾고, 차량을 좁히고, 반복 탐지를 해석하고, 소유자의 전력을 확인하는 순차 조사다.

“현재 수사 중인 Crime 노드 하나를 반환하라.”

초기 사건 식별

status가 investigation인 사건을 하나 찾는다. 결과는 CRIMINAL TRESPASS이며, 진술에는 검은 차량과 EB로 시작하는 번호판이 등장한다.

시스템의 역할 — 단일 노드에 적합한 graph 출력을 선택하고, 속성 속 긴 서술에서 차량 단서를 요약한다.

수사 그래프의 개념 구조

Person -[OWNS]→ Vehicle -[PLATE_READ]→ CameraEvent ←[HAS_EVENT]- ANPRCamera │ └─[COMMITTED]→ Crime Crime.position ↔ ANPRCamera.position · CameraEvent.timestamp · Vehicle.color/plate · Person criminal history
1 km

공간 조건

선택한 사건 지점에서 가까운 ANPR 카메라를 찾고 지도와 그래프를 함께 제시한다.

2023-06-15

시간 조건

사건 당일 탐지 이벤트만 남긴다.

BLK · EB*

외형 조건

검은색 차량과 EB로 시작하는 번호판을 조합한다.

반복 패턴

EB16946의 중복 탐지를 주변 순환 가능성의 단서로 해석한다.

최종 연결 — 반복 탐지된 CHEV 4D 차량 EB16946의 소유자가 과거 BATTERY와 CRIMINAL TRESPASS 사건에 연결된다. 시스템은 현재 사건과 같은 유형의 전력이 있다는 점을 강조한다. 다만 이는 수사 우선순위를 돕는 증거 조합이지, 유죄 판정이 아니다.

맥락 유지

“선택한 사건”, “선택한 카메라”를 후속 질문에서 계속 참조한다.

다중 증거 통합

공간, 사건 날짜, 차량 특성, 반복 탐지, 소유자 이력을 하나의 경로로 엮는다.

의사결정 지원

패턴을 요약하고 추가 조사 대상을 좁히되, 최종 판단은 조사자에게 남긴다.

15.4 · 432-434

완성품이 아니라, 스스로 나아질 수 있는 기초

저자들은 이 구현을 곧바로 배포할 만능 제품으로 제시하지 않는다. 가치는 무엇을 하는가보다 어떻게 보이고 고칠 수 있게 만들어졌는가에 있다. 각 단계의 판단이 드러나므로 실패와 성공 모두가 다음 개선의 자료가 된다.

15.4.1

사용에서 배우기

불만형 질문을 모아 실패 패턴과 사용자 고충을 분류한다. 유용했던 질의의 추론 경로도 보존해 예시 데이터베이스를 강화한다. 질문 군집을 찾으면 관련 스키마 조각과 예시만 선택해 공급할 수 있다.

15.4.2

핵심 능력 확장

전문가처럼 예비 질의를 실행해 실제 데이터 사용 패턴을 파악하는 스키마 강화 에이전트를 둔다. 대규모 KG는 상세 계층과 차량 모니터링·형사 사법 같은 상위 도메인 뷰를 함께 관리한다.

15.4.3

고급 진화 경로

프롬프트에 스키마와 예시를 모두 넣는 in-context 방식의 확장 한계를 넘어, 스키마 자체를 학습 데이터로 사용한 KG-aware fine-tuned 에이전트를 선택적으로 도입한다.

관찰 가능성의 선순환

질문·선택·의도·질의·오류·요약 ↓ 실패/성공 패턴 분류 ↓ 예시·스키마·프롬프트 개선 ↓ 더 나은 다음 상호작용

대체가 아닌 선택적 보강

미세조정 모델을 도입해도 전문가 모사형 파이프라인은 버리지 않는다. 특정 구성요소만 fine-tuned 대안으로 바꾸거나 보강하면서 단계별 관찰 가능성과 조건 분기를 유지한다.

장기적으로는 질의 패턴과 그래프 구조의 관계를 더 깊이 이해하는 계획 에이전트로 발전할 수 있다.

개선의 출발점은 언제나 같은 질문이다. “이 상황에서 숙련된 전문가는 무엇을 할 것인가?” 그 답을 보이는 단계로 만들면, 시스템의 성장은 유행이 아니라 작업의 진화가 된다.

Figures & listings

그림 16개와 목록 15개의 역할 지도

제15장은 설명보다 구현의 연결에 무게를 둔다. 그림은 시스템의 층과 실제 조사 화면을 보여 주고, 목록은 구성·스키마·상태·에이전트·UI 이벤트가 맞물리는 지점을 제시한다.

그림 15.1-15.9 · 아키텍처와 파이프라인
그림핵심 내용
15.1입력-의도-스키마-질의-실행-시각화/요약 전체 구조
15.2RAG 예제로 설명한 공유 상태 기반 에이전트 통신
15.3 / 15.7 / 15.8LangGraph 노드와 오류·요약 조건 분기
15.4구성 공급자·스키마 공급자·질문 처리 인터페이스를 포함한 백엔드
15.5구성 공급자의 위치와 책임
15.6스키마 공급자와 Neo4j 연결
15.9상태 업데이트를 이벤트로 바꾸는 통합 계층
그림 15.10-15.16 · UI와 전문가 모사형 수사
그림핵심 내용
15.10Selection, Canvas, Question/Reasoning/Summary를 가진 Streamlit 화면
15.11Crime-ANPRCamera-CameraEvent-Vehicle-Person 조사 스키마
15.12수사 중인 CRIMINAL TRESPASS 사건 식별
15.131km 내 카메라의 그래프·지도 이중 표현
15.14검은색·EB*·사건 당일 조건을 만족하는 차량 경로
15.15동일 결과에 조사 맥락을 주어 반복 탐지 패턴을 분석
15.16차량 소유자와 과거 범죄를 연결한 최종 조사 통찰
Listing 15.1-15.15 · 구현 구성요소
목록역할
15.1-15.2YAML 구성과 ChainConfiguration 템플릿 로더
15.3-15.4Property/Node/Relationship 데이터 모델과 Neo4jSchema 변환
15.5AgentState TypedDict
15.6프롬프트 실행과 의도 탐지
15.7스키마 추출 에이전트
15.8선택·주석을 포함한 Text-to-Cypher
15.9질의 실행과 결과 형식화·오류 포착
15.10재시도·요약·종료 라우팅
15.11그래프·지도 결과의 요약 생성
15.12StateGraph 조립과 체크포인터
15.13질문을 typed event stream으로 바꾸는 generator
15.14MessageHistory 표시·누적
15.15사용자 입력과 이벤트 유형별 UI 처리
Chapter summary

제15장이 남기는 여섯 문장

1

전문가 모사형 접근은 사람이 그래프 DB를 탐색하는 절차를 작은 에이전트 단계로 분해한다.

2

LangGraph의 공유 상태는 모듈성과 관찰 가능성을 함께 제공하고, 조건부 간선은 오류와 출력 형식을 다룬다.

3

구성 공급자와 스키마 공급자는 프롬프트 지식과 DB 구조를 코어 코드에서 분리한다.

4

질문 처리 인터페이스는 복잡한 실행을 update·result·visualization·END 이벤트로 단순화한다.

5

선택 상태와 대화 기록을 포함한 질의 생성은 “이 사건”, “선택한 카메라” 같은 자연스러운 상호작용을 가능하게 한다.

6

공간·시간·과거 이력을 결합한 다단계 분석은 단일 검색을 조사 가능한 서사로 확장한다.

검토 범위 — Alessandro Negro, Giuseppe Futia, Vlastimil Kůs, Fabio Montagna, Knowledge Graphs and LLMs in Action, Chapter 15 “Building a QA agent with LangGraph,” 책 397-434쪽(PDF 427-464쪽). 이 페이지는 장의 구조·도표·목록·사례를 한국어로 재구성한 해설이며, 원문 코드 전체를 복제하지 않는다.