הטמעות

ב-Gemini API יש מודלים של הטמעה שמאפשרים ליצור הטמעות של טקסט, תמונות, סרטונים ותכנים אחרים. אפשר להשתמש בהטמעות שנוצרות למשימות כמו חיפוש סמנטי, סיווג ואשכולות, כדי לקבל תוצאות מדויקות יותר שמותאמות להקשר, בהשוואה לגישות שמבוססות על מילות מפתח.

המודל העדכני ביותר, gemini-embedding-2, הוא המודל המולטי-מודאלי הראשון להטמעה ב-Gemini API. הוא ממפה טקסט, תמונות, וידאו, אודיו ומסמכים למרחב הטמעה מאוחד, ומאפשר חיפוש, סיווג ואשכולות במגוון אופנים ביותר מ-100 שפות. מידע נוסף זמין בקטע בנושא הטמעות מולטי-מודאליות. לתרחישים לדוגמה שכוללים טקסט בלבד, אפשר להמשיך להשתמש ב-gemini-embedding-001.

בניית מערכות של Retrieval-Augmented Generation (יצירה משולבת-אחזור, RAG) היא תרחיש שימוש נפוץ במוצרי AI. ההטמעות משפרות באופן משמעותי את הפלט מהמודל, והופכות אותו ליותר מדויק מבחינה עובדתית, עקבי ועשיר בהקשר. אם אתם מעדיפים להשתמש בפתרון RAG מנוהל, פיתחנו את הכלי File Search, שמאפשר לנהל את ה-RAG בקלות וביעילות רבה יותר.

יצירת הטמעות

משתמשים ב-method‏ embedContent כדי ליצור הטמעות טקסט:

Python

from google import genai

client = genai.Client()

result = client.models.embed_content(
        model="gemini-embedding-2",
        contents="What is the meaning of life?"
)

print(result.embeddings)

JavaScript

import { GoogleGenAI } from "@google/genai";

async function main() {

    const ai = new GoogleGenAI({});

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: 'What is the meaning of life?',
    });

    console.log(response.embeddings);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.EmbedContentResponse;

Client client = new Client();

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", "What is the meaning of life?", null);

System.out.println(response.embeddings().orElse(null));

Go

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

    "google.golang.org/genai"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    contents := []*genai.Content{
        genai.NewContentFromText("What is the meaning of life?", genai.RoleUser),
    }
    result, err := client.Models.EmbedContent(ctx,
        "gemini-embedding-2",
        contents,
        nil,
    )
    if err != nil {
        log.Fatal(err)
    }

    embeddings, err := json.MarshalIndent(result.Embeddings, "", "  ")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(embeddings))
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "model": "models/gemini-embedding-2",
        "content": {
        "parts": [{
            "text": "What is the meaning of life?"
        }]
        }
    }'

ציון סוג המשימה כדי לשפר את הביצועים

אפשר להשתמש בהטמעות למגוון רחב של משימות, מסיווג ועד חיפוש מסמכים. ציון סוג המשימה הנכון עוזר לבצע אופטימיזציה של ההטמעות לקשרים הרצויים, וכך לשפר את הדיוק והיעילות.

סוגי משימות עם Embeddings 2

במשימות שכוללות רק טקסט עם gemini-embedding-2, מומלץ מאוד להוסיף את הוראות המשימה להנחיה. כדי לעשות את זה, צריך להוסיף לשאילתה ולמסמך את הקידומת המתאימה למשימה.

כשיוצרים הטמעה אחת על סמך קלט מולטימודלי, בדרך כלל לא מומלץ להוסיף הוראה למשימה בתחילת החלק של הטקסט בקלט. במקרים מסוימים הוא משפר את הביצועים, אבל במקרים אחרים הוא פוגע בהם.

בטבלאות הבאות מוצגות דוגמאות לפורמטים של שאילתות ומסמכים לתרחישים סימטריים ואסימטריים באמצעות המודל gemini-embedding-2.

תרחישים לדוגמה של אחזור (פורמט אסימטרי)

בתרחישי שימוש אסימטריים, מוסיפים את הקידומת של המשימה לשאילתה ומחילים את מבנה המסמך על התוכן שרוצים להטמיע ולאחזר.

תרחיש שימוש מבנה השאילתה מבנה המסמך
שאילתת חיפוש task: search result | query: {content} title: {title} | text: {content}
אם אין כותרת, משתמשים ב-title: none.
מענה לשאלות task: question answering | query: {content} title: {title} | text: {content}
בדיקת עובדות task: fact checking | query: {content} title: {title} | text: {content}
אחזור קוד task: code retrieval | query: {content} title: {title} | text: {content}

דוגמה לשימוש

Python

# Generate embedding for a task's query. Use your correct task here:
def prepare_query(query):
    # return f"task: question answering | query: {query}"
    # return f"task: fact checking | query: {query}"
    # return f"task: code retrieval | query: {query}"
    return f"task: search result | query: {query}"

# Generate embedding for document of an asymmetric retrieval task:
def prepare_document(content, title=None):
    if title is None:
        title = "none"
    return f"title: {title} | text: {content}"

