Main Quest - Snowflake/[시리즈] Cortex AI Functions

[Cortex_AI_2] 감성분석: 완전관리형(AI_SENTIMENT) VS 프롬프트 엔지니어링(AI_COMPLETE)

포스 삼촌 2026. 7. 17. 12:34

 

자~ 나연 대표님, 오늘은 아주 흥미진진하고도 현실적인 '돈 이야기'와 'AI 실무 선택'에 대한 이야기를 해볼까 해.

 

나연스떼 2호점 확장 준비를 할 때, 1호점 회원님들의 콜센터 통화 녹취 파일을 분석해보려고 했었지 않니.

고객의 소리(Voice of Customer)를 받게 되었을 때, 잘 분석하고 대응해야 더욱 좋은 서비스를 할 수 있겠지~


 

Snowflake에서 제공하는 완전관리형 AI 함수는 AI_SENTIMENT가 있어.

-- =============================================================
-- 5. AI_SENTIMENT — 감성 분석
-- =============================================================

-- 구문: AI_SENTIMENT( <text> [, <return_error_details>] )
-- 반환: FLOAT (-1.0 ~ 1.0)
-- 모델: Snowflake managed model (컨텍스트 2,048 토큰)

SELECT AI_SENTIMENT('제품 품질이 매우 만족스러워요. 그런데 배송은 좀 지연되었네요.');

 

반환 결과: {  "categories": [    {      "name": "overall",      "sentiment": "mixed"    }  ]}

 

제품 품질은 만족스러운데, 배송은 좀 지연되었다-는 고객의 멘트에서 전반적인 감성은 mixed = 혼합, 즉 긍정과 부정이 복합적이라는 결과야.

 

 

AI_SENTIMENT는 긍정/복합/부정의 3가지 결과를 반환한단다.

SELECT AI_SENTIMENT('This is the worst experience I have ever had');

 

반환 결과: {  "categories": [    {      "name": "overall",      "sentiment": "negative"    }  ]}

위와 같이 worst 라는 단어가 들어간 표현의 경우에는 negative를 반환하는 걸 알 수 있어.

 

 

그럼 overall이 아닌 내가 원하는 척도에서의 분석을 할 수는 없을까? 예를 들어 '직원 친절도', '시설 청결도' 이런게 궁금할 수 있잖아.

그럴 땐 다음과 같이 활용하면 돼.

select cust_contents, cust_keyword, sentiment_label, 
    AI_SENTIMENT(
        cust_contents,
        ['시설 청결도', '직원 친절도', '대기 시간', '프라이버시', '재등록 의향']
    ) as newSent
from  FORCE_DB.SH26.T_BRANCH1_VOC;

 

1호점 회원님들의 VoC 내용을 실제로 한번 분석해볼까?

아래와 같은 통화가 있었어.

나연: 민지님, 오늘 요가 수업 어떠셨어요? 불편한 점은 없으셨나요?
고객: 선생님, 다 좋은데 샤워실 수압이 너무 낮아요. 옆 칸에서 사람 쓰면 제 칸은 물이 졸졸 나와서 샴푸 헹구는 데 한참 걸려요. 그리고 옆 사람이랑 너무 붙어 있어서 좀 민망하기도 하고요. 요즘은 다 칸막이 있던데 여기는 너무 오픈형이라 좀 그래요.

 

위 통화 내역에 대한 쿼리 결과야.

{  "categories": [
    {      "name": "overall",      "sentiment": "mixed"    },
    {      "name": "대기 시간",      "sentiment": "unknown"    },
    {      "name": "시설 청결도",      "sentiment": "negative"    },
    {      "name": "재등록 의향",      "sentiment": "unknown"    },
    {      "name": "직원 친절도",      "sentiment": "neutral"    },
    {      "name": "프라이버시",      "sentiment": "unknown"    }
  ]}

통화 내용에 해당되는 '시설 청결도'는 negative가 나오는 반면 별다른 언급이 없었던 '직원 친절도'는 neutral이 나왔지.

