Cortex Search (하이브리드 검색 서비스와 RAG)
벡터 검색과 키워드 검색, 재순위화를 묶은 Cortex Search 서비스를 만들고 SQL, Python, REST 로 질의하는 법, 2026년 GA 가 된 다중 인덱스와 사용자 임베딩, 비용 세 갈래와 한도, RAG 와 에이전트에서 쓰는 요령을 정리합니다.
무엇인가
Cortex Search 는 Snowflake 테이블의 텍스트로 낮은 지연의 검색 서비스를 만들어 주는 관리형 기능입니다. 임베딩 생성, 인덱스 갱신, 서빙을 Snowflake 가 맡습니다.
- 하이브리드 검색: 의미가 비슷한 문서를 찾는 벡터 검색과 단어가 맞는 문서를 찾는 키워드 검색을 함께 쓰고, 상위 결과를 의미 기반 재순위화(reranking) 로 다시 정렬합니다.
- 점수 조정: 숫자 열 가중치(boost), 시간 감쇠(time decay), 구성 요소 가중치, 재순위화 끄기를 고를 수 있습니다. 2026년 2월부터 구성 요소별 점수(component scores)를 결과로 볼 수 있습니다 (GA).
- 쓰임: RAG 챗봇의 검색 단계, 사내 검색창, Cortex Agents 와 Snowflake CoWork 의 문서 검색 도구.
만들기
CREATE OR REPLACE CORTEX SEARCH SERVICE support.ticket_search
ON body -- 검색할 텍스트 열
ATTRIBUTES product, region, created_at -- 거르기용 열 (아래 SELECT 에 있어야 함)
WAREHOUSE = cortex_search_wh -- 처음 만들기와 갱신용
TARGET_LAG = '1 hour' -- 원본 변경을 얼마나 빨리 반영할지
EMBEDDING_MODEL = 'snowflake-arctic-embed-l-v2.0'
AS (
SELECT ticket_id, body, product, region, created_at
FROM support.tickets
WHERE status <> 'SPAM'
);- 기본 임베딩 모델은
snowflake-arctic-embed-m-v1.5이고, 한국어처럼 영어가 아닌 문서는 다국어 모델(snowflake-arctic-embed-l-v2.0,voyage-multilingual-2등)을 고릅니다. 지원 모델은 리전마다 다릅니다. - 공식 문서는 서비스마다 MEDIUM 이하의 전용 웨어하우스를 권장합니다.
- 원본 쿼리 결과는 4억 행 미만이어야 합니다. 넘으면 만들기가 실패하고, 늘리려면 계정 팀에 요청합니다.
2026년에 GA 가 된 것
| 시점 | 기능 |
|---|---|
| 2026-03-12 | 한 서비스에 검색 열 여러 개(다중 인덱스), 미리 계산한 사용자 임베딩, 에이전트용 검색 도구 강화 (호출마다 서비스 선택, 필터, 반환 열, 결과 수 최대 500) |
| 2026-04-14 | Cortex Search 서비스 복제 |
| 2026-05-18 | Batch Cortex Search (대량 질의를 한 번에) |
| 2026-05-11 | 서빙 자동 일시 중지와 재개 (PuPr) |
질의하기
-- SQL 로 미리 보기
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'support.ticket_search',
'{"query": "결제 후 환불이 안 돼요", "columns": ["ticket_id", "body"],
"filter": {"@eq": {"region": "KR"}}, "limit": 5}'
)
):results;from snowflake.core import Root
svc = (Root(session).databases["SUPPORT_DB"].schemas["SUPPORT"]
.cortex_search_services["TICKET_SEARCH"])
resp = svc.search(query="결제 후 환불이 안 돼요", columns=["ticket_id", "body"],
filter={"@eq": {"region": "KR"}}, limit=5)
print(resp.to_json())앱에서는 REST API 로 부르고, 인증은 키 페어 JWT, OAuth, PAT 를 씁니다. 필터 연산자는 @eq, @contains, @gte, @lte, @and, @or, @not 등이 있습니다.
RAG 로 묶기
WITH ctx AS (
SELECT LISTAGG(r.value:body::STRING, '\n---\n') AS docs
FROM TABLE(FLATTEN(PARSE_JSON(SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'support.ticket_search', '{"query": "환불 절차", "columns": ["body"], "limit": 5}')):results)) r
)
SELECT AI_COMPLETE('claude-sonnet-4-5',
'아래 사례만 근거로 환불 절차를 3단계로 설명해 줘. 근거가 없으면 모른다고 답해.\n' || docs)
FROM ctx;SEARCH_PREVIEW 는 이름 그대로 확인용입니다. 운영 RAG 는 REST API 나 Python SDK, 또는 Cortex Agents 의 검색 도구로 구현합니다. 모델 이름은 예시이고 리전의 지원 목록을 확인합니다.
비용
| 항목 | 과금 | 줄이는 법 |
|---|---|---|
| 서빙 | 인덱스된 압축 전 데이터(임베딩 포함) GB 당 월 요금. 질의가 없어도 서비스가 떠 있으면 과금 (Consumption Table 기준 GB 당 월 6.3 AI Credits) | 필요한 열만 넣기, 오래된 문서 제외, 자동 일시 중지 |
| 임베딩 | 임베딩한 토큰 수. 바뀐 행만 다시 임베딩 | 자주 바뀌는 열을 검색 열에서 빼기 |
| 웨어하우스 | 초기화, 갱신, 인덱스 빌드. 바뀐 것이 없으면 크레딧 없음 | TARGET_LAG 를 업무에 맞게 길게 |
- 2026년 7월 Cortex Search 에도 리소스 예산(resource budgets)을 걸 수 있게 되었습니다.
- 서빙 자동 일시 중지(PuPr)는 최소 1,800초(30분) 이고, 멈춘 서비스의 첫 질의는 재개를 기다리며 동시에 온 요청은 HTTP 429 와
Retry-After를 받습니다. 재개에 몇 분 걸릴 수 있습니다.
한도와 성능
- 처리량은 서비스당 20 QPS, 계정 전체 140 QPS 입니다. 넘으면 HTTP 429 가 나오므로 클라이언트에서 지수 백오프로 재시도합니다.
- 청크 크기는 512 토큰 안팎이 일반적인 출발점입니다. 너무 크면 검색 정밀도가, 너무 작으면 문맥이 떨어집니다.
- 문서 원본 경로나 페이지 번호를 ATTRIBUTES 나 반환 열로 넣어 두면 답에 출처를 붙이기 쉽습니다.
트러블슈팅
증상: 원본 테이블을 고쳤는데 검색 결과가 그대로입니다.
원인: TARGET_LAG 가 길거나 서비스 갱신이 실패했습니다.
해결:
DESC CORTEX SEARCH SERVICE로 마지막 갱신 시각과 상태를 보고, 급하면ALTER CORTEX SEARCH SERVICE ... REFRESH를 실행합니다.증상: 한국어 질의 정확도가 낮습니다.
원인: 영어 중심 임베딩 모델을 썼거나 청크가 너무 깁니다.
해결: 다국어 임베딩 모델로 서비스를 다시 만들고, 문서를 문단 단위로 나눠 넣습니다.