개인 식별 정보(PII) 수정

PII에는 이름, 주소, 전화번호, 이메일 주소, 납세자 식별 번호 및 개인을 식별하기 위해 단독으로 또는 다른 정보와 함께 사용할 수 있는 기타 데이터가 포함됩니다. 대부분의 조직에는 PII 데이터 처리와 관련된 규정 및 규정 준수 요구 사항이 있습니다. AI_REDACT는 완전 관리형 Cortex AI 함수입니다. 이를 통해 Snowflake에서 호스팅하는 대규모 언어 모델(LLM)를 사용하여 PII를 식별하고 자리 표시자 값으로 바꿔 비정형 텍스트 데이터에서 PII를 수정합니다.

AI_REDACT는 콜 센터 코칭, 감정 분석, 보험 및 의료 분석, ML 모델 학습 등 기타 사용 사례를 위한 텍스트를 준비하는 데 도움이 될 수 있습니다.

AI_REDACT를 적용하기 전에 AI_PARSE_DOCUMENT 또는 AI_TRANSCRIBE를 사용하여 문서나 음성 데이터를 텍스트로 변환합니다.

AI_REDACT

AI_REDACT 함수는 입력 텍스트의 개인 식별 정보(PII)를 자리 표시자 값으로 대체합니다.

중요

AI_REDACT는 AI 모델을 사용하여 최선의 방식으로 수정 작업을 수행합니다. 항상 출력을 검토하여 조직의 데이터 개인정보 보호정책을 준수하는지 확인하세요. AI_REDACT가 데이터의 PII를 수정하지 못한 경우 Snowflake에 알려주시기 바랍니다.

리전 가용성

리전 가용성 섹션을 참조하십시오.

제한 사항

  • 수정은 AI 모델을 사용하여 수행되며, 모든 개인 식별 정보를 찾지 못할 수도 있습니다. 항상 출력을 검토하여 조직의 데이터 개인정보 보호정책을 준수하는지 확인하세요. AI_REDACT가 특정 PII를 수정하지 못한 경우 Snowflake에 알려주시기 바랍니다.

  • COUNT_TOKENS 및 AI_COUNT_TOKENS 함수는 아직 AI_REDACT를 지원하지 않습니다.

  • 현재 AI_REDACT는 올바른 형식의 영어 텍스트에서 가장 잘 작동합니다. 다른 언어나 맞춤법, 구두점 또는 문법 오류가 많은 텍스트에서는 성능이 다를 수 있습니다.

  • AI_REDACT는 현재 US PII 및 :ref:`label-ai_redact_pii_categories`에 명시된 일부 UK 및 캐나다 PII만 수정합니다.

  • AI_REDACT는 현재 입력 및 출력할 수 있는 토큰 수가 제한되어 있습니다. 입력과 출력을 합치면 최대 4,096개의 토큰이 될 수 있습니다. 출력은 1,024개의 토큰으로 제한됩니다. 입력 텍스트가 더 긴 경우, 더 작은 청크로 분할하고 각 청크를 별도로 수정합니다(SPLIT_TEXT_RECURSIVE_CHARACTER 사용). 토큰 제한을 초과하는 텍스트를 수정하는 예제는 청킹의 예 섹션을 참조하세요.

    참고

    토큰은 AI 모델에서 처리하는 가장 작은 데이터 단위입니다. 영어 텍스트의 경우 업계 가이드라인에서는 토큰 1개를 약 4자 또는 0.75단어로 간주합니다.

PII 카테고리 감지

AI_REDACT는 PII의 다음 카테고리 수정을 지원합니다. 카테고리 열의 값은 선택적 categories 인자에서 지원되는 문자열입니다.

카테고리

참고

NAME

전체 이름, 이름, 중간 이름, 성 인식

EMAIL

PHONE_NUMBER

DATE_OF_BIRTH

GENDER

남성, 여성, 논바이너리 인식

AGE

ADDRESS

다음을 식별합니다.

  • 전체 우편 주소(US, UK, CA)

  • 상세 주소(US, UK, CA)

  • 우편 번호(US, UK, CA)

  • 도시(US, UK, CA)

  • 주(US) 또는 지방(CA)

  • 카운티, 자치구 또는 타운십(US)

NATIONAL_ID

사회 보장 번호 식별(US)

PASSPORT

여권 번호 식별(US, UK, CA)

TAX_IDENTIFIER

개인 납세자 번호(ITNs) 식별

PAYMENT_CARD_DATA

전체 카드 정보, 카드 번호, 만료일 및 CVV

DRIVERS_LICENSE

US, UK, CA 지원됨

IP_ADDRESS

참고

AI_REDACT는 일부 PII 카테고리에 대한 부분 일치를 지원합니다. 예를 들어, 이름만으로도 [NAME] 자리 표시자를 사용하여 수정을 트리거합니다.

오류 처리

일반적으로, AI_REDACT는 입력 텍스트를 처리할 수 없는 경우 오류를 발생시킵니다. 쿼리가 여러 행을 수정할 때 오류로 인해 전체 쿼리가 실패합니다. 다른 행에서 처리를 계속하려면 세션 매개 변수 AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR를 FALSE로 설정하면 됩니다. 그런 다음 쿼리를 중지하는 대신 NULL 오류를 반환합니다.

ALTER SESSION SET AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR=FALSE;
Copy

또한 이 매개 변수를 FALSE로 설정하면 TRUE를 AI_REDACT에 대한 최종 인자로 전달할 수 있습니다. 이로 인해 반환 값은 수정된 텍스트와 오류 메시지에 대한 별도의 필드가 포함된 OBJECT가 됩니다. 이러한 필드 중 하나는 AI_REDACT 호출이 성공적으로 처리되었는지 여부에 따라 NULL이 됩니다.

