Mục nhúng

Gemini API cung cấp các mô hình nhúng để tạo các mục nhúng cho văn bản, hình ảnh, video và nội dung khác. Sau đó, bạn có thể sử dụng các mục nhúng thu được cho các tác vụ như tìm kiếm ngữ nghĩa, phân loại và phân cụm, mang lại kết quả chính xác hơn, nhận biết theo bối cảnh hơn so với các phương pháp dựa trên từ khoá.

Mô hình mới nhất, gemini-embedding-2, là mô hình nhúng đa phương thức đầu tiên trong Gemini API. Mô hình này liên kết văn bản, hình ảnh, video, âm thanh và tài liệu vào một không gian nhúng hợp nhất, cho phép tìm kiếm, phân loại và phân nhóm trên nhiều phương thức bằng hơn 100 ngôn ngữ. Hãy xem phần nhúng đa phương thức để tìm hiểu thêm. Đối với các trường hợp sử dụng chỉ có văn bản, gemini-embedding-001 vẫn hoạt động.

Xây dựng hệ thống Tạo sinh tăng cường truy xuất (RAG) là một trường hợp sử dụng phổ biến cho các sản phẩm AI. Embeddings đóng vai trò quan trọng trong việc cải thiện đáng kể đầu ra của mô hình với độ chính xác thực tế, tính mạch lạc và độ phong phú về ngữ cảnh được cải thiện. Nếu bạn muốn sử dụng giải pháp RAG được quản lý, chúng tôi đã xây dựng công cụ Tìm kiếm tệp giúp việc thực hiện RAG dễ quản lý hơn và tiết kiệm chi phí hơn.

Đang tạo mục nhúng

Sử dụng phương thức embedContent để tạo các mục nhúng văn bản:

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?"
        }]
        }
    }'

Chỉ định loại việc cần làm để cải thiện hiệu suất

Bạn có thể sử dụng các mục nhúng cho nhiều nhiệm vụ, từ phân loại đến tìm kiếm tài liệu. Việc chỉ định đúng loại tác vụ giúp tối ưu hoá các mục nhúng cho mối quan hệ dự kiến, tối đa hoá độ chính xác và hiệu quả.

Loại nhiệm vụ có Embeddings 2

Đối với các nhiệm vụ chỉ có văn bản với gemini-embedding-2, bạn nên thêm hướng dẫn về nhiệm vụ vào câu lệnh. Bạn có thể thực hiện việc này bằng cách định dạng truy vấn và tài liệu bằng tiền tố nhiệm vụ chính xác.

Khi tạo một bản nhúng duy nhất dựa trên dữ liệu đầu vào đa phương thức, bạn thường không nên thêm tiền tố vào phần văn bản của dữ liệu đầu vào bằng một lệnh tác vụ. Trong một số trường hợp, việc này giúp cải thiện hiệu suất, nhưng trong một số trường hợp khác, việc này lại làm giảm hiệu suất.

Các bảng sau đây trình bày ví dụ về cách định dạng truy vấn và tài liệu cho các trường hợp sử dụng đối xứng và bất đối xứng bằng mô hình gemini-embedding-2.

Trường hợp sử dụng truy xuất (Định dạng không đối xứng)

Trong các trường hợp sử dụng không đối xứng, hãy thêm tiền tố nhiệm vụ vào truy vấn và áp dụng cấu trúc tài liệu cho nội dung bạn muốn nhúng và truy xuất.

Trường hợp sử dụng Cấu trúc truy vấn Cấu trúc tài liệu
Truy vấn tìm kiếm task: search result | query: {content} title: {title} | text: {content}
Nếu không có tiêu đề, hãy sử dụng title: none.
Trả lời câu hỏi task: question answering | query: {content} title: {title} | text: {content}
Kiểm chứng thông tin task: fact checking | query: {content} title: {title} | text: {content}
Truy xuất mã task: code retrieval | query: {content} title: {title} | text: {content}

