[Cortex_AI_2] 감성분석: 완전관리형(AI_SENTIMENT) VS 프롬프트 엔지니어링(AI_COMPLETE)
자~ 나연 대표님, 오늘은 아주 흥미진진하고도 현실적인 '돈 이야기'와 '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"에서
앞으로 회원님들의 만족도를 높이고 상담 품질을 올리기 위해, 가입되어 있는 모든 요가원들의 콜센터 통화 녹취 파일(STT)을 분석해서 "감성 점수 + 불만 유형 + 위험 심각도 + 3줄 요약"을 자동으로 뽑아내는 데이터 파이프라인을 구축한다고 생각해보자!
이때 앞에서 살펴본 것과 같이, 우리는 두 가지 길을 선택할 수 있어.
- 스노우플레이크가 기본 제공하는 완전관리형 함수 (AI_SENTIMENT)
- 범용 LLM 함수에 프롬프트를 쥐여주는 방식 (AI_COMPLETE)
삼촌이 동일한 샘플(긴 통화 포함)으로 직접 비교 테스트를 거쳐서 비용, 품질, 운영 안정성을 완벽하게 검증해 봤단다. 결과가 아주 충격적이야!
1. 테스트 조건
두 방식 모두 동일한 STT 텍스트를 대상으로 진행했고, 결과는 깔끔하게 DB 테이블에 꽂아 넣을 수 있도록 JSON 형태로 출력하도록 설계를 맞췄어.
- 원하는 추출 항목 5가지:
- 감성 점수 ('시설 청결도', '직원 친절도', '대기 시간', '프라이버시', '재등록 의향')
- 불만 유형 분류
- 위험 심각도 (Low / Medium / High)
- 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를 늘 염두에 둬야 하니까
- 단순함에 속지 말자: 단순 텍스트 비교/분류가 아니라 요약 + 점수화 + 구조화(JSON)가 동시에 필요한 실무 파이프라인이라면, 완전관리형 함수(AI_SENTIMENT)보다 AI_COMPLETE + 오픈소스 대형 모델 조합이 훨씬 강력하고 안정적이다.
- 데일리 배치엔 llama3.1-70b: 비용과 품질의 타협점(Sweet Spot)을 찾는다면 Llama 70B 계열이 최고의 선택!
나연 대표님~ 이제 우리 프라나링크 가입 요가원의 감성 분석 배치 파이프라인은 llama3.1-70b 기반의 AI_COMPLETE로 고정해서 돌리면 되겠지? 비용도 아끼고 품질도 챙기는 멋진 데이터 엔지니어링 완료! 😎🚀