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.

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;
+------+
| 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;
+-------------------------+
| [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())
[(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())
[([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()
----------------------
|"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)
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).
Pesquisa de similaridade vetorial¶
Para implementar uma busca por documentos semanticamente similares, primeiro armazene as incorporações dos documentos a serem pesquisados. Mantenha as incorporações atualizadas quando os documentos forem adicionados ou editados.
Neste exemplo, os documentos são problemas do call center registrados por representantes de suporte. O problema é armazenado em uma coluna chamada issue_text
na tabela issues
. A seguir, o SQL cria uma nova coluna de vetor para armazenar as incorporações dos problemas.
ALTER TABLE issues ADD COLUMN issue_vec VECTOR(FLOAT, 768);
UPDATE issues
SET issue_vec = SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', issue_text);
Para realizar uma pesquisa, crie uma incorporação do termo de pesquisa ou do documento de destino e, em seguida, use uma função de similaridade vetorial para localizar documentos com incorporações semelhantes. Use as cláusulas ORDER BY e LIMIT para selecionar os k documentos com maior correspondência e, opcionalmente, use uma condição WHERE para especificar uma similaridade mínima.
Geralmente, a chamada para a função de similaridade vetorial deve aparecer na cláusula SELECT, não na cláusula WHERE. Dessa forma, a função é chamada apenas para as linhas especificadas pela cláusula WHERE, que pode restringir a consulta com base em algum outro critério, em vez de operar em todas as linhas da tabela. Para testar um valor de similaridade na cláusula WHERE, defina um alias de coluna para a chamada VECTOR_COSINE_SIMILARITY na cláusula SELECT e use esse alias em uma condição na cláusula WHERE.
Este exemplo encontra até cinco problemas correspondentes ao termo de pesquisa dos últimos 90 dias, supondo que a similaridade do cosseno com o termo de pesquisa seja de pelo menos 0,7.
SELECT
issue,
VECTOR_COSINE_SIMILARITY(
issue_vec,
SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', 'User could not install Facebook app on his phone')
) AS similarity
FROM issues
ORDER BY similarity DESC
LIMIT 5
WHERE DATEDIFF(day, CURRENT_DATE(), issue_date) < 90 AND similarity > 0.7;
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;
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.