본문 바로가기
Snowflake

[Snowflake] Cortex Search Service 기반 AI 챗봇 질의

by heed159 2025. 12. 24.

Cortex Analyst는 TEXT2SQL 즉, 자연어를 SQL로 변환하여 테이블과 같은 구조화(정형)된 데이터를 분석하고 비즈니스 사용자가 셀프 서비스 분석을 수행할 수 있도록 지원한다. 또한 Cortex Search는 문서나 텍스트와 같은 비정형 데이터를 기반으로 정보를 찾는데 탁월하며, 챗봇용 RAG에 자주 활용된다. 아래 표를 보며 비교해보자.

구분 Cortex Analyst Cortex Search
대상 데이터 테이블(정형) 문서/텍스트(비정형)
주요 기능 자연어 → SQL → 분석 의미 기반 문서 검색
쿼리 실행 ✅ 있음 ❌ 없음
비용 발생 Warehouse 비용 Search + LLM 비용
RAG 구성 요소 ❌ (보조적) ✅ 핵심
대표 활용 매출 분석, VOC 집계 정책 QA, 매뉴얼 검색

 

이번 글에서는 '사내 메뉴얼 기반 Cortex Search AI 챗봇' 데모를 생성해보려고 한다. 파이썬도 활용하기 위해 Snowflake Notebook에서 진행해보자.

 

RAG용 문서 전처리(PDF → 이미지/텍스트 추출)

PDF 문서를 그레이스케일 이미지로 변환하기 위한 PyMuPDF 라이브러리르 설치 및 임포트한다. 이는 Notebook에서 사용할 기본 환경을 준비하는 단계이다. 또한, Notebook 환경에서 PDF 문서를 이미지로 변환하기 위한 전처리 클래스를 정의하고 Snowflake 스테이지에 있는 PDF를 다운로드한 뒤 페이지별로 고해상도 이미지(PNG)로 변환하고, 결과를 다시 스테이지에 업로드하여 이후 RAG용 문서 인덱싱(Cortex Search)에 활용할 수 있도록 한다. 해당 과정에 대한 코드는 생략하도록 하겠다.

 

 

Stage 생성

스테이지에 새로 업로드된 파일을 인식시키기 위해 STAGE 메타데이터를 갱신하고, 이후 RAG 파이프라인에서 사용할 이미지 파일 경로와 추출된 데이터를 저장할 RAW 테이블을 생성한다.

--STAGE에 파일 생성 후 REFRESH 필요
ALTER STAGE HD_DEMO.MANUAL.STG_BUILD_FILES_MANUAL REFRESH;

CREATE OR REPLACE TABLE HD_DEMO.MANUAL.IMAGE_RAW_DATA_MANUAL(
  FILEPATH STRING
, EXTRACTED_CONTENT STRING
);

 

RAG 인덱싱용 데이터 적재

스테이지에 있는 이미지 파일 목록을 조회한 뒤, 멀티모달 LLM(AI_COMPLETE)을 사용해 이미지에서 텍스트·표·차트를 추출하고 그 결과를 파일 경로와 함께 RAW 테이블에 저장하여 RAG 인덱싱용 데이터로 적재한다. 아래 프롬프트를 보면 표, 차트, 그래프는 JSON 형태로 추출하라고 되어있는데 이는 정확한 의미 기반으로 데이터를 가져와야 하기 때문이다. 그래프 등의 수치를 단순히 텍스트로만 추출하게 된다면 어떤 의미인지 정확한 파악이 안되기 때문이다.

