paint-brush
프로덕션 등급 Text2SQL 엔진을 구축하는 방법~에 의해@datastax
109 판독값 새로운 역사

프로덕션 등급 Text2SQL 엔진을 구축하는 방법

~에 의해 DataStax11m2024/08/13
Read on Terminal Reader

너무 오래; 읽다

text2SQL에서 LLM의 역할에 대해 알아보고, 이 기능에 내재된 과제를 논의하고, Skypoint 팀의 새로운 text2SQL 엔진인 SherloQ를 살펴보세요.
featured image - 프로덕션 등급 Text2SQL 엔진을 구축하는 방법
DataStax HackerNoon profile picture

데이터베이스와 상호 작용하려면 많은 사람이 데이터를 쉽게 얻을 수 없는 수준의 기술적 전문성이 필요한 경우가 많습니다. 회사의 재무 수치와 추세를 이해해야 하는 재무 임원을 생각해 보세요. 전통적으로 이 임원은 데이터베이스에서 필요한 데이터를 추출하기 위해 SQL 분석가에게 의존해야 했습니다. 이러한 종속성은 지연과 커뮤니케이션 격차를 초래할 수 있으며, 특히 임원이 원하는 통찰력을 얻기 위해 쿼리를 여러 번 정제해야 하는 경우 더욱 그렇습니다.


하지만 자연어를 구조화된 쿼리 언어 문장으로 변환하는 기능인 text2SQL이 게임을 바꾸었습니다. text2SQL을 사용하면 재무 임원이 자연어를 사용하여 데이터베이스와 직접 상호 작용할 수 있습니다. 예를 들어, 사용자는 "지난달 각 고객의 평균 주문 가치는 얼마였습니까?"와 같은 비즈니스 관련 질문을 입력할 수 있습니다.


Text-to-SQL AI 엔진은 질문을 처리하고 해당 SQL 쿼리를 생성합니다.


Select customer_id, AVG(order_value) AS average_order_value FROM orders WHERE order_date >= DATE_SUB(CURRDATE(), INTERVAL 1 MONTH) GROUP BY customer_id;


그런 다음 데이터베이스에 대해 이를 실행하고 그 결과를 사용자에게 표시합니다.


이 글에서는 text2SQL에서 LLM의 역할을 설명하고, 이 기능에 내재된 과제에 대해 논의하며, Skypoint 팀이 개발한 정확도가 높고 견고한 text2SQL 엔진인 SherloQ를 살펴보겠습니다.

text2SQL에서 LLM의 역할

text2SQL을 변환하는 기능은 대규모 언어 모델 (LLM)의 도움으로 상당히 개선되었습니다. 이러한 모델은 방대한 양의 데이터와 강력한 신경망 아키텍처를 사용하여 인간과 유사한 텍스트를 이해하고 생성합니다. 다양한 데이터 세트에서 학습함으로써 LLM은 자연어를 SQL 쿼리로 변환하는 것을 포함하여 다양한 작업을 일반화할 수 있습니다.


예를 들어, 논문 " 언어 모델은 Few-Shot Learners입니다 "는 LLM이 최소한의 예제로 작업을 수행하는 방법을 보여주며, 제한된 데이터로 새로운 작업에 적응하는 능력을 강조합니다. 이 접근 방식은 광범위한 작업별 데이터의 필요성을 크게 줄여 다양한 애플리케이션에 LLM을 배포하는 것을 더 쉽게 만듭니다.


" Spider: 복잡하고 교차 도메인 의미 분석 및 텍스트-SQL 작업을 위한 대규모 인간 레이블 데이터 세트 "는 다양한 도메인에서 복잡한 SQL 쿼리에 대한 모델을 훈련하고 평가하기 위한 포괄적인 데이터 세트를 제공합니다. 이 데이터 세트는 모델 성능에 대한 강력한 벤치마크를 제공하여 text2SQL의 최첨단 기술을 발전시키는 데 핵심적인 역할을 했습니다.


