Incorporações de vetor

Uma incorporação se refere à redução de dados de alta dimensão, como texto não estruturado, para uma representação com menos dimensões, como um vetor. Técnicas modernas de aprendizado profundo podem criar incorporações vetoriais, que são representações numéricas estruturadas, a partir de dados não estruturados, como texto e imagens, preservando noções semânticas de similaridade e dissimilaridade na geometria dos vetores que produzem.

A ilustração abaixo é um exemplo simplificado de incorporação vetorial e similaridade geométrica de texto em linguagem natural. Na prática, as redes neurais produzem vetores de incorporação com centenas ou até milhares de dimensões, e não duas como mostrado aqui, mas o conceito é o mesmo. Texto semanticamente similar produz vetores que “apontam” na mesma direção geral.

Um exemplo bidimensional de similaridade vetorial

Muitos aplicativos podem se beneficiar da capacidade de encontrar texto ou imagens similares a uma meta. Por exemplo, quando um novo chamado de suporte é registrado em um help desk, a equipe de suporte pode se beneficiar da capacidade de encontrar chamados semelhantes que já foram resolvidos. A vantagem de usar vetores de incorporação neste aplicativo é que eles irão além da correspondência de palavras-chave para similaridade semântica, de modo que registros relacionados podem ser encontrados mesmo que não contenham exatamente as mesmas palavras.

O Snowflake Cortex oferece as funções EMBED_TEXT_768 e EMBED_TEXT_1024 para criar incorporações, bem como várias Funções de similaridade vetorial para compará-las para diversos aplicativos.

Sobre as funções de similaridade vetorial

A medição de similaridade entre vetores é uma operação fundamental na comparação semântica. O Snowflake Cortex fornece três funções de similaridade vetorial: VECTOR_INNER_PRODUCT, VECTOR_L2_DISTANCE e VECTOR_COSINE_SIMILARITY. Para saber mais sobre essas funções, consulte Funções de similaridade vetorial.

Para obter detalhes de sintaxe e uso, consulte a página de referência de cada função:

Exemplos

Os exemplos a seguir usam funções de similaridade vetorial.

Esse exemplo de SQL usa a função VECTOR_INNER_PRODUCT para determinar quais vetores na tabela estão mais próximos entre si entre as colunas a e b:

CREATE TABLE vectors (a VECTOR(float, 3), b VECTOR(float, 3));
INSERT INTO vectors SELECT [1.1,2.2,3]::VECTOR(FLOAT,3), [1,1,1]::VECTOR(FLOAT,3);
INSERT INTO vectors SELECT [1,2.2,3]::VECTOR(FLOAT,3), [4,6,8]::VECTOR(FLOAT,3);

-- Compute the pairwise inner product between columns a and b
SELECT VECTOR_INNER_PRODUCT(a, b) FROM vectors;
Copy
+------+
| 6.3  |
|------|
| 41.2 |
+------+

Esse exemplo de SQL chama a função VECTOR_COSINE_SIMILARITY para encontrar o vetor mais próximo de [1,2,3]:

SELECT a, VECTOR_COSINE_SIMILARITY(a, [1,2,3]::VECTOR(FLOAT, 3)) AS similarity
    FROM vectors
ORDER BY similarity DESC
LIMIT 1;
Copy
+-------------------------+
| [1, 2.2, 3] | 0.9990... |
+-------------------------+

Snowflake Python Connector

Esses exemplos mostram como usar o tipo de dados VECTOR e as funções de similaridade de vetor com o Python Connector.

Nota

O suporte ao tipo VECTOR foi introduzido na versão 3.6 do Snowflake Python Connector.

import snowflake.connector

conn = ... # Set up connection
cur = conn.cursor()

# Create a table and insert some vectors
cur.execute("CREATE OR REPLACE TABLE vectors (a VECTOR(FLOAT, 3), b VECTOR(FLOAT, 3))")
values = [([1.1, 2.2, 3], [1, 1, 1]), ([1, 2.2, 3], [4, 6, 8])]
for row in values:
        cur.execute(f"""
            INSERT INTO vectors(a, b)
                SELECT {row[0]}::VECTOR(FLOAT,3), {row[1]}::VECTOR(FLOAT,3)
        """)

# Compute the pairwise inner product between columns a and b
cur.execute("SELECT VECTOR_INNER_PRODUCT(a, b) FROM vectors")
print(cur.fetchall())
Copy
[(6.30...,), (41.2...,)]
# Find the closest vector to [1,2,3]
cur.execute(f"""
    SELECT a, VECTOR_COSINE_SIMILARITY(a, {[1,2,3]}::VECTOR(FLOAT, 3))
        AS similarity
        FROM vectors
        ORDER BY similarity DESC
        LIMIT 1;
""")
print(cur.fetchall())
Copy
[([1.0, 2.2..., 3.0], 0.9990...)]

Snowpark Python

