ベクトル埋め込み

埋め込み とは、構造化されていないテキストのような高次元のデータを、ベクトルのような次元数の少ない表現に縮小することです。最新のディープラーニング技術は、テキストや画像などの非構造化データから、構造化された数値表現であるベクトル埋め込みを作成することができます。

下の図は、自然言語テキストのベクトル埋め込みと幾何学的類似性の簡略化された例です。実際には、ニューラルネットワークは、ここで示したような2次元ではなく、何百、何千という次元の埋め込みベクトルを生成しますが、コンセプトは同じです。意味的に類似したテキストは、同じ一般的な方向を「ポイントする」ベクトルを生成します。

ベクトル類似性の2次元の例

多くのアプリケーションは、ターゲットに類似したテキストや画像を検索する機能から恩恵を受けることができます。例えば、新しいサポートケースがヘルプデスクにログされると、サポートチームはすでに解決された類似のケースを見つけることができます。このアプリケーションで埋め込みベクトルを使用する利点は、キーワードのマッチングを超えて意味的な類似性を実現することで、まったく同じ単語が含まれていなくても関連する記録を見つけることができることです。

Snowflake Cortexでは、 EMBED_TEXT_768EMBED_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;
Copy
+------+
| 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;
Copy
+-------------------------+
| [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())
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

これらの例は、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()
Copy
----------------------
|"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)
Copy

Tip

Snowpark Container Services を通して他の埋め込みモデルを使用することができます。詳細については、 テキスト埋め込みコンテナーサービス をご参照ください。

重要

EMBED_TEXT_768とEMBED_TEXT_1024はCortex LLM関数であるため、その使用には他のCortex LLM関数と同じアクセス制御が適用されます。これらの関数へのアクセス方法については、 Cortex LLM 関数の必須権限 をご参照ください。

使用例

このセクションでは、埋め込み、ベクトル類似度関数、VECTORデータ型を使用して、ベクトル類似度検索や検索拡張生成(RAG)などの一般的なユースケースを実装する方法を示します。

検索拡張世代(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;
Copy

コストの考慮事項

EMBED_TEXT_768とEMBED_TEXT_1024を含むSnowflake Cortex LLM関数は、処理されたトークンの数に基づいてコンピューティングコストが発生します。

注釈

トークンは、Snowflake Cortex LLM関数で処理されるテキストの最小単位で、テキストの4文字にほぼ同じです。トークンに相当する生の入力または出力テキストは、モデルによって異なる場合があります。

  • EMBED_TEXT_768およびEMBED_TEXT_1024関数では、入力トークンのみが請求可能合計にカウントされます。

  • ベクトル類似性関数はトークンベースのコストを発生させません。

Cortex LLM 関数の請求に関する詳細については、 Cortex LLM 関数のコストに関する考慮事項 をご参照ください。コンピュートコストに関する一般情報については、 コンピューティングコストについて をご参照ください。