תרחישים לדוגמה של קלט יחיד (פורמט סימטרי)

במקרים סימטריים, באותה משימה, השתמשו באותו פורמט לשאילתה ולמסמך.

תרחיש שימוש מבנה הקלט
סיווג task: classification | query: {content}
סידור באשכול task: clustering | query: {content}
דמיון סמנטי task: sentence similarity | query: {content}
אל תשתמשו בזה לחיפוש או לאחזור. הוא מיועד לדמיון סמנטי בין טקסטים.

דוגמה לשימוש

Python

# Generate embedding for query & document of your task.
def prepare_query_and_document(content):
    # return f'task: clustering | query: {content}'
    # return f'task: sentence similarity | query: {content}'
    return f'task: classification | query: {content}'

חשוב להשתמש במשימה באופן עקבי. לדוגמה, אם המסמכים מוטמעים עם f'task: classification | query: {content}', גם השאילתה צריכה להיות מוטמעת לפי פורמט המשימה הזה.

סוגי משימות עם Embeddings 1

בשביל gemini-embedding-001, אפשר לציין את task_type ב-method‏ embedContent. בטבלה סוגי משימות נתמכים מופיעה רשימה מלאה של סוגי המשימות הנתמכים.

בדוגמה הבאה אפשר לראות איך משתמשים ב-SEMANTIC_SIMILARITY כדי לבדוק עד כמה מחרוזות טקסט דומות במשמעות שלהן.

Python

from google import genai
from google.genai import types
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

client = genai.Client()

texts = [
    "What is the meaning of life?",
    "What is the purpose of existence?",
    "How do I bake a cake?",
]

result = client.models.embed_content(
    model="gemini-embedding-001",
    contents=texts,
    config=types.EmbedContentConfig(task_type="SEMANTIC_SIMILARITY")
)

# Create a 3x3 table to show the similarity matrix
df = pd.DataFrame(
    cosine_similarity([e.values for e in result.embeddings]),
    index=texts,
    columns=texts,
)

print(df)

JavaScript

import { GoogleGenAI } from "@google/genai";
// npm i compute-cosine-similarity
import * as cosineSimilarity from "compute-cosine-similarity";

async function main() {
    const ai = new GoogleGenAI({});

    const texts = [
        "What is the meaning of life?",
        "What is the purpose of existence?",
        "How do I bake a cake?",
    ];

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-001',
        contents: texts,
        config: { taskType: 'SEMANTIC_SIMILARITY' },
    });

    const embeddings = response.embeddings.map(e => e.values);

    for (let i = 0; i < texts.length; i++) {
        for (let j = i + 1; j < texts.length; j++) {
            const text1 = texts[i];
            const text2 = texts[j];
            const similarity = cosineSimilarity(embeddings[i], embeddings[j]);
            console.log(`Similarity between '${text1}' and '${text2}': ${similarity.toFixed(4)}`);
        }
    }
}

main();

Java

import java.util.Arrays;
import com.google.genai.Client;
import com.google.genai.types.ContentEmbedding;
import com.google.genai.types.EmbedContentConfig;
import com.google.genai.types.EmbedContentResponse;
import java.util.List;

Client client = new Client();

List<String> texts =
    Arrays.asList(
        "What is the meaning of life?",
        "What is the purpose of existence?",
        "How do I bake a cake?");

EmbedContentConfig config =
    EmbedContentConfig.builder().taskType("SEMANTIC_SIMILARITY").build();

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-001", texts, config);

List<ContentEmbedding> embeddings = response.embeddings().get();

for (int i = 0; i < texts.size(); i++) {
  for (int j = i + 1; j < texts.size(); j++) {
    List<Float> v1 = embeddings.get(i).values().get();
    List<Float> v2 = embeddings.get(j).values().get();
    double dotProduct = 0.0;
    double normA = 0.0;
    double normB = 0.0;
    for (int k = 0; k < v1.size(); k++) {
      dotProduct += v1.get(k) * v2.get(k);
      normA += v1.get(k) * v1.get(k);
      normB += v2.get(k) * v2.get(k);
    }
    double similarity = dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    System.out.printf(
        "Similarity between '%s' and '%s': %.4f%n", texts.get(i), texts.get(j), similarity);
  }
}

Go

package main

import (
    "context"
    "fmt"
    "log"
    "math"

    "google.golang.org/genai"
)

// cosineSimilarity calculates the similarity between two vectors.
func cosineSimilarity(a, b []float32) (float64, error) {
    if len(a) != len(b) {
        return 0, fmt.Errorf("vectors must have the same length")
    }

    var dotProduct, aMagnitude, bMagnitude float64
    for i := 0; i < len(a); i++ {
        dotProduct += float64(a[i] * b[i])
        aMagnitude += float64(a[i] * a[i])
        bMagnitude += float64(b[i] * b[i])
    }

    if aMagnitude == 0 || bMagnitude == 0 {
        return 0, nil
    }

    return dotProduct / (math.Sqrt(aMagnitude) * math.Sqrt(bMagnitude)), nil
}

