AI 함수 최적화
AI 함수 최적화 (AI_FUNCTION_OPTIMIZATION)
프리뷰 기능 — 오픈 (Open). 모든 계정에서 사용할 수 있어요.
AI_FUNCTION_OPTIMIZATION은 레이블이 지정된 데이터셋과 점수 매기기 메트릭을 사용하여 AI 함수의 개선된 구현을 검색해요. 최적화할 AI 함수, 후보 출력을 평가하는 데 사용되는 데이터셋, 최적화할 메트릭, 옵티마이저가 사용할 수 있는 모델을 지정해요. Snowflake는 함수의 프롬프트와 모델 구성을 수정하여 후보 구현을 생성하고, 각 후보를 데이터셋에 대해 평가하며, 품질과 비용을 기록해요.
최적화는 품질·비용 프런티어(frontier)의 후보를 포함한 후보 구현들을 생성해요. 원래 AI 함수는 수정되지 않아요. 최적화된 구현을 사용하려면 선택된 최적화 실행에서 새 AI 함수를 만들어요.
AI_FUNCTION_OPTIMIZATION은 AI 함수 평가(AI function evaluation)와 동일한 평가 모델을 사용해요 — 후보 구현은 지정된 데이터셋과 메트릭에 대해 반복적으로 평가돼요.
본문
구문 (Syntax)
최적화는 두 문장으로 실행돼요: 최적화 사양으로 실험(experiment)을 생성한 다음 실행하는 것이에요.
CREATE [ OR REPLACE ] EXPERIMENT
TYPE = 'AI_FUNCTION_OPTIMIZATION'
FROM SPECIFICATION $$
$$;
EXECUTE EXPERIMENT ;
최적화 사양은 다음 형태의 YAML 문서예요:
function:
function_name: "" # one of function_name /
# function_body: "" # function_body
metrics:
- name:
# judge_model: # llm_judge only
# custom_udf: # custom only (required)
dataset:
name:
version:
column_mapping: # optional
argument_mapping:
:
ground_truth:
optimization:
models:
- # one or more
reflection_model:
strategy: # optional
budget: # optional
인자 (Arguments)
사양은 CREATE EXPERIMENT 시점에 검증돼요. 알 수 없거나 잘못 입력된 키는 거부돼요.
필수 (Required)
function— 최적화할 AI 함수예요. 다음 중 정확히 하나를 제공해요:function_name— 인자 타입 시그니처를 포함한 정규화된 이름, 예를 들어"my_db.my_schema.redact(VARCHAR)". 이름이 지정된 함수는 CREATE AI FUNCTION으로 생성돼야 하며, 일반 SQL UDF는 거부돼요.function_body— 직접 최적화할 인라인 SQL 표현식 (AI 함수 본문에 넣을 것과 같은 형식).
metrics— 정확히 하나의 점수 메트릭 — 단일 매핑 또는 한 요소 리스트. 평가와 동일한 메트릭 집합:
| 메트릭 | 필요 사항 |
|---|---|
exact_match |
— |
fuzzy_match |
— |
contains_match |
— |
redaction_match |
— |
llm_judge |
선택 judge_model |
custom |
custom_udf: <udf_name> (필수) |
각 메트릭이 무엇을 점수 매기는지 보려면 "AI 함수 평가" 문서를 참고해요.
dataset— 후보를 점수 매기는 데 사용되는 레이블 데이터예요. 버전이 지정된 Snowflake 데이터셋(SNOWFLAKE.ML.DATASET)이어야 하며, 일반 테이블/뷰는 허용되지 않아요.name— 정규화된 데이터셋 이름. 필수.version— 데이터셋 버전 (예:v1). 필수.
optimization— 검색 방법. 최소한 다음이 필요해요:models— 시도할 하나 이상의 후보 모델 목록. 각 모델은 병렬로 최적화되며, 모든 모델에 걸친 최상의 구현들이 보고된 프런티어를 구성해요.reflection_model— 후보 개선을 생성하는 데 사용되는 모델이에요. 이 모델이 최적화 프로세스를 주도하므로 사용 가능한 가장 강력한 지원 모델을 사용해요. 예를 들어 Claude Opus 모델 또는 최신 세대 GPT 모델을 사용해요.
선택 (Optional)
dataset.column_mapping— 함수의 입력과 레이블을 데이터셋 컬럼에 매핑해요. 함수 인자 이름이 데이터셋 컬럼 이름과 다를 때 필요해요.argument_mapping—<function_argument>: <dataset_column>매핑 (키는 AI 함수의 매개변수 이름 또는 위치 마커$1,$2, ... 이고, 값은 데이터셋 컬럼 이름).ground_truth— 후보가 점수 매겨지는 레이블 컬럼.
optimization.strategy— 최적화 목표 (기본값quality_first):
| 전략 | 최적화 대상 |
|---|---|
quality_first |
메트릭 점수 최대화 (기본값) |
balanced |
품질과 비용의 균형 |
cost_first |
품질을 유지하면서 비용 최소화 |
optimization.budget— Snowflake가 함수를 최적화하는 데 사용하는 검색 노력의 양을 제어해요. 예산은 각 후보 모델에 독립적으로 적용돼요. 예를 들어 세 개의 후보 모델과 함께light를 지정하면 각 모델은 자체light최적화 예산을 받아요. 더 높은 예산은 일반적으로 더 많은 후보 구현을 생성·평가하므로, 최적화 결과가 개선될 수 있지만 런타임과 크레딧 소비도 증가해요. 사용:ultra-light— 매우 작은 검색. 반복 검색을 사용하는 옵티마이저의 경우 후보 모델당 약 4–6회의 제안 반복에 해당해요.light— 대부분의 최적화 실행에 적합. 후보 모델당 약 10–15회의 제안 반복에 해당해요.medium— 더 넓은 검색. 후보 모델당 약 18–27회의 제안 반복에 해당해요.heavy— 가장 넓은 검색. 후보 모델당 약 27–40회의 제안 반복에 해당해요.auto— Snowflake가 예산을 선택. 현재auto는light로 결정돼요.
반환 값 (Returns)
CREATE EXPERIMENT와 EXECUTE EXPERIMENT는 상태 행을 반환해요. EXECUTE EXPERIMENT는 서버리스 컴퓨트에서 비동기적으로 실행되며 즉시 반환돼요. 실험은 실행 트리(runs)를 생성해요:
- 단일
SEED실행 — 입력 함수 자체의 평가 (기준선). - 하나 이상의
ITER_<N>실행 — 옵티마이저가 제안하고 평가한 후보 구현. 수락, 거부, 프런티어 후보가 모두 기록돼요 (이름이 아니라 실행 메타데이터로 구분).
실행과 그 메트릭 읽기:
SHOW RUNS IN EXPERIMENT ;
SHOW RUN METRICS IN EXPERIMENT RUN SEED;
SHOW RUN METRICS IN EXPERIMENT RUN ITER_7;
SHOW RUN PARAMETERS IN EXPERIMENT RUN ITER_7;
주요 실행 메트릭과 매개변수:
| 필드 | 종류 | 의미 |
|---|---|---|
val_score |
metric | 검증 분할에서의 품질 (0–1) |
test_score |
metric | 보류된 테스트 분할에서의 품질 (프런티어 실행만) |
cost_compared_to_seed |
metric | SEED 대비 후보 비용 (<1 더 저렴, >1 더 비쌈) |
is_frontier |
metric | 교차 모델 품질/비용 프런티어에 있으면 1 |
run_type |
param | seed, accepted, 또는 rejected |
model |
param | 후보의 모델 |
function_impl |
param | 후보의 튜닝된 구현 |
parent_candidate |
param | 이 후보가 파생된 실행 |
rows_evaluated |
param | 점수 매겨진 검증 행 수 |
건강한 결과: SEED가 기준선 val_score로 완료되고, 하나 이상의 ITER_<N> 실행이 is_frontier = 1로 더 높은 점수에 도달해요.
사용 노트 (Usage Notes)
- 승자를 골라 구체화하세요. 최적화는 후보를 보고할 뿐, 함수를 변경하지 않아요. 원하는 실행을
CREATE AI FUNCTION … FROM EXPERIMENT <exp> RUN <run>으로 새 AI 함수로 승격하세요. - 최고 점수뿐 아니라 프런티어를 읽으세요.
strategy: balanced또는cost_first에서는 약간 더 낮은 품질이지만 훨씬 저렴한 후보가 최선일 수 있어요.is_frontier가 비지배 집합(non-dominated set)을 표시해요. val_score뿐 아니라test_score를 읽으세요.val_score는 검증 분할에 과적합할 수 있으며,test_score(보류된 테스트 분할)가 더 정직한 추정이에요.llm_judge기본 모델.judge_model을 생략하면 기본 판정자는claude-sonnet-4-5예요. 최적화 경로에서 판정자는 각 행을 0–1 의미론적 정확성 척도로 점수 매겨요.- 커스텀 메트릭 UDF 계약. 커스텀 메트릭은
custom_udf가 명명한 UDF를 행당 한 번씩custom_udf(EXPECTED, PREDICTED)로 호출해요 — 두 개의 VARCHAR 인자(정답이 먼저, 모델 출력이 다음). 0–1 범위의 숫자score를 가진 VARIANT/OBJECT를 반환해야 해요 (선택적으로feedback문자열). 일반 스칼라 UDF로 생성해야 하며 AI 함수가 아니어야 해요. - 강력한
reflection_model을 사용하세요. 새 후보의 에이전트식 제안을 수행하므로, Claude Sonnet만큼 강력한 모델(예:claude-sonnet-4-5)을 사용해요. 더 작거나 약한 모델은 종종 사용 가능한 후보를 생성하지 못해요. - 여러 후보 모델이 경쟁해요.
models에 여러 모델을 나열하면 최적화가, 예를 들어 동일한 품질에 도달하는 더 저렴한 모델을 비교할 수 있게 해요 —cost_compared_to_seed로 표면화됨. - 후보 모델은 최대 5개를 사용하세요.
models의 각 모델은 별도로 최적화되므로, 모델이 많을수록 실행이 더 느려져요. 5개 이하로 유지하세요 (빠른 반복에는 더 적게). - 데이터셋 크기. 약 50–200 행의 레이블 데이터셋이 권장돼요 — 긴 런타임 없이도 안정적으로 최적화할 수 있는 충분한 신호이며, 최대는 1,000 행이에요.
ultra-light로 시작하세요.medium/heavy에 비용을 지출하기 전에 작은 예산으로 파이프라인이 종단간 작동하는지 확인하세요.- 비용. 실험은 서버리스 컴퓨트에서 실행되고(
SERVERLESS_EXPERIMENTS로 계량), 만드는 많은 AI 호출은 Cortex 추론 토큰으로 계량돼요. 더 무거운 예산과 더 많은 모델은 더 많은 비용이 들어요. Experiments → Billing 문서를 참고해요.
액세스 제어 요구사항 (Access Control Requirements)
| 권한 / 역할 | 객체 | 설명 |
|---|---|---|
| CREATE EXPERIMENT | 스키마 | 실험 생성 |
데이터베이스 역할 SNOWFLAKE.CORTEX_USER (또는 SNOWFLAKE.AI_FUNCTIONS_USER) |
— | EXECUTE EXPERIMENT에 필요 |
| USAGE | 함수 + 데이터셋 데이터베이스/스키마 | 함수와 레이블 데이터 읽기 |
예제 (Examples)
레드액션 함수 최적화 (품질 우선)
CREATE OR REPLACE EXPERIMENT my_db.my_schema.redact_opt_exp
TYPE = 'AI_FUNCTION_OPTIMIZATION'
FROM SPECIFICATION $$
function:
function_name: "my_db.my_schema.redact(VARCHAR)"
metrics:
- name: redaction_match
dataset:
name: my_db.my_schema.redaction_ds
version: v1
column_mapping:
argument_mapping:
text: text_col # function arg -> dataset column
ground_truth: expected_output
optimization:
models:
- claude-haiku-4-5
reflection_model: claude-sonnet-4-5
strategy: quality_first
budget: ultra-light
$$;
EXECUTE EXPERIMENT my_db.my_schema.redact_opt_exp;
비용을 위한 모델 비교 (균형)
CREATE OR REPLACE EXPERIMENT my_db.my_schema.classify_opt_exp
TYPE = 'AI_FUNCTION_OPTIMIZATION'
FROM SPECIFICATION $$
function:
function_name: "my_db.my_schema.classify_ticket(VARCHAR)"
metrics:
- name: exact_match
dataset:
name: my_db.my_schema.tickets_ds
version: v1
column_mapping:
argument_mapping:
body: ticket_body
ground_truth: expected_label
optimization:
models:
- openai-gpt-5-nano
- claude-haiku-4-5
reflection_model: claude-sonnet-4-5
strategy: balanced
budget: medium
$$;
EXECUTE EXPERIMENT my_db.my_schema.classify_opt_exp;
프런티어 검사 후 승자 승격
SHOW RUNS IN EXPERIMENT my_db.my_schema.redact_opt_exp;
SHOW RUN METRICS IN EXPERIMENT my_db.my_schema.redact_opt_exp RUN ITER_7;
CREATE OR REPLACE AI FUNCTION my_db.my_schema.redact_tuned(text VARCHAR)
RETURNS VARCHAR
FROM EXPERIMENT my_db.my_schema.redact_opt_exp RUN ITER_7;
제한 사항 (Limitations)
- 공개 프리뷰. 최적화는 공개 프리뷰 상태이며 계정에 단계적으로 출시되고 있어요.
- 대상은 AI 함수 또는 인라인 본문이어야 해요.
function_name은 CREATE AI FUNCTION 객체를 참조해야 하며, 일반 UDF는 거부돼요. - 정확히 하나의 AI_COMPLETE 호출. 최적화는 단일
AI_COMPLETE호출을 튜닝해요: 함수(또는function_body)는AI_COMPLETE를 정확히 한 번 호출해야 하며, 모든 최적화된 후보는 정확히 하나의AI_COMPLETE호출을 포함해요.AI_COMPLETE호출이 0개 또는 여러 개인 함수는 최적화가 지원되지 않아요. - 데이터셋 객체만. 데이터셋은 버전이 지정된
SNOWFLAKE.ML.DATASET객체여야 해요. - 데이터셋 크기 제한. 데이터셋은 최대 1,000 행(권장 약 50–200 행)을 포함할 수 있어요.
- 최적화당 하나의 메트릭.
- 모델 허용 목록. 후보 및 리플렉션 모델은 계정에서 최적화에 대해 승인/가격 책정되고 지역에서 제공되어야 해요. 거부된 모델은 실험을 실패시켜요.
mode/optimize_mode/validation_fraction은 지원되지 않으며 사양 검증에서 거부돼요.- 실행 시간 제한. 실험 실행은 20시간으로 제한되며, 더 긴 실행은 종료돼요. 더 작은 데이터셋, 더 적은 후보 모델, 또는 더 가벼운 예산으로 런타임을 줄이세요.
법적 사항 (Legal)
입력과 출력의 데이터 분류는 다음 표에 명시된 대로예요.
| 입력 데이터 분류 | 출력 데이터 분류 | 지정 |
|---|---|---|
| 사용 데이터(Usage Data) | 고객 데이터(Customer Data) | 일반 공개 함수는 Covered AI Features이고, 프리뷰 함수는 Preview AI Features예요. [1] |
[1] AI 이용 약관 및 허용 가능한 사용 정책에서 사용되는 정의 용어를 나타내요. 추가 정보는 Snowflake AI 및 ML 문서를 참고해요.
더 알아보기
- Snowflake AI 함수 — 관련 AI 함수 전체 목록