Ví dụ về cách sử dụng

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}"

Trường hợp sử dụng một dữ liệu đầu vào (Định dạng đối xứng)

Trong các trường hợp sử dụng đối xứng, đối với cùng một nhiệm vụ, hãy sử dụng cùng một định dạng cho truy vấn và tài liệu.

Trường hợp sử dụng Cấu trúc đầu vào
Phân loại task: classification | query: {content}
Tạo cụm task: clustering | query: {content}
Tính tương đồng về mặt ngữ nghĩa task: sentence similarity | query: {content}
Đừng dùng thuộc tính này để tìm kiếm hoặc truy xuất. Mô hình này dùng để đánh giá mức độ tương đồng về ngữ nghĩa của văn bản.

Ví dụ về cách sử dụng

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}'

Điều quan trọng là bạn phải sử dụng tác vụ này một cách nhất quán. Ví dụ: nếu tài liệu được nhúng bằng f'task: classification | query: {content}', thì truy vấn cũng phải được nhúng theo định dạng tác vụ này.

Loại nhiệm vụ có Embeddings 1

Đối với gemini-embedding-001, bạn có thể chỉ định task_type trong phương thức embedContent. Để biết danh sách đầy đủ các loại nhiệm vụ được hỗ trợ, hãy xem bảng Các loại nhiệm vụ được hỗ trợ.

Ví dụ sau đây cho thấy cách bạn có thể sử dụng SEMANTIC_SIMILARITY để kiểm tra mức độ tương đồng về ý nghĩa của các chuỗi văn bản.

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?"
        }
        ]
    }
    }'

Các đoạn mã sẽ cho thấy mức độ tương đồng giữa các đoạn văn bản khác nhau khi chạy.

Các loại việc cần làm được hỗ trợ

Các loại nhiệm vụ được hỗ trợ cho gemini-embedding-001:

Loại việc cần làm Mô tả Ví dụ
SEMANTIC_SIMILARITY Các mục nhúng được tối ưu hoá để đánh giá mức độ tương đồng của văn bản. Hệ thống đề xuất, phát hiện nội dung trùng lặp
CLASSIFICATION Các mục nhúng được tối ưu hoá để phân loại văn bản theo nhãn đặt trước. Phân tích cảm xúc, phát hiện tin nhắn rác
PHÂN CỤM Các mục nhúng được tối ưu hoá để phân nhóm văn bản dựa trên điểm tương đồng. Sắp xếp tài liệu, nghiên cứu thị trường, phát hiện hoạt động bất thường
RETRIEVAL_DOCUMENT Nhúng được tối ưu hoá cho việc tìm kiếm tài liệu. Lập chỉ mục bài viết, sách hoặc trang web để tìm kiếm.
RETRIEVAL_QUERY Các mục nhúng được tối ưu hoá cho cụm từ tìm kiếm chung. Sử dụng RETRIEVAL_QUERY cho truy vấn; RETRIEVAL_DOCUMENT cho tài liệu cần truy xuất. Tìm kiếm tùy chỉnh
CODE_RETRIEVAL_QUERY Các mục nhúng được tối ưu hoá để truy xuất khối mã dựa trên truy vấn bằng ngôn ngữ tự nhiên. Sử dụng CODE_RETRIEVAL_QUERY cho truy vấn; RETRIEVAL_DOCUMENT cho các khối mã cần truy xuất. Gợi ý mã và tìm kiếm
QUESTION_ANSWERING Nhúng cho các câu hỏi trong hệ thống hỏi đáp, được tối ưu hoá để tìm tài liệu trả lời câu hỏi. Sử dụng QUESTION_ANSWERING cho câu hỏi; RETRIEVAL_DOCUMENT cho tài liệu cần truy xuất. Hộp trò chuyện
FACT_VERIFICATION Nhúng cho các câu lệnh cần được xác minh, được tối ưu hoá để truy xuất các tài liệu chứa bằng chứng hỗ trợ hoặc bác bỏ câu lệnh. Sử dụng FACT_VERIFICATION cho văn bản mục tiêu; RETRIEVAL_DOCUMENT cho tài liệu cần truy xuất Hệ thống kiểm chứng tự động