또한, " PALM: 경로로 언어 모델링 확장 "에서는 모델 크기를 확장하고 학습 경로를 최적화하는 등의 고급 학습 기술이 text2SQL을 포함한 다양한 애플리케이션에서 모델 성능을 어떻게 향상시킬 수 있는지 살펴봅니다.


이러한 LLM은 통제된 환경에서 매우 효과적이지만, 프로덕션 설정에서는 종종 어려움에 직면합니다. 여기에는 모호한 프롬프트 처리, 복잡한 데이터베이스 스키마 관리, 실시간 성능 보장이 포함됩니다. 또한 이러한 모델을 기존 시스템에 통합하려면 변화하는 데이터와 사용자 요구 사항에 적응하기 위해 상당한 노력과 지속적인 유지 관리가 필요합니다. 이 작업에 적합한 세 가지 LLM은 다음과 같습니다.

SQL코더

SQLcoder의 주요 목적은 자연어 입력을 SQL 쿼리로 변환하는 것입니다. 다른 범용 모델과 달리 SQLCoder는 SQL에 특화된 데이터에서 개선되었으므로 SQL 쿼리를 이해하고 생성하는 데 특히 효과적입니다. SQLCoder는 text2SQL 시스템을 위한 복잡하고 교차 도메인 벤치마크인 Spider 데이터 세트에서 주목할 만한 성능을 보여줍니다.


SQLCoder는 64.6%의 정확도 로 학습에서 볼 수 없는 새로운 스키마에 대한 올바른 SQL 쿼리를 생성합니다. 크기가 10배 이상인 모델인 GPT-3.5-turbo 및 text-davinci-003보다 성능이 뛰어납니다. 이는 다양하고 복잡한 SQL 쿼리를 처리하는 SQLCoder의 기능을 강조하며, 이는 프로덕션 환경에 필수적입니다.

GPT3.5/GPT4

GPT-3.5와 GPT-4(Generative Pre-trained Transformer)는 가장 진보적이고 효과적인 범용 언어 모델 중 일부입니다. 두 모델 모두 소수 샷 학습에 뛰어나며, 최소한의 예제로 새로운 작업에 빠르게 적응하여 제한된 입력에서 SQL 쿼리를 만드는 데 이상적입니다.


예를 들어, Spider 데이터세트에서 평가했을 때 GPT-3.5-turbo는 훈련에서 볼 수 없었던 새로운 스키마에 대해 SQL 쿼리를 올바르게 생성한 비율이 60.6%인 반면, GPT-4는 74.3%를 달성했습니다.


이러한 모델은 특히 컨텍스트를 이해하고 복잡한 자연어 입력에서 정확한 SQL 쿼리를 생성하는 데 있어 강력한 성능을 보여줍니다. 그러나 일반적인 용도의 디자인은 때때로 SQL 생성과 같은 특수 애플리케이션에서 최적의 결과를 위해 추가적인 미세 조정이 필요합니다.

팔름 SQL

PaLM(Pathways Language Model) SQL은 Google에서 개발한 또 다른 강력한 모델입니다. PaLM SQL의 고급 기능과 아키텍처는 자연어를 SQL 쿼리로 변환하고 복잡하고 다양한 데이터베이스 스키마를 더 정확하게 처리하는 데 매우 효율적입니다.


LLM의 발전에도 불구하고, 프로덕션에서 text2SQL에 단일 LLM에 의존하는 것은 문제가 될 수 있습니다. 단일 모델로는 엔터프라이즈 데이터 환경의 다양한 쿼리, 데이터베이스 스키마 및 실시간 대기 시간 요구 사항을 효과적으로 처리할 수 없습니다.


프로덕션 환경에서는 견고성, 적응성, 실제 비즈니스 사용자의 모호한 프롬프트를 처리할 수 있는 능력이 필요합니다. 따라서 text2SQL 엔진은 프로덕션 등급으로 간주되기 위해 세 가지 속성을 보여야 합니다.