func main() {
    ctx := context.Background()
    client, _ := genai.NewClient(ctx, nil)
    defer client.Close()

    texts := []string{
        "What is the meaning of life?",
        "What is the purpose of existence?",
        "How do I bake a cake?",
    }

    var contents []*genai.Content
    for _, text := range texts {
        contents = append(contents, genai.NewContentFromText(text, genai.RoleUser))
    }

    result, _ := client.Models.EmbedContent(ctx,
        "gemini-embedding-001",
        contents,
        &genai.EmbedContentRequest{TaskType: genai.TaskTypeSemanticSimilarity},
    )

    embeddings := result.Embeddings

    for i := 0; i < len(texts); i++ {
        for j := i + 1; j < len(texts); j++ {
            similarity, _ := cosineSimilarity(embeddings[i].Values, embeddings[j].Values)
            fmt.Printf("Similarity between '%s' and '%s': %.4f\n", texts[i], texts[j], similarity)
        }
    }
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -d '{
    "taskType": "SEMANTIC_SIMILARITY",
    "content": {
        "parts": [
        {
            "text": "What is the meaning of life?"
        },
        {
            "text": "How much wood would a woodchuck chuck?"
        },
        {
            "text": "How does the brain work?"
        }
        ]
    }
    }'

קטעי הקוד יראו עד כמה קטעי הטקסט השונים דומים זה לזה כשהם מופעלים.

סוגי המשימות הנתמכים

סוגי המשימות שנתמכים ב-gemini-embedding-001:

סוג המשימה תיאור דוגמאות
SEMANTIC_SIMILARITY הטמעות שעברו אופטימיזציה להערכת דמיון בין טקסטים. מערכות המלצות, זיהוי כפילויות
סיווג הטמעות שעברו אופטימיזציה לסיווג טקסטים לפי תוויות מוגדרות מראש. ניתוח סנטימנטים, זיהוי ספאם
קיבוץ לאשכולות הטמעות שעברו אופטימיזציה כדי לקבץ טקסטים על סמך קווי הדמיון ביניהם. ארגון מסמכים, מחקר שוק, זיהוי אנומליות
RETRIEVAL_DOCUMENT הטמעות שעברו אופטימיזציה לחיפוש מסמכים. הוספת מאמרים, ספרים או דפי אינטרנט לאינדקס לצורך חיפוש.
RETRIEVAL_QUERY הטמעות שעברו אופטימיזציה לשאילתות חיפוש כלליות. משתמשים ב-RETRIEVAL_QUERY לשאילתות, וב-RETRIEVAL_DOCUMENT למסמכים שרוצים לאחזר. חיפוש בהתאמה אישית
CODE_RETRIEVAL_QUERY הטמעות שעברו אופטימיזציה לאחזור של בלוקים של קוד על סמך שאילתות בשפה טבעית. משתמשים ב-CODE_RETRIEVAL_QUERY לשאילתות, וב-RETRIEVAL_DOCUMENT לאחזור בלוקים של קוד. הצעות לקוד וחיפוש קוד
QUESTION_ANSWERING הטמעות לשאלות במערכת של שאלות ותשובות, שעברו אופטימיזציה למציאת מסמכים שעונים על השאלה. השתמשו ב-QUESTION_ANSWERING לשאלות וב-RETRIEVAL_DOCUMENT למסמכים שצריך לאחזר. תיבת הצ'אט
FACT_VERIFICATION הטמעות של הצהרות שצריך לאמת, שעברו אופטימיזציה לאחזור מסמכים שמכילים ראיות שתומכות בהצהרה או מפריכות אותה. משתמשים ב-FACT_VERIFICATION לטקסט היעד וב-RETRIEVAL_DOCUMENT למסמכים שרוצים לאחזר מערכות אוטומטיות לבדיקת עובדות

שליטה בגודל ההטמעה

שני המודלים, gemini-embedding-001 ו-gemini-embedding-2, מאומנים באמצעות שיטת Matryoshka Representation Learning ‏ (MRL) של למידת אופן הייצוג. בשיטה הזו, המודל לומד הטמעות עם ממדים רבים, שיש להן פלחים ראשוניים (או קידומות) שהם גם גרסאות שימושיות ופשוטות יותר של אותם נתונים.

משתמשים בפרמטר output_dimensionality כדי לשלוט בגודל של וקטור ההטמעה בפלט. בחירה במאפיין פלט קטן יותר יכולה לחסוך מקום באחסון ולהגביר את יעילות החישוב באפליקציות במורד הזרם, בלי לפגוע באיכות. כברירת מחדל, שני המודלים יוצרים הטמעה של 3,072 ממדים, אבל אפשר לחתוך אותה לגודל קטן יותר בלי לאבד איכות כדי לחסוך בנפח האחסון. מומלץ להשתמש במידות פלט של 768, 1,536 או 3,072.

Python

from google import genai
from google.genai import types

client = genai.Client()

result = client.models.embed_content(
    model="gemini-embedding-2",
    contents="What is the meaning of life?",
    config=types.EmbedContentConfig(output_dimensionality=768)
)

[embedding_obj] = result.embeddings
embedding_length = len(embedding_obj.values)

print(f"Length of embedding: {embedding_length}")

