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ố
contentssẽ 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ượngContentvà truyền các đối tượng đó vào tham sốcontentssẽ 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ư:
- Tạo sinh tăng cường khả năng truy xuất (RAG): Các mục nhúng giúp nâng cao chất lượng của văn bản được tạo bằng cách truy xuất và kết hợp thông tin liên quan vào bối cảnh của một mô hình.
Truy xuất thông tin: Tìm kiếm văn bản hoặc tài liệu có ngữ nghĩa tương tự nhất dựa trên một đoạn văn bản đầu vào.
Xếp hạng lại kết quả tìm kiếm: Ưu tiên các mục phù hợp nhất bằng cách chấm điểm ngữ nghĩa cho kết quả ban đầu so với cụm từ tìm kiếm.
Phát hiện hoạt động bất thường: Việc so sánh các nhóm nhúng có thể giúp xác định các xu hướng ẩn hoặc điểm ngoại lệ.
Phân loại: Tự động phân loại văn bản dựa trên nội dung, chẳng hạn như phân tích cảm xúc hoặc phát hiện tin nhắn rác
Phân cụm: Nắm bắt hiệu quả các mối quan hệ phức tạp bằng cách tạo các cụm và hình ảnh trực quan cho các mục nhúng.
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
|
| 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 |
|
| 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
|
| 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 |
|
| 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ớigemini-embedding-2, tham sốtask_typekhô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-001tạ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-2tạ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ượngContenthoặ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-2sẽ tự động chuẩn hoá các mục nhúng bị cắt bớt này. Vớigemini-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.