INSERT INTO HD_DEMO.MANUAL.IMAGE_RAW_DATA_MANUAL
WITH BUILD_IMAGES AS 
(
 SELECT  RELATIVE_PATH
    FROM DIRECTORY('@HD_DEMO.MANUAL.STG_BUILD_FILES_MANUAL')
    WHERE (RELATIVE_PATH LIKE '%.png' 
           OR RELATIVE_PATH LIKE '%.jpg'
           OR RELATIVE_PATH LIKE '%.jpeg'
           OR RELATIVE_PATH LIKE '%.PNG'
           OR RELATIVE_PATH LIKE '%.JPG'
           OR RELATIVE_PATH LIKE '%.JPEG')
)
SELECT 
    RELATIVE_PATH,
    AI_COMPLETE(
'llama4-maverick',
'첨부 이미지에서 아래와 같은 규칙을 지켜서 리턴해.
1. 첨부 이미지에 표, 차트, 그래프는 데이터를 JSON 형태로 뽑아줘.
2. 텍스트는 그냥 텍스트로 뽑아줘.
3. 다른 답변은 하지 말고 JSON 과 Text 값만 리턴해.',
    TO_FILE('@HD_DEMO.MANUAL.STG_BUILD_FILES_MANUAL', RELATIVE_PATH)
        ) AS EXTRACTED_CONTENT
FROM BUILD_IMAGES;

 

이미지 파일 경로와 추출된 데이터 조회

SELECT * FROM HD_DEMO.MANUAL.IMAGE_RAW_DATA_MANUAL;

 

Cortex Search 서비스 생성

RAW 테이블의 EXTRACTED_CONTENT 컬럼을 검색 대상으로 인덱싱하고, FILEPATH를 메타데이터로 활용하여 이후 Snowflake Intelligence에서 의미 기반(RAG) 질의가 가능하도록 설정한다.

CREATE OR REPLACE CORTEX SEARCH SERVICE HD_DEMO.MANUAL.SSG_MANAUL_SEARCH
    ON EXTRACTED_CONTENT
    ATTRIBUTES FILEPATH
    WAREHOUSE = COMPUTE_WH
    TARGET_LAG = '7 days'
    AS (
        SELECT * FROM HD_DEMO.MANUAL.IMAGE_RAW_DATA_MANUAL
    );

 

에이전트 생성 및 설정

Cortex Agent는 LLM과 함께 Analyst와 Search를 활용하여 인사이트를 제공한다. 위에서도 설명했지만 Search는 비정형 데이터에서 인사이트를 추출하지만, Analyst는 정형 데이터를 처리하기 위해 SQL을 생성한다. 또한, 원하는 방식으로 오케스트레이션도 가능하다. 세부설정을 알고 싶다면 아래 글을 확인해보자.

2025.12.11 - [Snowflake] - [Snowflake] Snowflake Intelligence로 나만의 에이전트를 만들어보자

 

[Snowflake] Snowflake Intelligence로 나만의 에이전트를 만들어보자

GPT에게 Snowflake Intelligence가 무엇인지 설명해보라고 한 답변이다. Snowflake Intelligence는 조직의 데이터를 기반으로 인사이트를 얻고 행동을 취할 수 있도록 도와주는 AI 기반 플랫폼입니다.자연어

heed159.tistory.com

 

예시 질문을 위와 같이 미리 생성해 놓을 수도 있다.

 

앞서 생성한 Search 서비스를 선택해준다.

 

Cortex Agent에서 사용할 수 있는 모델은 다음과 같다. 만약 해당 모델을 로컬 리전에서 사용할 수 없다면 리전 간 추론을 허용해야 한다.

  • auto
  • claude-sonnet-4-5
  • claude-4-sonnet
  • claude-3-7-sonnet
  • claude-3-5-sonnet
  • openai-gpt-5
  • openai-gpt-4-1

공식문서에서는 auto를 선택하는 것이 좋다고 나와있지만, 응답의 일관성을 위해서 특정 모델을 선택하는 것이 이후 작업 하기엔 용이하다고 생각한다. 결국 어떤 모델을 선택할 것인지가 튜닝 포인트라고 한다.

에이전트까지 모두 생성됐다면 이제 Intelligence를 통해 질의 할 수 있다.

 

예시 질문도 생성이 잘 되었고 해당 질문들도 수행해보자.

아래와 같은 이미지 파일에서 표에 있는 내용을 토대로 답변을 가져온 것을 확인할 수 있다.