레이블이 Database인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Database인 게시물을 표시합니다. 모든 게시물 표시

9/18/2025

Text to SQL이 왜 잘 안될까?

LLM(Large Language Model)의 등장으로 데이터 접근 방식도 변해야 한다고 생각한다. 데이터베이스 분야외에 다른 분야는 LLM을 위한 변화가 이미 시작되었다.

프론트엔드 관점에서는 Perplexity, GPT 검색과 같은 AI 에이전트 및 스크래퍼를 지원하기 위해 명확한 제목, 구조화된 섹션, 풍부한 스니펫을 통해 "LLM 검색"이 가능하도록 설계되어가고 있다.

AI가 콘텐츠를 더 효과적으로 요약, 추출을 할 수 있게 하기 위함이다.

백엔드 관점에서는 백엔드에서 만들어지는 API 디자인은 AI 에이전트가 분석하고 사용할 수 있도록 명확한 주소와 메타데이터를 갖춘 MCP과 같은 프로토콜로 전환되고 있다.

프론트엔드, 백엔드를 지나 이제 데이터베이스의 차례이다.


레거시 데이터베이스에서 작업한 경험이 있으신 분들은 아마 알고 있을 것이다. 데이터베이스는 자가 설명적이지 않다. 데이터베이스의 스키마를 보고 무엇을 의미하는지 알기가 어렵다.

Fullname이라면 유추할 수 있지만, 축약어를 사용한다면 더더욱 판단하기가 어렵다.

예를 들어, order라는 테이블이 있다고 하면 이 테이블이 고객의 주문서를 담고 있는 것인지, 구매 주문서인지 이름만 봐서는 판단하기 어렵다. 이는 데이터베이스가 안고 있는 오래된 문제이다.

이제는 LLM이 데이터베이스에서 제공하는 맥락만으로 데이터에 대한 이해를 해야 한다. 사람도 헷갈리는데 혼란스럽지 않을까?

여기서 "Text to SQL"의 허점이 발생한다. 지금은 사용자가 자연어를 사용하여 데이터를 뽑는 시대가 열리고 있다.

"지난 분기 각 매장의 총 수익을 보여주세요." 라고 질문을 하면,

위에 맞는 적절한 SQL 쿼리를 실행하고 그 결과를 차트에 표시해야 한다. 이런 상황을 고려하지 않은 LLM 태생 이전에 디자인한 데이터베이스로 이 질문에 대한 정확한 SQL을 만들 수 있을까?

생각보다 이 문제는 어려운 문제이다.

누군가는 이렇게 얘기할 수 있다. LLM에 데이터베이스의 전체 스키마를 전달하고, SQL 쿼리를 생성하도록 요청하면 되지 않느냐고...

테이블 이름, 컬럼명 그리고 관계에 대한 정보가 있어도 LLM은 사용자의 질문에 정확하게 답변하는 SQL쿼리를 생성하지 못할 수 있다. 

대부분의 데이터베이스 스키마에서 테이블과 컬럼명은 그 자체로 설명적이지 않기 때문이다. 때로는 개발자 조차도 스키마 이해에 어려움을 겪기 때문에 AI가 이해할 수 있을 것이라고 기대할 순 없다.

위에서 언급한 대로 고객 주문과 구매 주문이 각각 어떤 테이블에 있는지 이해하지 못하면 파악할 수 없다. 이 상황은 데이터베이스가 클수록 상황은 더 나빠진다.

일반적인 코드 생성 문제와는 달리 이 문제는 단순하게 텍스트 설명에서 코드를 생성하는 것 이상이다. 모델은 데이터베이스 구조, 데이터 유형, 테이블 간의 관계 등을 알고 있어야 하기 때문이다.

비즈니스의 전문화된 용어를 데이터베이스의 구조로 번역하는 방법에 대해 모델을 훈련시켜야 할 수 도 있다. 모델이 전반적인 비즈니스를 이해하고, 데이터 구조를 이해한 상태에서 사용자의 질문에 답할 수 있어야 하는 경우가 대부분이기 때문이다.

어떤 상황에서 LLM이 힘들어하는지 살펴보자.

LLM은 필드 이름의 의미가 중요하다. 이름이 모호하면 추측하게 되고, 잘못된 이해를 할 수 있다. 예를 들어 "가치"라는 필드가 있으면, 이 필드는 "원화"라는 의미도 담고 있어야 한다. "가치_원" 으로 표현되어야 LLM이 이해할 수 있을 것이다.

일관된 데이터 형식도 중요하다.
"구매날짜 = 2025-09-18"
"주문날짜 = 2025/09/18"

위 처럼 데이터 형식이 서로 다르면, 일관된 형태로 답을 하기가 어렵다.

그리고 회사내부에서 사용하는 용어, 지표, 명명 규칙을 LLM은 알지 못한다.