Kiểm soát kích thước nhúng

Cả gemini-embedding-001 và gemini-embedding-2 đều được huấn luyện bằng kỹ thuật Học biểu diễn Matryoshka (MRL). Kỹ thuật này hướng dẫn mô hình học các mục nhúng nhiều chiều có các phân đoạn ban đầu (hoặc tiền tố) cũng là các phiên bản hữu ích, đơn giản hơn của cùng một dữ liệu.

Sử dụng tham số output_dimensionality để kiểm soát kích thước của vectơ nhúng đầu ra. Việc chọn số chiều đầu ra nhỏ hơn có thể tiết kiệm không gian lưu trữ và tăng hiệu quả tính toán cho các ứng dụng hạ nguồn, trong khi chất lượng không bị ảnh hưởng nhiều. Theo mặc định, cả hai mô hình đều xuất ra một nhúng 3072 chiều, nhưng bạn có thể cắt bớt thành kích thước nhỏ hơn mà không mất chất lượng để tiết kiệm không gian lưu trữ. Bạn nên sử dụng kích thước đầu ra là 768, 1536 hoặc 3072.

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
    }'

Kết quả mẫu từ đoạn mã:

Length of embedding: 768

Đảm bảo chất lượng cho các kích thước nhỏ hơn

Mặc dù các mục nhúng 3072 chiều mặc định luôn được chuẩn hoá, nhưng Gemini Embedding 2 cũng tự động chuẩn hoá các chiều bị cắt bớt (ví dụ: 768, 1536). Điều này đảm bảo độ tương đồng về ngữ nghĩa được tính toán thông qua hướng vectơ thay vì độ lớn, mang lại kết quả chính xác hơn ngay từ đầu.

Mô hình cũ: Nếu đang sử dụng gemini-embedding-001, bạn phải chuẩn hoá các phương diện không phải 3072 theo cách thủ công như sau:

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

Kết quả mẫu từ đoạn mã này:

Normed embedding length: 768
Norm of normed embedding: 1.000000

Bảng sau đây cho thấy điểm MTEB (một điểm chuẩn thường dùng cho các mục nhúng) cho nhiều phương diện. Đáng chú ý, kết quả cho thấy hiệu suất không liên quan chặt chẽ đến kích thước của chiều nhúng, trong đó các chiều thấp hơn đạt được điểm số tương đương với các chiều cao hơn.

Phương diện MRL Điểm MTEB (Gemini Embedding 001)
2048 68,16
1536 68,17
768 67,99
512 67,55
256 66,19
128 63,31

Nhúng đa phương thức

Mô hình gemini-embedding-2 hỗ trợ dữ liệu đầu vào đa phương thức, cho phép bạn nhúng nội dung hình ảnh, video, âm thanh và tài liệu cùng với văn bản. Tất cả các phương thức đều được liên kết vào cùng một không gian nhúng, cho phép tìm kiếm và so sánh trên nhiều phương thức.

Các phương thức và giới hạn được hỗ trợ

Giới hạn tổng số mã thông báo đầu vào tối đa là 8.192 mã thông báo.

Phương thức Thông số kỹ thuật và giới hạn
Văn bản Hỗ trợ tối đa 8.192 token.
Image Tối đa 6 hình ảnh cho mỗi yêu cầu. Định dạng được hỗ trợ: PNG, JPEG.
Âm thanh Thời lượng tối đa là 180 giây. Định dạng được hỗ trợ: MP3, WAV.
Video Thời lượng tối đa là 120 giây. Định dạng được hỗ trợ: MP4, MOV. Bộ mã hoá và giải mã được hỗ trợ: H264, H265, AV1, VP9.
Hệ thống xử lý tối đa 32 khung hình cho mỗi video: video ngắn (≤32 giây) được lấy mẫu ở tốc độ 1 khung hình/giây, còn video dài hơn được lấy mẫu đồng đều thành 32 khung hình. Bản âm thanh không được xử lý trong tệp video.
Tài liệu (PDF) Tối đa 1 tệp cho mỗi yêu cầu, tối đa 6 trang.

