1. 배경(Problem)
"AI가 단순히 답변만 하는 것이 아니라, 진짜 이야기를 함께 만들어가고 싶어요."
우리는 인간이 이야기를 통해 소통하고 경험을 공유하는 본능을 가지고 있습니다.
하지만 현대 사회에서는 다음과 같은 문제가 존재합니다
•
일방통행적 소비
: 대부분의 미디어 경험은 일방적인 소비에 그치며, 독자가 이야기에 직접 참여하기 어렵습니다.
•
AI 상호작용의 한계
: 기존 AI 챗봇은 단순 질의응답에 최적화되어 있어, 풍부한 서사와 캐릭터 발전을 담은 장기적 스토리텔링이 부족합니다.
•
접근성
: 여러 참가자가 필요해 진입장벽이 높습니다.
•
언어모델의 기억력 한계
: 대규모 언어 모델(LLM)은 이전 맥락을 금방 잊어버리기 때문에 긴 대화나 복잡한 스토리를 일관성 있게 유지하기 어렵습니다.
시연 동영상
2. 서비스 소개(Solution)
”샌드박스형 인터랙티브 소설 작성기"
Novelist는 사용자와 AI가 실시간으로 상호작용하며 함께 이야기를 만들어가는 인터랙티브 소설 플랫폼입니다. 사용자는 자유롭게 텍스트 입력을 통해 이야기에 참여하고, AI는 실시간으로 스토리를 생성하며 게임을 진행하지만, 화면에 나타나는 모든 이야기는 소설의 형태를 가집니다.
LangGraph와 Neo4j 그래프 데이터베이스를 활용하여 구현된 Novelist는 일방적인 소설 읽기나 게임 플레이와는 달리, 사용자가 자유롭게 행동하고 선택하며 이야기의 흐름에 직접적인 영향을 미칠 수 있는, 샌드박스 롤플레잉 게임을 하듯 이야기에 스스로 참여하는 경험을 제공하는 것을 목표로 개발되었고, 그 프로토타입입니다.
주요한 도전과 해결책:
•
LLM의 기억력 한계 극복
: LangGraph를 활용하여 누적된 사용자 입력을 맥락에 반영하고, 특정 조건(Condition)의 결과에 따라 다음 내용으로 변경되도록 하여 소설의 흐름을 유지합니다.
•
풍부한 스토리텔링
: GraphRAG를 통해 표현/행동과 클리셰를 검색(Retrieve)하여 소설을 증강생성합니다. 클리셰(스토리라인), 감정표현, 행동을 벡터 인덱스로 작성하고 검색하여 풍부한 이야기를 생성합니다.
◦
프로젝트에서 “스토리데이터 설계, 구축 및 창작 요소 분포 분석(storyhelper(DBPIA-NURIMEDIA : 이화여대 김지선, 김명준 외))”의 데이터셋에서 추출한 데이터를 사용했습니다.
•
복잡한 관계 유지
: Neo4j 그래프 데이터베이스를 활용하여 캐릭터, 장소, 사건 간의 복잡한 관계를 효과적으로 표현하고 관리합니다.
3. 아키텍처 및 핵심 기능
1) Novelist는 다음과 같은 주요 컴포넌트로 구성되어 있습니다:
•
프론트엔드 (Streamlit): 사용자가 이야기에 참여하고 상호작용할 수 있도록 범용적인 형식의 웹 인터페이스를 제공합니다.
•
스토리 생성 엔진 (LangGraph): 사용자 입력과 상태(state)를 관리하여 이야기의 흐름을 제어합니다.
•
데이터베이스 (Neo4j): 캐릭터, 장소, 이벤트 간의 관계를 그래프 형태로 저장하고 관리합니다. 또한, 이야기의 분기점이 되는 상태(condition)를 적용하여 이야기를 분기합니다.
•
벡터 검색 시스템 (GraphRAG): 스토리라인을 검색하여 패턴에 따른 시나리오를 전개합니다. 또한 캐릭터의 표현과 감정, 행하는 행동 등을 검색하여 이야기를 생성합니다.
◦
데이터 기반 창작: 해당 샘플에서는 넷플릭스 시리즈 블랙 미러의 에피소드 'Metalhead'(시즌 4 에피소드 5)와 StoryHelper 데이터셋(AI Hub)을 활용하여 풍부하고 일관된 내러티브를 구성합니다.
◦
장기 기억 관리: 그래프 데이터베이스를 활용해 복잡한 스토리와 관계를 관리합니다.
•
이미지 생성 모듈 (Gemini API 등): 이야기와 동시에 해당 스토리의 주요 장면을 시각화하여 몰입감을 높입니다.
◦
맞춤형 시각 표현: 사용자의 캐릭터와 선택한 환경에 맞는 독특한 이미지가 생성됩니다.
◦
감정 증폭: 텍스트만으로는 표현하기 어려운 분위기와 감정을 시각적으로 전달합니다.
2) 데이터 흐름
1. 사용자가 텍스트를 입력합니다.
2. 입력은 LangGraph 노드로 전달되어 의도를 분석합니다.
3. 분석된 의도에 따라 Neo4j 데이터베이스에서 관련 정보를 검색합니다.
4. GraphRAG를 통해 관련 스토리라인, 감정, 행동을 검색합니다.
5. 검색된 정보를 기반으로 LLM이 새로운 이야기를 생성합니다.
6. 생성된 이야기와 함께 주요 장면은 Gemini API를 통해 이미지로 시각화됩니다.
7. 최종 결과가 사용자에게 표시됩니다.
3) 몰입형 시각적 경험
•
실시간 장면 시각화
: 중요한 순간마다 Gemini API를 통해 생성된 이미지로 몰입감을 높입니다.
4) LangGraph 기반 상태 관리
•
그래프 형태의 대화 흐름
: LangGraph를 사용하여 복잡한 대화 흐름을 그래프 형태로 명확하게 표현합니다.
•
효과적인 상태 관리
: LangChain에 비해 흐름 제어와 디버깅이 더 용이합니다.
•
사용자 입력 매칭
: 사용자 입력의 코사인 유사도를 검출해서 다음 노드로 진행되는 행동과 매칭하여 노드를 진행합니다.
4. 활용 라이브러리 및 개발 환경
관계형 DB를 통해서 이전에 있던 사건을 추적하고,
상황에 따라 이야기가 변경되며, 변경된 내용을 잊지 않도록 합니다.
5. 트러블 슈팅
1) Neo4j 드라이버 문제
•
문제 : Neo4j의 DB를 붙이기 위해서 neo4j의 드라이버로 개발을 진행하던 중, langchain에서 작성된 공식 래퍼를 확인
•
해결방법 : 마이그레이션을 했습니다.
•
결과 : 잦은 충돌이 없어져서 개발속도가 현저하게 올랐습니다.
2) LangGraph 상태 관리 복잡성
•
문제 : 복잡한 이야기 분기와 사용자 상호작용 처리 시 상태 관리가 어려워졌습니다.
•
해결 방법 :
◦
상태 관리 개선: 핵심 상태와 메타데이터를 분리하여 관리
◦
이벤트 기반 아키텍처 도입: 상태 변화를 이벤트로 처리하는 구조로 변경
•
결과: 복잡한 대화 흐름에서도 안정적인 상태 관리가 가능해짐
3) LLM 환각 현상 제어
•
문제 : 대규모 언어 모델에서 자주 발생하는 환각 현상으로 인해 이야기에 비일관성이 발생했습니다.
•
해결 방법 :
◦
GraphRAG 강화: 검색 기반 생성을 강화하여 사실에 기반한 정보 제공
◦
프롬프트 엔지니어링: 명확한 제약과 가이드라인을 포함한 프롬프트 설계
◦
사후 검증 시스템: 생성된 내용의 일관성을 검증하는 시스템 구축
•
결과 : 환각 현상 소거 및 이야기 일관성 크게 향상
5. 팀 소개
팀장 : 황현정
팀원 : 김준완, 김기용, 김태석
합쳐서 팀 일황삼김 입니다.
황현정
자신이 맡은 역할 :
프로젝트 리드, 시스템 및 컨셉 기획 및 설계, 전반적 기능 구현
자신에게의 의미 :
이전 프로젝트에서 사용해본 langchain에서 효율적인 관리를 위해 Langgraph와 Neo4J를 활용한 GraphRag를 구현해보는 좋은 기회가 되었고, 향후 프로덕션 빌드를 만들기 위한 필요한 사전연습의 의미가 컸습니다.
Contact :
realarem@naver.com
김준완
자신이 맡은 역할 :
이번 프로젝트에서는 데이터를 수집하고 Neo4j 형식에 맞게 전처리하는 역할을 맡았습니다. 관계형 DB보다 직관적인 구조 덕분에 다양한 방식으로 데이터를 구조화하며 관계 정의를 시도해 볼 수 있었습니다. Cypher 쿼리를 활용해 데이터를 탐색했고, PDF 데이터를 효과적으로 매핑하는 작업도 수행했습니다. 또한 LangChain과 연계하여 자연어 처리 기반의 지식 그래프 실험을 진행하며 기술적 성장의 계기가 되었습니다.
자신에게의 의미 :
이번 프로젝트는 LangChain이라는 기술을 처음 접하고 직접 활용해 본 첫 경험이라는 점에서 저에게 매우 의미 있는 시간이었습니다. 생소한 개념과 기능들을 익혀 가며 프로젝트를 진행하는 과정은 쉽지 않았고, 특히 시간적인 여유가 많지 않아 부담도 컸습니다. 하지만 그만큼 더 집중해서 공부하고 실습해야 했고, 그 과정 속에서 제가 기술적으로 성장하고 있다는 것을 체감할 수 있었습니다. 단순히 결과물을 완성하는 데 그치지 않고, 새로운 도구를 이해하고 활용해 보며 제 개발 역량의 폭을 넓힐 수 있었기 때문에 이번 프로젝트는 매우 뜻깊은 경험으로 남았습니다.
Contact :
rlawnsdhks7@naver.com
김기용
자신이 맡은 역할 :
Langraph에서 스토리 생성 모델 별 테스트 및 프롬프트를 튜닝했습니다.
자신에게 의미 :
AI로 프롬프트를 쓰고, AI툴들을 이용해, AI로 궁금증을 해결하며, AI 어플을 만들었습니다.
DEVELOPER == EDITOR =? PLANNER
김태석
자신이 맡은 역할 :
프레젠테이션 및 회의록 작성, 기술 관련 문서 검색을 했습니다.
자신에게 의미 :
새로운 기능을 많이 배웠습니다. GRAPH RAG와 NEO4J에 대해 알게되었습니다.
그리고 기술이 참 빠르게 생긴다는걸 느꼈습니다.