1. 재구매 고객: 최소 3개월 이상 구매한 고객
2. 이탈 고객: 3개월 이상 로그인을 안한 고객

회사내에서는 위 용어에 대해 정의를 내렸지만, 데이터베이스에서는 해당 데이터가 존재하지 않는다. 여러 데이터를 기반으로 애플리케이션 계층에서 계산을 해야 하기 때문이다.

이럴 경우 LLM은 추론할 수 없다. 이런 용어의 논리를 명확하게 정리하지 않으면, LLM은 올바른 의견을 낼 수 없다.

반면, LLM의 등장 이전에 우리가 해왔던 것들을 생각해보자.

이전 에도 작성했지만, SQL과 코드에서 필드 이름을 축약어를 선호했기에 짧은 이름을 주로 사용한다. 가독성보다 최적화를 선택했다.

여러가지 이유, 제약이 있을테고, 이는 타당한 엔지니어링 결정일 수 있지만 스키마를 의미적으로 추론하기 어렵게 만든 것은 사실이다.

그럼 우리는 앞으로 어떻게 해야 할까?

MCP 스타일 표준 관점에서 접근을 해야 할 것이다. 기계가 이해할 수 있는 친화적인 스키마 설계가 필요하다.

즉, 데이터베이스를 설계하는 방식에 변화가 필요하다. 아래처럼 우선 시작해봐야하지 않을까?

  • 설명이 드러나는 명확한 이름과 일관된 형식 사용
  • 의미론적 관계를 반영
  • 기계가 이해할 수 있는 메타데이터 추가
  • 컨텍스트가 저장된 벡터DB를 이용한 추론

끝으로, Text to SQL에서 질의에 대한 답이 이상하다면, LLM의 문제로 바라볼 것이 아니라. 스키마 설계를 의심해야 한다. 우리는 LLM을 염두해서 설계하지 않았기 때문이다.

Text to SQL에서 정확도를 높이려면 시스템이 접근할 수 있는 정보의 범위를 좁히는 것도 중요하다. 성공적인 Agent는 엄격한 범위 설정이 중요하다. 정확성이 입증된 후에만 확대하는 것이 효과적이다.

다음 글에서는 스키마 설계에 대한 부분을 다룰 생각이다.

2/12/2019

Netflix 미디어 데이터베이스

Netflix의 목표는 전 세계 수백만 회원의 재생 시작 시간을 최소화하는 것이다. 이를 위해서 ISO BMFF의 Header 크기에 대한 통계량(최소값, 최대값, 중간값, 평균값등)을 수집해야 한다.

Netflix의 Transcoding Pipeline은 방대한 콘텐츠 카탈로그를 서비스하며 모든 콘텐츠에 대해 다양한 코덱+품질 조합을 생성한다.

과거에는 비트 스트림 헤더 정보를 클롤링하는 일회성 스크립트를 작성해야만 데이터를 분석할 수 있었고 이러한 접근 방식에는 확장성이 없었다.

본 글에서는 Netflix의 Media Data Base 시스템에 대해서 소개하고자 한다.

왜 미디어 전용 데이터 베이스가 필요한가?

의미있는 개인화 및 효율적인 스트리밍은 최종 사용자가 서비스를 정의하는 주요 요소이다.

이러한 경험을 제공하기 위해서는 복잡한 비즈니스 워크 플로우가 필요하다.


위 그림처럼 아트워크상의 이미지 및 타이틀은 사용자가 관련 영화를 찾는데 도움이 된다. Netflix에서는 콘텐츠를 처리하는 단계에서 디지털 상품 Asset을 합성하는데 도움이되는 시스템을 개발해야 하는 상황이 있었다. 예를 들어서 소스 비디오 Asset에서 자동으로 추출 된 의미 있는 원시적인 이미지 및 비디오 클립을 제공하는 부분이다. 이는 콘텐츠에서 매력적인 디지털 미디어 자산을 창출하는 출발점이 될 수 있다고 생각했다. 이런 기능을 제공하게되면 사용자가 관련 프로그램 및 영화를 찾는데 큰 도움이 될 수 있다.

위의 그림처럼 콘텐츠 추천 시스템은 최종 사용자의 취향에 맞게 개인화 된 항목을 보여준다. Netflix 카탈로그에 있는 콘텐츠의 작고 효과적인 기능 표현은 매우 중요하다. 이러한 표현은 미디어 파일(오디오, 텍스트, 비디오)과 메타 데이터(장르 태그, 개요)를 기반으로 학습하는 기계 학습 모델을 구축하여 얻을 수 있다.

마지막으로 Netflix에서 수집 된 콘텐츠의 품질에 대한 높은 기준을 유지하는 것이 최종 사용자의 경험을 위해서는 필수적이다. 아래의 이미지는 이런 사례중 하나를 보여준다.