비용 고려 사항

AI_REDACT는 다른 Cortex AI 함수와 마찬가지로 처리된 입력 및 출력 토큰 수에 따라 비용이 발생합니다. 자세한 내용은 `Snowflake 가격 가이드<https://www.snowflake.com/pricing/pricing-guide/>`_를 참조하세요.

기본 예제

다음 예에서는 입력 텍스트에서 이름과 주소를 수정합니다.

SELECT AI_REDACT(
    input => 'My name is John Smith and I live at twenty third street, San Francisco.'
);
Copy

출력:

My name is [NAME] and I live at [ADDRESS]

다음 예에서는 입력 텍스트에서 이름과 이메일 주소만 수정합니다. 텍스트에는 [NAME]으로 인식되고 수정되는 이름만 포함됩니다. 입력 텍스트에는 이메일 주소가 포함되지 않으므로 출력에 이메일 자리 표시자가 표시되지 않습니다.

SELECT AI_REDACT(
    input => 'My name is John and I live at twenty third street, San Francisco.',
    categories => ['NAME', 'EMAIL']
);
Copy

출력:

My name is [NAME] and I live at twenty third street, San Francisco.

엔드투엔드 예제

다음 예에서는 한 테이블의 행을 처리하고 수정된 출력을 다른 테이블에 삽입합니다. 유사한 접근 방식을 사용하여 기존 테이블의 열에 수정된 데이터를 저장할 수 있습니다.

수정 후 텍스트는 AI_SENTIMENT에 전달되어 전체 감정 정보를 추출합니다.

-- Create a table with unredacted text
CREATE OR REPLACE TABLE raw_table AS
  SELECT 'My previous manager, Washington, used to live in Kirkland. His first name was Mike.' AS my_column
  UNION ALL
  SELECT 'My name is William and I live in San Francisco. You can reach me at (415).450.0973';

-- view unredacted data
SELECT * FROM raw_table;

-- Create a redaction table
CREATE OR REPLACE TABLE redaction_table (
  value VARCHAR
);

-- Redact PII from raw_table and insert into redaction_table
INSERT INTO redaction_table
SELECT AI_REDACT(my_column) AS value FROM raw_table;

-- view redacted results
SELECT * FROM redaction_table;

-- Run AI_SENTIMENT on redacted text
SELECT
    value AS redacted_text,
    AI_SENTIMENT(value) AS summary_sentiment
FROM redaction_table;
Copy

오류 처리 예제

앞의 예제를 기반으로 한 이 예제에서는 AI_REDACT로 여러 행을 처리할 때 오류를 처리하는 방법을 보여줍니다. 세션 매개 변수를 AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR로 설정하고 TRUE를 AI_REDACT에 대한 마지막 인자로 전달합니다. 이로 인해 함수는 수정된 텍스트와 오류 메시지에 대한 별도의 필드가 있는 OBJECT를 반환하며, 그중 하나는 함수의 성공 여부에 따라 NULL이 됩니다.

ALTER SESSION SET AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR=FALSE;

-- Create a redaction table with columns for value and error message
CREATE OR REPLACE TABLE redaction_table (
  value VARCHAR,
  error VARCHAR
);

-- Redact PII from raw_table and insert into redaction_table
-- Both the redacted text and any error message are stored
INSERT INTO redaction_table
SELECT
  result:value::STRING AS value,
  result:error::STRING AS error
  FROM (SELECT AI_REDACT(my_column, TRUE) AS result FROM raw_table);
Copy

청킹의 예

이 예제에서는 텍스트를 더 작은 청크로 분할하고 각 청크를 별도로 수정한 다음, 수정된 청크를 최종 출력으로 다시 결합하여 긴 텍스트에서 PII를 수정하는 방법을 보여줍니다. 이 접근 방식은 AI_REDACT의 토큰 제한과 같은 문제를 해결합니다.

CREATE OR REPLACE TABLE patients (
    patient_id INT PRIMARY KEY,
    patient_notes text
);

CREATE OR REPLACE TABLE final_temp_table AS
WITH chunked_data AS (
    -- Step 1: Split text into chunks
    SELECT
        patient_id,
        chunk.value AS chunk_text,
        chunk.index AS chunk_index
    FROM
        patients,
        LATERAL FLATTEN(
            input => SNOWFLAKE.CORTEX.SPLIT_TEXT_RECURSIVE_CHARACTER(
                patient_notes,
                'none',
                1000
            )
        ) AS chunk
    WHERE
        patient_notes IS NOT NULL
        AND LENGTH(patient_notes) > 0
),
redacted_chunks AS (
    -- Step 2: Apply AI_REDACT to each chunk
  SELECT
  patient_id,
        chunk_index,
        chunk_text,
        TO_VARIANT(results:value) AS redacted_chunk,
        TO_VARIANT(results:error) AS error_string
        from (
    SELECT
        patient_id,
        chunk_index,
        chunk_text,
        AI_REDACT(chunk_text,TRUE) AS results
    FROM
        chunked_data
)
),

-- Step 3: Concatenate redacted chunks
final AS (
SELECT
chunk_text as original,
IFF(error_string IS NOT NULL, chunk_text, redacted_chunk) AS redacted_text,
patient_id,
chunk_index
FROM
    redacted_chunks
)
SELECT * FROM final;

SELECT
  patient_id,
  LISTAGG(redacted_text, '') WITHIN GROUP (ORDER BY chunk_index) AS full_output
  FROM final_temp_table
  GROUP BY patient_id;
Copy