이렇게 내가 원하는 키워드를 지정하면 그에 맞는 감성 분석 결과를 얻을 수 있어.

 

VoC를 분석하는 파이프라인을 만들 때, 이런 키워드를 세심하게 조정하면 더욱 고객의 소리를 잘 들을 수 있을거야.

 

 

 

이쯤되면, 우리 나연 대표님이 궁금해하겠지, '삼촌~ 그거 AI_COMPLETE로 사용하면 안돼?' 라고 ^^

AI_COMPLETE를 사용해서도 유사한 결과를 만들어 낼 수 있어.

select cust_contents, cust_keyword, sentiment_label, 
        PARSE_JSON(
            AI_COMPLETE(
                'llama3.1-70b',
                '다음은 요가원 나연스떼 1호점의 콜센터 통화 텍스트입니다. 아래 JSON 형식으로만 응답하세요.
                {
                  "sentiment": {"시설 청결도": 0.0, "직원 친절도": 0.0, "대기 시간": 0.0, "프라이버시": 0.0, "재등록 의향": 0.0},
                  "risk": "상/중/하",
                  "summary": "3줄 이내 요약"
                }
                점수는 -1.0(매우 부정) ~ 1.0(매우 긍정) 사이 값.
                통화 텍스트:
                ' || cust_contents
                    )
        ) as newCom
  from  FORCE_DB.SH26.T_BRANCH1_VOC
 ;

 

앞서 나온 민지 회원님의 통화 기록에 대한 결과는 다음과 같아.

{
  "risk": "중",
  "sentiment": {
    "대기 시간": 0,
    "시설 청결도": 0,
    "재등록 의향": 0,
    "직원 친절도": 1,
    "프라이버시": -1
  },
  "summary": "샤워실 수압이 낮고, 오픈형 구조로 프라이버시가 침해된다 호소함."
}

 

LLM이 프롬프트에 의해 대답하니까, 프롬프트를 잘 짜는 것이 중요해. 좋은 점은 한번의 AI_COMPLETE 실행으로 통화 요약 결과를 바로 얻을 수 있다는 점이야. 이런 부분은 파이프라인을 단계를 절약할 수 있어서 중요하거든~ :D 

 


가장 완벽한 맞춤형 웰니스, PRANALINK

나연 대표님~ 우리의 스타트업인 "PRANALINK"에서

앞으로 회원님들의 만족도를 높이고 상담 품질을 올리기 위해, 가입되어 있는 모든 요가원들의 콜센터 통화 녹취 파일(STT)을 분석해서 "감성 점수 + 불만 유형 + 위험 심각도 + 3줄 요약"을 자동으로 뽑아내는 데이터 파이프라인을 구축한다고 생각해보자! 

 

이때 앞에서 살펴본 것과 같이, 우리는 두 가지 길을 선택할 수 있어.

  1. 스노우플레이크가 기본 제공하는 완전관리형 함수 (AI_SENTIMENT)
  2. 범용 LLM 함수에 프롬프트를 쥐여주는 방식 (AI_COMPLETE)

삼촌이 동일한 샘플(긴 통화 포함)으로 직접 비교 테스트를 거쳐서 비용, 품질, 운영 안정성을 완벽하게 검증해 봤단다. 결과가 아주 충격적이야!

1. 테스트 조건

두 방식 모두 동일한 STT 텍스트를 대상으로 진행했고, 결과는 깔끔하게 DB 테이블에 꽂아 넣을 수 있도록 JSON 형태로 출력하도록 설계를 맞췄어.

  • 원하는 추출 항목 5가지:
    1. 감성 점수 ('시설 청결도', '직원 친절도', '대기 시간', '프라이버시', '재등록 의향')
    2. 불만 유형 분류
    3. 위험 심각도 (Low / Medium / High)
    4. 3줄 핵심 요약

 

2. 한눈에 보는 3대 선수의 스펙 & 비용 비교표 📊

