Account Usage를 통해 Cortex AI 함수 비용 관리하기¶
Snowflake Cortex AI 함수(AI_COMPLETE, AI_SUMMARIZE, AI_TRANSLATE, AI_SENTIMENT 등)는 토큰 또는 페이지 사용량에 따라 크레딧을 사용합니다. 모니터링 및 제어가 없으면 다음과 같은 이유로 인해 이러한 함수 사용 비용이 빠르게 증가할 수 있습니다.
과도한 토큰을 생성하는 최적화되지 않은 프롬프트
장기 실행 쿼리 또는 런어웨이 쿼리
사용자당 지출 한도 부족
사용 패턴에 대한 가시성 부족
이 항목에서는 Snowflake Cortex AI 함수와 관련된 비용을 모니터링, 관리 및 제어하기 위한 전략을 제안합니다. CORTEX_AI_FUNCTIONS_USAGE_HISTORY 뷰를 사용하여 사용 패턴을 추적하고 자동화된 비용 제어를 구현할 수 있습니다. 이러한 기법은 사용량을 모니터링하고, 지출 한도를 초과할 때 경고하고, 월별 한도에 따라 함수에 대한 액세스를 제어하고, 런어웨이 쿼리를 중지하는 데 도움이 될 수 있습니다.
사용 기록 뷰¶
SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY 뷰에서는 SQL을 통해 호출되는 모든 Cortex AI 함수에 대한 자세한 원격 분석을 제공합니다. 뷰의 최대 대기 시간은 60분이지만, 함수 실행이 시작된 후 10분 이내에 데이터를 사용할 수 있습니다. 이 뷰에 대한 자세한 내용은 CORTEX_AI_FUNCTIONS_USAGE_HISTORY 뷰 섹션을 참조하세요.
기본 사용량 모니터링¶
다음 쿼리는 AI 함수 사용량 패턴을 이해하는 데 도움이 됩니다. 주기적으로 직접 실행하거나 대시보드에 통합하여 지속적인 가시성을 확보합니다.
함수 및 모델별 일일 크레딧 사용량¶
일일 지출 추세를 추적하여 사용량 급증을 식별하고 어떤 함수와 모델이 크레딧을 가장 많이 사용하는지 파악합니다.
SELECT
DATE_TRUNC('day', START_TIME) AS usage_date,
FUNCTION_NAME,
MODEL_NAME,
SUM(CREDITS) AS total_credits,
COUNT(DISTINCT QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY
WHERE START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP())
GROUP BY 1, 2, 3
ORDER BY usage_date DESC, total_credits DESC;
사용자당 월별 크레딧 사용량¶
상위 컨슈머를 식별하고 시간 경과에 따른 사용자당 지출을 추적합니다. 이 쿼리는 USERS 뷰와 조인하여 더 쉽게 식별하고 후속 조치를 취할 수 있도록 이메일 및 기본 역할을 포함한 사용자 세부 정보를 제공합니다.
SELECT
DATE_TRUNC('month', h.START_TIME) AS usage_month,
u.NAME AS user_name,
u.EMAIL,
u.DEFAULT_ROLE,
SUM(h.CREDITS) AS total_credits,
COUNT(DISTINCT h.QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY h
JOIN SNOWFLAKE.ACCOUNT_USAGE.USERS u
ON h.USER_ID = u.USER_ID
WHERE h.START_TIME >= DATEADD('month', -3, CURRENT_TIMESTAMP())
GROUP BY 1, 2, 3, 4
ORDER BY usage_month DESC, total_credits DESC;
비용 관리¶
과도한 지출을 감지하고 시정 조치를 취하는 자동화된 메커니즘을 정의합니다. 이러한 쿼리는 서로 독립적으로 사용하거나 포괄적인 비용 거버넌스를 위해 결합하여 사용할 수 있습니다.
계정 수준 월별 지출 경고¶
전체 계정에 걸쳐 월별 AI 함수 크레딧 사용량 총계를 모니터링하는 자동화된 경고를 설정합니다. 지출이 정의된 임계값을 초과하면 지정된 관리자에게 경고 이메일 알림을 보냅니다. 경고를 설정하려면 다음 전제 조건이 필요합니다.
:ref:`알림 통합을 생성 <label-create_email_notification_integration>`하고 :ref:`경고 <label-alerts_privileges_granting>`할 수 있는 ACCOUNTADMIN 역할 또는 적절한 권한
경고 조건 검사를 실행하기 위한 웨어하우스
경고 수신자의 검증된 이메일 주소
먼저, 알림 통합이 아직 없는 경우 알림 통합을 생성합니다. 이 예제에서는 이름이 ``ai_cost_alerts``인 기존 통합을 바꿉니다.
CREATE OR REPLACE NOTIFICATION INTEGRATION ai_cost_alerts
TYPE = EMAIL
ENABLED = TRUE
ALLOWED_RECIPIENTS = ('admin@company.com', 'finops@company.com')
다음으로, 매월 경고가 전송된 시점을 추적하는 테이블을 생성합니다. 이는 한 달 내에 중복 경고를 방지하는 데 사용됩니다.
CREATE TABLE IF NOT EXISTS AI_FUNCTIONS_ALERT_STATE (
ALERT_NAME VARCHAR NOT NULL,
ALERT_MONTH DATE NOT NULL,
SENT_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(),
CREDITS_AT_ALERT NUMBER(38,6),
PRIMARY KEY (ALERT_NAME, ALERT_MONTH)
);
이제 이 달에 경고가 이미 전송되었는지 확인하는 저장 프로시저를 생성하고, 경고 상태를 기록하고, 이메일 알림을 보냅니다.
CREATE OR REPLACE PROCEDURE SEND_MONTHLY_SPEND_ALERT(P_THRESHOLD FLOAT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
// Check if alert already sent this month
var check_sent = snowflake.execute({
sqlText: `SELECT COUNT(*) AS cnt FROM AI_FUNCTIONS_ALERT_STATE
WHERE ALERT_NAME = 'monthly_spend'
AND ALERT_MONTH = DATE_TRUNC('month', CURRENT_DATE())`
});
check_sent.next();
var already_sent = check_sent.getColumnValue(1);
if (already_sent > 0) {
return 'Alert already sent for this month';
}
// Get current spend
var spend_result = snowflake.execute({
sqlText: `SELECT COALESCE(SUM(CREDITS), 0) AS total
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY
WHERE START_TIME >= DATE_TRUNC('month', CURRENT_TIMESTAMP())`
});
spend_result.next();
var v_credits = spend_result.getColumnValue(1);
// Check threshold
if (v_credits <= P_THRESHOLD) {
return 'Threshold not exceeded. Current: ' + v_credits + ' / ' + P_THRESHOLD;
}
// Record alert
snowflake.execute({
sqlText: `INSERT INTO AI_FUNCTIONS_ALERT_STATE (ALERT_NAME, ALERT_MONTH, CREDITS_AT_ALERT)
VALUES ('monthly_spend', DATE_TRUNC('month', CURRENT_DATE()), ?)`,
binds: [v_credits]
});
// Send email - update the recipient email address
snowflake.execute({
sqlText: `CALL SYSTEM$SEND_EMAIL(
'ai_cost_alerts',
'admin@company.com',
'AI Functions Monthly Spend Alert',
'Monthly AI Function credit consumption has exceeded the threshold.\\n\\n' ||
'Current spend: ' || ${v_credits}::VARCHAR || ' credits\\n' ||
'Threshold: ' || ${P_THRESHOLD}::VARCHAR || ' credits\\n\\n' ||
'Please review usage accordingly.'
)`
});
return 'Alert sent. Credits: ' + v_credits;
$$;
마지막으로, 매시간 지출 임계값과 비교하여 사용량을 확인하는 경고를 생성하고 필요한 경우 프로시저를 호출하여 알림을 보냅니다. 아래 예제에서 두 위치에 나타나는 1,000크레딧 한도를 원하는 임계값으로 조정해야 합니다.
CREATE OR REPLACE ALERT ai_functions_monthly_spend_alert
WAREHOUSE = <your_warehouse>
SCHEDULE = 'USING CRON 0 * * * * UTC' -- Runs every hour
IF (EXISTS (
SELECT 1
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY
WHERE START_TIME >= DATE_TRUNC('month', CURRENT_TIMESTAMP())
HAVING SUM(CREDITS) > 1000 -- adjust the limit accordingly
))
THEN
CALL SEND_MONTHLY_SPEND_ALERT(1000); -- please adjust the limit accordingly
-- enable the alert
ALTER ALERT ai_functions_monthly_spend_alert RESUME;
팁
테스트 목적으로 처음에는 제한을 0으로 설정하여 경고를 즉시 트리거합니다. 예상대로 작동하는지 확인한 후 원하는 임계값으로 경고를 다시 생성합니다.
0 임계값으로 테스트한 후 다음 SQL을 실행하여 이번 달에 경고가 다시 트리거되도록 허용합니다.
DELETE FROM AI_FUNCTIONS_ALERT_STATE
WHERE ALERT_NAME = 'monthly_spend'
AND ALERT_MONTH = DATE_TRUNC('month', CURRENT_DATE());
다음과 같이 경고 기록과 경고 상태 테이블을 쿼리하여 경고가 작동하는지 확인할 수 있습니다.
-- Make sure alert exists
SHOW ALERTS LIKE 'ai_functions_monthly_spend_alert';
-- Check alert history
SELECT *
FROM TABLE(INFORMATION_SCHEMA.ALERT_HISTORY(
SCHEDULED_TIME_RANGE_START => DATEADD('day', -1, CURRENT_TIMESTAMP()),
ALERT_NAME => 'ai_functions_monthly_spend_alert'
))
ORDER BY SCHEDULED_TIME DESC;
-- Check which months have had alerts sent
SELECT * FROM AI_FUNCTIONS_ALERT_STATE ORDER BY ALERT_MONTH DESC;
사용자당 월별 지출 한도¶
이 예제에서는 사용자당 월별 지출 한도를 구현합니다. 사용자에게 Cortex AI 함수에 대한 액세스 권한을 제공하는 전용 사용자 지정 AI_FUNCTIONS_USER_ROLE 권한이 부여됩니다. 테이블은 개별 사용자의 월별 토큰 예산을 저장합니다. 사용자가 해당 월의 예산을 초과하면 시간별 태스크는 AI_FUNCTIONS_USER_ROLE을 제거하여 AI 함수에 대한 액세스 권한을 취소합니다. 월별 태스크는 다음 달 초에 역할을 복원합니다.
중요
기본적으로 모든 사용자는 SNOWFLAKE.CORTEX_USER 데이터베이스 역할에 PUBLIC 역할이 부여되므로 AI 함수(및 기타 Snowflake Cortex 기능)에 액세스할 수 있습니다. 사용자당 제한을 적용하려면 PUBLIC에서 SNOWFLAKE.CORTEX_USER를 취소하고 AI_FUNCTIONS_USER_ROLE을 통해서만 역할을 부여해야 합니다. 다음 SQL을 사용하여 PUBLIC에서 역할을 취소합니다.
REVOKE DATABASE ROLE SNOWFLAKE.CORTEX_USER FROM ROLE PUBLIC;
Cortex 기능에 액세스해야 하는 모든 사용자에게 AI_FUNCTIONS_USER_ROLE 권한만 부여해야 합니다. SNOWFLAKE.CORTEX_USER를 포함하는 다른 역할을 사용하면 사용자가 이 예제에서 구현된 지출 한도 제어를 우회할 수 있습니다. 경우에 따라 더 구체적인 역할을 사용할 수 있습니다. 예를 들어, Cortex Analyst에만 액세스해야 하는 사용자에게 SNOWFLAKE.CORTEX_USER 대신 SNOWFLAKE.CORTEX_ANALYST_USER 역할을 부여할 수 있습니다.
사용자당 지출 한도를 설정하려면 먼저 AI 함수에 대한 액세스 권한을 제어하는 역할을 생성하여 이 액세스 권한을 다른 권한과 별도로 관리할 수 있도록 합니다.
-- Create a role specifically for AI Function access
CREATE ROLE IF NOT EXISTS AI_FUNCTIONS_USER_ROLE;
-- Grant necessary privileges to the role
GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE AI_FUNCTIONS_USER_ROLE;
-- Grant usage on warehouse
GRANT USAGE ON WAREHOUSE AI_FUNCTIONS_WAREHOUSE TO ROLE AI_FUNCTIONS_USER_ROLE;
이제 액세스 제어 테이블을 설정하여 AI 함수 액세스 권한이 있는 사용자, 개별 지출 한도, 취소 기록을 추적합니다. 이는 자동화된 모니터링 및 액세스 복원 프로세스를 위한 정보 소스 역할을 합니다.
CREATE TABLE IF NOT EXISTS AI_FUNCTIONS_ACCESS_CONTROL (
USER_NAME VARCHAR NOT NULL,
USER_ID NUMBER,
GRANTED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(),
MONTHLY_CREDIT_LIMIT NUMBER(38,6) DEFAULT 100, -- adjust the limit accordingly
IS_ACTIVE BOOLEAN DEFAULT TRUE,
REVOKED_AT TIMESTAMP_LTZ,
REVOCATION_REASON VARCHAR,
PRIMARY KEY (USER_NAME)
);
다음으로, AI 함수 액세스 권한을 부여할 저장 프로시저를 생성하고 지출 한도와 함께 액세스 제어 테이블에 등록합니다. 이 코드는 Account Usage 뷰에서 사용자의 ID를 조회하여 쿼리 모니터링에서 효율적인 조인을 활성화합니다.
CREATE OR REPLACE PROCEDURE GRANT_AI_FUNCTIONS_ACCESS(
P_USER_NAME VARCHAR,
P_MONTHLY_LIMIT NUMBER(38,6) DEFAULT 100 -- adjust the limit accordingly
)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
DECLARE
v_user_id NUMBER;
BEGIN
-- Look up USER_ID from account usage
SELECT USER_ID INTO :v_user_id
FROM SNOWFLAKE.ACCOUNT_USAGE.USERS
WHERE NAME = :P_USER_NAME
LIMIT 1;
-- Grant the AI Functions role to the user
EXECUTE IMMEDIATE 'GRANT ROLE AI_FUNCTIONS_USER_ROLE TO USER ' || P_USER_NAME;
-- Register or update the user in the access control table
MERGE INTO AI_FUNCTIONS_ACCESS_CONTROL tgt
USING (SELECT :P_USER_NAME AS USER_NAME) src
ON tgt.USER_NAME = src.USER_NAME
WHEN MATCHED THEN
UPDATE SET
USER_ID = :v_user_id,
IS_ACTIVE = TRUE,
MONTHLY_CREDIT_LIMIT = :P_MONTHLY_LIMIT,
GRANTED_AT = CURRENT_TIMESTAMP(),
REVOKED_AT = NULL,
REVOCATION_REASON = NULL
WHEN NOT MATCHED THEN
INSERT (USER_NAME, USER_ID, MONTHLY_CREDIT_LIMIT, IS_ACTIVE)
VALUES (:P_USER_NAME, :v_user_id, :P_MONTHLY_LIMIT, TRUE);
RETURN 'Access granted to ' || P_USER_NAME || ' with monthly limit of ' || P_MONTHLY_LIMIT || ' credits';
END;
$$;
이 저장 프로시저를 사용하여 사용자와 해당 크레딧 할당량을 액세스 제어 테이블에 추가합니다.
CALL GRANT_AI_FUNCTIONS_ACCESS('ALICE', 1000); -- grants access to user ALICE with a monthly limit of 100 credits
CALL GRANT_AI_FUNCTIONS_ACCESS('BOB', 2000); -- grants access to user BOB with a monthly limit of 200 credits
다음으로 월별 액세스 새로 고침 작업을 생성합니다. 이 작업은 매월 1일에 실행되어 권한이 부여된 모든 사용자에 대한 AI 함수 액세스 권한을 복원합니다. 이전 달에 한도를 초과하여 사용자의 액세스 권한이 취소된 경우 이 태스크는 새 달에 대한 새로운 예산을 부여합니다.
-- Create a procedure to re-grant access to all entitled users
CREATE OR REPLACE PROCEDURE GRANT_ALL_ENTITLED_USERS()
RETURNS TABLE (USER_NAME VARCHAR, CREDIT_LIMIT NUMBER, ACTION VARCHAR)
LANGUAGE SQL
AS
$$
DECLARE
result RESULTSET;
BEGIN
result := (
SELECT
USER_NAME,
MONTHLY_CREDIT_LIMIT AS CREDIT_LIMIT,
'GRANTED' AS ACTION
FROM AI_FUNCTIONS_ACCESS_CONTROL
);
-- Re-grant access for each entitled user
FOR rec IN result DO
CALL GRANT_AI_FUNCTIONS_ACCESS(rec.USER_NAME, rec.CREDIT_LIMIT);
END FOR;
RETURN TABLE(result);
END;
$$;
-- Create a task to run on the 1st of each month at midnight UTC
CREATE OR REPLACE TASK MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH
WAREHOUSE = <your_warehouse>
SCHEDULE = 'USING CRON 0 0 1 * * UTC' -- 1st day of each month at 00:00 UTC
AS
CALL GRANT_ALL_ENTITLED_USERS();
-- Enable the task
ALTER TASK MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH RESUME;
-- Run once initially to populate grantees
CALL GRANT_ALL_ENTITLED_USERS();
-- Verify task status
SHOW TASKS LIKE 'MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH';
마지막으로, 사용자 지출을 모니터링하는 시간별 태스크를 생성하고 월별 한도를 초과하는 모든 사용자에 대한 액세스 권한을 취소합니다.
-- Create a procedure to re-grant access to all entitled users
CREATE OR REPLACE PROCEDURE GRANT_ALL_ENTITLED_USERS()
RETURNS TABLE (USER_NAME VARCHAR, CREDIT_LIMIT NUMBER, ACTION VARCHAR)
LANGUAGE SQL
AS
$$
DECLARE
result RESULTSET;
BEGIN
result := (
SELECT
USER_NAME,
MONTHLY_CREDIT_LIMIT AS CREDIT_LIMIT,
'GRANTED' AS ACTION
FROM AI_FUNCTIONS_ACCESS_CONTROL
);
-- Re-grant access for each entitled user
FOR rec IN result DO
CALL GRANT_AI_FUNCTIONS_ACCESS(rec.USER_NAME, rec.CREDIT_LIMIT);
END FOR;
RETURN TABLE(result);
END;
$$;
-- Create a task to run on the 1st of each month at midnight UTC
CREATE OR REPLACE TASK MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH
WAREHOUSE = <your_warehouse>
SCHEDULE = 'USING CRON 0 0 1 * * UTC' -- 1st day of each month at 00:00 UTC
AS
CALL GRANT_ALL_ENTITLED_USERS();
-- Enable the task
ALTER TASK MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH RESUME;
-- Run once initially to populate grantees
CALL GRANT_ALL_ENTITLED_USERS();
-- Verify task status
SHOW TASKS LIKE 'MONTHLY_AI_FUNCTIONS_ACCESS_REFRESH';
런어웨이 쿼리 감지 및 취소¶
장기 실행 AI 함수 쿼리는 상당한 비용을 누적할 수 있습니다. 이 예제에서는 크레딧 임계값을 초과하는 쿼리를 감지하고 더 많은 리소스를 사용하기 전에 쿼리를 취소하는 자동화된 시스템을 구현합니다. 전체 쿼리 세부 정보가 포함된 이메일 경고가 전송됩니다.
참고
쿼리가 취소된 경우에도 취소 시점까지 사용된 모든 리소스에 대한 요금이 클라이언트에 청구됩니다. 런어웨이 쿼리를 취소하면 추가 비용 누적이 방지되지만 이미 소비된 크레딧은 환불되지 않습니다.
이 프로시저는 지난 48시간 동안 크레딧 임계값을 초과했지만 여전히 실행 중인 AI 함수 쿼리를 찾아 취소하고 관리자에게 보고합니다.
-- Create a procedure to detect and cancel expensive runaway queries
CREATE OR REPLACE PROCEDURE MONITOR_AND_CANCEL_RUNAWAY_QUERIES(
P_CREDIT_THRESHOLD NUMBER DEFAULT 50 -- adjust the limit accordingly
)
RETURNS TABLE (
QUERY_ID VARCHAR,
USER_NAME VARCHAR,
FUNCTION_NAME VARCHAR,
MODEL_NAME VARCHAR,
CREDITS NUMBER,
START_TIME TIMESTAMP_LTZ,
ACTION VARCHAR
)
LANGUAGE SQL
AS
$$
DECLARE
result RESULTSET;
BEGIN
-- Find queries from the last 48 hours that exceed the threshold and are still running
result := (
SELECT
h.QUERY_ID,
u.NAME AS USER_NAME,
h.FUNCTION_NAME,
h.MODEL_NAME,
h.CREDITS,
h.START_TIME,
h.ROLE_NAMES,
h.QUERY_TAG,
h.WAREHOUSE_ID,
'CANCELLED' AS ACTION
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY h
LEFT JOIN SNOWFLAKE.ACCOUNT_USAGE.USERS u
ON h.USER_ID = u.USER_ID
WHERE h.START_TIME >= DATEADD('hour', -48, CURRENT_TIMESTAMP())
AND h.CREDITS > :P_CREDIT_THRESHOLD
AND h.IS_COMPLETED = FALSE
);
-- Cancel each runaway query and send alert
FOR rec IN result DO
-- Attempt to cancel the query
BEGIN
EXECUTE IMMEDIATE 'SELECT SYSTEM$CANCEL_QUERY(''' || rec.QUERY_ID || ''')';
EXCEPTION
WHEN OTHER THEN
NULL; -- Query may have already completed
END;
-- Send alert with query details
CALL SYSTEM$SEND_EMAIL(
'ai_cost_alerts',
'admin@company.com',
'Runaway AI Query Cancelled - ' || rec.QUERY_ID,
'A runaway AI Function query has been cancelled due to excessive cost.\n\n' ||
'Query Details:\n' ||
'- Query ID: ' || rec.QUERY_ID || '\n' ||
'- User: ' || COALESCE(rec.USER_NAME, 'Unknown') || '\n' ||
'- Function: ' || rec.FUNCTION_NAME || '\n' ||
'- Model: ' || rec.MODEL_NAME || '\n' ||
'- Credits Used: ' || rec.CREDITS::VARCHAR || '\n' ||
'- Threshold: ' || :P_CREDIT_THRESHOLD::VARCHAR || '\n' ||
'- Start Time: ' || rec.START_TIME::VARCHAR || '\n' ||
'- Roles: ' || COALESCE(rec.ROLE_NAMES::VARCHAR, 'N/A') || '\n' ||
'- Query Tag: ' || COALESCE(rec.QUERY_TAG, 'N/A') || '\n' ||
'- Warehouse ID: ' || COALESCE(rec.WAREHOUSE_ID::VARCHAR, 'N/A') || '\n\n' ||
'Please investigate this query and take appropriate action.'
);
END FOR;
RETURN TABLE(result);
END;
$$;
-- Create a task to monitor and cancel runaway queries every hour
CREATE OR REPLACE TASK MONITOR_RUNAWAY_AI_QUERIES
WAREHOUSE = <your_warehouse>
SCHEDULE = 'USING CRON 0 * * * * UTC' -- Every hour
AS
CALL MONITOR_AND_CANCEL_RUNAWAY_QUERIES(50); -- adjust the limit accordingly
-- Enable the task
ALTER TASK MONITOR_RUNAWAY_AI_QUERIES RESUME;
-- Verify task status
SHOW TASKS LIKE 'MONITOR_RUNAWAY_AI_QUERIES';
-- Check task execution history
SELECT *
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(
SCHEDULED_TIME_RANGE_START => DATEADD('day', -1, CURRENT_TIMESTAMP()),
TASK_NAME => 'MONITOR_RUNAWAY_AI_QUERIES'
))
ORDER BY SCHEDULED_TIME DESC;
팁
일부 쿼리가 오랫동안 실행될 것이라는 점은 이미 알고 계실 것입니다. 이러한 쿼리에 대한 특별한 역할을 정의하고 프로시저의 취소 논리에서 해당 역할을 제외할 수 있습니다. 예를 들어 다음과 같이 역할을 생성합니다.
CREATE ROLE AI_FUNCTIONS_USER_LONG_RUNNING_ROLE;
GRANT ROLE AI_FUNCTIONS_USER_ROLE TO ROLE AI_FUNCTIONS_USER_LONG_RUNNING_ROLE;
GRANT ROLE AI_FUNCTIONS_USER_LONG_RUNNING_ROLE TO USER LONG_RUNNING_USER;
프로시저의 WHERE 절에 다음 조건을 추가하여 이 역할의 사용자가 실행한 쿼리가 취소되지 않도록 제외합니다.
,, code-block:: sqlexample
AND NOT ARRAY_CONTAINS(h.ROLE_NAMES, ‘AI_FUNCTIONS_USER_LONG_RUNNING_ROLE’)
이제 사용자는 취소되지 않고 장기 실행 쿼리를 실행하는 역할을 맡을 수 있습니다.
USE ROLE AI_FUNCTIONS_USER_LONG_RUNNING_ROLE;
-- then start the long-running query
모범 사례¶
AI 함수 사용법에 대한 비용 관리 전략을 개발할 때 다음 모범 사례를 염두에 두세요.
모니터링부터 시작: 자동화된 제어를 구현하기 전에 :ref:`label-ai_functions_basic_usage_queries`의 쿼리를 사용하여 기준 사용 패턴을 설정합니다.
보수적인 초기 제한 설정: 낮은 임계값에서 시작하여 실제 사용 패턴에 따라 상향 조정합니다.
쿼리 태그 사용: 팀이 QUERY_TAG 세션 매개 변수를 사용하여 프로젝트 또는 팀별 비용 할당을 활성화하도록 권장합니다.
정기적으로 검토: 액세스 제어 테이블을 주기적으로 검토하고 정당한 필요에 따라 사용자당 제한을 조정합니다.
테스트 경고: 중요한 경고에 대해 이메일 알림을 사용하기 전에 이메일 알림이 올바르게 작동하는지 확인합니다.
대기 시간 고려: ACCOUNT_USAGE 뷰의 대기 시간은 최대 60분이며, 이를 모니터링 전략에 고려합니다.