다양한 쿼리 공식을 이해하는 능력 - 구문적으로 다른 사용자 프롬프트는 동일한 SQL 쿼리로 축소될 수 있습니다. 우수한 text2SQL 엔진은 데이터 모델의 컨텍스트를 염두에 두고 사용자 프롬프트의 동기를 이해하고 이에 따라 SQL 쿼리를 공식화할 수 있어야 합니다.


모호한 데이터베이스 스키마와 데이터 모델로 작업할 수 있는 기능 - 운영 데이터 모델은 조직 내 여러 팀이 기여하고 데이터 수명 주기 전반에 걸쳐 소유권이 여러 번 바뀌기 때문에 혼란스러울 수 있습니다.


좋은 text2SQL 엔진은 사용자를 위해 데이터 모델의 모호성을 해소하고, 잡음과 모호성으로 인해 환각이 발생하지 않도록 보장해야 합니다. 이는 많은 실무 사용자를 막는 현 LLM의 특성입니다.


엔진의 작동이 쿼리 실행에 상당한 지연 시간을 추가하지 않도록 해야 합니다. 사용자가 실시간으로 기대하는 답변은 실시간으로 반환되어야 합니다. 즉, 엔진은 최대 처음 세 번의 시도 내에 최적의 쿼리를 공식화해야 합니다.

SherloQ 소개

SherloQ는 Skypoint의 text2SQL 엔진으로 자연어에서 SQL로 쿼리를 변환합니다. 쿼리 생성을 위한 맞춤형 사내(LLM)를 활용하는 것이 아키텍처의 중요한 부분이지만, SherloQ의 효과는 데이터 쿼리 기능을 향상하도록 설계된 고급 구성 요소의 조합에서 비롯됩니다. SherloQ는 쿼리 변환에서 높은 정확도, 강력한 오류 처리 및 프로덕션 데이터베이스 시스템과의 원활한 통합을 자랑하므로 대규모 데이터 환경에 적합합니다.



다음 몇 섹션에서는 SherloQ의 내부 아키텍처 세부 사항을 자세히 살펴보고 이를 프로덕션 환경에서 사용하여 달성한 결과 중 일부를 공유하겠습니다.

SherloQ의 건축 구성 요소

SherloQ의 아키텍처에는 시스템의 정확도, 안정성 및 지연 시간을 개선하기 위해 각각 작동하는 여러 개의 움직이는 부분이 포함되어 있습니다. 아키텍처 개요는 다음과 같습니다.




사용자 입력 - 사용자 입력은 자연어 쿼리입니다.


상태 에이전트 Eeecutor- 실행 프로세스 전반에 걸쳐 상태를 추적하는 LangChain 인터페이스 구현. Redis와 DataStax Astra DB를 활용하여 실행 중에 추론 및 메모리 상태를 추적합니다. 실행자는 서로 다른 모듈 간에 조정하여 작업 흐름을 관리합니다.


사용자 입력이 올바르게 구문 분석되고 처리되어 후속 구성 요소로 전달되도록 보장하여 입력에서 SQL 쿼리 생성까지의 흐름을 유지합니다.


상태 도구 - 상태 변수를 가지고 해당 상태를 해당 도구에 전달하는 Langchain Base 도구의 확장된 클래스입니다. 상태 변수를 유지함으로써 상태 도구는 해당 도구에 전달해야 하는 필요한 데이터를 추적합니다. 이를 통해 데이터 흐름의 일관성이 보장되어 에이전트 간 전환 중에 정보가 손실되는 것을 방지합니다.


