PDF, 이메일, 웹 콘텐츠 같은 비정형 데이터에는 정말 귀중한 통찰력이 숨어있지만, 여기서 구조화된 지식을 추출하는 건 여전히 어려운 일이에요. 이렇게 흩어져 있는 정보를 체계적이고 쿼리 가능한 형식으로 바꾸려면 다양한 데이터 소스를 효율적으로 처리하는 강력한 시스템이 필요하죠.
이번 블로그 포스팅에서는 추출 프로세스가 어떻게 작동하는지 한번 살펴볼까요? 다음 내용들을 다룰 거예요:
- 다양한 소스(PDF, Amazon Simple Storage Service(S3), Google Cloud Storage, URL, 스크립트)에서 구조화되지 않은 데이터를 수집
- 효율적인 처리를 위해 대용량 문서를 분할하는 청킹 전략
- Neo4j의 Vector Index를 사용해서 Semantic Search를 활성화하는 Vector Embedding 생성
- LLM과 그래프 변환 기술을 사용한 엔터티 추출
- 데이터를 개선하고 최적화하는 후처리 기술Knowledge Graph
이 포스팅은 다양한 측면을 다루는 시리즈의 일부랍니다! Neo4j LLM Knowledge Graph Builder에 대한 내용이에요:
- Knowledge Graph 추출
- GraphRAG 리트리버
추출 과정 이해
Neo4j LLM Graph Builder의 추출 파이프라인은 구조화된 접근 방식을 따르고 있어서, 구조화되지 않은 데이터를 체계적으로 처리하고 쿼리 가능한 Knowledge Graph로 변환해줘요. 데이터 수집, 청킹, Vector Embedding 생성, 엔터티 추출, 사후 처리 등 여러 단계로 구성되어 있는데, 각각 의미가 풍부한 그래프 표현을 구축하는 데 중요한 역할을 한답니다.
다음 흐름도는 원시 텍스트에서 구조화된 Knowledge Graph로 변환되는 과정을 단계별로 보여주고 있어요.
1단계: 데이터 수집
이 시스템은 로컬 파일, Amazon S3에 저장된 PDF, Google Cloud Storage 버킷, 웹 URL, YouTube 스크립트, Wikipedia 링크 등 다양한 소스의 비정형 데이터를 처리할 수 있어요. 사용자는 데이터 소스를 선택하고 다양한 문서 로더를 통해 읽어들이죠.
Google Cloud Storage 또는 S3 버킷에서 업로드된 로컬 파일:
- PDF 문서는 PyMuPDF 라이브러리를 통해 로드돼요.
- 다른 문서(.txt, docs, .ppt)는 LangChain(unstructured.io) 문서 로더로 읽어 들여요.
- Wikipedia 기사는 LangChain의 Wikipedia 로더를 사용하고요.
- 웹 URL은 LangChain의 WebBaseLoader로 로드해요.
- YouTube 비디오는 YouTube Transcript API를 사용해서 대본을 추출한답니다.
각 문서는 Neo4j 데이터베이스의 `Source` node로 표현돼요. 파일 이름, 유형, 소스 URL, 크기 같은 메타데이터는 node property로 저장되죠. 이렇게 하면 추적성이 확보되고, 애플리케이션이 다양한 데이터 소스를 효율적으로 관리할 수 있어요.
2단계: Chunk 생성
대용량 문서를 효과적으로 처리하기 위해서, 시스템은 토큰 기반 분할기를 사용해서 문서를 더 작고 관리하기 쉬운 chunk로 나눠요. `CHUNKS_TO_BE_CREATED`와 `Chunk_size` 같은 설정 가능한 상수는 chunk의 크기와 개수를 정의하죠. 이런 매개변수는 그래프 향상 섹션의 UI에서 설정할 수 있도록 제공될 거예요.
각 chunk의 `Vector Embedding`은 해당 의미의 본질을 잘 담아내야 해요. 너무 큰 chunk는 너무 광범위하고 모호해지기 때문에 chunk 크기 제한은 정말 중요하답니다. Chunking은 검색된 데이터가 LLM의 입력 창에 쏙 들어가도록 보장해서 효율적이고 정확한 처리가 가능하게 해줘요.
각 chunk는 문서 위치, 텍스트의 offset, 길이 같은 property를 사용해서 Neo4j에서 `Chunk` node로 표현돼요.
Chunk와 해당 상위 문서 간에 `Relationship`이 설정되는데요.
- `PART_OF`: 각 chunk를 상위 문서에 연결해요.
- `NEXT_CHUNK`: chunk 간의 순차적인 `Relationship`을 설정하죠.
3단계: Embedding 생성
Chunk로 나눠진 데이터는 `Embedding` 모델을 사용해서 벡터 표현으로 변환돼요.
`Embedding`이 활성화된 경우(`IS_EMBEDDING = True`), 각 chunk의 텍스트는 설정 가능한 `Embedding` 모델을 사용해서 임베딩돼요. 기본적으로는 각 chunk에 대해 384차원 벡터를 생성하는 SentenceTransformer `Embedding` 모델을 사용하죠. 설정할 수 있는 다른 주목할 만한 `Embedding` 모델로는 OpenAI, Vertex AI, Titan AI가 있어요.
이런 `Embedding`은 `Chunk` node의 property로 저장되고, Neo4j의 벡터 `Index`를 통해 유사성 검색을 활성화해요.
`Chunk` node에 대해 "벡터"라는 벡터 `Index`가 생성되어서 `Query` 중에 의미상 유사한 chunk를 검색할 수 있게 돼요. 이런 벡터는 각 chunk의 의미론적 의미를 담아내죠. 이 내장형 Neo4j 벡터 `Index`('벡터')는 효율적인 유사성 검색(HNSW(Hierarchical Navigable Small Worlds) 사용)을 가능하게 해서 주어진 사용자 질문 또는 `Query`와 가장 관련성이 높은 chunk를 찾을 수 있도록 도와줘요.
이 단계에서는 숫자 텍스트 표현을 제공해서 구조화되지 않은 텍스트와 `Machine Learning`을 연결하는 역할을 해요.
4단계: 엔터티 추출
Chunk 생성 후, LLM 및 Neo4j의 `LLMGraphTransformer`를 사용해서 chunk 텍스트에서 엔터티가 추출돼요.
이 플랫폼은 OpenAI의 GPT-4(GPT-4o 및 GPT-4o mini), Google Gemini 1.5 및 2.0과 같은 인기 있는 옵션은 물론 Diffbot과 같은 특수 모델을 포함해서 사전 훈련된 LLM을 제공해요. 다른 모델은 개발 모드 또는 자체 배포용으로 사용할 수 있고요. 이런 모델은 다양한 작업, 언어, 데이터 유형에 최적화되어 있어서 사용자는 특정 데이터 세트와 요구 사항에 가장 적합한 모델을 선택할 수 있답니다.
LLMGraphTransformer
이 프로세스는 LLMGraphTransformer LangChain의 라이브러리를 사용해요. 구체적으로, Convert_to_graph_documents 이 라이브러리 내의 메소드는 chunk 데이터를 구조화된 표현인 GraphDocument 로 변환하죠. `GraphDocument`는 본질적으로 `Node` 목록(엔터티를 나타냄)과 해당 `Relationship`(node를 연결하는 edge)으로 구성된 그래프 데이터 구조에요. 이 그래프 표현을 통해 추출된 항목과 원본 데이터 내에서의 연결을 더 미묘하고 상황에 맞게 이해할 수 있게 되는 거죠.
이에 따라 `LLMGraphTransformer`를 사용하면 다음과 같은 설정 가능한 제약 조건을 준수하면서 `Node`, `Relationship` 및 해당 property에 초점을 맞춘 `Knowledge Graph`를 생성할 수 있어요.
- 사용자는 그래프에 포함할 `Node` 유형(`allowed_nodes`)과 `Relationship` 유형(`allowed_relationships`)을 지정할 수 있어요. 이렇게 하면 관련 요소만 추출해서 노이즈를 줄이고 원하는 그래프 구조에 집중할 수 있죠.
- 풍부한 property 추출 — 변환기는 `Node` 및 `Relationship`에 대한 사용자 정의 property 추출을 지원해요. 사용자는 무제한 property 추출을 허용하거나 포함할 특정 property를 정의해서 결과 그래프의 세분성을 향상시킬 수 있답니다.
- 추가 지침: 그래프 향상 섹션에서 추가 지침을 제공해서 LLMGraphTransformer에 전달하면 특정 주제에 집중할 수 있어요. 예를 들어 의료 용어에 집중하거나 기술 전문 용어를 무시하는 식으로요. 이렇게 하면 요구 사항에 따라 엔터티를 추출하는 데 도움이 될 거예요.
추출된 각 엔터티는 그래프에서 엔터티 `Node`로 표시되고, `HAS_ENTITY` `Relationship`을 통해 원래 청크에 연결돼요.
시스템은 그래프 향상 섹션에서 관련/중복 엔터티를 병합해서 추가 개선을 할 수 있게 해줘요.
애플리케이션의 엔터티 추출 프로세스는 더 작은 텍스트 포함 청크를 더 큰 텍스트 조각으로 결합해요. 구성 가능한 매개변수(`NUMBER_OF_CHUNKS_TO_COMBINE`)는 현재 1로 유지되는 이러한 조각의 크기를 제어하죠. 결과적으로 이 값이 증가하면 많은 청크가 처리 전에 함께 그룹화될 거예요.
5단계: 후처리 및 Knowledge Graph 최적화
사후 처리는 `Knowledge Graph` 생성 파이프라인에서 중요한 단계인데, 그래프 구조를 개선하고 고급 검색 기능을 활성화하며 향상된 통찰력을 위해 커뮤니티 감지를 통합하거든요. 후처리 API는 다양한 작업을 통합해서 `Knowledge Graph`가 강화되고 최적화되며 다운스트림 애플리케이션에 사용할 수 있도록 준비해줘요.
처리
처리에는 다음 작업이 포함돼요. 그래프 향상 섹션에서 이를 활성화하거나 비활성화할 수 있어요.
- 텍스트 청크 유사성 업데이트
이 단계에서는 KNN(k-nearest neighbor) 알고리즘을 활용해서 청크 간의 그래프 유사성을 업데이트해요. `Embedding` 기반 거리를 분석해서 그래프는 유사한 콘텐츠 간의 더 강력한 연결을 포착하죠. - 하이브리드 및 전체 텍스트 검색 지원
하이브리드 검색은 벡터 기반 유사성과 전체 텍스트 검색 기능을 결합한 거예요. 이 단계에서는 벡터 및 전체 텍스트 `Index`를 생성해서 Neo4j Bloom과 같은 도구에서 효율적인 검색 `Query`를 가능하게 하죠. 사용자는 `Semantic Search`과 키워드 검색을 원활하게 수행할 수 있어요. - 엔터티 `Embedding`
그래프의 엔터티는 언어 모델을 사용해서 포함되므로 엔터티 간의 유사성 계산이 가능해져요. 이를 통해 클러스터링 및 엔터티 명확성과 같은 작업이 가능해지죠. 하지만 항목 삽입은 `ENTITY_EMBEDDING` 플래그가 활성화된 경우에만 생성돼요. - 그래프 `Schema` 통합
그래프 `Schema` 통합 단계에서는 `Node` 레이블과 `Relationship`을 표준화해서 깔끔하고 논리적인 구조를 유지해요. 언어 모델을 사용하면 중복되거나 일관되지 않은 레이블과 `Relationship`이 통합되어 그래프 `Schema`의 명확성과 일관성이 보장되죠. 사용자는 그래프 향상 탭을 통해 이 옵션을 활성화할 수 있어요.
사용자는 그래프 향상 섹션에서 커뮤니티 옵션을 활성화할 수 있어요. 커뮤니티는 `Node`가 다른 그룹의 `Node`보다 서로 더 긴밀하게 상호 연결된 영역을 나타내죠. 커뮤니티는 Leiden 클러스터링과 같은 알고리즘을 사용해서 형성돼요. 커뮤니티 `Node`는 관련 엔터티 또는 청크의 클러스터를 나타내기 위해 `Knowledge Graph`에 생성되죠. `IN_COMMUNITY` 및 `PARENT_COMMUNITY`와 같은 `Relationship`은 `Node`를 해당 커뮤니티에 연결하고 커뮤니티 간의 상위-하위 `Relationship`을 연결해요. 커뮤니티에는 0에서 2 까지의 계층 구조가 있어요. 0은 기본 커뮤니티이고, 1은 기본 커뮤니티에 연결되는 상위 커뮤니티이고, 2는 첫 번째 수준 상위 커뮤니티에 대한 상위 커뮤니티에요.
콘텐츠에 대한 간결한 개요를 제공하기 위해 LLM을 사용해서 각 커뮤니티에 대한 요약이 생성돼요. 요약 및 제목과 같은 속성이 커뮤니티 `Node`에 추가되죠. 요약을 사용하면 요약이나 다중 상황 질문과 같은 더 광범위한 질문에 효과적으로 답변할 수 있어요. 커뮤니티 제목은 LLM을 통해 생성되어 요약에 간결한 제목을 제공하므로 커뮤니티 `Node`를 적절하게 식별할 수 있죠.
Neo4j LLM Knowledge Graph Builder가 해결하는 주요 과제
구조화되지 않은 텍스트와 구조화된 그래프 데이터 간의 격차 해소
- 과제: 텍스트에서 `Knowledge Graph`를 생성하는 기존 방법은 수동적이고 시간이 많이 걸리며 상당한 도메인 전문 지식이 필요한 경우가 많아요. 구조화되지 않은 텍스트에서 항목과 `Relationship`을 정확하고 일관되게 추출하는 것은 복잡하죠.
- 솔루션: Neo4j LLM `Knowledge Graph` Builder는 LLM의 강력한 기능을 활용해서 텍스트에서 지식을 추출하고 이를 Neo4j 내에서 그래프 구조로 변환하는 프로세스를 자동화해요. 고급 `Natural Language Processing` 기능을 갖춘 LLM은 텍스트 내의 엔터티, `Relationship` 및 뉘앙스를 식별해서 그래프 작성 프로세스를 크게 단순화할 수 있죠.
복잡한 `Schema` 설계 및 매핑의 필요성 제거
- 과제: 그래프 `Schema`(`Node` 레이블, `Relationship` 유형, 속성)를 미리 정의하면 병목 현상이 발생할 수 있어요. 가능한 모든 엔터티와 `Relationship`을 예상해야 하는데, 이는 다양하고 진화하는 데이터 세트를 처리할 때 어렵죠. 텍스트 데이터를 이 `Schema`에 수동으로 매핑하는 것도 지루한 일이고요.
- 해결 방법: 응용 프로그램은 LLM을 사용해서 입력 텍스트를 기반으로 `Schema`를 동적으로 추론해요. 엄격하고 사전 정의된 `Schema`가 필요 없으므로 그래프 작성 프로세스가 더욱 유연해지고 다양한 데이터 소스 및 도메인에 적응할 수 있죠. 이렇게 하면 초기 설정 노력이 줄어들고 새 정보가 추가됨에 따라 그래프가 더 쉽게 발전할 수 있어요.
손으로 만든 규칙과 패턴에 대한 의존도 줄이기
- 과제: 정보 추출을 위해 기존의 규칙 기반 또는 패턴 기반 접근 방식은 취약하고, 자연어에 내재된 가변성과 모호성을 처리하기가 어렵죠. 규칙을 만들고 유지하려면 엄청난 수동 작업이 필요하기도 하고요.
- 해결 방법: LLM을 사용하면 애플리케이션이 데이터에서 학습된 패턴을 일반화해서 명시적인 규칙 정의의 필요성을 줄일 수 있어요. LLM은 다양한 언어, 언어적 변형, 암시적 관계, 복잡한 문장 구조를 더 효과적으로 처리해서 정확성과 견고성을 높일 수 있죠.
그래프 구성을 위한 Prompt Engineering 단순화
- 과제: LLM과 상호 작용해서 그래프 구성과 같은 특정 작업을 수행하려면 효과적인 프롬프트를 작성해야 해요. 이건 Prompt Engineering 원리와 실험에 대한 이해가 필요한 쉽지 않은 작업일 수 있어요.
- 솔루션: Neo4j LLM Knowledge Graph Builder는 그래프 구성을 위해 설계된 사용자 친화적인 인터페이스와 사전 구축된 프롬프트 템플릿(또는 이를 생성하는 로직)을 제공해요. 직접 Prompt Engineering의 복잡성을 추상화해서 사용자가 Prompt Engineering 전문가가 될 필요 없이 그래프를 더 쉽게 작성할 수 있게 해주는 거죠.
- 게다가 사용자는 "과학적 전문 용어를 포함하지 말고 의료 용어에 더 중점을 두세요"와 같은 추가 지침을 제공할 수도 있어요.
효율적이고 확장 가능한 그래프 구성 지원
- 과제: 대규모 Knowledge Graph를 수동으로 구축하는 건 불가능해요. 프로세스를 자동화하고 효율적으로 만드는 것은 실제 애플리케이션에 정말 중요하죠.
- 솔루션: 이 애플리케이션은 자동화를 통해 그래프 구성 프로세스를 간소화해서 사용자는 수동 방법보다 훨씬 빠르게 실제 텍스트로 크고 복잡한 그래프를 작성할 수 있어요. 확장 가능한 Graph Database인 Neo4j와의 통합은 결과 그래프의 효율적인 저장 및 Query를 보장하고요.
요약
Neo4j LLM Knowledge Graph Builder의 추출 프로세스는 원시 텍스트를 구조화된 지식으로 변환해서 검색 가능하고, Query 가능하며, 상황에 맞게 의미 있게 만들어줘요. 자동화된 청크 생성, 임베딩 생성, 항목 추출 및 사후 처리를 통해 조직은 구조화되지 않은 데이터 소스에서 Knowledge Graph를 효율적으로 구성할 수 있죠.
LLM과 Neo4j의 Graph Database 기능을 활용함으로써 이 프로세스는 수동 데이터 구조화의 필요성을 없애고 대규모 지식 추출을 더 빠르고 확장 가능하게 만들어줘요. 구성 가능한 청킹, 임베딩 기반 유사성 검색, 스키마 통합과 같은 기능을 통해 시스템은 다양한 도메인에 대한 정확성, 유연성 및 적응성을 보장하고요.
LLM 및 Knowledge Graph의 발전이 계속됨에 따라 Neo4j LLM Knowledge Graph Builder와 같은 도구는 지능형 데이터 처리, 검색 및 검색에서 중요한 역할을 할 거예요.
자세히 알아보려면 다음을 확인하세요.Neo4j LLM 지식 그래프 빌더 소개.
초보자를 위한 GraphRAG
연결된 데이터를 기반으로 복잡한 질문에 답할 수 있는 GraphRAG 애플리케이션을 구축하세요. 세 가지 주요 검색 패턴을 알아보세요.
- GraphRAG
- Langchain
- LLM-그래프 빌더
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'Ontology & Knowledge Graph' 카테고리의 다른 글
| Graph used right & built fast: Neo4j at HackwithBay 3.0 (1) | 2026.07.11 |
|---|---|
| 지식 그래프 생성: 핵심 개념과 활용 가이드 (2) | 2026.07.10 |
| GPT-3와 Neo4j로 지식 그래프 기반 챗봇 만들기 (0) | 2026.07.09 |
| LlamaIndex 워크플로우로 지식 그래프 에이전트 구축하기 (0) | 2026.07.09 |
| 자기 발견 여정: 30년 데이터 파이프라인을 Knowledge Graph로 통합하기 (0) | 2026.07.09 |
