Ontology & Knowledge Graph

LLM으로 비정형 텍스트를 Neo4j Knowledge Graph로 변환하는 방법

hsystems 2026. 8. 6. 09:54
728x90
반응형

구조화되지 않은 텍스트는 이메일, PDF, 내부 문서, 웹페이지 등 어디에나 존재하며, 구조가 없으면 접근하기 어려운 통찰력으로 가득 차 있죠. RAG(Retrieval-Augmented Generation) 및 LLM(Large Language Model) 애플리케이션을 구축하는 경우, 아마 다음과 같은 과제에 직면했을 거예요. 원시적이고 정리되지 않은 텍스트를 구조화되고 사용 가능한 텍스트로 어떻게 변환할까요?

바로 이럴 때 Knowledge Graph가 필요해요.

Knowledge Graph는 데이터에 대한 체계적이고 연결된 뷰를 제공해서 엔터티 간의 관계를 매핑해줘요. 문서를 독립된 덩어리로 처리하는 기존 데이터베이스 또는 벡터 검색 도구와는 달리, Knowledge Graph는 해당 덩어리에 있는 아이디어, 사람 또는 이벤트가 모든 소스에서 서로 어떻게 연관되어 있는지 보여준답니다.

이 가이드에서 다룰 내용:

  • 원시 텍스트에서 그래프로
  •  
  • 벡터 데이터베이스를 사용하면 안 되는 이유는 뭘까요?
  •  
  • 필수 GraphRAG
  •  
  •  
  • 1. Node 및 Relationship 추출
  •  
  • 2. 엔터티 명확성
  •  
  • 3. Neo4j로 데이터 가져오기
  •  
  • 텍스트에서 Knowledge Graph 구축: 빠른 데모
  •  
  •  
  • 시도해 볼 수 있는 도구
  •  

원시 텍스트에서 그래프로

그렇다면 구조화되지 않은 텍스트 더미에서 체계적인 Knowledge Graph로 어떻게 이동할까요?

지식 추출 파이프라인.

최근까지는 시간이 많이 걸리는 수동 작업이었죠. 하지만 이제는 LLM과 같은 도구, 특히 LLM 지식 그래프 빌더의 도움으로 대부분의 작업을 자동화할 수 있어요.

이 가이드에서는 텍스트를 Knowledge Graph로 변환하는 간단하지만 강력한 3단계 프로세스를 안내할게요.

  1. LLM을 사용하여 텍스트에서 Nodes와 Edges 추출
  2. 중복 엔터티를 병합하기 위해 엔터티 명확화 수행
  3. Knowledge Graph를 저장하고 분석하기 위해 데이터를 Neo4j로 가져오기

이 접근 방식의 실제 예제는 LLM 지식 그래프 빌더 GitHub 저장소에서 살펴볼 수 있어요. 시작하는 데 도움이 되는 코드, 프롬프트, 샘플 데이터가 포함되어 있답니다.

이제 한번 들어가 볼까요?

Knowledge Graph란 무엇이며 구조화되지 않은 데이터에 중요한 이유는 무엇인가요?

Knowledge Graph는 사물이 어떻게 연결되어 있는지 보여줌으로써 정보를 정리하는 방법이에요. 데이터를 행과 열(예: 스프레드시트 또는 관계형 데이터베이스)에 저장하는 대신 Knowledge Graph는 사람, 장소 또는 개념과 같은 데이터 개체가 관계로 서로 연결되는 네트워크로 데이터를 나타내죠.

데이터에 대한 마인드 맵이라고 생각하면 돼요. 사람들이 사람, 장소, 사건 및 이들의 관계 측면에서 세상을 자연스럽게 이해하는 방식을 반영하는 구조인 거죠.

Knowledge Graph를 특히 유용하게 만드는 것은 유연성이에요. 이를 사용하여 다음을 구성할 수 있어요.

  • (스프레드시트나 데이터베이스 등)
  • (예: JSON 또는 XML)
  • 구조화되지 않은 데이터(PDF, 문서, 웹사이트 등)

마지막 카테고리인 구조화되지 않은 텍스트는 Knowledge Graph가 돋보이는 부분이에요.

Large Language Model은 원시 텍스트에서 의미를 추출하는 데 도움이 될 수 있지만 이러한 통찰력은 수명이 짧거나 큰 콘텐츠 블록에 묻혀 있는 경우가 많아요. Knowledge Graph는 다음과 같은 방식으로 통찰력을 포착하죠. 지속적이고 연결되어 있으며 쿼리하기 쉬워요.

  • : 문서 또는 소스 전반에 걸쳐
  • 복잡한 질문에 답하기: 여러 사실을 종합하기 위해 LLM이 필요한 경우
  • 더 스마트한 애플리케이션 구축: 개인화된 추천이나 추론을 기반으로 한 기업 검색 등