Nhúng hình ảnh

Ví dụ sau đây cho thấy cách nhúng hình ảnh bằng gemini-embedding-2.

Bạn có thể cung cấp hình ảnh dưới dạng dữ liệu cùng dòng hoặc dưới dạng tệp đã tải lên thông qua 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}"'"
                }
            }]
        }
    }'

Tổng hợp nhúng

Khi làm việc với nội dung đa phương thức, cách bạn cấu trúc dữ liệu đầu vào sẽ ảnh hưởng đến kết quả nhúng:

  • Nhiều phần (tổng hợp): Việc thêm trực tiếp nhiều dữ liệu đầu vào vào tham số contents sẽ tạo ra một mục nhúng tổng hợp cho tất cả dữ liệu đầu vào.
  • Nhiều đối tượng Content (riêng biệt): Việc gói từng dữ liệu đầu vào trong một đối tượng Content và truyền các đối tượng đó vào tham số contents sẽ trả về các mục nhúng riêng biệt cho từng mục nhập.
  • Biểu diễn ở cấp bài đăng: Đối với các đối tượng phức tạp như bài đăng trên mạng xã hội có nhiều mục nội dung nghe nhìn, bạn nên tổng hợp các mục nhúng riêng biệt (ví dụ: bằng cách tính trung bình) để tạo một biểu diễn nhất quán ở cấp bài đăng.

Ví dụ sau đây cho thấy cách tạo một mục nhúng tổng hợp cho dữ liệu đầu vào là văn bản và hình ảnh. Bạn chỉ cần thêm nhiều dữ liệu đầu vào vào tham số 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}"'"
                    }
                }
            ]
        }
    }'

Mặt khác, nếu bạn sử dụng các đối tượng Content bên trong tham số contents, thì tham số này sẽ trả về các mục nhúng riêng biệt. Ví dụ này tạo nhiều mục nhúng trong một lệnh gọi nhúng:

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}"'"}}]}
            }
        ]
    }'

Đang nhúng âm thanh

Ví dụ sau đây cho thấy cách nhúng tệp âm thanh bằng gemini-embedding-2.

Bạn có thể cung cấp tệp âm thanh dưới dạng dữ liệu cùng dòng hoặc dưới dạng tệp đã tải lên thông qua 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}"'"
                }
            }]
        }
    }'

Nhúng video

Ví dụ sau đây cho thấy cách nhúng video bằng gemini-embedding-2.

Bạn có thể cung cấp video dưới dạng dữ liệu cùng dòng hoặc dưới dạng tệp đã tải lên thông qua 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}"'"
                }
            }]
        }
    }'

Nếu cần nhúng video dài hơn 120 giây, bạn có thể chia video thành các phân đoạn chồng chéo và nhúng riêng từng phân đoạn đó.

Nhúng tài liệu

Bạn có thể nhúng trực tiếp tài liệu ở định dạng PDF. Mô hình này xử lý nội dung hình ảnh và văn bản của mỗi trang.

Bạn có thể cung cấp tệp PDF dưới dạng dữ liệu cùng dòng hoặc dưới dạng tệp đã tải lên thông qua Files API.

Cách mô hình xử lý tệp PDF

