ベクトル埋め込み¶
埋め込み とは、構造化されていないテキストのような高次元のデータを、ベクトルのような次元数の少ない表現に縮小することです。最新のディープラーニング技術は、テキストや画像などの非構造化データから、構造化された数値表現であるベクトル埋め込みを作成することができます。
下の図は、自然言語テキストのベクトル埋め込みと幾何学的類似性の簡略化された例です。実際には、ニューラルネットワークは、ここで示したような2次元ではなく、何百、何千という次元の埋め込みベクトルを生成しますが、コンセプトは同じです。意味的に類似したテキストは、同じ一般的な方向を「ポイントする」ベクトルを生成します。

多くのアプリケーションは、ターゲットに類似したテキストや画像を検索する機能から恩恵を受けることができます。例えば、新しいサポートケースがヘルプデスクにログされると、サポートチームはすでに解決された類似のケースを見つけることができます。このアプリケーションで埋め込みベクトルを使用する利点は、キーワードのマッチングを超えて意味的な類似性を実現することで、まったく同じ単語が含まれていなくても関連する記録を見つけることができることです。
Snowflake Cortexでは、 EMBED_TEXT_768 と EMBED_TEXT_1024 関数を使用して埋め込みを作成できるほか、 ベクトル類似関数 を使用してさまざまなアプリケーションで埋め込みを比較できます。
ベクトル類似関数について¶
ベクトル間の類似度の測定は、意味比較における基本的な操作です。Snowflake Cortexには3つのベクトル類似性関数があります。VECTOR_INNER_PRODUCTVECTOR_L2_DISTANCEおよびVECTOR_COSINE_SIMILARITY。これらの関数の詳細については、 ベクトル類似関数 をご参照ください。
構文や使い方の詳細については、各関数のリファレンスページをご参照ください。
例¶
以下の例では、ベクトルの類似性関数を使用しています。
この SQL の例では、VECTOR_INNER_PRODUCT 関数を使用して、 a
列と 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 |
+------+
この SQL の例では、 VECTOR_COSINE_SIMILARITY 関数を呼び出して、 [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コネクタ¶
これらの例は、VECTORデータ型とベクトル類似性関数をPython Connectorで使用する方法を示しています。
注釈
VECTOR型のサポートはSnowflake Python Connectorのバージョン3.6で導入されました。
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¶
これらの例は、Snowpark Python ライブラリでVECTORデータ型とベクトル類似性関数を使用する方法を示しています。
注釈
VECTOR型のサポートはSnowpark Pythonのバージョン1.11で導入されました。
Snowpark Pythonライブラリは 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 |
----------------------
テキストからベクトル埋め込みを作成する¶
重要
snowflake-arctic-embed-m
および e5-base-v2
モデルでは、512 トークンが入力制限です。いくつかのトークンは単語を表さないため、サポートされる単語の数はやや少なくなります。テキストが長すぎるとエラーメッセージが表示されます。
テキストの一部からベクトル埋め込みを作成するには、 EMBED_TEXT_768 (SNOWFLAKE.CORTEX) または EMBED_TEXT_1024 (SNOWFLAKE.CORTEX) 関数を使います。この関数は、与えられた英語テキストに対するベクトル埋め込みを返します。このベクトルは、 ベクトル比較関数 と共に使用することで、2つのドキュメントの意味的類似度を決定することができます。
SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768(model, text)
Tip
Snowpark Container Services を通して他の埋め込みモデルを使用することができます。詳細については、 テキスト埋め込みコンテナーサービス をご参照ください。
重要
EMBED_TEXT_768とEMBED_TEXT_1024はCortex LLM関数であるため、その使用には他のCortex LLM関数と同じアクセス制御が適用されます。これらの関数へのアクセス方法については、 Cortex LLM 関数の必須権限 をご参照ください。
使用例¶
このセクションでは、埋め込み、ベクトル類似度関数、VECTORデータ型を使用して、ベクトル類似度検索や検索拡張生成(RAG)などの一般的なユースケースを実装する方法を示します。
ベクトル類似性検索¶
意味的に類似したドキュメントの検索を行うには、まず検索対象のドキュメントの埋め込みを保存します。ドキュメントが追加または編集された場合、埋め込みは常に最新の状態に保たれます。
この例では、ドキュメントはサポート担当者がログに記録したコールセンターの問題です。この問題は、テーブル issues
の issue_text
という列に格納されています。次のSQLは、問題の埋め込みを保持する新しいベクトル列を作成します。
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);
検索を実行するには、検索語または検索対象文書の埋め込みを作成し、類似した埋め込みを持つ文書を見つけるためにベクトルの類似性関数を使用します。ORDERBY、LIMITの句を使って、上位 k 個の一致するドキュメントを選択し、オプションでWHEREの条件を使って最小類似度を指定します。
通常、ベクトル類似性関数の呼び出しは、WHERE句ではなく、SELECT句に記述します。この方法では、WHERE句で指定された行に対してのみ関数が呼び出されます。この関数は、テーブル内のすべての行を操作するのではなく、他の条件に基づいてクエリを制限することができます。WHERE句で類似値をテストするには、SELECT句でVECTOR_COSINE_SIMILARITY呼び出し用の列エイリアスを定義し、WHERE句の条件でそのエイリアスを使用します。
この例では、検索語との余弦類似度が少なくとも0.7であると仮定して、過去90日間の検索語に一致する最大5つの項目を検索します。
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;
検索拡張世代(RAG)¶
検索支援型生成(RAG)では、ユーザーのクエリを用いて、 ベクトル類似度 を用いて類似ドキュメントを検索します。最上位ドキュメントはユーザーのクエリとともに大規模言語モデル(LLM)に渡され、生成応答(完了)のためのコンテキストを提供します。そうすることで、応答の適切さを大幅に改善することができます。
以下の例では、 wiki
はテキスト列 content
を持つテーブルで、 query
はテキスト列 text
を持つ1行のテーブルです。
-- 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;
コストの考慮事項¶
EMBED_TEXT_768とEMBED_TEXT_1024を含むSnowflake Cortex LLM関数は、処理されたトークンの数に基づいてコンピューティングコストが発生します。
注釈
トークンは、Snowflake Cortex LLM関数で処理されるテキストの最小単位で、テキストの4文字にほぼ同じです。トークンに相当する生の入力または出力テキストは、モデルによって異なる場合があります。
EMBED_TEXT_768およびEMBED_TEXT_1024関数では、入力トークンのみが請求可能合計にカウントされます。
ベクトル類似性関数はトークンベースのコストを発生させません。
Cortex LLM 関数の請求に関する詳細については、 Cortex LLM 関数のコストに関する考慮事項 をご参照ください。コンピュートコストに関する一般情報については、 コンピューティングコストについて をご参照ください。