JavaScript

import { GoogleGenAI } from "@google/genai";

async function main() {
    const ai = new GoogleGenAI({});

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: 'What is the meaning of life?',
        config: { outputDimensionality: 768 },
    });

    const embeddingLength = response.embeddings[0].values.length;
    console.log(`Length of embedding: ${embeddingLength}`);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.ContentEmbedding;
import com.google.genai.types.EmbedContentConfig;
import com.google.genai.types.EmbedContentResponse;

Client client = new Client();

EmbedContentConfig config =
    EmbedContentConfig.builder().outputDimensionality(768).build();

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", "What is the meaning of life?", config);

ContentEmbedding embeddingObj = response.embeddings().get().get(0);
int embeddingLength = embeddingObj.values().get().size();

System.out.println("Length of embedding: " + embeddingLength);

Go

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
)

func main() {
    ctx := context.Background()
    // The client uses Application Default Credentials.
    // Authenticate with 'gcloud auth application-default login'.
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    contents := []*genai.Content{
        genai.NewContentFromText("What is the meaning of life?", genai.RoleUser),
    }

    result, err := client.Models.EmbedContent(ctx,
        "gemini-embedding-2",
        contents,
        &genai.EmbedContentRequest{OutputDimensionality: 768},
    )
    if err != nil {
        log.Fatal(err)
    }

    embedding := result.Embeddings[0]
    embeddingLength := len(embedding.Values)
    fmt.Printf("Length of embedding: %d\n", embeddingLength)
}

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H 'Content-Type: application/json' \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -d '{
        "content": {"parts":[{ "text": "What is the meaning of life?"}]},
        "output_dimensionality": 768
    }'

פלט לדוגמה מקטע הקוד:

Length of embedding: 768

שמירה על האיכות במידות קטנות יותר

ההטמעות של 3,072 מאפיינים שמוגדרות כברירת מחדל תמיד עוברות נרמול, אבל Gemini Embedding 2 גם מנרמל באופן אוטומטי מאפיינים מקוצרים (למשל, 768, 1,536). כך אפשר לחשב את הדמיון הסמנטי באמצעות כיוון הווקטור ולא הגודל, ולקבל תוצאות מדויקות יותר באופן מיידי.

מודלים ישנים יותר: אם אתם משתמשים ב-gemini-embedding-001, אתם צריכים לנרמל באופן ידני מאפיינים שהם לא 3072, באופן הבא:

Python

import numpy as np
from numpy.linalg import norm

# Only for embeddings from `gemini-embedding-001`
embedding_values_np = np.array(embedding_obj.values)
normed_embedding = embedding_values_np / np.linalg.norm(embedding_values_np)

print(f"Normed embedding length: {len(normed_embedding)}")
print(f"Norm of normed embedding: {np.linalg.norm(normed_embedding):.6f}") # Should be very close to 1

פלט לדוגמה מקטע הקוד הזה:

Normed embedding length: 768
Norm of normed embedding: 1.000000

בטבלה הבאה מוצגים ציוני MTEB, נקודת השוואה נפוצה להטמעות, למאפיינים שונים. חשוב לציין שהתוצאה מראה שהביצועים לא קשורים באופן מוחלט לגודל של מאפיין ההטמעה, ושהממדים הנמוכים יותר משיגים ציונים דומים לאלה של הממדים הגבוהים יותר.

מאפיין MRL ציון MTEB‏ (Gemini Embedding 001)
2048 68.16
1536 68.17
768 67.99
512 67.55
256 66.19
128 63.31

הטמעות מולטי-מודאליות

מודל gemini-embedding-2 תומך בקלט מולטי-מודאלי, ומאפשר להטמיע תמונות, סרטונים, אודיו ותוכן של מסמכים לצד טקסט. כל המודלים ממופים לאותו מרחב הטמעה, מה שמאפשר חיפוש והשוואה בין מודלים שונים.

אופני שימוש נתמכים ומגבלות

המגבלה הכוללת של אסימוני קלט היא 8,192 אסימונים.

מודליות מפרטים ומגבלות
טקסט תמיכה בעד 8,192 טוקנים.
תמונה אפשר להעלות עד 6 תמונות בכל בקשה. פורמטים נתמכים: PNG, ‏ JPEG.
אודיו משך הזמן המקסימלי הוא 180 שניות. פורמטים נתמכים: MP3, ‏ WAV.
סרטון משך הזמן המקסימלי הוא 120 שניות. פורמטים נתמכים: MP4, ‏ MOV. קודקים נתמכים: H264, ‏ H265, ‏ AV1, ‏ VP9.
המערכת מעבדת עד 32 פריימים לכל סרטון: סרטונים קצרים (עד 32 שניות) נדגמים בקצב של פריים אחד לשנייה, וסרטונים ארוכים יותר נדגמים באופן אחיד ל-32 פריימים. טראקים של אודיו לא מעובדים בקובצי וידאו.
מסמכים (PDF) אפשר להעלות קובץ אחד בכל בקשה, עד 6 דפים.

הטמעת תמונות

בדוגמה הבאה אפשר לראות איך מטמיעים תמונה באמצעות gemini-embedding-2.