Khi bạn nhúng một tệp PDF, mô hình sẽ xử lý tài liệu bằng cả tính năng hình ảnh và văn bản:

  • Biểu diễn trực quan: Mô hình này kết xuất mỗi trang dưới dạng hình ảnh, sử dụng 258 mã thông báo cho mỗi trang.
  • Trích xuất văn bản: Mô hình trích xuất văn bản từ tài liệu. Đối với tệp PDF gốc (chứa văn bản kỹ thuật số), mô hình sẽ trích xuất văn bản trực tiếp. Đối với tệp PDF được quét (chứa hình ảnh của văn bản), mô hình sẽ tự động chạy công nghệ nhận dạng ký tự quang học (OCR) để trích xuất văn bản.

Để tính tổng số mã thông báo cho một tệp PDF, hãy cộng số mã thông báo hình ảnh (258 mã thông báo mỗi trang) với số mã thông báo văn bản. Thông tin đầu vào của bạn phải nằm trong giới hạn 8.192 mã thông báo của mô hình (được chia sẻ trên tất cả các phương thức). Hệ thống sẽ tự động cắt bớt dữ liệu đầu vào vượt quá giới hạn này.

Giới hạn đối với tệp PDF

  • Số tệp cho mỗi yêu cầu: Bạn có thể gửi tối đa 1 tệp PDF.
  • Giới hạn số trang: Bạn có thể gửi tối đa 6 trang cho mỗi tệp. Để có chất lượng tốt nhất, bạn nên sử dụng 1 trang cho mỗi tệp PDF.

Ví dụ sau đây cho thấy cách nhúng tệp PDF bằng 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}"'"
                }
            }]
        }
    }'

Trường hợp sử dụng

Nhúng văn bản đóng vai trò quan trọng trong nhiều trường hợp sử dụng AI phổ biến, chẳng hạn như:

Lưu trữ dữ liệu nhúng

Khi đưa các mục nhúng vào môi trường thực tế, bạn thường sử dụng cơ sở dữ liệu vectơ để lưu trữ, lập chỉ mục và truy xuất các mục nhúng nhiều chiều một cách hiệu quả. Google Cloud cung cấp các dịch vụ dữ liệu được quản lý có thể dùng cho mục đích này, bao gồm Gemini Enterprise Agent Platform Vector Search 2.0, BigQuery, AlloyDB và Cloud SQL.

Các hướng dẫn sau đây cho biết cách sử dụng các cơ sở dữ liệu vectơ khác của bên thứ ba với Gemini Embedding.

Phiên bản mô hình

Gemini Embedding 2

Thuộc tính Mô tả
Mã kiểu máy

Gemini API

gemini-embedding-2

Các loại dữ liệu được hỗ trợ

Thiết bị đầu vào

Văn bản, hình ảnh, video, âm thanh, PDF

Kết quả

Nhúng văn bản

Giới hạn về mã thông báo[*]

Giới hạn số token đầu vào

8.192

Kích thước đầu ra

Linh hoạt, hỗ trợ: 128 – 3072, Nên dùng: 768, 1536, 3072

phiên bản
Hãy đọc mẫu phiên bản mô hình để biết thêm thông tin chi tiết.
  • Ổn định: gemini-embedding-2
Thông tin cập nhật mới nhất Tháng 4 năm 2026

Gemini Embedding

Thuộc tính Mô tả
Mã kiểu máy

Gemini API

gemini-embedding-001

Các loại dữ liệu được hỗ trợ

Thiết bị đầu vào

Văn bản

Kết quả

Nhúng văn bản

Giới hạn về mã thông báo[*]

Giới hạn số token đầu vào

2.048

Kích thước đầu ra

Linh hoạt, hỗ trợ: 128 – 3072, Nên dùng: 768, 1536, 3072

phiên bản
Hãy đọc mẫu phiên bản mô hình để biết thêm thông tin chi tiết.
  • Ổn định: gemini-embedding-001
Thông tin cập nhật mới nhất Tháng 6 năm 2025

Đối với các mô hình Nhúng không dùng nữa, hãy truy cập vào trang Ngừng sử dụng

Di chuyển từ gemini-embedding-001