SherloQ의 상태 도구 :

  • 쿼리 생성 도구는 검색된 few-shot 쿼리, 데이터 모델 컨텍스트 및 DB 스키마를 사용하여 초기 SQL 쿼리를 생성합니다. 구문 분석된 스키마 정보를 사용하고 컨텍스트 예제에서 학습하여 생성된 SQL 쿼리의 정확성과 관련성을 향상시킵니다.


  • 재시도 도구는 쿼리 실행 중에 발생한 오류를 분석하고 해당 오류를 해결하는 쿼리를 다시 생성합니다.


  • DB 도구는 쿼리 생성에 도움이 될 데이터베이스 스키마와 해당 메타데이터(주석, 주석 등)를 가져오는 데 도움이 됩니다. 검색된 스키마 정보는 시간 기반 캐싱 메커니즘을 사용하여 캐시되어 성능을 최적화하고 데이터베이스 쿼리를 줄입니다. 또한 데이터베이스에 대해 쿼리를 실행하고 결과 또는 오류 스택 추적을 반환합니다.

SherloQ의 성능 향상을 위한 데이터 입력 및 기술

SherloQ의 성능을 향상시키기 위해 여러 기술을 사용하고 모델에 중요한 데이터 입력을 제공합니다. 여기에는 구조화된 분해, 몇 가지 샷 예제, 데이터 모델 컨텍스트 검색, 반영 및 재시도 메커니즘이 포함됩니다. 각 부분은 자연어 입력에서 정확하고 관련성 있는 SQL 쿼리를 생성하는 모델의 기능을 개선하는 데 필수적입니다.

구조화된 분해

구조적 분해에서 사용자 프롬프트는 기본 부분으로 나뉩니다. 쿼리의 필수 구성 요소에 초점을 맞추고 식별하면 모델이 정확한 SQL을 생성하는 데 도움이 됩니다. 예를 들어:


입력: XYZ Corp에서 공급하는 모든 품목에 대해 현재 가능한 수량은 얼마입니까?

출력: ["현재 사용 가능한 수량", "모든 품목", "XYZ Corp에서 공급"]

몇 가지 샷 예

이 모델은 몇 가지 샷 SQL 예제 형태로 참조 질문을 받으며, 이는 유사한 패턴을 기반으로 SQL 쿼리를 생성하는 데 도움이 됩니다. 이러한 예제는 의도된 쿼리의 구조와 형식을 인식하는 데 도움이 되어 다양한 프롬프트에 대한 새로운 SQL 쿼리를 정확하게 생성하는 모델의 능력을 향상시킵니다. 몇 가지 예는 다음과 같습니다.


예제 1

입력: 재고 수량이 20개 미만인 품목을 표시합니다.

출력: SELECT * FROM stock WHERE Quantity_Available < 20;


예제 2

입력: 상품 가격이 100달러 이상인 공급업체를 나열하세요.

출력: SELECT * FROM vendors WHERE Vendor_ID IN (SELECT Vendor_ID FROM items WHERE Unit_Price > 100);


우리는 벡터 데이터베이스인 Astra DB 의 의미적 유사성 매칭을 사용하여 가장 유사한 몇 가지 샷 예제를 동적으로 선택합니다. 벡터 데이터베이스를 사용하면 새 입력 쿼리와 구조와 내용이 가장 가까운 예제를 찾을 수 있으므로 모델이 가장 관련성 있는 패턴을 활용하여 정확한 SQL 쿼리를 생성할 수 있습니다.


저희의 프로덕션 환경에서는 쿼리당 평균 2개의 few-shot 예제가 있습니다. 저희의 경험상 정확도를 높이기 위해 few-shot 예제를 더 추가하는 것은 확장 가능한 관행이 아닙니다.

데이터 모델 컨텍스트

데이터 모델 컨텍스트에는 SQL 쿼리를 만드는 데 유용할 수 있는 도메인별 세부 정보가 포함됩니다. 예를 들어, 병원 네트워크의 재무 데이터 컨텍스트에서 이는 재무 지표 코드와 해당 설명과 같은 것일 수 있습니다. 이 컨텍스트는 모델에서 생성된 SQL 쿼리가 도메인의 데이터 구조와 일치하는지 확인하는 데 사용됩니다. 데이터 모델 컨텍스트를 포함하는 것은 선택 사항이며 테이블이 복잡하고 SQL 쿼리를 구성하기 위해 도메인 지식이 필요한 경우에만 필요합니다.