אפשר לספק תמונות כנתונים מוטבעים או כקבצים שהועלו באמצעות Files API.

Python

from google import genai
from google.genai import types

with open('example.png', 'rb') as f:
    image_bytes = f.read()

client = genai.Client()

result = client.models.embed_content(
    model='gemini-embedding-2',
    contents=[
        types.Part.from_bytes(
            data=image_bytes,
            mime_type='image/png',
        ),
    ]
)

print(result.embeddings)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const imgBase64 = fs.readFileSync("example.png", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [{
            inlineData: {
                mimeType: 'image/png',
                data: imgBase64,
            },
        }],
    });

    console.log(response.embeddings);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;

Client client = new Client();

byte[] imageBytes = Files.readAllBytes(Paths.get("example.png"));

Content content = Content.fromParts(Part.fromBytes(imageBytes, "image/png"));

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", content, null);

System.out.println(response.embeddings().orElse(null));

REST

IMG_PATH="/path/to/your/image.png"
IMG_BASE64=$(base64 -w0 "${IMG_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "content": {
            "parts": [{
                "inline_data": {
                    "mime_type": "image/png",
                    "data": "'"${IMG_BASE64}"'"
                }
            }]
        }
    }'

צבירת הטמעות

כשעובדים עם תוכן מולטימודלי, המבנה של הקלט משפיע על הפלט של ההטמעה:

  • כמה חלקים (מצטברים): הוספה של כמה קלטים ישירות לפרמטר contents יוצרת הטמעה מצטברת אחת לכל הקלטים.
  • כמה אובייקטים מסוג Content (נפרדים): אם עוטפים כל קלט באובייקט מסוג Content ומעבירים אותם בפרמטר contents, הפונקציה מחזירה הטמעות נפרדות לכל רשומה.
  • ייצוג ברמת הפוסט: לאובייקטים מורכבים כמו פוסטים ברשתות החברתיות עם כמה קובצי מדיה, מומלץ לצבור הטמעות נפרדות (לדוגמה, באמצעות חישוב ממוצע) כדי ליצור ייצוג עקבי ברמת הפוסט.

בדוגמה הבאה מוסבר איך ליצור הטמעה נצברת אחת לקלט של טקסט ותמונה. פשוט מוסיפים כמה קלטים לפרמטר contents:

Python

from google import genai
from google.genai import types

client = genai.Client()

with open('dog.png', 'rb') as f:
    image_bytes = f.read()

result = client.models.embed_content(
    model='gemini-embedding-2',
    contents=[
        "An image of a dog",
        types.Part.from_bytes(
            data=image_bytes,
            mime_type='image/png',
        ),
    ]
)

# This produces one embedding
for embedding in result.embeddings:
    print(embedding.values)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const imgBase64 = fs.readFileSync("dog.png", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [
            'An image of a dog',
            {
                inlineData: {
                    mimeType: 'image/png',
                    data: imgBase64,
                },
            },
        ],
    });

    // This produces one embedding
    for (const embedding of response.embeddings) {
        console.log(embedding.values);
    }
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.ContentEmbedding;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collections;

Client client = new Client();

byte[] imageBytes = Files.readAllBytes(Paths.get("dog.png"));

Content content =
    Content.fromParts(
        Part.fromText("An image of a dog"),
        Part.fromBytes(imageBytes, "image/png"));

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", content, null);

// This produces one embedding
for (ContentEmbedding embedding : response.embeddings().orElse(Collections.emptyList())) {
  System.out.println(embedding.values().orElse(Collections.emptyList()));
}

REST

IMG_PATH="/path/to/your/dog.png"
IMG_BASE64=$(base64 -w0 "${IMG_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "content": {
            "parts": [
                {"text": "An image of a dog"},
                {
                    "inline_data": {
                        "mime_type": "image/png",
                        "data": "'"${IMG_BASE64}"'"
                    }
                }
            ]
        }
    }'

לעומת זאת, אם משתמשים באובייקטים מסוג Content בפרמטר contents, הפונקציה מחזירה הטמעות נפרדות. בדוגמה הזו נוצרות כמה הטמעות בקריאה אחת להטמעה:

Python

from google import genai
from google.genai import types

client = genai.Client()

with open('dog.png', 'rb') as f:
    image_bytes = f.read()

result = client.models.embed_content(
    model="gemini-embedding-2",
    contents=[
        types.Content(parts=[types.Part.from_text(text="task: classification | query: An image of a dog")]),
        types.Content(
            parts=[
                types.Part.from_bytes(
                    data=image_bytes,
                    mime_type="image/png",
                ),
            ]
        ),
    ],
)

# This produces two embeddings
for embedding in result.embeddings:
    print(embedding.values)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const imgBase64 = fs.readFileSync("dog.png", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [
            { parts: [{ text: 'task: classification | query: An image of a dog' }] },
            {
                parts: [{
                    inlineData: {
                        mimeType: 'image/png',
                        data: imgBase64,
                    },
                }],
            },
        ],
    });

    // This produces two embeddings
    for (const embedding of response.embeddings) {
        console.log(embedding.values);
    }
}