아래의 이미지는 Western Classical 장르의 비디오 프레임에 해당되고 이 경우 카메라가 동영상에 표시되고 있다. 카메라의 존재를 감지하는 자동화 된 분석 시스템을 갖는 것은 매우 바람직하다.


다음 그림의 경우, 자막은 영상에서 표시한 텍스트 위에 놓여지면 읽기가 어려울 수 있다. 자막의 타이밍 및 위치에 대한 지식과 함께 영상내 텍스트 검출 알고리즘을 사용하여 이 문제를 자동으로 해결 할 수 있다.


위와같은 분석 중 많은 부분을 계산하기 위한 비용은 매우 비싸다. 서로 다른 유즈 케이스를 처리할때 동일한 계산을 반복하는것도 매우 비효율적이기 떄문에 미디어의 타임라인과 관련된 모든 분석을 위한 보편적인 저장소 역할을 할 수 있는 데이터 시스템이 필요했다. 즉, 미디어 데이터베이스가 필요하다.

미디어 데이터베이스의 특징

미디어 데이터베이스는 다양한 형식의 미디어에 대한 분석 데이터가 들어있다. 여기에는 오디오, 비디오, 이미지 및 텍스트가 포함된다. 미디어 타임라인에서 임의의 쿼리를 처리할 때 사용된다. 예를 들어서 오디오 트랙의 타임라인에서 음악이 포함된 부분에 대한 시간 간격 또는 텍스트가 포함된 비디오의 비디오 프레임 목록 또는 자막 파일의 시간 간격 집합이 그것이다. 다음과 같은 사항이 미디어 데이터베이스의 중요한 특징이다.

  1. 구조화 된 데이터와의 유사성: 스키마가 있는 데이터는 기계 기반 처리가 가능하기에 분석이 가능하다. Netflix의 경우 스키마를 통해 데이터 검색 및 마이닝 기회를 제공하는 데이터를 색인할 수 있다.
  2. 효율적인 미디어 타임라인 모델링: 비디오 프레임에서 이벤트 기반에 이르기까지 다양한 유형의 미디어 타임라인 데이터를 서비스하는 기능은 미디어 데이터베이스의 기본 특성이다.
  3. 시공간 쿼리 기능: 미디어 데이터베이스는 미디어 데이터의 공간적(e.g. 이미지의 일부) 특성외에 시간적(e.g. 오디오 트랙의 시간 간격) 특성을 기본적으로 지원하며 이러한 부분에서 꽤 괜찮은 쿼리 기능을 제공한다. 예를 들어서, 미디어 데이터베이스를 사용하면 비디오 프레임내의 연속 시퀀스에 비디오 프레임의 특정 공간 영역(e.g. 왼쪽 상단 모서리)에 텍스트가 포함되어 있는지 쉽게 확인 할 수 있다. 이러한 쿼리를 비디오에 있는 텍스트와 자막 사이의 충돌을 탐지 하는데 유용하다.
  4. 다중 소유: 잘 설계된 미디어 데이터베이스는 복수의 어플리케이션으로부터 복수의 분석 데이터를 지원하기 위한 플랫폼으로써 사용될 수 있다. 이 부분이 구조화되어 있으면 임의의 데이터를 저장할 수 있고 해당 데이터가 미디어 리소스의 특정 시간 간격에도 연관 될 수 있을 경우에는 효율적인 쿼리 기능에 활용 될 수 있다.
  5. 확장성: 확장 가능한 마이크로 서비스 기반 모델은 필수적이다. 시스템은 다양한 시나리오에서 가용성 및 일관선과 관련된 문제를 해결해야 한다.

Netflix 미디어 데이터베이스 소개

Netflix는 위에서 소개된 내용을 통해 미디어 타임라인의 시공간 쿼리에 대규모로 응답이 가능한 미디어 타임라인과 관련된 분석을 위한 NMDB를 만들었다. Netflix 카탈로고는 다양한 형식의 많은 미디어 자산으로 구성되고 정적 자산의 경우 이미지가 포함되며 재생 가능한 자산의 경우 오디오, 텍스트 및 비디오가 포함된다. 위에서 설명한 것처럼 수많은 비즈니스 어플리케이션이 이러한 자산과 관련된 정보를 얻을 수 있다. NMDB의 주요 목표는 어플리케이션에서 필요한 필수 데이터를 제공하는 것이다. NMDB는 다양한 Netflix 미디어 처리 시스템의 백본을 형성하는 데이터 시스템인 것이다.

References

  • https://medium.com/netflix-techblog/the-netflix-media-database-nmdb-9bf8e6d0944d


9/17/2018

MSA(마이크로 서비스 아키텍처)에서 단일 데이터베이스를 분리해야 하는 이유