왜 벡터 데이터베이스를 사용하지 않는가?

Retrieval-Augmented Generation (RAG) 파이프라인에 이미 익숙하다면 벡터 데이터베이스를 사용하여 구조화되지 않은 콘텐츠를 삽입하고 검색할 수 있다는 것을 알 거예요. 벡터 데이터베이스는 의미상 유사한 텍스트 덩어리를 찾는 데 탁월해요. 즉, 정확한 단어가 일치하지 않더라도 관련성이 "느껴지는" 구절을 검색할 수 있죠.

하지만 벡터 검색만으로는 구조화되지 않은 데이터에서 필요한 정보를 얻는 데 충분하지 않아요. 정보가 서로 어떻게 연관되어 있는지 알아야 하거든요. 하지만 벡터 검색에서는 이 정보를 제공하지 않아요. 벡터 검색은 사람, 아이디어, 조직이 문서 전체에서 어떻게 연결되는지 보여줄 수 없죠. Knowledge Graph는 이러한 관계를 볼 수 있도록 구성을 제공해요. Knowledge Graph는 다음을 수행할 수 있답니다.

  • 대표하다 구조화된 데이터와 구조화되지 않은 데이터를 함께
  • 모델 실제 관계는 명시적으로(단순히 근접성을 의미하는 것이 아님)
  • 지원하다 연결된 사실 전반에 걸쳐

간단히 말해서…

GraphRAG (Graph Retrieval-Augmented Generation)는 구조화된 그래프 기반 검색을 도입해서 RAG 프레임워크를 더 발전시킨 거예요. 단순히 "유사한" 텍스트 덩어리를 검색하는 대신, GraphRAG는 Knowledge Graph를 사용해서 관련 엔터티, 관계, 사실을 명확히 보여줌으로써 LLM에게 더 나은 컨텍스트를 제공하고, 연결된 지식을 통해 다중 홉 추론을 가능하게 하죠.

만약 여러분이 구조화되지 않은 데이터로 작업하고, 키워드 검색이나 유사성 점수를 뛰어넘고 싶다면, Knowledge Graph가 더 스마트한 기반을 제공해 줄 거예요. 지저분한 정보를 정리하고 숨겨진 패턴을 드러내며, 상황 인식, 관계 중심 통찰력이 필요한 LLM 애플리케이션을 강화하는 데 도움이 되거든요.

LLM을 사용하여 텍스트를 Knowledge Graph로 변환하는 방법

그런데 구조화되지 않은 텍스트 문서 더미에서 체계적인 Knowledge Graph로 어떻게 옮겨갈 수 있을까요? 이전에는 시간이 엄청나게 많이 걸리는 수동 작업이 필요했지만, LLM을 사용하면 이 프로세스의 대부분을 자동화할 수 있어요.

사용자 정의 추출기를 작성하거나 모든 관계를 수동으로 정의할 필요가 없어요. LLM이 힘든 작업을 처리할 수 있고, 나중에 개입해서 결과를 개선할 수 있거든요.

프로세스가 어떻게 작동하는지 한번 살펴볼까요?

1. Node 및 Relationship 추출

시작하는 가장 간단한 방법은 입력 텍스트를 LLM에 전달하고, LLM이 추출할 Node와 Relationship을 결정하도록 하는 거예요. 이름, 유형, 찾은 속성을 포함해서 각 엔터티를 일관된 형식으로 반환하도록 모델에 요청하기만 하면 돼요. 일관된 형식으로 엔터티를 반환하도록 LLM을 안내하는 이 방법을 사용하면 입력 텍스트에서 Node와 Relationship을 추출할 수 있죠.

LLM은 한 번에 제한된 양의 텍스트(보통 4,000개에서 100,000개 이상의 토큰)만 처리할 수 있어요. 입력 내용이 너무 길면 모델이 모든 내용을 처리할 수 없죠. 이 문제를 해결하려면 텍스트를 모델 제한 내에 맞는 작은 덩어리로 나눠야 해요.

텍스트에 대한 최적의 분할 지점을 결정하는 것은 그 자체로 어려운 일이에요. 작업을 단순하게 유지하려면 모델의 제한을 초과하지 않는 범위 내에서 텍스트를 최대한 큰 덩어리로 나누는 게 좋아요.

문장이나 설명이 여러 청크에 걸쳐 있는 경우를 설명하기 위해 이전 청크에서 일부 중복을 도입할 수도 있어요. 이 접근 방식을 사용하면 각 청크에서 Node와 Relationship을 추출하여 그 안에 포함된 정보를 나타낼 수 있죠.