예를 들어:

메트릭 코드: "MGMTFEE" -> 설명: "부동산 관리를 위해 수집된 수수료 - 관리 수수료"

SQL DB 스키마

SQL DB 스키마는 사용 가능한 데이터의 구조화된 표현입니다. 스키마는 테이블과 열에 주석을 달아 풍부해집니다. 여기에는 테이블 이름과 설명, 열, 설명 및 데이터 유형이 포함됩니다.


스키마를 제공하면 모델이 데이터베이스 구조와 각 테이블과 열에 연관된 의미를 이해하는 데 도움이 되며, 생성된 SQL 쿼리가 구문적으로 올바르고 올바른 데이터베이스 요소를 활용하도록 할 수 있습니다.

반사

반성은 모델이 자신의 과거 응답, 행동 또는 생성된 콘텐츠를 평가하고 평가하는 능력을 말합니다. 이를 통해 모델은 오류나 약점을 식별하고 수정하여 응답을 개선할 수 있습니다. 이 프로세스에는 Sherloq 엔진에서 이전에 본 쿼리와 쿼리 생성 단계 동안의 피드백을 고려하는 것이 포함됩니다.


이러한 시나리오는 모델이 과거에 본 유사한 질문의 성공을 재현하거나 실패를 피하는 데 도움이 됩니다. 이 단계는 또한 Astra DB를 활용하여 현재 질문과 의미적으로 가장 유사한 쿼리를 찾습니다.

재시도 메커니즘

SherloQ는 데이터베이스에서 수신된 오류를 사용하여 재시도 메커니즘을 통합합니다. 생성된 SQL 쿼리가 오류를 발생시키면 엔진은 사전 정의된 템플릿이 있는 에이전트를 사용하여 쿼리를 수정합니다.


“””

귀하의 과제는 질문에서 생성된 잘못된 SQL 쿼리를 수정하여 ANSI SQL과 호환되도록 만드는 것입니다. 다음 지침을 따르세요. 질문, 데이터베이스 스키마, 수신된 오류 메시지를 주의 깊게 분석하여 정확한 답변을 보장합니다. 혼란을 피하기 위해 테이블 별칭을 활용합니다.


예를 들어, SELECT t1.col1, t2.col1 FROM table1 AS t1 JOIN table2 AS t2 ON t1.id = t2.id .


배급량을 계산할 때는 항상 분자를 부동 소수점으로 변환하세요. 아래 형식을 사용하세요.

일:

[QUESTION] {user_input} [/QUESTION] 질문에 대한 SQL 쿼리를 생성하세요. 올바른 쿼리는 다음과 같습니다. {sql_query} 마지막 실행 중에 수신된 오류 메시지는 다음과 같습니다. {error_message}

응답:

위의 입력을 기반으로 수정된 SQL 쿼리는 다음과 같습니다. {response_sql} “””

결과 비교: SherloQ 구현 전과 후

고급 LLM과 잘 설계된 시스템을 사용하여 SherloQ는 컨텍스트에 더 정확하고 관련성이 높은 SQL 쿼리를 생성합니다. 여기서 우리는 대기 시간과 정확도의 지표를 사용하여 SherloQ 이전과 이후의 사용자 프롬프트 결과를 비교합니다.

한 가지 생산 질문을 사용한 비교

여기서 우리는 잘 알려진 노인 생활 운영자인 우리의 생산 고객 중 하나를 살펴봅니다. 그들의 사용 사례 중 하나는 재무 팀이 Skypoint의 플랫폼을 사용하여 다양한 노인 생활 시설의 통합 재무 지표를 이해하고 추론하는 것입니다.


사용자 프롬프트: "2022년 내내 시설 CM의 하우스키핑 비용 분기별 추세를 확인하세요."


