Ocultar informações de identificação pessoal (PII)

PII incluem nomes, endereços, números de telefone, endereços de e-mail, números de identificação fiscal e outros dados que podem ser utilizados ​​(sozinhos ou com outras informações) para identificar um indivíduo. A maioria das organizações tem requisitos regulatórios e de conformidade relacionados ao tratamento de dados PII. AI_REDACT é uma função da Cortex AI totalmente gerenciada que ajuda você a ocultar PII de dados de texto não estruturados, usando um modelo de linguagem grande (Large Language Model, LLM) hospedado pelo Snowflake para identificar PII e substituí-las por valores de espaço reservado.

AI_REDACT pode ajudar você a preparar texto para treinamento de call center, análise de sentimentos, análises médicas e de seguros e treinamento de modelos de ML, entre outros casos de uso.

Dica

Use AI_PARSE_DOCUMENT ou AI_TRANSCRIBE para converter dados de documentos ou fala em texto antes de aplicar AI_REDACT.

AI_REDACT

A função AI_REDACT substitui informações de identificação pessoal (PII) no texto de entrada por valores de espaço reservado.

Importante

AI_REDACT realiza a ocultação da melhor maneira possível usando modelos de AI. Sempre revise a saída para garantir a conformidade com as políticas de privacidade de dados da sua organização. Informe a Snowflake se AI_REDACT não conseguir ocultar alguma PII em seus dados.

Disponibilidade regional

Consulte Disponibilidade regional.

Limitações

  • A ocultação é realizada usando modelos de AI e pode não encontrar todas as informações de identificação pessoal. Sempre revise a saída para garantir a conformidade com as políticas de privacidade de dados da sua organização. Entre em contato com o suporte Snowflake se AI_REDACT não conseguir ocultar certas PII.

  • As funções COUNT_TOKENS e AI_COUNT_TOKENS ainda não são compatíveis com AI_REDACT.

  • No momento, AI_REDACT funciona melhor com texto em inglês bem formulado. O desempenho pode variar com outros idiomas ou textos com muitos erros de ortografia, pontuação ou gramática.

  • Atualmente, AI_REDACT oculta apenas PII dos US e algumas PII do UK e Canadá, conforme indicado em Categorias de PIIs detectadas.

  • AI_REDACT está atualmente limitado no número de tokens que pode receber e produzir. A entrada e a saída juntas podem ter até 4.096 tokens. A saída é limitada a 1.024 tokens. Se o texto de entrada for mais longo, divida-o em partes menores e oculte cada parte separadamente, talvez usando SPLIT_TEXT_RECURSIVE_CHARACTER. Consulte Exemplo de divisão em partes para conferir um exemplo de como ocultar texto que excede os limites do token.

    Nota

    Um token é a menor unidade de dados processada pelo modelo de AI. Para texto em inglês, as diretrizes do setor consideram um token como aproximadamente quatro caracteres ou 0,75 palavra.

Categorias de PIIs detectadas

AI_REDACT é compatível com ocultação das seguintes categorias de PII. Os valores na coluna Categoria são as strings compatíveis no argumento opcional categories.

Categoria

Notas

NAME

Reconhece nome completo, primeiro nome, nome do meio e sobrenome

EMAIL

PHONE_NUMBER

DATE_OF_BIRTH

GENDER

Reconhece masculino, feminino e não binário

AGE

ADDRESS

Identifica:

  • endereço postal completo (US, UK, CA)

  • nome da rua (US, UK, CA)

  • código postal (US, UK, CA)

  • cidade (US, UK, CA)

  • estado (US) ou província (CA)

  • condado, distrito ou município (US)

NATIONAL_ID

Identifica números de segurança social (US)

PASSPORT

Identifica números de passaporte (US, UK, CA)

TAX_IDENTIFIER

Identifica números de identificação fiscal individual (ITNs)

PAYMENT_CARD_DATA

Identifica informações completas do cartão, número do cartão, data de vencimento e CVV

DRIVERS_LICENSE

Compatível com US, UK, CA

IP_ADDRESS

Nota

O AI_REDACT oferece suporte a correspondências parciais para algumas categorias de PII. Por exemplo, apenas o primeiro nome é suficiente para acionar a ocultação de [NAME] usando um espaço reservado.

Tratamento de erros

Normalmente, AI_REDACT gera um erro se não pode processar o texto de entrada. Quando uma consulta oculta várias linhas, um erro gera uma falha em toda a consulta. Para permitir que o processamento continue com outras linhas, você pode definir o parâmetro de sessão AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR como FALSE. Dessa forma, os erros retornam NULL em vez de interromper a consulta.

ALTER SESSION SET AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR=FALSE;
Copy

Com esse parâmetro definido como FALSE, você também pode passar TRUE como argumento final para AI_REDACT, o que faz com que o valor de retorno seja um OBJECT que contém campos separados para o texto oculto e qualquer mensagem de erro. Um desses campos será NULL, dependendo se a chamada AI_REDACT foi processada com sucesso.

Considerações sobre custo

AI_REDACT gera custos conforme o número de tokens de entrada e saída processados, assim como nas outras funções da Cortex AI. Consulte o Guia de preços do Snowflake para obter detalhes.

Exemplos

Exemplos básicos

O exemplo a seguir oculta um nome e um endereço do texto de entrada.

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

Saída:

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

O exemplo a seguir oculta apenas nomes e endereços de e-mail do texto de entrada. Observe que o texto contém apenas o primeiro nome, que é reconhecido e oculto como [NAME]. O texto de entrada não contém um endereço de e-mail, portanto, nenhum espaço reservado de e-mail aparece na saída.

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

Saída:

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

Exemplo de ponta a ponta

O exemplo a seguir processa linhas de uma tabela e insere a saída ocultada em outra tabela. Você pode usar uma abordagem semelhante para armazenar os dados ocultados em uma coluna em uma tabela existente.

Após a ocultação, o texto é passado para AI_SENTIMENT para extrair informações gerais de sentimento.

-- 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

Exemplo de tratamento de erros

Este exemplo, baseado no exemplo anterior, mostra como resolver erros ao processar várias linhas com AI_REDACT. Ele define o parâmetro de sessão AI_SQL_ERROR_HANDLING_USE_FAIL_ON_ERROR e passa TRUE como o último argumento para AI_REDACT. Isso faz com que a função retorne um OBJECT com campos separados para o texto oculto e qualquer mensagem de erro, sendo um deles NULL, dependendo se a função foi bem-sucedida ou falhou.

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

Exemplo de divisão em partes

Este exemplo ilustra como ocultar PII em texto longo, dividindo o texto em partes menores, ocultando cada parte separadamente e reunindo as partes ocultas na saída final. Essa abordagem é uma solução alternativa para os limites de token de 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