여러 청크에서 다양한 유형의 엔터티에 레이블을 지정할 때 일관성을 유지하려면 LLM에 이전 청크에서 추출된 Node 유형 목록을 제공하세요. 그러면 추출된 "스키마"가 형성되기 시작할 거예요. 이 접근 방식은 최종 라벨의 균일성을 향상시키죠. 예를 들어 LLM은 "회사"와 "게임 회사"에 대해 별도의 유형을 생성하는 대신 "회사" 레이블 아래에 모든 유형의 회사를 통합할 거예요.

이 접근 방식에서 눈에 띄는 문제점 중 하나는 중복된 엔티티 문제예요. 각 청크가 거의 독립적으로 처리되다 보니, 다른 청크에서 발견된 동일한 엔티티에 대한 정보가 결과를 합칠 때 중복을 만들어내는 거죠.

이 문제는 다음 단계인 엔티티 명확화로 자연스럽게 이어져요.

2. 엔티티 명확성

일반적으로 엔티티 집합을 추출하고 나면 데이터셋에 중복된 항목이 있을 수 있어요. 이런 중복은 각 텍스트 덩어리가 따로 처리되기 때문에 생기는 문제인데요. 똑같은 엔티티가 다른 이름이나 부분적인 속성으로 여러 번 나타날 수 있거든요.

이럴 때 Large Language Model (LLM)을 사용해서 중복된 엔티티를 해결할 수 있어요. 먼저 추출된 엔티티들을 유형별로 묶어주는 거예요. 예를 들어 모든 "Person" 엔티티를 한 그룹으로 모으는 거죠. 그런 다음 LLM에게 속성을 결합해서 중복 항목을 찾아 병합하도록 요청하는 거예요.

LLM은 각 엔티티에 어떤 이름이나 형식이 사용되었는지 항상 알 수는 없기 때문에 특히 유용해요. 예를 들어 초기 추출 과정에서 같은 엔티티를 가리키는 두 개의 Node, 즉 (Alice {name: “Alice Henderson”})와 (Alice Henderson {age: 25})가 만들어졌을 수도 있겠죠. 이런 식으로요:

  • (Alice {name: “Alice Henderson”})
  • (Alice Henderson {age: 25})

LLM은 이 중복을 알아채고 엔티티를 두 속성(이름과 나이)을 모두 가진 하나의 Node로 합쳐야 해요.

3. Neo4j로 데이터 가져오기

마지막 단계는 LLM이 생성한 결과를 Neo4j 데이터베이스로 가져오는 거예요. 데이터를 넣으려면 출력을 Neo4j가 이해할 수 있는 형식으로 바꿔줘야겠죠? 먼저 LLM의 텍스트를 파싱해서 각 Node와 Relationship 유형에 맞는 CSV 파일로 만들어주는 거예요.

다음으로 이 CSV 파일을 Neo4j Data Importer Tool과 호환되는 형식으로 매핑해요. 이 툴을 사용하면 데이터를 가져오기 전에 미리 보고 조정할 수 있어서 편리하죠.

응용 프로그램 개요.

이제 세 부분으로 구성된 애플리케이션을 만들게 될 거예요.

  1. 파일 업로드를 위한 UI
  2. End-to-End 프로세스를 관리하는 컨트롤러
  3. 컨트롤러가 상호 작용하는 LLM

원본 소스 코드는 에서 확인할 수 있어요. 최신 버전을 보려면 다음을 참고하세요: llm-graph-builder.

스키마가 포함된 파이프라인 버전을 실행할 수도 있는데요. 이 스키마는 필터처럼 작동해서 LLM이 출력에 특정 유형의 Node, Relationship, Property만 포함하도록 도와준답니다.

Knowledge Graph와 함께 LLM을 사용하는 방법에 대해 더 자세히 알고 싶다면 GraphRAG 개발자 가이드를 확인해 보세요. 실습 예제, 아키텍처 패턴, 시작을 위한 실용적인 팁들이 담겨 있어요.

텍스트에서 Knowledge Graph 구축: 빠른 데모

이게 실제로 어떻게 작동하는지 보여드리기 위해, 제임스 본드 프랜차이즈에 대한 Wikipedia 페이지를 넣어서 애플리케이션을 테스트해 봤어요. 그리고 생성된 Knowledge Graph를 살펴봤죠.

Knowledge Graph에는 수많은 책 `Node`와 저자, 출판사와 같이 연결된 사람들이 포함되어 있어요. 전체적으로 기사 내용에 대한 적절한 요약을 제공하고, 모델이 일반 텍스트에서 얼마나 많은 구조를 추출할 수 있는지 보면 정말 인상적이죠?