Esses exemplos mostram como usar o tipo de dados VECTOR e as funções de similaridade de vetores com a Snowpark Python Library.

Nota

  • O suporte ao tipo VECTOR foi introduzido na versão 1.11 da Snowpark Python Library.

  • A Snowpark Python Library não oferece suporte à função VECTOR_COSINE_SIMILARITY.

from snowflake.snowpark import Session, Row
session = ... # Set up session
from snowflake.snowpark.types import VectorType, StructType, StructField
from snowflake.snowpark.functions import col, lit, vector_l2_distance
schema = StructType([StructField("vec", VectorType(int, 3))])
data = [Row([1, 2, 3]), Row([4, 5, 6]), Row([7, 8, 9])]
df = session.create_dataframe(data, schema)
df.select(
    "vec",
    vector_l2_distance(df.vec, lit([1, 2, 2]).cast(VectorType(int, 3))).as_("dist"),
).sort("dist").limit(1).show()
Copy
----------------------
|"VEC"      |"DIST"  |
----------------------
|[1, 2, 3]  |1.0     |
----------------------

Como criar incorporações vetoriais a partir de texto

Importante

Os modelos snowflake-arctic-embed-m e e5-base-v2 têm um limite de entrada de 512 tokens. Alguns tokens não representam palavras, então o limite do número de palavras é um pouco menor. Você receberá uma mensagem de erro se o texto for muito longo.

Para criar uma incorporação vetorial a partir de um trecho de texto, use as funções EMBED_TEXT_768 (SNOWFLAKE.CORTEX) ou EMBED_TEXT_1024 (SNOWFLAKE.CORTEX). Esta função retorna a incorporação vetorial para um determinado texto em inglês. Este vetor pode ser usado com as funções de comparação de vetores para determinar a similaridade semântica de dois documentos.

SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768(model, text)
Copy

Dica

Você pode usar outros modelos de incorporação através de Snowpark Container Services. Para mais informações, consulte Serviço de contêiner de texto incorporado.

Importante

EMBED_TEXT_768 e EMBED_TEXT_1024 são funções LLM do Cortex, portanto seu uso é regido pelos mesmos controles de acesso que as outras funções LLM do Cortex. Para obter instruções sobre como acessar essas funções, consulte Privilégios necessários das funções LLM do Cortex.

Exemplos de casos de uso

Esta seção mostra como usar incorporações, funções de similaridade vetorial e tipo de dados VECTOR para implementar casos de uso populares, como pesquisa de similaridade vetorial e geração aumentada de recuperação (RAG).

Geração aumentada de recuperação (RAG)

Na geração aumentada de recuperação (RAG), a consulta de um usuário é usada para encontrar documentos semelhantes usando a similaridade vetorial. O documento superior é então passado para um modelo de linguagem grande (LLM) junto com a consulta do usuário, fornecendo contexto para a resposta generativa (conclusão). Isso pode melhorar significativamente a adequação da resposta.

No exemplo a seguir, wiki é uma tabela com uma coluna de texto content, e query é uma tabela de linha única com uma coluna de texto text.

-- Create embedding vectors for wiki articles (only do once)
ALTER TABLE wiki ADD COLUMN vec VECTOR(FLOAT, 768);
UPDATE wiki SET vec = SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', content);

-- Embed incoming query
SET query = 'in which year was Snowflake Computing founded?';
CREATE OR REPLACE TABLE query_table (query_vec VECTOR(FLOAT, 768));
INSERT INTO query_table SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', $query);

-- Do a semantic search to find the relevant wiki for the query
WITH result AS (
    SELECT
        w.content,
        $query AS query_text,
        VECTOR_COSINE_SIMILARITY(w.vec, q.query_vec) AS similarity
    FROM wiki w, query_table q
    ORDER BY similarity DESC
    LIMIT 1
)

-- Pass to large language model as context
SELECT SNOWFLAKE.CORTEX.COMPLETE('mistral-7b',
    CONCAT('Answer this question: ', query_text, ' using this text: ', content)) FROM result;
Copy

Considerações sobre custo

As funções de LLM do Snowflake Cortex, incluindo EMBED_TEXT_768 e EMBED_TEXT_1024, incorrem em custos de computação com base no número de tokens processados.

Nota

Um token é a menor unidade de texto processada pelas funções de LLM do Snowflake Cortex, aproximadamente igual a quatro caracteres de texto. A equivalência do texto bruto de entrada ou saída com tokens pode variar de acordo com o modelo.

  • Para as funções EMBED_TEXT_768 e EMBED_TEXT_1024, apenas tokens de entrada são contados para o total faturável.

  • Funções de similaridade vetorial não incorrem em custos baseados em tokens.

Para mais informações sobre o faturamento das funções LLM do Cortex, consulte Considerações de custo das funções LLM do Cortex. Para obter informações gerais sobre custos de computação, consulte Explicação dos custos de computação.