> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# AI 함수 — 고급 기능과 실무 활용

> 이 문서는 **[데이터 웨어하우징](/training/06-data-warehousing/overview)** 섹션의 일부입니다.

## ai\_similarity() — 텍스트 유사도

두 텍스트 간의 의미적 유사도를 0\~1 사이의 점수로 반환합니다.

```sql theme={null}
-- 중복 고객 문의 감지
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만으로 시계열 예측과 이상 감지를 수행할 수 있습니다.

```sql theme={null}
-- 매출 예측 (향후 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단어 ≈ 1~~1.5 토큰이며, 한국어는 1글자 ≈ 1~~3 토큰으로 다소 많이 소모됩니다. 프롬프트(입력)와 응답(출력) 모두 토큰 수로 과금됩니다.

***

## 실무 활용 시나리오

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

```sql theme={null}
-- 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: 비정형 문서 → 구조화 데이터 파이프라인

```sql theme={null}
-- 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               |

***

## 참고 링크

* [Databricks: ai\_query()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_query.html)
* [Databricks: ai\_classify()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_classify.html)
* [Databricks: ai\_extract()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_extract.html)
* [Databricks: ai\_gen()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_gen.html)
* [Databricks: ai\_parse\_document()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_parse_document.html)
* [Databricks: ai\_forecast()](https://docs.databricks.com/aws/en/sql/language-manual/functions/ai_forecast.html)
* [Databricks: Foundation Model APIs](https://docs.databricks.com/aws/en/machine-learning/foundation-models/)
* [Databricks Blog: AI Functions](https://www.databricks.com/blog)