하지만 몇 가지 특이한 점도 발견할 수 있어요.

  • 역할 혼란: 제임스 본드 소설의 대부분을 쓴 이안 플레밍(Ian Fleming)이 여러 곳에서 대신 로 등장해요. 모델이 기사의 일부를 오해했기 때문에 발생한 것 같아요.
  • 엔터티 중복: 그래프는 영화에 대해 별도의 `Node`를 생성하는 대신 책 `Node`를 동일한 이름의 영화 감독에 연결합니다. 이러한 종류의 혼동은 도메인 전체에서 이름이 겹칠 때 흔히 발생하죠.
  • 문자적 관계: 모델은 제임스 본드를 그가 운전하는 자동차에 연결하기 위해 "사용"이라는 `Relationship`을 만들었어요. 아마도 기사에서 그렇게 설명했기 때문일 거예요. 보다 자연스러운 레이블은 "drive"일 수 있지만, 이 예는 LLM이 소스 텍스트를 문자 그대로 해석하는 방식을 보여줍니다.

여기에서 전체 데모를 시청하세요.

도전과제

위의 데모에서 볼 수 있듯이, 이 접근 방식은 첫 번째 단계에서 놀랍게도 잘 작동하며 LLM을 사용하여 구조화되지 않은 텍스트에서 Knowledge Graph를 작성하는 것이 절대적으로 가능하고 가치 있다는 것을 보여줘요. 즉, 명심해야 할 몇 가지 제한 사항이 있습니다.

  1. 예측할 수 없는 출력: LLM이 항상 지침을 정확하게 따르는 것은 아니에요. 특정 형식(예: `Node` 및 `Relationship`의 JSON 목록)을 요청하더라도 모델은 이를 무시하고 항목에 번호를 매기거나 예상치 못한 설명을 추가하는 등 다른 작업을 수행할 수 있습니다. 이로 인해 출력 구문 분석이 더 어렵고 신뢰성이 떨어집니다. 다음과 같은 새로운 도구 OpenAI의 Function Calling은 이 문제를 해결하는 데 도움이 되며 유용한 도구의 생태계는 나날이 발전하고 있습니다.
  2. 성능 및 속도: LLM은 항상 예상만큼 빠르지는 않아요. 하나의 긴 기사(예: 전체 Wikipedia 페이지)를 구문 분석하는 데 몇 분 정도 걸릴 수 있습니다. 대량의 문서를 처리하는 경우 이는 빠르게 증가하죠. 속도 개선은 시간이 지나면서 또는 파이프라인의 구조를 다시 생각함으로써 이루어질 가능성이 높습니다.
  • 투명성 부족: 실제로 모델이 왜 특정 사실을 추출했는지, 혹은 해당 사실이 원본 텍스트에 실제로 존재하는지 알 방법이 없는 경우가 있어요. 이 때문에 수동 검토 없이는 출력을 신뢰하기 어렵죠. 규칙 기반 방식이나 사람이 관리하는 방식과 비교했을 때, LLM 기반 추출은 데이터 품질에 약간의 모호함을 더하는 것 같아요.

Knowledge Graph 시작하기

이제 LLM을 사용해서 텍스트에서 Knowledge Graph를 만드는 방법을 알아봤으니, 직접 시도해보고 싶을 텐데 가장 쉬운 방법이 뭘지 궁금할 거예요.

좋은 소식은 처음부터 시작할 필요가 없다는 점이에요. 샘플 문서를 테스트하든, 자신만의 파이프라인을 구축하든, Neo4j는 빠르게 시작하고 실행할 수 있도록 초보자에게 친숙한 도구와 가이드를 제공하고 있거든요.

시도해 볼 수 있는 도구

  • LLM Knowledge Graph Builder
    구조화되지 않은 텍스트를 구조화된 그래프로 변환하기 위해 미리 만들어진 파이프라인이에요. 여기에는 Neo4j Data Importer용으로 포맷된 프롬프트 템플릿, 청킹 로직, 그리고 CSV 내보내기가 포함되어 있답니다.
  • GraphRAG 패키지
    생성적 AI 워크플로우에서 Knowledge Graph를 사용하고 싶으신가요? 이 패키지는 더 스마트한 검색, 더 나은 정보 연결, 그리고 다중 홉 추론을 위해 LLM을 Neo4j와 결합하는 방법을 보여줘요.
  • Neo4j Data Importer 도구
    CSV 데이터를 실시간 Graph Database에 매핑하고 로드하는 데 도움이 되는 코드가 필요 없는 드래그 앤 드롭 인터페이스로, 테스트와 빠른 반복 작업에 아주 적합해요.

Graph Database를 처음 접하거나 이해도를 높이고 싶다면 여기서 시작해 보세요.

  • 7단계로 Knowledge Graph를 구축하는 방법
  • GraphAcademy: 지식 정보 기초
  • LangChain 라이브러리, Neo4j Vector Index에 대한 완벽한 지원 추가
  • Knowledge Graph를 사용하여 RAG 애플리케이션 구현

구조화되지 않은 데이터가 무엇을 알고 있는지 확인할 준비가 되셨나요? 내 데이터세트로 첫 번째 Knowledge Graph 구축을 시작해 보세요..

  • 구조화되지 않은 데이터

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형