選擇嵌入任務類型

Vertex AI 嵌入模型可為各種工作類型 (例如文件擷取、問答和事實驗證) 產生最佳化嵌入項目。工作類型是標籤,可根據您的預期用途,最佳化模型產生的嵌入資料。本文將說明如何為嵌入項目選擇最佳任務類型。

支援的模型

下列模型支援的工作類型:

  • text-embedding-005
  • text-multilingual-embedding-002
  • gemini-embedding-001

工作類型的優點

任務類型可改善嵌入模型產生的嵌入資料品質。

問題和答案的語意不相似
圖 1. 問題和答案在語意上並不相似,因此嵌入資料不會自動顯示兩者的關聯。

舉例來說,建構檢索增強生成 (RAG) 系統時,常見的設計方式是使用文字嵌入和 向量搜尋 執行相似度搜尋。在某些情況下,這可能會導致搜尋品質下降,因為問題和答案在語意上並不相似。舉例來說,「為什麼天空是藍色的?」這類問題及其答案「陽光散射造成天空呈現藍色」,這兩者在陳述上有截然不同的意義,因此 RAG 系統不會自動辨識兩者之間的關係,如圖 1 所示。如果沒有任務類型,RAG 開發人員就需要訓練模型來學習查詢和答案之間的關係,這需要先進的數據科學技能和經驗,或是使用以 LLM 為基礎的查詢擴充功能HyDE,但這可能會導致延遲和成本增加。

任務類型會在嵌入空間中將問題和答案置於較近的位置
圖 2. 工作類型會針對特定工作進行嵌入最佳化。在這種情況下,問題和答案在嵌入空間中會靠得更近。

您可以使用工作類型為特定工作產生最佳化嵌入資料,省去自行開發工作專屬嵌入資料所需的時間和成本。針對查詢「為什麼天空是藍色的?」和其答案「陽光散射造成藍色」所產生的嵌入資料,會位於代表兩者關係的共用嵌入空間中,如圖 2 所示。在這個 RAG 範例中,經過最佳化的嵌入資料可改善相似度搜尋。

除了查詢和答案用途之外,工作類型也提供最佳化嵌入空間,可用於分類、叢集和事實驗證等工作。

支援的工作類型

使用工作類型的嵌入模型支援下列工作類型:

工作類型 說明
CLASSIFICATION 用於產生經過最佳化的嵌入資料,以便根據預先設定的標籤分類文字
CLUSTERING 用於產生經過最佳化的嵌入資料,以便根據相似性將文字分組
RETRIEVAL_DOCUMENTRETRIEVAL_QUERYQUESTION_ANSWERINGFACT_VERIFICATION 用於產生最佳化文件搜尋或資訊擷取的嵌入
CODE_RETRIEVAL_QUERY 用於根據自然語言查詢語法擷取程式碼區塊,例如排序陣列反轉鏈結清單。系統會使用 RETRIEVAL_DOCUMENT 計算程式碼區塊的嵌入內容。
SEMANTIC_SIMILARITY 用於產生經過最佳化處理的嵌入值,以便評估文字相似度。這項功能不適用於擷取用途。

最佳嵌入工作任務類型取決於您對嵌入資料的用途。選取工作類型前,請先決定要用於哪些嵌入用途。

決定要用於哪些嵌入用途

嵌入功能的用途通常可歸類為四種:評估文字相似度、分類文字、分群文字或從文字中擷取資訊。如果您的用途不屬於上述任一類別,請預設使用 RETRIEVAL_QUERY 工作類型。

工作指令格式分為 2 種:非對稱格式和對稱格式。您必須根據用途使用正確的模式。

擷取用途
(非對稱格式)
查詢工作類型 文件工作類型
搜尋查詢 RETRIEVAL_QUERY RETRIEVAL_DOCUMENT
問題回答 QUESTION_ANSWERING
事實查核 FACT_VERIFICATION
取得代碼 CODE_RETRIEVAL_QUERY



單一輸入用途
(對稱格式)
輸入工作類型
分類 分類
分群 分群
語意相似度
(請勿用於擷取用途;
適用於 STS)
SEMANTIC_SIMILARITY

分類文字

如果您想使用嵌入資料,根據預先設定的標籤分類文字,請使用 CLASSIFICATION 工作類型。這類工作類型會在經過最佳化分類的嵌入空間中產生嵌入資料。

舉例來說,假設您想為社群媒體貼文產生嵌入資料,然後將其用於將情緒分類為正面、負面或中立。如果「I don't like traveling on airplanes」這則社群媒體貼文的嵌入資料經過分類,情緒就會被歸類為負面。

叢集文字

如果您想使用嵌入資料,根據相似性將文字分組,請使用 CLUSTERING 工作類型。此工作類型會產生經過最佳化的嵌入資料,以便根據相似性進行分組。

舉例來說,假設您想為新聞文章產生嵌入資料,以便向使用者顯示與先前閱讀的文章相關的主題文章。產生並分群嵌入資料後,您可以向經常閱讀體育相關內容的使用者,建議其他體育相關文章。

