비즈니스는 문서를 통해 이루어집니다. 문서는 업무의 핵심 인터페이스이자 거의 모든 비즈니스 활동을 뒷받침하는 컨텍스트 계층으로 작동합니다. 계획, 조율, 심층 분석, 승인, 실행의 모든 과정에서 방대한 양의 텍스트, 슬라이드, 스프레드시트가 기록으로 남습니다.
하지만 새로운 연구 결과, 시장 분석, 임상 기록, 참신한 아이디어가 곧바로 문서에 담기는 오늘날에도, 기존 데이터 스택과 처리 도구는 그 의미를 제대로 파악하는 데 어려움을 겪습니다. 새 공급업체의 인보이스가 도착합니다. 법무팀은 책임 조항을 찾기 위해 계약서를 검색합니다. 주식 리서치 팀은 추세를 파악하기 위해 실적 보고서를 비교합니다. 기존 도구로는 대부분의 기업이 안심하고 비즈니스 프로세스를 자동화하는 데 필요한 정확도로 이러한 문서 데이터를 디지털화하기 어렵습니다.
바로 이러한 이유로 Snowflake는 문서를 정식 데이터 자산으로 다루는 네이티브 문서 인텔리전스 기능을 구축했습니다. 이 블로그에서는 조직이 Snowflake Cortex AI Functions를 활용해 하루 수십만 건의 문서를 처리하도록 확장 가능한 문서 인텔리전스 워크플로우를 구축한 방법을 살펴봅니다.
비즈니스 성과를 이끄는 세 가지 패턴
Cortex AI Functions는 직원과 사용자가 정보를 더 빠르게 찾도록 돕는 엔터프라이즈 검색 애플리케이션의 기반으로 설계되었습니다. 또한 문서에서 데이터를 추출해 비즈니스 프로세스를 자동화하고 대규모 문서 라이브러리 전반에서 더욱 심층적인 조사와 분석을 지원합니다.
지식 활용
겉으로 보기에는 검색 애플리케이션 구축이 단순해 보이지만, 실제 엔터프라이즈 문서를 마주하는 순간 이야기는 달라집니다. 실적 보고서에는 표, 차트, 각주, 복잡한 레이아웃이 포함됩니다. 계약서는 수백 페이지에 걸쳐 있으며, 조항은 여러 섹션과 부록에 흩어져 있습니다. 헬스케어 양식은 구조화된 필드, 손글씨 메모, 스캔 이미지를 함께 포함합니다. 핵심 과제는 정보를 검색하는 것이 아니라, 먼저 모든 문서를 AI가 정확히 이해할 수 있는 데이터로 전환하는 것입니다.
AI_PARSE_DOCUMENT는 엔터프라이즈가 문서를 데이터로 전환하는 기반입니다. 디지털 문서나 스캔 문서의 텍스트 버전만 필요하다면 OCR 모드는 스캔 문서와 이미지에서 텍스트를 추출합니다. 하지만 엔터프라이즈 검색, RAG, 에이전트 기반 애플리케이션에서는 구조 자체가 의미를 담는 경우가 많습니다. LAYOUT 모드는 문서의 원래 구조를 보존하여 다운스트림 AI 시스템이 문서의 의도된 읽기 방식에 따라 콘텐츠를 검색하고 이를 바탕으로 추론해 답변을 생성할 수 있도록 합니다. 여기에는 복잡한 다단 레이아웃의 읽기 순서 보존, 표 구조 추출, 시각적 계층 구조 유지, 차트, 다이어그램, 기타 그래픽 요소가 담긴 문서 내 이미지 캡처가 포함됩니다.
그 결과 정확한 검색에 필요한 컨텍스트를 유지하는 구조화된 문서 데이터가 생성됩니다. 구조가 제거된 단일 텍스트 스트림을 인덱싱하는 대신, 조직은 Cortex Search를 사용해 복잡한 문서에서도 의미를 보존하는 데 필요한 구조 정보를 포함한 콘텐츠를 검색할 수 있습니다. Cortex Search는 문서 코퍼스 전반에서 가장 관련성이 높은 섹션을 검색하고, 조직의 자체 콘텐츠를 근거로 응답을 생성합니다. 워크플로우가 Snowflake 내부에서 완전히 실행되므로, 엔터프라이즈 데이터에 적용되는 동일한 거버넌스와 액세스 제어가 사용자가 검색하고 가져올 수 있는 항목을 결정합니다.
비즈니스 프로세스 자동화
일상 업무에 인보이스, 계약서, 청구 양식, 구매 주문서, 세무 문서가 끊임없이 유입된다면 수동 데이터 입력은 곧 병목으로 작용합니다. 기업들은 이러한 워크플로우 중 상당수가 누군가 문서를 직접 읽고, 필요한 정보를 찾아, 다운스트림 시스템에 입력하는 방식으로 시작된다고 말합니다. 엔터프라이즈 규모에서 이 프로세스는 비용이 많이 들고 감사가 어려우며, 비즈니스 운영 속도를 제한하는 요인이 되기 쉽습니다.
Snowflake는 대량의 문서에서 고품질로 정보를 추출하는 작업을 네이티브로 처리합니다. AI_EXTRACT를 사용하면 공급업체명, 인보이스 날짜, 총액, 결제 조건, 항목별 내역 등 필요한 필드를 자연어로 설명할 수 있습니다. 그러면 다운스트림 분석, 규정 준수, 자동화에 바로 사용할 수 있는 구조화된 JSON이 반환됩니다. 추출된 모든 필드에는 신뢰도 점수가 포함되어 있어, 신뢰도가 낮은 결과를 원본 문서와 대조해 검토하고 검증하는 휴먼 인 더 루프 워크플로우를 구현할 수 있습니다. 다양한 문서 유형을 처리하는 조직의 경우 AI_CLASSIFY(퍼블릭 프리뷰)가 트래픽 컨트롤러처럼 작동해 서로 다른 문서를 각기 다른 AI 파이프라인으로 자동 라우팅할 수 있습니다.
그 결과 문서를 운영 데이터로 전환하는 신뢰할 수 있는 추출 파이프라인이 구축됩니다. 신뢰도 높은 추출 결과는 자동 처리하고, 신뢰도가 낮은 결과는 검토 단계로 라우팅할 수 있습니다. 특수 문서 형식, 산업별 용어, 규정 준수에 민감한 워크플로우에서는 Snowflake 내에서 AI_EXTRACT를 직접 파인튜닝해 추출 정확도를 더욱 높일 수 있습니다.
문서 전반에 걸친 심층 분석
경우에 따라 가치는 단일 문서 안에만 담겨 있지 않습니다. 수백 개, 수천 개의 문서에 흩어진 정보를 연결할 때 비로소 드러납니다. 주식 리서치 애널리스트는 성장 추세를 파악하기 위해 업계 전반의 실적 보고서를 비교해야 할 수 있습니다. 제약사는 경쟁 구도를 파악하기 위해 임상 연구와 규제기관 제출 자료를 검토해야 할 수 있습니다. 핵심 과제는 정보를 찾는 것이 아니라, 전체 문서 코퍼스 전반의 정보를 종합하는 것입니다.
이를 위해 고객은 AI_PARSE_DOCUMENT를 사용해 대규모 문서 컬렉션을 정형 데이터로 전환하면서 분석에 필요한 텍스트, 표, 이미지, 레이아웃을 보존하고 있습니다. AI_COMPLETE는 이어서 이러한 컬렉션 전반에 LLM 추론을 적용합니다. 조사 결과 요약, 문서 비교, 추세 식별, 복잡한 언어 해석, 여러 소스의 정보를 연결해야 하는 멀티홉 질문에 대한 답변 등 다양한 작업에 활용할 수 있습니다. 이후 AI_EMBED로 이러한 요약을 벡터로 변환하면 문서를 의미 유사도에 따라 클러스터링하고 문서 코퍼스의 핵심 주제를 파악할 수 있습니다.
그 결과 문서 컬렉션을 실행 가능한 인사이트로 전환하는 연구 및 분석 파이프라인이 구축됩니다. 헬스케어 조직은 수천 건의 임상 연구 문서를 아우르는 종단적 뷰를 생성해 분석가와 연구자가 대규모로 연구 결과를 종합하도록 지원할 수 있습니다. 한편 금융 분석가는 방대한 보고서와 공시 자료에서 추세, 위험, 기회를 수작업 분석보다 효율적으로 파악할 수 있습니다.
프로덕션 규모로 확장
문서 사용 사례가 10개 파일에서 작동한다는 사실을 입증하는 일은 어렵지 않습니다. 엔터프라이즈 환경의 실질적인 과제는 처리 규모입니다. 엔지니어링 파이프라인에 과부하를 주지 않으면서 매일 수십만 건의 문서를 처리하도록 이를 프로덕션 환경에 어떻게 구현할 수 있을까요?
Snowflake는 Dynamic Tables를 활용해 이 과제를 단순화합니다. 방대하고 복잡한 오케스트레이션 시스템을 구축하는 대신, 문서 데이터의 처리 방식과 데이터 최신성 요건을 정의하는 하나 이상의 선언적 SQL 문으로 데이터 파이프라인을 표현하면 됩니다. Snowflake가 스케줄링과 새로 고침 오케스트레이션을 자동으로 처리합니다.
추적 대상 기업의 연례 보고서를 지속적으로 수집해 적재하는 전략 팀을 예로 들어보겠습니다. 새 공시 자료가 들어올 때마다 각 문서에서 정형 데이터를 추출하고 애널리스트 관점의 요약을 생성하며 전략 테마별로 기업을 클러스터링하고 업계 패턴에서 벗어난 전략적 행보를 보이는 기업을 파악하려고 합니다.
새로운 CoCo의 ai-functions-pipeline-builder 스킬을 사용하면 다음 세 가지 Cortex AI Functions를 결합한 파이프라인을 손쉽게 실행할 수 있습니다.
- AI_PARSE_DOCUMENT는 각 연례 보고서 PDF를 구조화된 텍스트로 변환하면서 표, 제목, 읽기 순서를 보존합니다.
- AI_EXTRACT는 전략 테마, 성장 이니셔티브, 부담 요인, 매출, 회계연도 등 문서에서 지정된 필드를 추출합니다.
- AI_COMPLETE는 각 기업을 전략, 재무 성과, 전망, 차별화의 네 가지 애널리스트 관점으로 요약하고 명시적으로 레이블이 지정되지 않은 내용까지 포함한 문서 전체 텍스트에서 위험과 기회를 별도로 추론합니다.
- AI_EMBED는 각 기업의 요약을 벡터로 변환하여 의미 유사도에 따라 기업을 클러스터링하고 전체 코퍼스에서 테마를 찾아 이름을 지정하며 이상치를 식별할 수 있도록 합니다. 어떤 테마에도 명확히 부합하지 않는 전략을 가진 기업은 자동으로 식별됩니다.
CoCo가 생성한 SQL 코드
-- ── Step 1 | Parse annual reports ──────────────────────────────────────────
-- Note: Setting the refresh mode to "incremental" guarantees that each incoming document is processed only once.
CREATE OR REPLACE DYNAMIC TABLE DT_ESR_PARSED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
SELECT
SPLIT_PART(SPLIT_PART(fl.RELATIVE_PATH, '/', -1), '.', 1) AS COMPANY,
fl.RELATIVE_PATH,
AI_PARSE_DOCUMENT(
TO_FILE('@ESR_DOCS_STAGE', fl.RELATIVE_PATH),
{'mode': 'LAYOUT'}
) AS RAW_PARSE
FROM ESR_FILE_LOG fl
WHERE fl.RELATIVE_PATH ILIKE '%.pdf';
-- ── Step 2 | Extract structured fields ─────────────────────────────────────
CREATE OR REPLACE DYNAMIC TABLE DT_CONS_EXTRACTED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
WITH full_text AS (
SELECT COMPANY, RELATIVE_PATH,
LISTAGG(f.value:content::STRING, '\n') WITHIN GROUP (ORDER BY f.index) AS DOC_TEXT
FROM DT_ESR_PARSED, LATERAL FLATTEN(input => RAW_PARSE:pages) f
GROUP BY COMPANY, RELATIVE_PATH
)
SELECT
COMPANY, RELATIVE_PATH,
AI_EXTRACT(
text => LEFT(DOC_TEXT, 120000),
responseFormat => {'schema': {'type': 'object', 'properties': {
'title': {'type': 'string', 'description': 'Company name and fiscal year'},
'fiscal_year': {'type': 'string', 'description': '4-digit fiscal year'},
'revenue': {'type': 'string', 'description': 'Total revenue with currency'},
'strategy_themes': {'type': 'array', 'description': 'Top strategic priorities'},
'growth_initiatives': {'type': 'array', 'description': 'Key growth programs and investments'},
'headwinds': {'type': 'array', 'description': 'Key challenges and risks'}
}}}
) AS RAW_EXTRACT
FROM full_text;
-- ── Step 3 | Summarize + embed each company ─────────────────────────────────
CREATE OR REPLACE DYNAMIC TABLE DT_CONS_EMBEDDED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
WITH summarised AS (
SELECT COMPANY, RELATIVE_PATH, RAW_EXTRACT,
AI_COMPLETE(
'claude-sonnet-4-5',
PROMPT('Summarise this company''s annual report into 4 JSON fields:
strategy, financial_performance, outlook, differentiation.\n\n{0}',
'company: ' || COALESCE(RAW_EXTRACT:response:title::STRING, COMPANY) || '\n' ||
'themes: ' || COALESCE(ARRAY_TO_STRING(RAW_EXTRACT:response:strategy_themes::ARRAY, '; '), '') || '\n' ||
'headwinds: ' || COALESCE(ARRAY_TO_STRING(RAW_EXTRACT:response:headwinds::ARRAY, '; '), '')
),
response_format => {'type': 'json', 'schema': {'type': 'object', 'properties': {
'strategy': {'type': 'string'},
'financial_performance': {'type': 'string'},
'outlook': {'type': 'string'},
'differentiation': {'type': 'string'}
}}}
) AS SUMMARY_JSON
FROM DT_CONS_EXTRACTED
)
SELECT
COMPANY, RELATIVE_PATH,
RAW_EXTRACT:response:title::STRING AS TITLE,
RAW_EXTRACT:response:fiscal_year::STRING AS FISCAL_YEAR,
RAW_EXTRACT:response:revenue::STRING AS REVENUE,
SUMMARY_JSON:strategy::STRING AS S_STRATEGY,
SUMMARY_JSON:financial_performance::STRING AS S_FINANCIAL_PERFORMANCE,
SUMMARY_JSON:outlook::STRING AS S_OUTLOOK,
SUMMARY_JSON:differentiation::STRING AS S_DIFFERENTIATION,
TRIM(CONCAT_WS(' ',
COALESCE(SUMMARY_JSON:strategy::STRING, ''),
COALESCE(SUMMARY_JSON:outlook::STRING, ''),
COALESCE(SUMMARY_JSON:differentiation::STRING, '')
)) AS SUMMARY_TEXT,
AI_EMBED('snowflake-arctic-embed-l-v2.0', TRIM(CONCAT_WS(' ',
COALESCE(SUMMARY_JSON:strategy::STRING, ''),
COALESCE(SUMMARY_JSON:outlook::STRING, ''),
COALESCE(SUMMARY_JSON:differentiation::STRING, '')
))) AS SUMMARY_VEC
FROM summarised;
-- ── Step 4 | Discover strategic themes across the corpus ────────────────────
CREATE OR REPLACE TABLE CONS_THEMES AS
WITH themes AS (
SELECT AI_COMPLETE(
'claude-sonnet-4-5',
PROMPT('Identify 4-5 distinct strategic themes that organise these companies.
Each needs a short name and one-sentence description.\n\n{0}',
LISTAGG(COMPANY || ': ' || S_STRATEGY, '\n')),
response_format => {'type': 'json', 'schema': {'type': 'object', 'properties': {
'themes': {'type': 'array', 'items': {'type': 'object', 'properties': {
'name': {'type': 'string'},
'description': {'type': 'string'}
}}}
}}}
) AS RAW FROM DT_CONS_EMBEDDED
)
SELECT
f.index AS THEME_ID,
f.value:name::STRING AS THEME_NAME,
f.value:description::STRING AS THEME_DESC,
AI_EMBED('snowflake-arctic-embed-l-v2.0',
f.value:name::STRING || ': ' || f.value:description::STRING) AS THEME_VEC
FROM themes, LATERAL FLATTEN(input => RAW:themes) f;
CoCo가 생성한 Streamlit 애플리케이션
결론
오랫동안 문서는 데이터 플랫폼 밖에 존재해 왔으며 조직이 문서에 담긴 정보를 검색하고 분석하며 관련 프로세스를 자동화하는 데 제약이 있었습니다. Cortex AI Functions를 사용하면 이제 문서를 데이터로 전환해 엔터프라이즈 규모의 검색, 자동화, 분석, AI 애플리케이션을 지원할 수 있습니다.
엔터프라이즈 검색을 통해 지식을 활성화하든, 구조화된 추출로 문서 기반 비즈니스 프로세스를 자동화하든, 대규모 문서 분석으로 인사이트를 생성하든, 그 기반은 Cortex AI Functions가 제공합니다. 이러한 인텔리전스는 Snowflake CoWork, Cortex Agents, Snowflake CoCo, Snowflake 기반 사용자 지정 애플리케이션 등의 환경에서 활용할 수 있습니다.
핵심 문서 인텔리전스 AI Functions 요약
| 함수 | 기능 설명 | 애플리케이션 영향 |
|---|---|---|
| AI_PARSE_DOCUMENT | PDF, 이미지, Office 문서를 구조화된 텍스트로 변환하면서 표와 레이아웃을 보존합니다. | 검색, RAG, 분석, 다운스트림 AI 워크플로우를 위한 원본 충실도가 높은 기반을 마련합니다. |
| AI_EXTRACT | 자연어 스키마를 사용해 구조화된 필드, 표, 엔터티를 추출합니다. | 문서 기반 프로세스를 자동화하고 문서를 운영 데이터로 전환합니다. |
| AI_CLASSIFY | 다운스트림 처리를 위해 유형에 따라 문서를 라우팅하고 분류합니다. | 콘텐츠를 적절한 워크플로우, 모델 또는 비즈니스 프로세스로 라우팅합니다. |
| AI_COMPLETE | 심층 분석과 문서 간 인사이트를 위한 범용 LLM 추론을 제공합니다. | 요약, 분석, 리서치, 다중 문서 추론, 인사이트 생성을 지원합니다. |