Không gian nhúng giữa gemini-embedding-001 và gemini-embedding-2 không tương thích. Điều này có nghĩa là bạn không thể so sánh trực tiếp các mục nhúng do một mô hình tạo ra với các mục nhúng do mô hình kia tạo ra. Nếu đang nâng cấp lên gemini-embedding-2, bạn phải nhúng lại tất cả dữ liệu hiện có.

Ngoài tính không tương thích, còn có một số điểm khác biệt đáng chú ý khác giữa hai mô hình:

  • Thông số kỹ thuật của loại nhiệm vụ: Với gemini-embedding-001, bạn chỉ định loại nhiệm vụ bằng tham số task_type (ví dụ: SEMANTIC_SIMILARITY, RETRIEVAL_DOCUMENT). Với gemini-embedding-2, tham số task_type không được hỗ trợ. Thay vào đó, bạn nên đưa chỉ dẫn về nhiệm vụ trực tiếp vào câu lệnh cho các nhiệm vụ chỉ có văn bản. Hãy xem phần Các loại tác vụ với Embeddings 2 để biết thông tin chi tiết về cách định dạng câu lệnh cho nhiều trường hợp sử dụng.

  • Tổng hợp mục nhúng: gemini-embedding-001 tạo các mục nhúng riêng lẻ cho từng chuỗi trong danh sách dữ liệu đầu vào. Ngược lại, gemini-embedding-2 tạo ra một mục nhúng tổng hợp duy nhất khi nhiều đầu vào (như văn bản và hình ảnh) được cung cấp trực tiếp trong một yêu cầu. Để tạo các mục nhúng riêng biệt cho từng dữ liệu đầu vào, hãy gói từng dữ liệu đầu vào trong một đối tượng Content hoặc sử dụng Batch API. Hãy xem phần Tổng hợp nhúng để biết thêm thông tin.

  • Chuẩn hoá: Nếu bạn sử dụng output_dimensionality để yêu cầu các mục nhúng có ít hơn 3072 chiều, thì gemini-embedding-2 sẽ tự động chuẩn hoá các mục nhúng bị cắt bớt này. Với gemini-embedding-001, bạn cần thực hiện chuẩn hoá thủ công cho các kích thước khác ngoài 3072. Hãy xem phần Đảm bảo chất lượng cho các kích thước nhỏ hơn để biết thông tin chi tiết.

Nhúng hàng loạt

Nếu độ trễ không phải là vấn đề, hãy thử sử dụng các mô hình Gemini Embeddings với Batch API. Điều này cho phép thông lượng cao hơn nhiều với mức giá bằng 50% giá Nhúng mặc định. Xem các ví dụ về cách bắt đầu trong sổ tay về Batch API.

Thông báo về việc sử dụng có trách nhiệm

Không giống như các mô hình AI tạo sinh tạo ra nội dung mới, mô hình Nhúng Gemini chỉ dùng để chuyển đổi định dạng dữ liệu đầu vào thành dạng biểu diễn số. Mặc dù Google chịu trách nhiệm cung cấp mô hình nhúng chuyển đổi định dạng dữ liệu đầu vào của bạn sang định dạng số được yêu cầu, nhưng người dùng vẫn hoàn toàn chịu trách nhiệm về dữ liệu họ nhập và kết quả nhúng. Bằng việc sử dụng mô hình Gemini Embedding, bạn xác nhận rằng bạn có các quyền cần thiết đối với mọi nội dung mình tải lên. Đừng tạo nội dung vi phạm quyền tài sản trí tuệ hoặc quyền riêng tư của người khác. Khi sử dụng dịch vụ này, bạn phải tuân thủ Chính sách về các hành vi bị cấm và Điều khoản dịch vụ của Google.

Bắt đầu xây dựng bằng các mục nhúng

Hãy xem sổ tay hướng dẫn bắt đầu nhanh về nhúng để khám phá các chức năng của mô hình và tìm hiểu cách tuỳ chỉnh cũng như trực quan hoá các mục nhúng.