分群的其他用途包括:

  • 客戶區隔:將具有相似個人資料或活動所產生嵌入資料的客戶分組,以便進行指定行銷和個人化體驗。
  • 產品區隔:根據產品名稱和說明、產品圖片或顧客評論,將產品嵌入資料分群,有助於企業進行產品區隔分析。
  • 市場研究:將消費者問卷調查回覆或社群媒體資料嵌入叢集,可揭露消費者意見、偏好和行為的隱藏模式和趨勢,有助於進行市場研究,並提供產品開發策略的參考依據。
  • 醫療照護:從醫療資料中擷取病患嵌入資料並進行分群,有助於識別有類似病症或治療反應的群組,進而提供更個人化的醫療照護計畫和指定療法。
  • 顧客意見回饋趨勢:將來自不同管道 (問卷調查、社群媒體、支援單) 的顧客意見回饋分組,有助於找出常見的痛點、功能要求和產品改善領域。

從文字中擷取資訊

如果您想使用嵌入資料來進行文件搜尋或資訊擷取,以及在問答用途 (例如搜尋、聊天機器人或 RAG) 中使用,如前文所述,您需要執行兩個嵌入資料工作,且使用不同的工作類型:

  1. 使用 RETRIEVAL_DOCUMENT 工作類型,為文件 (也稱為字元集) 建立最佳化嵌入資料。
  2. 請根據查詢的性質,使用下列任務類型之一為查詢建立最佳化嵌入資料:
    • RETRIEVAL_QUERY:用於查詢的預設工作類型,例如「溫哥華頓最佳餐廳」、「綠色蔬菜」或「最佳餅乾食譜為何?」。
    • QUESTION_ANSWERING:如果所有查詢的格式都是正確的問句,例如「為什麼天空是藍色的?」或「如何綁鞋帶?」,請使用此值。
    • FACT_VERIFICATION:如果您想從語料庫中擷取可證明或反駁某項陳述的文件,請使用此方法。舉例來說,如果使用「apples grow underground」(蘋果會在地下生長) 做為查詢,可能會找出關於蘋果的文章,但這篇文章最終會駁斥該陳述。

請考慮下列實際情境,其中擷取查詢相當實用:

  • 如果是電子商務平台,您可以使用嵌入資料,讓使用者同時使用文字查詢和圖片搜尋產品,提供更直覺且引人入勝的購物體驗。
  • 在教育平台方面,您想建立問答系統,以便根據課本內容或教育資源回答學生的問題,提供個人化學習體驗,並協助學生理解複雜的概念。

取得代碼

text-embedding-005 支援新的任務類型 CODE_RETRIEVAL_QUERY,可用於透過純文字查詢擷取相關程式碼區塊。如要使用這項功能,請使用 RETRIEVAL_DOCUMENT 工作類型嵌入程式碼區塊,並使用 CODE_RETRIEVAL_QUERY 嵌入文字查詢。

如要探索所有工作類型,請參閱模型參考資料

範例如下:

REST

PROJECT_ID=PROJECT_ID

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/text-embedding-005:predict -d \
$'{
  "instances": [
    {
      "task_type": "CODE_RETRIEVAL_QUERY",
      "content": "Function to add two numbers"
    }
  ],
}'

評估文字相似度

如果您想使用嵌入來評估文字相似度,請使用 SEMANTIC_SIMILARITY 任務類型。此工作類型會產生經過最佳化的嵌入資料,以便產生相似度分數。

舉例來說,假設您想產生嵌入項目,用於比較下列文字的相似程度:

  • 貓咪正在睡覺
  • 貓科動物正在午睡

當使用嵌入值建立相似度分數時,由於兩個文字的意思幾乎相同,因此相似度分數很高。

請考量下列實際情境,評估輸入相似度的實用性:

  • 在推薦系統中,您需要找出與使用者偏好項目語意相似的項目 (例如產品、文章、電影),提供個人化推薦內容並提升使用者滿意度。

Python 適用的 Vertex AI SDK

如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Vertex AI SDK for Python API 參考說明文件

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

MODEL_NAME = "gemini-embedding-001"
DIMENSIONALITY = 3072


def embed_text(
    texts: list[str] = ["Retrieve a function that adds two numbers"],
    task: str = "CODE_RETRIEVAL_QUERY",
    model_name: str = "gemini-embedding-001",
    dimensionality: int | None = 3072,
) -> list[list[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    kwargs = dict(output_dimensionality=dimensionality) if dimensionality else {}

    embeddings = []
    # gemini-embedding-001 takes one input at a time
    for text in texts:
        text_input = TextEmbeddingInput(text, task)
        embedding = model.get_embeddings([text_input], **kwargs)
        print(embedding)
        # Example response:
        # [[0.006135190837085247, -0.01462465338408947, 0.004978656303137541, ...]]
        embeddings.append(embedding[0].values)

    return embeddings


if __name__ == "__main__":
    # Embeds code block with a pre-trained, foundational model.
    # Using this function to calculate the embedding for corpus.
    texts = ["Retrieve a function that adds two numbers"]
    task = "CODE_RETRIEVAL_QUERY"
    code_block_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

    # Embeds code retrieval with a pre-trained, foundational model.
    # Using this function to calculate the embedding for query.
    texts = [
        "def func(a, b): return a + b",
        "def func(a, b): return a - b",
        "def func(a, b): return (a ** 2 + b ** 2) ** 0.5",
    ]
    task = "RETRIEVAL_DOCUMENT"
    code_query_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

使用這些模型時,請注意下列限制:

  • 請勿在重要任務或實際工作環境系統中使用這些預覽模型。
  • 這些型號僅適用於 us-central1
  • 不支援批次預測。
  • 不支援自訂。

後續步驟