ChatGPT는 저뿐만 아니라 여러분 대부분이 AI와 챗봇을 바라보는 방식을 바꿔놓았죠. 챗봇을 이용해서 정보를 찾거나 창의적인 작업을 하는 등 다양한 일을 할 수 있게 되었어요.
하지만 ChatGPT나 비슷한 챗봇들은 환각 현상을 일으켜서 겉보기엔 훌륭하지만 사실은 부정확한 결과를 내놓을 수 있다는 문제점이 있어요. 이런 문제가 발생하는 이유는 Large Language Model(LLM)이 본질적으로 블랙박스이기 때문에 환각 현상을 줄이려고 모델을 수정하거나 재학습시키기가 어렵기 때문이에요. 그래서 중요한 작업이나 생명이 걸린 일에 ChatGPT의 답변을 맹신하는 건 위험할 수 있어요.
반면에 챗봇과 상호작용하고, 챗봇을 여러 애플리케이션의 인터페이스로 활용할 수 있다는 점은 정말 큰 장점이에요.
그래서 챗봇에 대해 좀 더 자세히 알아보고 싶었는데, 다행히도 황 식싱님이 챗봇을 구현하는 다양한 방법에 대한 집중 강좌를 제공해주셨어요. 특히 저는 챗봇이 Knowledge Graph에 저장된 정보와 사실을 기반으로 답변을 제공하는 Knowledge Graph 기반 챗봇 방식에 큰 흥미를 느꼈답니다.
Knowledge Graph를 답변 저장소로 사용하면 챗봇이 제공하는 답변을 명확하고 완벽하게 제어할 수 있고, 환각 현상도 피할 수 있어요. 게다가 Sixing님은 이미 Knowledge Graph 기반 챗봇 구현에 대한 코드를 작성해서 공유해주셨기 때문에, 기존 아이디어를 활용해서 처음부터 시작할 필요가 없다는 점도 좋았죠.
제 아이디어는 뉴스 기사를 탐색, 분석, 이해하는 데 사용할 수 있는 챗봇을 개발하는 거였어요.
가장 먼저 뉴스 기사를 기반으로 Knowledge Graph를 구축해야 했어요. 다행히 저는 정보 추출 파이프라인을 여러 번 사용하고 관련 글도 썼었기 때문에, 이 부분에 시간을 많이 들이지 않아도 됐죠. 다음으로는 첫 번째 챗봇을 구현해 볼 차례였는데, GPT-3 덕분에 Knowledge Graph 기반 챗봇을 만드는 게 정말 쉬웠어요. 저는 다음과 같은 챗봇 아키텍처를 구축했답니다.
사용자는 Streamlit 애플리케이션을 통해 챗봇과 간단하게 대화할 수 있어요. 사용자가 질문을 입력하면, 그 질문은 OpenAI GPT-3 엔드포인트로 전달돼서 Cypher 쿼리로 변환되도록 요청되죠. OpenAI 엔드포인트는 Cypher 쿼리를 반환하고, 이 쿼리는 에 저장된 Knowledge Graph에서 정보를 검색하는 데 사용돼요. Knowledge Graph에서 검색된 데이터는 사용자의 질문에 대한 답변을 구성하는 데 사용되고요. 나중에 설명하겠지만, GPT-3 엔드포인트를 사용해서 기사를 요약하는 기능도 추가했어요.
모든 코드는 에서 확인할 수 있습니다.
Knowledge Graph 구축
Knowledge Graph에서 정보를 검색하려면 먼저 정보를 채워 넣어야겠죠? 앞서 말씀드렸듯이, 뉴스 기사의 Knowledge Graph를 구축하는 게 목표였어요. 그래서 양질의 정확한 뉴스 기사 출처를 찾아야 했죠. 이번 데모에서는 Kaggle 저장소에서 제공하는 최신 1000개의 기사를 사용했어요. 이 기사들은 CC BY-NC 4.0 라이선스에 따라 제공된답니다.
이 주제에 대해서는 이미 여러 번 글을 썼기 때문에, 정보 추출 파이프라인에 대해 자세히 설명하지는 않을게요.
- SpaCy 및 REBEL을 사용한 정보 추출 파이프라인
- 생체의학 정보 추출 파이프라인
- 뉴스에서 정보 추출
대부분의 경우 정보 추출 파이프라인의 기본 개념은 구조화되지 않은 텍스트에서 언급된 엔터티 및 관계에 대한 구조화된 정보를 추출하는 것이에요.
이 예에서 정보 추출 파이프라인은 텍스트에서 NASA 엔터티를 식별해요. 또한 대부분의 명명된 엔터티 인식 모델은 엔터티 유형을 추론할 수 있죠. 즉, 언급된 엔터티가 사람, 조직 또는 기타인지 추론할 수 있다는 거예요.
다음 단계에서는 관계 추출 모델을 사용하여 엔터티 간의 구조화된 관계를 검색합니다. 위 이미지의 텍스트는 NASA와의 업무 관계를 명확하게 나타내는데, 이는 다음과 같이 표현될 수 있어요: 관계.
흥미롭게도 GPT-3를 사용하여 텍스트에서 구조화된 정보를 추출할 수 있어요. GraphGPT 프로젝트는 입력 텍스트를 기반으로 구조화된 데이터를 생성하는 데 사용할 수 있는 간단한 프롬프트를 제공합니다.
GPT-3은 텍스트에서 관련 정보를 추출하는 작업을 훌륭하게 수행해요. 심지어 라는 두 번째 문장의 참조 내용도 잘 알고 있죠. 하지만 과 이 동일한 실제 엔터티를 참조한다는 것은 인식하지 못해요. 엔터티 명확성은 모든 정보 추출 파이프라인에서 중요한 부분이에요. 한 가지 접근 방식은 엔터티 연결 전략을 사용하여 엔터티를 대상 Knowledge Graph에 매핑하는 것이죠. Wikipedia는 대상 Knowledge Graph로 자주 사용돼요.
GPT-3 엔드포인트를 사용하여 간단한 프롬프트로 달성할 수 있다는 점이 정말 환상적이에요. 즉시 UK와 모두 동일하게 매핑되는 Q145 ID를 알 수 있는데, 이는 엔터티 명확성을 위해 사용할 수 있어요. 반면에 보리스 존슨은 Q1446에 연결되어 있죠. 두 경우 모두 말이에요. 그러면 다 좋겠지만, 이 ID Q1446은 로마 황제 를 가리키고 있어요.
GPT-3는 프롬프트를 따르는 데 탁월하지만 WikiData ID와 같은 외부 정보를 환각하는 경향이 있어요. 단일 단락에서 항목 명확성을 위한 좋은 프롬프트를 제공할 수 있지만, 항목 연결 없이 다양한 텍스트 간의 항목을 명확하게 하는 좋은 방법을 구성하기는 어렵죠.
관계 추출 및 엔터티 연결을 처리하는 정보 추출 파이프라인을 개발할 수 있어요. 저는 2년 전에 그런 파이프라인을 구현했었죠. 하지만 NLP 분야에서는 2년이 너무 길기 때문에 더 나은 정확도를 제공하는 솔루션을 찾을 수도 있어요.
맞춤형 정보 파이프라인 개발을 피하기 위해 우리는 Diffbot NLP 엔드포인트를 사용할 수 있어요. Diffbot NLP 엔드포인트는 관계를 추출하고 기본적으로 엔터티 연결을 제공해요. 또한 단락 수준과 개체 수준 감정을 모두 제공하므로 특정 사람이나 개체에 관한 긍정적이거나 부정적인 뉴스에 관해 챗봇에 질문할 수 있어서 챗봇에 질문할 수 있는 질문 집합이 크게 확장되죠.
Diffbot 엔드포인트를 사용하여 정보 추출 파이프라인을 실행하는 코드는 주피터 노트북에서 제공돼요. 이 데모에서는 정보 추출 파이프라인의 출력을 프로젝트의 데이터 폴더에 저장했기 때문에 실행할 필요가 없어요. 하지만 다른 데이터세트에서 테스트하고 성능을 평가하고 싶다면 시도해 보세요.
이제 새 기사가 처리되었으니, 정보 추출 파이프라인의 결과를 Graph Database로 가져올 수 있어요. 이 예시에서는 를 사용할 거예요. GitHub 저장소에는 Neo4j용 Docker 서비스와 Streamlit 애플리케이션용 Docker 서비스, 이렇게 두 개가 준비되어 있어서 Neo4j를 직접 설치할 필요가 없답니다.
seed_database.sh 스크립트를 실행하거나, Import 노트북을 실행해서 Graph Database를 뉴스 기사로 채울 수 있어요. 뉴스 기사로 채워진 Knowledge Graph의 그래프 스키마는 다음과 같아요.
Knowledge Graph는 다음을 포함하고 있어요. Article 노드는 기사의 웹 제목, 본문 내용 (텍스트), 감정 정보를 담고 있죠. 그리고 Article은 하나 이상의 Entity 노드를 언급할 수 있어요. Entity 노드에는 ID, 유형, 그리고 Entity 연결 프로세스의 결과인 URL 속성이 포함되어 있답니다.
흥미로운 점은 Entity 간의 관계가 그래프의 연결로 직접 표시되지 않고, 별도의 Relationship 노드로 표현된다는 거예요. 이렇게 그래프 모델링을 한 이유는 추출된 관계가 시작된 텍스트를 추적하고 싶었기 때문이에요. 아시다시피 완벽한 Natural Language Processing 파이프라인은 없잖아요? 그래서 원본 텍스트를 직접 확인해서 관계가 정확하게 추출되었는지 검증하는 게 중요해요. Neo4j 같은 레이블이 있는 Property Graph Database에서는 다른 연결을 가리키는 연결을 가질 수 없어요. 그래서 추출된 Entity 간의 관계를 중간 노드로 모델링하는 방식을 선택한 거죠.
GPT-3 모델을 사용해서 Cypher 구문 만들기
GPT-3가 프롬프트에 주어진 명령을 얼마나 잘 수행하는지는 이미 알고 계실 거예요. 추가적으로, 황 식싱님은 GPT-3 모델을 훈련시켜 Cypher 구문을 생성하는 것이 얼마나 쉬운지에 대해 이미 글을 쓴 적이 있어요. 아이디어는 간단해요. 모델에게 몇 가지 예시를 보여주고, 새로운 사용자 입력에 따라 Cypher 구문을 만들도록 하는 거죠. 특히 GPT-3 모델을 학습시키기 위해 다음과 같은 Cypher 예제를 준비했어요.
아쉽게도 GPT-3 엔드포인트에는 컨텍스트 개념이 없어서 모든 사용자 입력과 함께 훈련 예제를 보내야 해요. ChatGPT에는 대화의 맥락을 이해하는 기능이 있고, 이게 최종 사용자 애플리케이션에 어떤 영향을 미칠지 궁금해지네요. ChatGPT API 엔드포인트는 어떤 모습일까요?
이 이미지에서 보시는 것처럼, GPT-3 엔드포인트에 대한 모든 요청은 학습 예제로 시작해요. 재미있는 건, 모델에게 Cypher 구문을 생성해야 한다고 굳이 말할 필요가 없다는 거예요. 사용자 프롬프트와 함께 훈련 예제를 제공하기만 하면 모델이 알아서 Cypher 구문을 만들어낸답니다.
챗봇 구현
이제 퍼즐 조각들이 다 모였으니, 챗봇 애플리케이션에 합쳐볼까요? 저는 Streamlit 애플리케이션, 특히 Streamlit Chat을 사용해서 챗봇용 사용자 인터페이스를 만들었어요. Streamlit 애플리케이션은 작업이 간단하고, Python을 사용해서 CSS에 신경 쓰지 않고도 사용자 인터페이스를 개발할 수 있다는 점이 정말 마음에 들어요.
애플리케이션은 다음 Python 코드를 사용해서 챗봇 응답을 생성해요.
# Make a request to GPT-3 endpoint
completions = openai.Completion.create(
engine="text-davinci-003",
# Construct the prompt using the training examples
# combined with user input
prompt=examples + "n#" + prompt,
max_tokens=1000,
n=1,
stop=None,
temperature=0.5,
)
# Extract Cypher query from GPT-3 response
cypher_query = completions.choices[0].text
# Use the Cypher query to read the knowledge graph
message = read_query(cypher_query)
return message, cypher_query
앞서 말씀드린 것처럼, 모든 코드는 에서 확인하실 수 있어요. 더 자세한 내용이 궁금하시다면 방문해보세요. 저장소에는 챗봇 애플리케이션을 실행하는 방법도 자세히 설명되어 있답니다.
자, 이제 챗봇을 한번 사용해보고 얼마나 잘 작동하는지 살펴볼까요? 훈련 질문 세트에 있는 예시부터 시작해볼게요. 질문은 바로 "최근 긍정적인 소식은 무엇인가요?" 입니다.
생성된 Cypher 쿼리는 챗봇 사용자 인터페이스 오른쪽에서 바로 확인할 수 있어서, 생성된 Cypher 구문을 쉽게 평가할 수 있어요. 질문이 훈련 세트에 있기 때문에 생성된 Cypher 구문은 우리가 제공한 예시와 동일하죠.
다음으로는 훈련 세트 외부에 있는 질문의 변형을 시도해 볼 수 있어요. 비슷한 예시가 제공되긴 하지만, GPT-3는 Cypher 구문을 생성하기 위해 두 예시의 정보를 결합해야 할 거예요.
우리가 11개의 훈련 예제만 제공했다는 점을 감안하면, GPT-3가 적절한 Cypher 구문을 얼마나 잘 일반화하고 구성하는지 정말 놀라워요. 반면에 이전 답변에서 제공된 정보를 자세히 살펴보는 것이 얼마나 쉬운지 매우 만족스러워요. Cypher 구문을 작성하는 대신 자연어를 사용하여 데이터를 탐색할 수 있으니, 조사 작업이 훨씬 더 재미있고 접근하기 쉬워지죠!
Knowledge Graph에 Emla Fitzsimons에 대해 저장한 정보에 대해 후속 조치를 취하고 챗봇에게 질문할 수 있어요.
챗봇은 특정인과 관련된 추출된 관계에 대한 정보를 제공해줘요. 이 예시에서 우리는 Emla가 Center for Longitudinal Studies의 직원이고 Marcos Vera-Hernandez와 함께 일하며 경제학에 관심이 있다는 것을 알 수 있죠. 이 정보는 Diffbot NLP 엔드포인트를 사용하여 추출되었고 Knowledge Graph에 저장되었어요.
Emla에 대한 추가 소식이 있는지 챗봇에 문의해 보세요.
Emla는 한 기사에서만 언급된 것 같아요. GPT-3 엔드포인트를 사용하여 뉴스 기사를 요약하는 옵션을 추가하면 좋겠다고 생각했어요. GPT-3 모델은 명령을 매우 잘 따르기 때문에 텍스트 요약만 요청하면 되거든요.
# Make a request to GPT-3 endpoint
completions = openai.Completion.create(
engine="text-davinci-003",
# Prefix the prompt with a request to provide a summary
prompt="Summarize the following article: n" + prompt,
max_tokens=256,
n=1,
stop=None,
temperature=0.5,
)
message = completions.choices[0].text
return message, None
코드에 간단한 예외를 추가했어요. 사용자 입력에 다음이 포함된 경우 , 그러면 주어진 기사의 요약을 제공하는 것이 작업이라고 가정하는 거죠.
Knowledge Graph에는 기사와 개체 수준 감정이 모두 포함되어 있으므로 긍정적이거나 부정적인 감정을 가진 개체를 검색할 수 있어요. 예를 들어 뉴스에서 긍정적으로 언급된 조직을 검색할 수 있죠.
그리고 이전과 마찬가지로 챗봇에게 후속 질문을 하고, 관심 있는 정보를 드릴다운할 수 있어요.
요약
저는 자연어를 활용해서 오랫동안 Knowledge Graph를 탐구하고 분석하는 프로젝트를 만들고 싶었어요. 하지만 저는 Machine Learning 전문가가 아니기 때문에 진입 장벽이 너무 높았고, 사용자 입력을 기반으로 Cypher 구문을 생성하는 커스텀 모델을 개발하고 훈련하는 것이 저에게는 너무 큰 작업이었죠.
그리고 솔직히 말해서 ChatGPT의 과대 광고에 합류하기 전까지 저는 기본 기술이 얼마나 놀라운지, 그리고 그것이 얼마나 잘 작동하는지 진정으로 알지 못했어요. 예를 들어, 우리는 10개의 훈련 예제만 제공했는데 챗봇은 지난 5년 동안 주어진 그래프 스키마를 사용하여 작동한 것처럼 작동하는 거 있죠!
이 기사를 통해 여러분이 자신만의 챗봇을 구현하고 이를 사용하여 Knowledge Graph 및 기타 기술에 더 쉽게 접근할 수 있기를 바라요.
GitHub 저장소.
Knowledge Graph 구축을 고려하고 계신가요?
개발자 가이드: Knowledge Graph 구축 방법을 다운로드하여 자신 있게 시작하기 위해 알아야 할 모든 것을 단계별로 살펴보세요.
- gpt-3
- nlp
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'Ontology & Knowledge Graph' 카테고리의 다른 글
| 지식 그래프 생성: 핵심 개념과 활용 가이드 (2) | 2026.07.10 |
|---|---|
| 지식 그래프 추출, 그리고 풀어야 할 과제들 (1) | 2026.07.10 |
| LlamaIndex 워크플로우로 지식 그래프 에이전트 구축하기 (0) | 2026.07.09 |
| 자기 발견 여정: 30년 데이터 파이프라인을 Knowledge Graph로 통합하기 (0) | 2026.07.09 |
| 5분 인터뷰: Linkurious 공동 창립자 Jean Villedieu를 만나다 (0) | 2026.07.08 |
