個人を特定できる情報( PII )を編集する

PII には、名前、住所、電話番号、電子メールアドレス、税務番号、および個人を特定するために(単独または他の情報と合わせて)使用できるその他のデータが含まれます。ほとんどの組織には、 PII データの取り扱いに関する規則とコンプライアンス要件があります。 AI_REDACT は完全に管理された AI 関数で、Snowflakeがホストする大規模言語モデル( LLM )を使用して PII を特定し、プレースホルダー値に置き換え、非構造化テキストデータの PII を編集しやすくします。

AI_REDACT は、コールセンターのコーチング、感情分析、保険と医療分析、および ML モデルトレーニングなどのユースケースのためのテキストを準備するのに役立ちます。

Tip

AI_PARSE_DOCUMENT または AI_TRANSCRIBE を使用して、 AI_REDACT を適用する前に、ドキュメントまたはスピーチデータをテキストに変換します。

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 は現在、 検出される PII カテゴリ に示されているように、 US PII と一部の 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 に設定すると、 AI_REDACT の最終引数として TRUEを渡すこともできます。これにより、戻り値は編集されたテキストとエラーメッセージの個別のフィールドを含む OBJECT になります。AI_REDACT 呼び出しが正常に処理されたかどうかに応じて、これらのフィールドの1つが NULL になります。

コストの考慮事項

AI_REDACT は他のCortex AI 関数と同様に、処理される入力と出力トークンの数に基づいてコストが発生します。詳細については、 Snowflakeの価格ガイド をご参照ください。

基本的な例

次の例では、入力テキストから名前と住所を編集しています。

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 を設定し、 AI_REDACT の最後の引数として TRUE を渡します。これにより、関数は編集されたテキストとエラーメッセージの個別のフィールドを持つ OBJECT を返します。関数が成功したか失敗したかに応じて、その1つは 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