main();

Java

import java.util.Arrays;
import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.ContentEmbedding;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;

Client client = new Client();

byte[] imageBytes = Files.readAllBytes(Paths.get("dog.png"));

List<Content> contents =
    Arrays.asList(
        Content.fromParts(Part.fromText("task: classification | query: An image of a dog")),
        Content.fromParts(Part.fromBytes(imageBytes, "image/png")));

// Embed each Content object separately to produce separate embeddings
for (Content content : contents) {
  EmbedContentResponse response =
      client.models.embedContent("gemini-embedding-2", content, null);
  for (ContentEmbedding embedding : response.embeddings().orElse(Collections.emptyList())) {
    System.out.println(embedding.values().orElse(Collections.emptyList()));
  }
}

REST

IMG_PATH="/path/to/your/dog.png"
IMG_BASE64=$(base64 -w0 "${IMG_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:batchEmbedContents" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "requests": [
            {
                "model": "models/gemini-embedding-2",
                "content": {"parts": [{"text": "task: classification | query: An image of a dog"}]}
            },
            {
                "model": "models/gemini-embedding-2",
                "content": {"parts": [{"inline_data": {"mime_type": "image/png", "data": "'"${IMG_BASE64}"'"}}]}
            }
        ]
    }'

הטמעת אודיו

בדוגמה הבאה אפשר לראות איך מטמיעים קובץ אודיו באמצעות gemini-embedding-2.

אפשר לספק קובצי אודיו כנתונים מוטבעים או כקבצים שהועלו באמצעות Files API.

Python

from google import genai
from google.genai import types

with open('example.mp3', 'rb') as f:
    audio_bytes = f.read()

client = genai.Client()

result = client.models.embed_content(
    model='gemini-embedding-2',
    contents=[
        types.Part.from_bytes(
            data=audio_bytes,
            mime_type='audio/mpeg',
        ),
    ]
)

print(result.embeddings)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const audioBase64 = fs.readFileSync("example.mp3", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [{
            inlineData: {
                mimeType: 'audio/mpeg',
                data: audioBase64,
            },
        }],
    });

    console.log(response.embeddings);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;

Client client = new Client();

byte[] audioBytes = Files.readAllBytes(Paths.get("example.mp3"));

Content content = Content.fromParts(Part.fromBytes(audioBytes, "audio/mpeg"));

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", content, null);

System.out.println(response.embeddings().orElse(null));

REST

AUDIO_PATH="/path/to/your/example.mp3"
AUDIO_BASE64=$(base64 -w0 "${AUDIO_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "content": {
            "parts": [{
                "inline_data": {
                    "mime_type": "audio/mpeg",
                    "data": "'"${AUDIO_BASE64}"'"
                }
            }]
        }
    }'

הטמעת הסרטון

בדוגמה הבאה אפשר לראות איך מטמיעים סרטון באמצעות gemini-embedding-2.

אפשר לספק סרטונים כנתונים מוטבעים או כקבצים שהועלו באמצעות Files API.

Python

from google import genai
from google.genai import types

client = genai.Client()

with open('example.mp4', 'rb') as f:
    video_bytes = f.read()

result = client.models.embed_content(
    model='gemini-embedding-2',
    contents=[
        types.Part.from_bytes(
            data=video_bytes,
            mime_type='video/mp4',
        ),
    ]
)

print(result.embeddings[0].values)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const videoBase64 = fs.readFileSync("example.mp4", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [{
            inlineData: {
                mimeType: 'video/mp4',
                data: videoBase64,
            },
        }],
    });

    console.log(response.embeddings);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collections;

Client client = new Client();

byte[] videoBytes = Files.readAllBytes(Paths.get("example.mp4"));

Content content = Content.fromParts(Part.fromBytes(videoBytes, "video/mp4"));

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", content, null);

System.out.println(
    response.embeddings().get().get(0).values().orElse(Collections.emptyList()));

REST

VIDEO_PATH="/path/to/your/video.mp4"
VIDEO_BASE64=$(base64 -w0 "${VIDEO_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "content": {
            "parts": [{
                "inline_data": {
                    "mime_type": "video/mp4",
                    "data": "'"${VIDEO_BASE64}"'"
                }
            }]
        }
    }'

אם אתם צריכים להטמיע סרטונים באורך של יותר מ-120 שניות, אתם יכולים לחלק את הסרטון לקטעים חופפים ולהטמיע כל קטע בנפרד.

הטמעת מסמכים

אפשר להטמיע ישירות מסמכים בפורמט PDF. המודל מעבד את התוכן החזותי והטקסטואלי של כל דף.

אפשר לספק קובצי PDF כנתונים מוטבעים או כקבצים שהועלו באמצעות Files API.

איך המודל מעבד קובצי PDF

כשמטמיעים קובץ PDF, המודל מעבד את המסמך באמצעות תכונות חזותיות וטקסטואליות:

  • ייצוג חזותי: המודל מעבד כל דף כתמונה, וצורך 258 אסימונים לכל דף.
  • חילוץ טקסט: המודל מחלץ טקסט מהמסמך. בקובצי PDF מקוריים (שמכילים טקסט דיגיטלי), המודל מחלץ את הטקסט ישירות. בקובצי PDF סרוקים (שמכילים תמונות של טקסט), המודל מפעיל באופן אוטומטי זיהוי תווים אופטי (OCR) כדי לחלץ את הטקסט.

