스마트폰 없이는 집을 나서기 어려운 요즘 세상에서 구글은 언제나 우리 곁에 있습니다. 검색창에 질문 하나만 입력하면 거의 모든 궁금증을 순식간에 해결할 수 있죠.
검색 엔진과 그 방대한 정보 접근성은 이미 일상 깊숙이 자리 잡았고, 많은 사람들이 이에 크게 의존하고 있습니다. 구글을 비롯한 빅테크 기업들이 만들어 낸 높은 기준 때문에 검색 서비스가 최적의 성능을 내려면 쿼리에 대한 답변을 즉시 반환해야 합니다.
아주 사소한 지연이나 버벅임조차 사용자 경험을 해칩니다. 바로 이 문제를 극복하기 위해 Redis Launchpad 앱인 Alexis가 Redis를 메인 데이터베이스로 채택했습니다.
이 앱의 개발자 Bobby Donchev는 RedisAI와 RediSearch의 강력한 기능을 활용해 코퍼스(corpus)에서 최대한 효율적으로 정보를 검색합니다. 사용자는 PDF를 색인(index)하고, 간단한 UI를 통해 문서에서 필요한 정보를 손쉽게 추출할 수 있습니다.
Redis가 없었다면 전체 검색 과정이 느려져 Alexis의 핵심 기능 자체가 무너졌을 것입니다. 그럼 Bobby가 이 애플리케이션을 어떻게 만들었는지 하나씩 살펴보겠습니다.
본격적으로 시작하기 전에 한 가지 안내드립니다. Redis Launchpad에는 확인해 볼 만한 멋진 애플리케이션이 다양하게 준비되어 있으니 꼭 방문해 보시기 바랍니다!
- 무엇을 만들까요?
- 무엇이 필요할까요?
- 아키텍처
- 시작하기
- 데이터 저장 방식
- 데이터 접근 방식
- 작동 원리
1. 무엇을 만들까요?
이번 튜토리얼에서는 검색 쿼리를 최대 속도로 처리하는 고효율 텍스트 랭커(text ranker)를 만듭니다. 사용자는 이 애플리케이션으로 중요한 PDF를 색인하고, 문서에서 원하는 답변을 손쉽게 추출할 수 있습니다.
이제 각 단계를 순서대로 진행하며, 애플리케이션 구축에 필요한 구성 요소들을 하나씩 짚어보겠습니다.
2. 무엇이 필요할까요?
- RediSearch: 색인, 쿼리 및 전문(full-text) 검색 엔진
- RedisAI: 딥러닝·머신러닝 모델을 실행하여 데이터를 관리하고 지연 시간(latency)을 줄여줍니다
- Redis Streams: 데이터 소비(consumption)를 관리합니다
- NodeJS: 웹 브라우저 외부에서 JavaScript 코드를 실행하는 오픈소스 크로스플랫폼
- RedisJSON: ECMA-404 JSON 데이터 교환 표준을 네이티브 데이터 타입으로 구현합니다
3. 아키텍처
검색자의 쿼리에 대한 답변을 제공하는 과정은 두 단계로 이루어집니다.
- 먼저, 답변을 포함할 가능성이 높은 텍스트를 선별합니다. 이 단계에서는 BM25 랭킹 함수와 함께 RediSearch를 사용합니다.
- 다음으로, RedisAI에 로드된 트랜스포머(Transformer) AI 모델을 활용해 텍스트 내에서 정답 구간(answer span)을 식별합니다.
첫 번째 단계에서 RediSearch를 사용하면 검색 공간을 획기적으로 줄일 수 있습니다. 덕분에 앱 전반의 응답 속도가 훨씬 빨라집니다. 이후 백엔드는 TypeScript 기반의 NodeJS로, 프론트엔드는 TypeScript 기반의 React로 구성합니다.
RedisAI와 RediSearch 외에도 사용자 모델(user model)에는 RedisJSON을 활용하고, Redis Streams로 구현한 비동기 워커(asynchronous worker)를 함께 사용합니다.
웹 서버는 express 프레임워크로 노출되며, 다음과 같은 엔드포인트들을 제공합니다.
회원가입 후 로그인하면 색인 라이브러리에 문서를 추가하기 시작할 수 있습니다. PDF가 업로드되면 해당 이벤트가 Redis Streams에 기록됩니다. 이후 컨슈머 그룹(consumer group)의 워커가 이벤트를 가져와 비동기 방식으로 처리합니다.
PDF를 처리하고 클렌징(cleaning)을 적용한 뒤, RediSearch로 색인된 Redis 해시(hash)에 저장합니다. 이제 서버로 자연어 질의를 보낼 수 있으며, 더 이상 'kubernetes deployments', 'DDD root aggregate' 같은 단순 키워드 검색에만 국한되지 않습니다.
대신 훨씬 더 의미 있는 검색이 가능해집니다.
플로우차트
아래는 Alexis의 전체적인 동작 흐름입니다.
이제 플로우차트 중 Upload PDFs & Index PDF Content(PDF 업로드 및 콘텐츠 색인)과 Answer Query(질의 응답) 부분이 어떻게 동작하는지 자세히 살펴보겠습니다.
질의 응답(Answer Query)
- 사용자가 UI에 쿼리를 입력하면 해당 쿼리가 RediSearch로 전송됩니다
- 키워드를 바탕으로 RediSearch와 BM25 함수가 작동해 가장 의미 있는 콘텐츠를 찾아냅니다
- 이 콘텐츠는 쿼리와 함께 RedisAI로 전달되며, RedisAI가 비교 분석해 사용자의 질문에 가장 관련성 높은 답변을 결정합니다
PDF 업로드 및 콘텐츠 색인(Upload PDFs & Index PDF Content)
- 사용자가 검색창에 질문을 입력합니다
- RediSearch가 PDF를 색인하고 해당 쿼리에 대한 답변을 검색합니다
- RedisAI가 인퍼런스(inference)를 실행해 여러 개의 후보 답변을 도출합니다
- RedisAI가 각 답변을 비교하여 쿼리와 가장 관련성 높은 답변을 선택합니다
- 최종적으로 답변이 사용자에게 표시됩니다
4. 시작하기
1단계: 필수 요소 설치
Node - v12.x.x
NPM - v6.x.x
Docker 및 Docker-compose
2단계: 저장소 복제(Clone)
프로젝트 저장소를 로컬 환경으로 클론합니다.
3단계: 의존성 설치
디렉터리를 alexis로 변경한 후 아래 명령어를 실행합니다.
npm install
4단계: 프론트엔드 및 백엔드 설정
아래 명령어는 서버와 클라이언트 앱을 부트스트랩하고, Redis 서버와 RedisInsight GUI까지 초기화해 줍니다.
npm run bootstrap
5단계: 애플리케이션 실행
npm start
6단계: 애플리케이션 접속
브라우저에서 https://localhost:3000 을 열어 애플리케이션에 접속합니다.
7단계: RedisInsight 접속
RedisInsight는 GUI와 CLI 방식 모두로 Redis 데이터베이스와 상호작용할 수 있는 시각화 도구입니다. Redis 기반 애플리케이션 개발 시 훨씬 다양한 기능을 제공하며, 설계·개발·최적화까지 지원하는 완전한 데스크톱 GUI 클라이언트입니다. 자세한 내용은 RedisInsight 공식 문서를 참고하세요.
RedisInsight GUI는 https://localhost:8001 에서 접속할 수 있습니다.
5. 데이터 저장 방식
1단계: 사용자 데이터는 RedisJSON에 저장됩니다.
2단계: 아래 코드를 통해 사용자마다 RediSearch 인덱스가 생성됩니다.
3단계: 사용자가 PDF를 업로드하면 RedisJSON으로 해당 사용자의 pdfs 배열이 업데이트됩니다.
4단계: 파일 업로드는 동시에 이벤트를 발생시켜 ax:stream:pdf-processing 스트림에 기록합니다. 스트림 페이로드(payload) 구조는 다음과 같습니다.
5단계: 컨슈머 그룹 내 컨슈머가 스트림에서 이벤트를 가져와 파일을 처리하고, 내용을 해시(hash)에 기록합니다.
6. 데이터 접근 방식
이 애플리케이션에는 사용자마다 위에서 언급한 해시를 색인하는 RediSearch 인덱스가 존재합니다. 덕분에 사용자의 쿼리와 일치하는 관련 콘텐츠를 빠르게 조회(lookup)할 수 있습니다. 콘텐츠는 아래 코드로 분석됩니다.
RediSearch가 검색해 낸 콘텐츠는 이후 분석을 위해 RedisAI로 전달됩니다.
7. 작동 원리
계정 생성
Alexis 앱을 열면 로그인 포털로 이동합니다(아래 이미지 참조). 아직 계정이 없다면 하단의 하이퍼링크를 통해 새 계정을 만들 수 있습니다.
로그인하면 포털의 다른 페이지로 이동합니다. 처음 방문했다면 라이브러리에 아무 문서도 없을 것입니다. 다음 단계는 문서를 애플리케이션으로 가져오는 것입니다.
라이브러리에 문서 가져오기
절차를 시작하려면 화면 중앙의 박스로 문서를 드래그 앤 드롭하거나, 구름 아이콘을 클릭해 직접 파일을 불러오면 됩니다.
문서를 업로드하면 화면 왼쪽에 제목이 표시되면서 저장이 완료되었음을 알려줍니다(아래 참조).
이 시점에 PDF가 서버로 업로드되고, 백그라운드에서 클렌징이 진행됩니다. Redis의 고급 기능 덕분에 이 과정은 매우 효율적으로 처리됩니다.
질의하기
위 이미지에서 볼 수 있듯이, 앱에서 검색하고 싶은 쿼리를 입력하기만 하면 됩니다. 이 예시에서 사용자는 'What is the journey about?'라고 직접 물으며 파일의 내용이 무엇인지 질문했습니다.
쿼리를 제출하면 관련도에 따라 계층적으로 정렬된 여러 개의 답변이 즉시 제공됩니다(아래 예시 참조).
결론: Redis로 검색을 더 쉽게
결국 모든 사용자는 검색 결과가 그 어떤 지연도 없이 즉시 나타나기를 기대합니다. 디지털 시대에 어색한 버벅임은 사용자를 떠나게 만들고, 더 최적화된 서비스로 향하게 할 뿐입니다.
Redis를 활용함으로써 Alexis는 최고 수준의 성능을 발휘할 수 있었습니다. RediSearch 덕분에 여러 위치에 흩어진 가장 의미 있는 콘텐츠를 빠르고 효율적으로 수집했고, RedisAI의 초정밀 분석 기능이 이 콘텐츠를 걸러내어 사용자에게 가장 관련성 높고 정확한 답변을 제공했습니다.
이 애플리케이션이 만들어진 과정을 더 알고 싶다면 Bobby의 YouTube 영상을 확인해 보세요. 또한 Redis Launchpad에서 영감을 얻을 수 있는 다양한 애플리케이션을 만나볼 수 있습니다.
헬싱키의 실시간 버스 추적 시스템부터 개발도상국의 농작물 보험 보호에 이르기까지, 전 세계 개발자들이 Redis의 놀라운 가능성을 활용해 일상에 변화를 만들어 가고 있습니다. 여러분도 그 주인공이 될 수 있습니다!
이 애플리케이션을 만든 사람은?
Bobby Donchev

Bobby는 12년 이상 고객을 위한 시스템 설계 및 구현 경험을 쌓아온 역동적인 개발 엔지니어입니다.
그의 GitHub 페이지를 방문하면 참여한 프로젝트들의 최신 소식을 확인할 수 있습니다.