동일한 통화들을 처리할 때 발생한 크레딧과 비용, 그리고 결과 품질을 정리한 족보야!

비교 항목 AI_SENTIMENT (내장 AI함수) AI_COMPLETE (llama3.1-70b) AI_COMPLETE (gemini-3.1-pro)
호출 방식 완전관리형 단독 함수 프롬프트 엔지니어링 프롬프트 엔지니어링
건당 크레딧 0.0024 0.0007 0.0130
건당 비용 ($) $0.005 $0.001 $0.026
비용 비율 기준점 1x (가장 저렴!) 18x (18배 과금!)
결과 품질 ❌ 긴 텍스트 실패 (None 반환) ⭕ 충분함 (수치+분류+요약) 🟢 최고 (상세하고 구체적)
최종 판정 탈락 (운영 불가) ★ 최종 채택 (가성비 원탑) 비배치용 (특별검증용)

 

3. 삼촌의 실무 필드 리포트 (왜 이 결과가 나왔을까?)

🔴 1) AI_SENTIMENT (내장 함수)의 한계

  • 현실: 약 26분 분량의 길어진 상담 통화 텍스트를 밀어 넣었더니, 에러가 나거나 None (Null)을 반환해 버렸어.
  • 진단: 단순 단문 텍스트의 긍정/부정 뉘앙스만 파악하는 용도로 설계되었기 때문에, 긴 맥락을 유지해야 하거나 구조화된 3줄 요약 + 다중 레이블을 동시에 뽑아내는 복합 업무에는 운영 불가능 판단! 통화 내용을 요약하려면 AI_SENTIMENT -> AI_COMPLETE(요약)의 2단계 절차가 되기 때문에 비용이 더욱 늘어날 수 있어!

🟡 2) AI_COMPLETE + gemini-3.1-pro의 화려함, 하지만...

  • 현실: 요약의 구체성과 감성 분석의 미묘한 뉘앙스를 잡아내는 능력은 단연 최고였어.
  • 진단: 문제는 비용이야! llama3.1-70b 대비 무려 18배나 비싼 크레딧을 소모해. 매일 수천 건씩 쌓이는 콜센터 배치 파이프라인에 이 녀석을 돌렸다간, 요가원 고객님들의 이번 달 통장 잔고가 털릴지도 몰라! (이런 고급 성능은 차등화해서 VIP 회원 전용 특별 분석에만 쓰는 걸로 ^^)

🟢 3) AI_COMPLETE + llama3.1-70b (승자! 🏆)

  • 현실: 3건의 테스트 모두 완벽 성공! 우리가 요구한 JSON 포맷에 맞춰 감성 점수, 심각도, 3줄 요약을 깔끔하게 출력해 냈어.
  • 진단: 비용은 건당 $0.001 수준으로 가장 저렴하면서도 실무 데이터 분석 및 대시보드 구축에 충분한 품질을 보여줬지.

 

4. 포스 삼촌의 아키텍처 결론 & 1줄 요약 💡

스노우플레이크 Cortex AI를 쓸 때, 내장 함수와 AI_COMPLETE를 비교해보자^^
조직에선 TCO를 늘 염두에 둬야 하니까

  1. 단순함에 속지 말자: 단순 텍스트 비교/분류가 아니라 요약 + 점수화 + 구조화(JSON)가 동시에 필요한 실무 파이프라인이라면, 완전관리형 함수(AI_SENTIMENT)보다 AI_COMPLETE + 오픈소스 대형 모델 조합이 훨씬 강력하고 안정적이다.
  2. 데일리 배치엔 llama3.1-70b: 비용과 품질의 타협점(Sweet Spot)을 찾는다면 Llama 70B 계열이 최고의 선택!

나연 대표님~ 이제 우리 프라나링크 가입 요가원의 감성 분석 배치 파이프라인은 llama3.1-70b 기반의 AI_COMPLETE로 고정해서 돌리면 되겠지? 비용도 아끼고 품질도 챙기는 멋진 데이터 엔지니어링 완료! 😎🚀