지식 그래프 (Knowledge Graph) 소개
요약
본 글은 지식 그래프(Knowledge Graph, KG)의 개념과 구축 과정을 설명합니다. 텍스트 코퍼스에서 개체와 관계를 추출하여 노드와 엣지를 만들고 시각화할 수 있습니다. 특히, 이를 검색기(retriever)로 활용하는 GRAG(Graph Retrieval Augmented Generation) 기법을 소개하며 RAG의 진화된 형태로 강조했습니다.
핵심 포인트
- KG는 개체와 관계를 네트워크로 표현하여 지식을 구조화합니다.
- GRAG는 KG를 검색기로 사용하여 텍스트 이해도를 높인 차세대 대화 방식입니다.
- 개념(Concept) 추출이 개체명(Entity) 추출보다 더 의미 있는 KG를 만듭니다.
- Mistral 7B와 같은 로컬 LLM을 활용하여 비용 효율적으로 KG 생성이 가능합니다.

이 코드를 사용하여 생성된 지식 그래프
ghpages 링크: https://rahulnyk.github.io/knowledge_graph/
지식 그래프(Knowledge Graph)는 시맨틱 네트워크(semantic network)라고도 알려져 있으며, 현실 세계의 개체—즉, 객체, 사건, 상황 또는 개념—들의 네트워크를 나타내고 그들 간의 관계를 보여줍니다. 이러한 정보는 보통 그래프 데이터베이스에 저장되며 그래프 구조로 시각화되어 '지식 그래프'라는 용어를 탄생시켰습니다.
출처: https://www.ibm.com/topics/knowledge-graph
- 텍스트 코퍼스(text corpus) 정리 (작품의 본문).
- 작품의 본문에서 개념과 개체 추출.
- 개체들 간의 관계 추출.
- 그래프 스키마로 변환.
- 노드(개념)와 엣지(관계) 채우기.
- 시각화 및 질의응답(Query).
6단계는 순전히 선택 사항이지만, 어느 정도 예술적인 만족감을 동반합니다. 네트워크 그래프는 아름다운 대상입니다 (위 배너 이미지를 보세요, 정말 아름답하지 않나요?). 다행히도 그래프 시각화를 생성할 수 있는 좋은 수의 Python 라이브러리가 있습니다.
지식 그래프(KG)가 구축되면 다양한 용도로 사용할 수 있습니다. 우리는 그래프 알고리즘을 실행하고 모든 노드의 중심성(centrality)을 계산하여, 특정 개념(노드)이 이 작품에 얼마나 중요한지 이해할 수 있습니다. 텍스트를 더 잘 분석하기 위해 커뮤니티(community)를 계산하여 개념들을 묶을 수도 있습니다. 겉보기에는 단절된 것처럼 보이는 개념들 사이의 연결성을 이해할 수도 있습니다.
가장 좋은 점은, 그래프를 검색기(retriever)로 사용하여 **그래프 검색 증강 생성 (Graph Retrieval Augmented Generation, GRAG)**을 달성하고 우리의 텍스트와 훨씬 더 심오한 방식으로 대화할 수 있다는 것입니다. 이는 우리가 벡터 DB를 검색기로 사용하여 문서와 대화하는 **검색 증강 생성 (Retrieval Augmented Generation, RAG)**의 새롭고 개선된 버전입니다.
여기서는 PDF 문서로부터 간단한 지식 그래프를 만들었습니다. 제가 따르는 과정은 위 섹션에 개괄된 내용과 매우 유사하지만 일부 간소화되었습니다.
먼저 전체 텍스트를 청크(chunk)로 분할합니다. 그런 다음 LLM을 사용하여 각 청크 내에서 언급된 개념(concept)들을 추출합니다. 여기서 NER 모델을 사용해 개체명(entity)을 추출하는 것은 아니라는 점에 유의하십시오. 개념과 개체명 사이에는 차이가 있습니다. 예를 들어 'Bangalore'는 개체명이고, 'Pleasant weather in Bangalore'는 개념입니다. 제 경험상, 개념들이 개체명보다 더 의미 있는 지식 그래프(KG)를 만듭니다.
저는 서로 근처에서 언급되는 개념들은 관련이 있다고 가정합니다. 따라서 KG의 모든 엣지(edge)는 두 연결된 개념이 언급된 텍스트 청크가 됩니다.
노드(개념)와 엣지(텍스트 청크)를 계산한 후에는, 여기에 언급된 라이브러리들을 사용하여 그래프를 만드는 것이 쉽습니다. 제가 사용한 모든 구성 요소들은 로컬에 설정되어 있어 이 프로젝트는 개인 컴퓨터에서도 매우 쉽게 실행할 수 있습니다. 저는 비용 효율성을 유지하기 위해 여기에서 no-GPT 접근 방식을 채택했습니다. 저는 환상적인 Mistral 7B openorca instruct를 사용하는데, 이것이 이 사용 사례를 놀랍도록 잘 처리합니다. 이 모델은 Ollama를 사용하여 로컬에 설정할 수 있어 KG 생성 자체가 기본적으로 무료입니다(GPT 호출 없음).
그래프를 생성하려면 다음 노트북을 수정해야 합니다.
이 노트북은 다음 순서도에 설명된 방법을 구현합니다.
- 텍스트 코퍼스(corpus)를 청크(chunk)로 분할합니다. 각 청크에 chunk_id를 할당합니다.
- 모든 텍스트 청크에 대해 LLM을 사용하여 개념(concept)과 그 의미적 관계(semantic relationship)를 추출합니다. 이 관계에 가중치 W1을 부여한다고 가정합시다. 동일한 개념 쌍 사이에 여러 개의 관계가 있을 수 있습니다. 이러한 각 관계는 개념 쌍 사이의 간선(edge)이 됩니다.
- 같은 텍스트 청크에 나타나는 개념들은 문맥적 근접성(contextual proximity)으로 인해 서로 관련되어 있다고 간주합니다. 이 관계에 가중치 W2를 부여한다고 가정합시다. 동일한 개념 쌍이 여러 청크에서 발생할 수 있다는 점에 유의하세요.
- 유사한 쌍들을 그룹화하고, 그들의 가중치를 합산하며, 그 관계들을 연결(concatenate)합니다. 따라서 이제 우리는 서로 다른 모든 개념 쌍 사이에 단 하나의 간선만 갖게 됩니다. 이 간선은 특정 가중치와 이름으로 된 관계 목록을 가지게 됩니다.
추가적으로 각 노드의 차수(Degree of each node)와 그래프에서 노드를 크기화하고 색칠하기 위한 노드 커뮤니티(Communities of nodes)를 계산합니다.
-
Docker
-
저장소 클론:
git clone https://github.com/rahulnyk/knowledge_graph.git cd knowledge_graph -
빌드
docker build -t knowledge-graph . -
실행
docker run -p 8888:8888 knowledge-graph
저는 텍스트 청크에서 개념을 추출하기 위해 Mistral 7B Openorca를 사용합니다. 이 모델은 시스템 프롬프트 지침을 매우 잘 따릅니다.
Ollama는 모든 모델을 로컬에 쉽게 호스팅할 수 있게 해줍니다. Mistral 7B OpenOrca 버전은 Ollama에서 바로 사용할 수 있도록 이미 제공됩니다.
이 프로젝트를 설정하려면 로컬 컴퓨터에 Ollama를 설치해야 합니다.
단계 1: Ollama 설치 https://ollama.ai
단계 2: 터미널에서 ollama run zephyr 실행합니다. 이렇게 하면 zephyr 모델이 로컬 컴퓨터로 다운로드되고 Ollama 서버가 시작됩니다.
dataframes for graph schema (나중에 그래프 데이터베이스(graphdb)를 사용할 수 있습니다).
이것은 그래프 작업을 매우 쉽게 만들어주는 파이썬 라이브러리입니다.
Pyvis는 시각화를 위한 Python 라이브러리입니다. Pyvis는 Python을 사용하여 JavaScript 그래프 시각화를 생성하므로, 최종 그래프를 웹에 호스팅할 수 있습니다. 예를 들어, 이 저장소의 GitHub 링크는 pyvis로 생성된 그래프입니다.
이 프로젝트는 더 많은 작업이 필요합니다. Medium과 GitHub에서 여러 분들이 제안한 훌륭한 아이디어들이 있습니다. 이것에 관심이 있다면, 함께 힘을 모아 이 프로젝트를 만들어 나갑시다. 몇 가지 제안된 개선 사항은 다음과 같습니다.
임베딩(embeddings)을 사용하여 의미적으로 유사한 개념들을 중복 제거합니다. (Medium 아티클에서 William Claude가 제안) - LLM이 "doctor"와 "doctors"처럼 비슷한 개념을 다르게 작성하는 것을 방지합니다. - 강하게 유사한 개념들의 클러스터링을 강화할 필요가 있습니다. ("doctor"와 "medical practitioner" 등)
텍스트 이해에 유용하지 않을 수 있는 중복되거나 이상치(outlier) 개념들을 필터링합니다. 예를 들어, 텍스트에서 너무 자주 발생하는 일반적인 개념들이 있습니다. (Luke Chesley가 제안) - 특정 개념이 너무 자주 나타나 과도하게 강조되는 것을 방지하거나 쓸모없는 엣지(edges)를 제거하기 위해 문맥적 근접성(contextual proximity)의 개념을 더 잘 구현해야 합니다. (Luke Chesley가 제안)
개념 그래프를 더 유용하게 렌더링할 수 있는 프론트엔드(Frontend)를 만듭니다. 예를 들어 다음과 같은 흐름입니다. (Medium 아티클에서 David Garcia가 제안) - 개념/관심사/주제 목록을 제공합니다. - 사용자가 관심 있는 것을 선택합니다. - 이것이 하위 주제, 하위 개념, 하위 X 등을 보여주며 확장됩니다. - 이를 통해 전문 분야 깊숙이 파고들 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Jupyter Notebook (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기