SherloQ 이전

  • 생성된 쿼리

    • SELECT SUM(총 금액 분자) / SUM(총 금액 분모) AS Housekeeping_Expenses FROM skypoint_metric_fact_denormalized_vw WHERE 시설 이름 = 'CM' AND 연도 = 2022 AND 지표 이름 = 'Housekeeping Expense' GROUP BY 분기 번호';


  • 식별된 문제

    • 이 쿼리는 Quarter_Number를 기준으로 그룹화하지만 이를 선택하지 않으므로 불완전한 결과가 발생할 수 있습니다.

    • Metric_Code와 같은 보다 구체적인 식별자 대신 Metric_Name을 사용합니다.

    • SUM(Total_Amount_Denominator)에서는 0으로 나눌 수 있는 가능성이 처리되지 않습니다.


  • 평균 지연 시간: 29초

    SherloQ 이전의 설정은 GPT-3.5와 프롬프트 엔지니어링, 사용자 프롬프트당 5개 이상의 퓨어 샷 쿼리를 조합하여 사용했습니다.


SherloQ와 함께

  • 생성된 쿼리
    • SELECT 연도, 분기 번호, SUM(총 금액 분자) / COALESCE(SUM(NULLIF(총 금액 분모, 0)), 1) AS Housekeeping_Expenses FROM skypoint_metric_fact_denormalized_vwWHERE Metric_Code = 'EXPOTHHOU' AND Facility_Name = 'CM' AND 연도 = 2022 GROUP BY 분기 번호, 연도 ORDER BY 분기 번호 ASC;


  • 개선 사항이 발견되었습니다
  • 쿼리에는 Quarter_Number가 포함되어 있어 필요한 분기별 세부 정보를 제공합니다.
  • Metric_Code 필드를 사용하면 메트릭에 대한 보다 정확한 식별자를 제공할 수 있습니다.
  • COALESCE(SUM(NULLIF(Total_Amount_Denominator,0)),1) 함수는 0으로 나누는 경우 발생할 수 있는 오류를 처리합니다.
  • 결과는 분기별 추세를 반영하여 Quarter_Number별로 정렬됩니다.
  • 평균 지연 시간: 10초


프로덕션 워크로드의 벤치마크를 기반으로 SherloQ 사용 전과 사용 후의 정확도와 안정성에 대해 보고하는 결과는 다음과 같습니다.

  • SherloQ 이전
    • 정확도: 65%

    • 신뢰도: 60%


  • SherloQ와 함께
    • 정확도: 92%

    • 신뢰도: 90%


위의 결과는 캐싱의 효과(내부 시스템과 모델 모두)를 무효화하기 위해 모든 프롬프트를 별도의 식별자로 100번 실행하는 내부 벤치마크 모음에서 추출되었습니다. 이 모음은 반환된 응답을 벤치마크 응답과 비교하여 정확도를 측정하고, 유사한 응답을 반환하는 빈도를 측정하여 신뢰성을 측정합니다.


이 비교는 SherloQ가 자연어 쿼리를 정확한 SQL 쿼리로 변환하는 데 있어서의 이점을 명확히 보여줍니다. SherloQ 이후 전반적인 성능이 30% 향상되었습니다. 이전에 생성된 쿼리는 불완전한 결과와 오류 처리 부족과 같은 문제로 인해 정확도와 안정성에 영향을 미쳤습니다.


SherloQ를 사용하면 생성된 쿼리가 더 정확하고 효율적이며 견고하며 지연 시간, 정확도 및 안정성이 눈에 띄게 향상되었습니다. 이러한 향상은 SherloQ가 신뢰할 수 있는 데이터 검색을 제공할 수 있는 기능을 보여주므로 데이터 쿼리 프로세스를 최적화하려는 조직에 귀중한 도구가 됩니다.


Skypoint 플랫폼의 다른 부분을 살펴보거나 Skypoint AI 데모를 예약하려면 Skypoint 웹사이트를 방문하세요.


Alok Raj(Skypoint의 수석 AI 엔지니어) 및 Sayandip Sarkar(Skypoint의 엔지니어링 책임자)가 작성