안녕하세요, HEARTCOUNT팀 briley 입니다.
데이터 분석을 시작할 때 어떤 데이터를 어디서부터 찾아봐야 할지 막막한 경험이 있으신가요? 이제 오늘부터 그런 고민은 하지 마세요!
모두가 쉽게 필요한 데이터를 조회하고, 원하는 데이터셋을 생성할 수 있도록 도와주는 HEARTCOUNT ABI의 Text-To-SQL 기능에 대해 소개해 드릴게요.
이번 블로그에서는 Text-To-SQL(TTS)이 무엇인지 정의하고, 개발 과정에서 겪었던 시행착오, 이러한 과정을 겪으며 탄생한 하트카운트 ABI의 TTS의 사용 방법을 공유합니다.
자, 그럼 시작해 보겠습니다. :)
실무자 필수 역량 SQL?
빅데이터 시대에 접어들면서 데이터는 기업의 핵심 자산으로 부상하였고, 이에 따라 데이터베이스 관리 및 데이터 분석은 기업 및 조직에서 핵심적인 기술로 자리매김했습니다.
기업들은 데이터를 보다 효과적으로 관리하고 활용하기 위한 필수 도구로 SQL(Structured Query Language)을 도입해 왔습니다. SQL은 기업의 데이터 관리, 분석, 그리고 의사 결정에 있어서 핵심적인 역할을 수행하며, 이는 현대 비즈니스 환경에서 높은 가치를 창출하고 있죠.
하지만 SQL은 문법이 복잡하고 데이터베이스 구조에 대한 이해가 필요하여, 많은 업무 담당자들에게 일종의 숙제로 인식되고 있습니다.
SQL이 대체 어떻게 생긴 건데요?
간단한 예시를 위해 아래의 데이터를 보시죠. 어떤 기업의 인사 정보가 아래처럼 데이터베이스에 저장되어 있다고 가정합니다.
“마케팅팀에 나이가 35살 이상인 대리는 총 몇 명인가요?”를 SQL로 변환해볼까요?
SELECT COUNT("사번")
FROM "사원정보"
JOIN "부서정보" ON "사원정보"."부서코드" = "부서정보"."부서코드"
WHERE "부서정보"."부서" = '마케팅' AND "사원정보"."나이" >= 35
AND "사원정보"."직급" = '대리'
어때요? 아마 대부분의 사람들은 “이게 뭐야?”라고 생각하셨을 거에요. 확실히 일상 언어처럼 편한 언어는 아니죠. 이처럼 SQL은 강력하지만, 그만큼 데이터베이스 구조와 문법에 대한 이해와 학습이 필요한 언어입니다.
SQL을 배울 필요가 없는 이유
그렇다면, 우리는 반드시 SQL을 공부해야 할까요? 답은 바로 "아니오”입니다. 이제 우리에겐 TTS(Text-To-SQL)라고 하는 강력한 도구가 있기 때문이죠.
대체 TTS가 뭐길래 SQL을 몰라도 된다는 걸까요?
즉, 낯설디 낯선 SQL을 사용하지 않고 “마케팅팀에 35살 이상 대리는 총 몇 명인가요?” 라고 입력하기만 해도, 원하는 데이터를 얻을 수 있는 매우 강력한 기술인 것이죠.
세상에 그런게 있다고? 그럼 누가 SQL을 배워?
이제, TTS에 흥미가 생기시나요? 그렇다면 본격적으로 TTS에 대해 알아보겠습니다.
그래서 TTS(Text-To-SQL)가 뭐라고? (feat. HEARTCOUNT ABI)
매우 간단합니다. 정의 그대로예요. 우리의 일상 언어를 SQL로 바꿔주는 기술! 그렇다면, TTS는 어떤 방식으로 만들어질까요? 때마침 이 굉장한 기술을 BI 솔루션에 녹여낸 사례가 있네요. 바로 HEARTCOUNT ABI 입니다. :)
ABI의 Text-to-SQL은 사용자가 입력한 텍스트를 실행 가능한 정확한 SQL로 변환하기 위해, 자연어를 구조화된 언어로 재구성한 후 Large Language Model (LLM)을 활용합니다.
HEARTCOUNT ABI의 Text-to-SQL은 뭐가 좋은데요?
아래와 같은 사용자 측면 이점이 있습니다.
- 업무 가능 영역 확장: 일반적으로 업무에 필요한 데이터를 추출하기 위해, 데이터 담당자에게 추출 조건을 요청하고 그 후 다른 작업을 하며 데이터를 전달해 주기를 기다립니다. 그 과정에서 요청자의 요구 조건이 잘못 전달되는 경우도 종종 발생합니다. Text to SQL을 활용하면 직접 데이터를 추출할 수 있어 작업의 효율성을 높일 수 있습니다.
- 업무 효율성 향상: 데이터 관리자들은 하루에도 수십 차례씩 데이터 추출 작업을 반복 수행하고 있습니다. 데이터 추출 조건이 조금만 변경되어도, 유사한 데이터를 새롭게 추출해야 하는 불편함이 존재합니다. Text-to-SQL을 활용하면 SQL 비전문가도 필요한 데이터를 직접 추출할 수 있기 때문에, 데이터 관리자들의 반복 작업 부담이 감소합니다.
- 최적화된 SQL : 데이터 담당자는 실행되는 쿼리를 모니터링하고, 데이터베이스 부하가 최소화되도록 관리해야 합니다. ABI의 Text-to-SQL은 테이블의 키, 인덱스 정보를 고려하여 최적의 쿼리를 생성합니다.
- 데이터 접근성 향상: 자연어를 활용하여 데이터베이스에서 데이터를 직접 조회함으로써, 수동 데이터 처리 및 불필요한 복잡성이 감소하고 질문에 대한 답을 빠르게 얻을 수 있습니다. 이는 모든 사용자가 데이터베이스에서 원하는 정보에 신속하게 접근할 수 있게 도와줍니다.
가깝지만 먼 그대… Text-to-SQL
“아니 저렇게 좋은 점이 많다고? 어서 ABI에 적용해 봐야지!”
…는 우리만의 착각이었습니다. ABI의 Text-to-SQL을 설계하고 개발하는 과정에서 생각하지 못한 문제에 부딪혔고, 몇 번의 시행착오를 경험했죠. 이제 그 경험을 통해 얻은 지식을 공유하고자 합니다.
- 다양한 데이터베이스 구조 대응: Text-to-SQL은 다양한 형태와 구조의 데이터베이스에 대응할 수 있어야 합니다. 데이터베이스마다 다른 스키마와 테이블 구조를 이해하고 처리할 수 있는 일반화된 방식을 개발해야 합니다.
- 정합한 메타 데이터 추출: 정확한 답변을 얻기 위해서는 질문과 관련된 메타 데이터들을 잘 추출해야 합니다. 그러나 LLM을 호출하고 응답받을 수 있는 토큰의 수에는 한계가 있습니다. 이 한계를 극복하기 위해, ABI TTS는 메타 데이터 추출 과정을 두 번으로 나누고, 추출한 메타 데이터를 재구조화하는 로직을 추가했습니다.
- 생성된 쿼리 보정: 사용자가 입력한 질문을 정확하게 이해하고 원하는 결과를 조회하기 위해서는 올바른 쿼리를 생성해야 합니다. 그러나 질문의 모호성이나 동음이의어 등으로 인해 사용자의 의도를 잘못 이해하고 부정확한 SQL을 생성하는 경우가 발생할 수 있습니다. 이러한 문제점을 해결하기 위해, 스스로 오류를 수정할 수 있는 Observer 모듈을 추가했습니다.
- 쿼리 실행의 효율성: Text-to-SQL이 생성하는 SQL 쿼리는 정확성뿐만 아니라 실행 효율성도 고려되어야 합니다. 대량의 데이터를 조회하거나 색인 되지 않은 조건으로 데이터를 조회하여 데이터베이스에 부하를 주는 쿼리를 지양해야 합니다. 이를 위해 테이블의 키, 인덱스 정보를 조회하고, 이러한 정보를 활용하여 최적화된 쿼리를 생성합니다.
- 보안 강화: Text-to-SQL은 SQL 비전문가도 데이터베이스에 직접 접근할 수 있기 때문에, 사용자별 데이터 접근 권한을 명확하게 설정해야 합니다. ABI TTS는 사용자의 대시보드 접근 권한을 그대로 적용하여, 허가된 데이터만 접근할 수 있도록 설정하였습니다.
베일을 벗은 HEARTCOUNT ABI Text-to-SQL
다양한 시행착오를 경험하고, 여러 차례 변화를 거듭한 ABI의 TTS는 어떤 모습일까요?
Text-to-SQL은 여러 모듈들로 구성되어 있으며, 아래의 모듈들을 조합하여 사용자가 원하는 workflow를 생성할 수 있습니다.
Data Indexer
데이터베이스의 스키마 구조, 테이블 리스트, 테이블별 컬럼 리스트 및 설명, 인덱스를 조회하고, token을 최소화하는 구조로 변환하는 인덱싱 작업을 수행하는 모듈입니다. (실제 데이터는 조회하지 않습니다)
Prompt Manager
질문에 최적의 답변을 제공하기 위해, Prompt를 생성하고 관리하는 모듈입니다.
LLM + Parser
- LLM : 대용량 언어 모델(Large Language Model)로 사용자가 입력한 질문과 관련된 테이블 리스트를 추출하고, 이를 바탕으로 SQL 쿼리를 작성합니다. ABI Text-to-SQL은 GPT-4를 사용합니다.
- Output Parser : LLM에서 제공받은 답변을 원하는 형태로 파싱하는 모듈입니다. SQL Query와 Query에 대한 상세 설명을 제공합니다.
Validator
- SQL Executor : 생성된 SQL을 실행하고, 올바른 결과가 조회되는지 확인하는 모듈입니다. 결과 조회시, DB의 부하를 막기 위해 기본으로 10개의 결과만 조회합니다.
- Observer : 1~6번의 모듈을 반복 실행하며 모듈별 결과들을 관측하고, 스스로 오류를 수정하여 최적의 결과를 도출하는 모듈입니다. 해당 모듈을 사용하면 답변의 정확도를 향상 시킬 수 있지만, 응답시간과 비용이 증가합니다.
HEARTCOUNT ABI Text-to-SQL, 이렇게 쉽다고요?
ABI의 Text-to-SQL을 사용하는 방법은 아주 간단합니다. 사용자는 조회하고자 하는 데이터베이스를 선택하고 질문만 입력하면 됩니다. 제품 판매 내역이 저장된 데이터베이스를 선택하고 “일별 제품 유형별 판매 건수 알려줘”라는 질문을 입력하면 어떻게 될까요?
ABI의 Text-to-SQL은 사용자가 입력한 질문을 분석하고, 선택한 데이터베이스의 구조와 매칭하여 질문을 SQL 쿼리로 정확하게 변환합니다. 그럼 사용자는 생성된 SQL을 실행하여 원하는 결과를 확인할 수 있습니다.
그뿐만 아니라, 사용자는 답변된 쿼리를 데이터셋으로 저장할 수 있습니다. 이렇게 저장된 데이터셋은 나중에 필요한 경우에 다시 사용하거나, 대시보드 및 HEARTCOUNT에서 활용할 수 있습니다.
그러나 사용자의 질문이 모호하거나 필요한 정보가 명확하지 않은 경우에는 정확하지 않거나 불완전한 SQL 쿼리가 생성될 수 있습니다.
하지만 걱정할 필요가 없습니다. HEARTCOUNT ABI에서는 몇 번의 클릭만으로 사용자가 데이터를 직접 조회할 수 있습니다. 따라서 화면에서 데이터 구조를 확인하고, 잘못된 내용을 바로 수정할 수 있는 것이죠.