Skip to main content

ai_similarity() — 텍스트 유사도

두 텍스트 간의 의미적 유사도를 0~1 사이의 점수로 반환합니다.
-- 중복 고객 문의 감지
SELECT
    a.ticket_id AS ticket_a,
    b.ticket_id AS ticket_b,
    ai_similarity(a.description, b.description) AS similarity_score
FROM support_tickets a
CROSS JOIN support_tickets b
WHERE a.ticket_id < b.ticket_id
  AND ai_similarity(a.description, b.description) > 0.85;

ai_forecast() 및 ai_anomaly_detection() — 시계열 분석

SQL만으로 시계열 예측과 이상 감지를 수행할 수 있습니다.
-- 매출 예측 (향후 30일)
SELECT * FROM ai_forecast(
    TABLE(SELECT sale_date, total_revenue FROM gold_daily_revenue),
    horizon => 30,
    time_col => 'sale_date',
    value_col => 'total_revenue'
);

-- 이상 감지
SELECT * FROM ai_anomaly_detection(
    TABLE(SELECT timestamp, metric_value FROM server_metrics),
    time_col => 'timestamp',
    value_col => 'metric_value'
);

성능과 비용 최적화

권장 사항

항목권장 사항
배치 크기한 번에 수천 행을 처리하면 오버헤드가 줄어듭니다. LIMIT으로 테스트 후 전체 실행을 권장합니다
모델 선택간단한 분류는 작은 모델, 복잡한 생성은 큰 모델을 사용합니다
캐싱동일한 입력에 대한 반복 호출은 결과를 테이블에 저장하여 재사용합니다
failOnError대량 처리 시 failOnError => false로 설정하여 일부 실패가 전체를 중단하지 않도록 합니다
프롬프트 최적화프롬프트를 짧고 명확하게 작성하면 토큰 비용이 절약됩니다
Provisioned Throughput대량/정기적 사용 시 Pay-per-token보다 비용 효율적입니다

비용 구조

비용 = 입력 토큰 수 × 입력 토큰 단가 + 출력 토큰 수 × 출력 토큰 단가
💡 토큰(Token)이란? LLM이 텍스트를 처리하는 기본 단위입니다. 영어 기준 대략 1단어 ≈ 11.5 토큰이며, 한국어는 1글자 ≈ 13 토큰으로 다소 많이 소모됩니다. 프롬프트(입력)와 응답(출력) 모두 토큰 수로 과금됩니다.

실무 활용 시나리오

시나리오 1: 고객 서비스 자동 분류 + 우선순위 파이프라인

-- Silver 테이블에 AI 분석 결과를 추가한 Gold 테이블
CREATE OR REFRESH MATERIALIZED VIEW gold_enriched_tickets AS
SELECT
    ticket_id,
    created_at,
    subject,
    body,
    -- AI 함수로 자동 분류
    ai_classify(
        subject || ': ' || body,
        ARRAY('배송', '반품/환불', '상품불량', '결제', '회원', '기타')
    ) AS auto_category,
    ai_classify(
        body,
        ARRAY('긴급', '높음', '보통', '낮음')
    ) AS auto_priority,
    ai_extract(
        body,
        ARRAY('주문번호', '상품명', '요청사항')
    ) AS extracted_info,
    ai_query(
        'databricks-meta-llama-3-3-70b-instruct',
        CONCAT('고객 문의에 대한 초안 답변을 한국어로 작성해 주세요. 정중하고 전문적인 톤으로 작성하되, 100자 이내로 요약해 주세요.\n\n문의 내용: ', body),
        modelParameters => named_struct('temperature', 0.3, 'max_tokens', 200)
    ) AS draft_response
FROM silver_support_tickets
WHERE created_at >= CURRENT_DATE() - INTERVAL 1 DAY;

시나리오 2: 비정형 문서 → 구조화 데이터 파이프라인

-- PDF 계약서를 구조화된 테이블로 변환
CREATE OR REFRESH MATERIALIZED VIEW gold_contract_summary AS
WITH parsed_contracts AS (
    SELECT
        file_name,
        ai_parse_document(
            CONCAT('/Volumes/legal/contracts/originals/', file_name), 'text'
        ) AS full_text
    FROM contract_file_list
)
SELECT
    file_name,
    ai_extract(
        full_text,
        ARRAY('계약 당사자', '계약 금액', '계약 시작일', '계약 종료일', '자동갱신 여부', '해지 통보 기한')
    ) AS contract_terms,
    ai_classify(
        full_text,
        ARRAY('소프트웨어 라이선스', 'SaaS 구독', '컨설팅', '유지보수', '기타')
    ) AS contract_type,
    ai_query(
        'databricks-meta-llama-3-3-70b-instruct',
        CONCAT('다음 계약서의 주요 리스크 요인을 3가지 이내로 한국어로 요약해 주세요:\n\n', full_text),
        modelParameters => named_struct('temperature', 0.1)
    ) AS risk_summary
FROM parsed_contracts;

정리

AI 함수용도반환 타입
ai_query()범용 LLM 호출 (요약, 생성, 번역, 분석)STRING 또는 지정 STRUCT
ai_classify()텍스트를 사전 정의 카테고리로 분류STRING
ai_extract()텍스트에서 특정 정보 추출STRUCT
ai_gen()컨텍스트 기반 텍스트 생성STRING
ai_parse_document()PDF, 이미지 등에서 텍스트 추출STRING
ai_similarity()두 텍스트 간 의미적 유사도 측정DOUBLE
ai_forecast()시계열 예측TABLE
ai_anomaly_detection()시계열 이상 감지TABLE

참고 링크