כדי לחשב את מספר הטוקנים הכולל בקובץ PDF, מוסיפים את הטוקנים החזותיים (258 לכל דף) לטוקנים של הטקסט. הקלט צריך להיות במסגרת המגבלה של 8,192 טוקנים (שמשותפת לכל המודאליות). המערכת מקצרת באופן אוטומטי קלטים שחורגים מהמגבלה הזו.

מגבלות על קובצי PDF

  • קבצים לכל בקשה: אפשר לשלוח קובץ PDF אחד לכל היותר.
  • מגבלת דפים: אפשר לשלוח עד 6 דפים בכל קובץ. כדי לקבל את האיכות הטובה ביותר, מומלץ מאוד להשתמש בדף אחד לכל קובץ PDF.

בדוגמה הבאה אפשר לראות איך מטמיעים קובץ PDF באמצעות gemini-embedding-2:

Python

from google import genai
from google.genai import types

with open('example.pdf', 'rb') as f:
    pdf_bytes = f.read()

client = genai.Client()

result = client.models.embed_content(
    model='gemini-embedding-2',
    contents=[
        types.Part.from_bytes(
            data=pdf_bytes,
            mime_type='application/pdf',
        ),
    ]
)

print(result.embeddings)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

async function main() {
    const ai = new GoogleGenAI({});

    const pdfBase64 = fs.readFileSync("example.pdf", { encoding: "base64" });

    const response = await ai.models.embedContent({
        model: 'gemini-embedding-2',
        contents: [{
            inlineData: {
                mimeType: 'application/pdf',
                data: pdfBase64,
            },
        }],
    });

    console.log(response.embeddings);
}

main();

Java

import com.google.genai.Client;
import com.google.genai.types.Content;
import com.google.genai.types.EmbedContentResponse;
import com.google.genai.types.Part;
import java.nio.file.Files;
import java.nio.file.Paths;

Client client = new Client();

byte[] pdfBytes = Files.readAllBytes(Paths.get("example.pdf"));

Content content = Content.fromParts(Part.fromBytes(pdfBytes, "application/pdf"));

EmbedContentResponse response =
    client.models.embedContent("gemini-embedding-2", content, null);

System.out.println(response.embeddings().orElse(null));

REST

PDF_PATH="/path/to/your/example.pdf"
PDF_BASE64=$(base64 -w0 "${PDF_PATH}")

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-2:embedContent" \
    -H "Content-Type: application/json" \
    -H "x-goog-api-key: ${GEMINI_API_KEY}" \
    -d '{
        "content": {
            "parts": [{
                "inline_data": {
                    "mime_type": "application/pdf",
                    "data": "'"${PDF_BASE64}"'"
                }
            }]
        }
    }'

תרחישים לדוגמה

הטמעות טקסט הן חיוניות למגוון תרחישי שימוש נפוצים ב-AI, כמו:

  • ‫Retrieval-Augmented Generation (יצירה משולבת-אחזור, RAG): הטמעות משפרות את איכות הטקסט הדינמי מבוסס-AI שנוצר על ידי אחזור מידע רלוונטי ושילוב שלו בהקשר של המודל.
  • אחזור מידע: חיפוש הטקסט או המסמכים שהכי דומים מבחינה סמנטית לטקסט קלט נתון.

    מדריך לחיפוש מסמכים

  • דירוג מחדש של תוצאות החיפוש: מתעדפים את הפריטים הכי רלוונטיים על ידי מתן ציון סמנטי לתוצאות הראשוניות בהתאם לשאילתה.

    מדריך לדירוג מחדש של תוצאות החיפוש

  • זיהוי אנומליות: השוואה בין קבוצות של הטמעות יכולה לעזור לזהות מגמות נסתרות או חריגות.

    מדריך לזיהוי אנומליות

  • סיווג: סיווג אוטומטי של טקסט על סמך התוכן שלו, כמו ניתוח סנטימנטים או זיהוי ספאם.

    מדריך לסיווג

  • אשכולות: הבנה יעילה של קשרים מורכבים על ידי יצירת אשכולות והמחשות חזותיות של ההטמעות.

    מדריך להמחשה חזותית של אשכולות

אחסון הטמעות

כשמעבירים הטמעות לסביבת הייצור, נהוג להשתמש במסדי נתונים וקטוריים כדי לאחסן, להוסיף לאינדקס ולאחזר ביעילות הטמעות עם הרבה מאפיינים. ב-Google Cloud יש שירותי נתונים מנוהלים שאפשר להשתמש בהם למטרה הזו, כולל Gemini Enterprise Agent Platform חיפוש וקטורי 2.0,‏ BigQuery,‏ AlloyDB ו-Cloud SQL.

במדריכים הבאים מוסבר איך להשתמש במסדי נתונים וקטוריים אחרים של צד שלישי עם Gemini Embedding.