기존 Monolithic 서비스를 분해하여 Micro Service 아키텍처를 사용할 경우 데이터베이스에 중점을 두는 것이 중요합니다. 어플리케이션과 연계된 데이터베이스를 여러개의 작은 데이터베이스로 분할하는 확실한 전략이 필요합니다.

즉, 기존에 사용하던 Monolithic의 통합 데이터베이스를 분리해야 합니다.

마이크로 서비스 아키텍처는 각 마이크로 서비스가 자체 도메인 데이터가 있는 별도의 데이터베이스를 가지도록 설계해야 합니다. 이렇게 해야 마이크로 서비스를 독립적으로 배포하거나 확장 할 수 있기 때문입니다.

기존 Monolithic 서비스에는 단일 데이터베이스가 있고 데이터는 다른 컴포넌트간에 공유됩니다. 데이터가 단일 저장소에 관리되기 때문에 개발이 더 간단하다는 장점이 있지만, 데이터베이스 설계에는 여러 가지 문제가 존재합니다.


단일 데이터베이스 설계의 문제점

위의 그림처럼 Monolithic 데이터베이스를 사용하는 설계는 서비스 변경 사항을 독립적으로 배포 할 수 없도록 상호간의 밀접한 결합 방식을 통해 무능력하게 만듭니다. 동일한 데이터베이스에 엑세스하는 여러 서비스가 있는 경우 모든 서비스간에 스키마 변경 사항을 조정해야 합니다.(어디서 어떤 데이터를 사용하는지 알 수 없기에…) 변경 사항을 적용 할 때 추가 작업에 대한 지연이 발생할 가능성이 큽니다.

단일 데이터베이스를 수평 확장 할 수 있는 옵션만 있기에 어플리케이션 단에서 개별 서비스를 확장하는 것이 어렵습니다.

어플리케이션 성능을 향상 시키고자 할때, 단일 데이터 베이스를 사용하면 여러 개의 큰 테이블을 조인하여 필요한 데이터를 가져와야 하기에 데이터 검색이 어려워집니다.

그리고 가장 큰 문제는 모든 어플리케이션에서 관계형 데이터베이스만 사용하도록 제한하게 됩니다. No-SQL 데이터베이스가 특정 서비스에 더 적합할 수 있어도 제한으로 인해 사용할 수 없게 됩니다.

마이크로서비스 아키텍처에서 데이터를 처리하는 방법

각 마이크로 서비스는 자체 데이터베이스를 가지고 있어야 하며 해당 마이크로 서비스와 관련된 데이터를 모두 포함해야 합니다. 이렇게 하면 각 서비스를 독립적으로 배포 할 수 있습니다. 각 서비스마다 독립적인 데이터베이스를 소유할 수 있게 됩니다.


마이크로 서비스의 설계 사상은 도메인 기반이어야 하며 한정된 컨텍스트를 가져야 합니다. 데이터 우선 접근 방식보다 코드 우선 접근 방식을 따라야 합니다. 따라서 가장 먼저 모델을 설계해야 합니다. 이 작업은 새로운 요구 사항이나 프로젝트를 시작할 때 데이터베이스 테이블을 먼저 설계하는 전통적인 사고 방식과는 근본적으로 다른 접근법입니다. 항상 비즈니스 모델의 무결성을 유지하려고 노력해야 합니다.

데이터베이스를 디자인할때 어플리케이션 기능을 살펴보고 관계형 스키마 필요 여부를 결정해야 합니다. No-SQL에 대한 가능성도 열어 두어야 합니다.


데이터베이스는 각 마이크로 서비스에 대해 개별적으로 취급되어야 합니다. 다른 마이크로 서비스는 다른 마이크로 서비스의 데이터베이스 내부에 저장된 데이터를 직접 수정할 수 없습니다.

아래의 그림에서 Order Service는 가격 데이터베이스를 직접 업데이트 할 수 없으며 해당 마이크로서비스의 API를 통해서만 엑세스가 가능해야 합니다. 이를 통해 서로 다른 서비스간에 일관성을 유지할 수 있습니다.


이벤트 중심 아키텍처는 서로 다른 서비스간에 데이터 일관성을 유지하는 패턴입니다. 작업을 완료하고 시스템 리소스를 차지하기 위해 ACID 트랜잭션을 기다리는 대신 메세지를 대기열로 Offload하여 어플리케이션을 보다 유용하고 효율적으로 만들 수 있도록 고려 해야 합니다. 이는 서비스 간의 Loosely Coupled를 제공합니다.

Queue에 대한 메시지를 이벤트로 처리 될 수 있으며 Pub-Sub 모델을 사용할 수 있습니다.


Monolithic에서 마이크로서비스로의 여정중 데이터베이스 변경 사항을 처리하는 것은 쉽지 않지만, 꼭! 넘어야 하는 부분입니다.

Source: https://dzone.com/articles/breaking-the-monolithic-database-in-your-microserv