גרסאות המודלים

Gemini Embedding 2

נכס תיאור
קוד המודל

Gemini API

gemini-embedding-2

סוגי נתונים נתמכים

קלט

טקסט, תמונה, סרטון, אודיו, קובץ PDF

פלט

הטמעות טקסט

מגבלות על אסימונים[*]

מגבלת טוקנים בקלט

8,192

גודל המאפיין של הפלט

גמיש, תומך ב: 128 - 3072, מומלץ: 768, 1536, 3072

גרסאות
לפרטים נוספים, קראו את המאמר בנושא תבניות של גרסאות מודלים.
  • יציב: gemini-embedding-2
העדכון האחרון אפריל 2026

הטמעה של Gemini

נכס תיאור
קוד המודל

Gemini API

gemini-embedding-001

סוגי נתונים נתמכים

קלט

טקסט

פלט

הטמעות טקסט

מגבלות על אסימונים[*]

מגבלת טוקנים בקלט

2,048

גודל המאפיין של הפלט

גמיש, תומך ב: 128 - 3072, מומלץ: 768, 1536, 3072

גרסאות
לפרטים נוספים, קראו את המאמר בנושא תבניות של גרסאות מודלים.
  • יציב: gemini-embedding-001
העדכון האחרון יוני 2025

למידע על מודלים של הטמעות שיצאו משימוש, עיינו בדף הוצאה משימוש.

מעבר מ-gemini-embedding-001

מרחבי ההטמעה בין gemini-embedding-001 לבין gemini-embedding-2 לא תואמים. כלומר, אי אפשר להשוות ישירות בין הטמעות שנוצרו על ידי מודל אחד לבין הטמעות שנוצרו על ידי המודל השני. אם אתם משדרגים לגרסה gemini-embedding-2, אתם צריכים להטמיע מחדש את כל הנתונים הקיימים.

מעבר לחוסר התאימות, יש עוד כמה הבדלים חשובים בין שני המודלים:

  • ציון סוג המשימה: ב-gemini-embedding-001, מציינים את סוג המשימה באמצעות הפרמטר task_type (למשל, SEMANTIC_SIMILARITY, RETRIEVAL_DOCUMENT). ב-gemini-embedding-2, הפרמטר task_type לא נתמך. במקום זאת, צריך לכלול את הוראות המשימה ישירות בהנחיה למשימות טקסט בלבד. בקטע סוגי משימות עם Embeddings 2 מוסבר איך להגדיר את הפורמט של ההנחיות לתרחישים שונים לדוגמה.

  • צבירת הטמעות: הפונקציה gemini-embedding-001 יוצרת הטמעות נפרדות לכל מחרוזת ברשימת קלטים. לעומת זאת, gemini-embedding-2 יוצר הטמעה אחת נצברת כשמספקים כמה קלטים (כמו טקסט ותמונות) ישירות בבקשה אחת. כדי ליצור הטמעות נפרדות לקלטים ספציפיים, צריך לעטוף כל קלט באובייקט Content או להשתמש ב-Batch API. מידע נוסף זמין במאמר צבירת הטמעות.

  • נורמליזציה: אם משתמשים ב-output_dimensionality כדי לבקש הטמעות עם פחות מ-3,072 מאפיינים, gemini-embedding-2 מבצע באופן אוטומטי נורמליזציה של ההטמעות המקוצרות האלה. ב-gemini-embedding-001, צריך לבצע נרמול ידני למאפיינים שאינם 3072. פרטים נוספים זמינים במאמר שמירה על איכות התמונה במאפיינים קטנים יותר.

הטמעות באצווה

אם זמן האחזור לא חשוב, נסו להשתמש במודלים של Gemini Embeddings עם Batch API. כך אפשר להשיג קצב העברת נתונים גבוה בהרבה ב-50% מהמחיר של הטמעת ברירת המחדל. במדריך של Batch API יש דוגמאות לאיך להתחיל לעבוד עם ה-API.

הודעה על שימוש אחראי

בניגוד למודלים של AI גנרטיבי שיוצרים תוכן חדש, המודל Gemini Embedding נועד רק להמיר את הפורמט של נתוני הקלט לייצוג מספרי. ‫Google אחראית לספק מודל הטמעה שמשנה את הפורמט של נתוני הקלט לפורמט המספרי המבוקש, אבל המשתמשים נושאים באחריות מלאה לנתונים שהם מזינים ולהטמעות שנוצרות כתוצאה מכך. השימוש במודל ההטמעה של Gemini מבטא את האישור שלך לכך שיש לך את הזכויות הנדרשות על התוכן שהעלית. אסור ליצור תוכן שמפר את זכויות הקניין הרוחני או זכויות הפרטיות של אחרים. השימוש בשירות הזה כפוף למדיניות בנושא שימוש אסור ולתנאים ולהגבלות של Google.

איך מתחילים לפתח עם הטמעות

כדי לבדוק את יכולות המודל וללמוד איך להתאים אישית את ההטמעות ולהציג אותן באופן חזותי, כדאי לעיין במדריך למתחילים בנושא הטמעות ב-Notebook.