Gemini API cung cấp các mô hình nhúng văn bản để tạo các mục nhúng cho từ, cụm từ, câu và mã. Những hoạt động nhúng cơ bản này hỗ trợ các tác vụ NLP nâng cao 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, có tính đến ngữ cảnh so với các phương pháp dựa trên từ khoá.
Xây dựng hệ thống Tạo tăng cường truy xuất (RAG) là một trường hợp sử dụng phổ biến cho các mục nhúng. Các vectơ nhúng đóng vai trò quan trọng trong việc cải thiện đáng kể kết quả của mô hình nhờ độ chính xác về thông tin thực tế, tính nhất quán và mức độ phong phú về ngữ cảnh. Các mô hình này truy xuất thông tin liên quan một cách hiệu quả từ cơ sở kiến thức (được biểu thị bằng các vectơ nhúng). Sau đó, các vectơ nhúng này được truyền dưới dạng ngữ cảnh bổ sung trong câu lệnh đầu vào cho các mô hình ngôn ngữ, hướng dẫn mô hình ngôn ngữ tạo ra câu trả lời chính xác và giàu thông tin hơn.
Đối với các ứng dụng cấp doanh nghiệp và khối lượng công việc lớn, bạn nên sử dụng các mô hình nhúng trên Vertex AI.
Tạo vectơ nhúng
Sử dụng phương thức embedContent
để tạo các vectơ nhúng văn bản:
Python
from google import genai
client = genai.Client()
result = client.models.embed_content(
model="gemini-embedding-001",
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-001',
contents: 'What is the meaning of life?',
});
console.log(response.embeddings);
}
main();
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-001",
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-001:embedContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model": "models/gemini-embedding-001",
"content": {"parts":[{"text": "What is the meaning of life?"}]}
}'
Bạn cũng có thể tạo các vectơ nhúng cho nhiều đoạn cùng lúc bằng cách truyền các đoạn đó vào dưới dạng danh sách các chuỗi.
Python
from google import genai
client = genai.Client()
result = client.models.embed_content(
model="gemini-embedding-001",
contents= [
"What is the meaning of life?",
"What is the purpose of existence?",
"How do I bake a cake?"
])
for embedding in result.embeddings:
print(embedding)
JavaScript
import { GoogleGenAI } from "@google/genai";
async function main() {
const ai = new GoogleGenAI({});
const response = await ai.models.embedContent({
model: 'gemini-embedding-001',
contents: [
'What is the meaning of life?',
'What is the purpose of existence?',
'How do I bake a cake?'
],
});
console.log(response.embeddings);
}
main();
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.NewContentFromText("How does photosynthesis work?"),
genai.NewContentFromText("Tell me about the history of the internet."),
}
result, err := client.Models.EmbedContent(ctx,
"gemini-embedding-001",
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-001:embedContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model": "models/gemini-embedding-001",
"content": [
{"parts": [{"text": "What is the meaning of life?"}]},
{"parts": [{"text": "What is the purpose of existence?"}]},
{"parts": [{"text": "How do I bake a cake?"}]}
]
}'
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 vectơ nhúng cho nhiều tác vụ, từ phân loại đến tìm kiếm tài liệu. Việc chỉ định đúng loại nhiệm vụ sẽ 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ả. Để biết danh sách đầy đủ các loại tác vụ được hỗ trợ, hãy xem bảng Các loại tác vụ được hỗ trợ.
Ví dụ sau đây cho thấy cách bạn có thể 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 numpy as np
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 = [
np.array(e.values) for e in client.models.embed_content(
model="gemini-embedding-001",
contents=texts,
config=types.EmbedContentConfig(task_type="SEMANTIC_SIMILARITY")).embeddings
]
# Calculate cosine similarity. Higher scores = greater semantic similarity.
embeddings_matrix = np.array(result)
similarity_matrix = cosine_similarity(embeddings_matrix)
for i, text1 in enumerate(texts):
for j in range(i + 1, len(texts)):
text2 = texts[j]
similarity = similarity_matrix[i, j]
print(f"Similarity between '{text1}' and '{text2}': {similarity:.4f}")
JavaScript
import { GoogleGenAI } from "@google/genai";
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,
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();
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 -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [
{"parts": [{"text": "What is the meaning of life?"}]},
{"parts": [{"text": "What is the purpose of existence?"}]},
{"parts": [{"text": "How do I bake a cake?"}]}
],
"embedding_config": {
"task_type": "SEMANTIC_SIMILARITY"
}
}'
Sau đây là ví dụ về đầu ra từ đoạn mã này:
Similarity between 'What is the meaning of life?' and 'What is the purpose of existence?': 0.9481
Similarity between 'What is the meaning of life?' and 'How do I bake a cake?': 0.7471
Similarity between 'What is the purpose of existence?' and 'How do I bake a cake?': 0.7371
Các loại việc cần làm được hỗ trợ
Loại việc cần làm | Mô tả | Ví dụ |
---|---|---|
SEMANTIC_SIMILARITY | Các vectơ 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 |
PHÂN LOẠI | Các vectơ nhúng được tối ưu hoá để phân loại văn bản theo các nhãn đặt sẵn. | Phân tích tình cảm, phát hiện nội dung rác |
PHÂN CỤM | Các vectơ nhúng được tối ưu hoá để phân cụm văn bản dựa trên mức độ tương đồng. | Sắp xếp tài liệu, nghiên cứu thị trường, phát hiện điểm bất thường |
RETRIEVAL_DOCUMENT | Các vectơ nhúng được tối ưu hoá cho tính năng tìm kiếm tài liệu. | Lập chỉ mục các bài viết, sách hoặc trang web để tìm kiếm. |
RETRIEVAL_QUERY |
Các vectơ được tối ưu hoá cho các cụm từ tìm kiếm chung.
Sử dụng RETRIEVAL_QUERY cho các truy vấn; RETRIEVAL_DOCUMENT cho các tài liệu cần truy xuất.
|
Tìm kiếm tùy chỉnh |
CODE_RETRIEVAL_QUERY |
Các vectơ nhúng được tối ưu hoá để truy xuất các 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 các truy vấn; RETRIEVAL_DOCUMENT cho các khối mã cần truy xuất.
|
Đề xuất và tìm kiếm mã |
QUESTION_ANSWERING |
Các vectơ nhúng cho câu hỏi trong hệ thống trả lời câu hỏi, đượ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 |
Các câu cần được xác minh sẽ được nhúng, tối ưu hoá để truy xuất những tài liệu có bằng chứng ủng hộ hoặc bác bỏ câu đó.
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
Mô hình nhúng Gemini, gemini-embedding-001
, được huấn luyện bằng kỹ thuật Học biểu diễn Matryoshka (MRL) để dạy một mô hình học các thành phần nhúng có 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 đơn giản hơn và hữu ích của cùng một dữ liệu. Bạn có thể chọn sử dụng tính năng nhúng 3072 chiều đầy đủ hoặc có thể cắt bớt tính năng này thành kích thước nhỏ hơn mà không làm giảm chất lượng để tiết kiệm dung lượng lưu trữ. Để có chất lượng tốt nhất, bạn nên sử dụng 768 và 1536 đầu tiên.
Bằng cách sử dụng tham số output_dimensionality
, người dùng có thể kiểm soát kích thước của vectơ nhúng đầu ra. Việc chọn một chiều đầu ra nhỏ hơn có thể giúp bạn tiết kiệm dung lượng lưu trữ và tăng hiệu quả tính toán cho các ứng dụng hạ nguồn, đồng thời giảm thiểu chất lượng.
Python
from google import genai
from google.genai import types
client = genai.Client()
result = client.models.embed_content(
model="gemini-embedding-001",
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-001',
content: 'What is the meaning of life?',
outputDimensionality: 768,
});
const embeddingLength = response.embedding.values.length;
console.log(`Length of embedding: ${embeddingLength}`);
}
main();
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-001",
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-001:embedContent" \
-H "x-goog-api-key: YOUR_GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [
{"parts": [{"text": "What is the meaning of life?"}]}
],
"embedding_config": {
"output_dimensionality": 768
}
}'
Ví dụ về kết quả đầu ra:
Length of embedding: 768
Vectơ nhúng 3072 chiều được chuẩn hoá. Các mục nhúng được chuẩn hoá tạo ra độ tương đồng ngữ nghĩa chính xác hơn bằng cách so sánh hướng vectơ chứ không phải độ lớn. Đối với các phương diện khác, bao gồm 768 và 1536, bạn cần chuẩn hoá các mục nhúng như sau:
Python
import numpy as np
from numpy.linalg import norm
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
Ví dụ về kết quả đầu ra:
Normed embedding length: 768
Norm of normed embedding: 1.000000
Trường hợp sử dụng
Văn bản được nhúng là yếu tố quan trọng đối với 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 vectơ 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 ngữ cảnh của một mô hình.
Truy xuất thông tin: Sử dụng các mục nhúng để tìm kiếm văn bản hoặc tài liệu tương tự về mặt ngữ nghĩa dựa trên một đoạn văn bản đầu vào.
Phát hiện điểm bất thường: Việc so sánh các nhóm vectơ nhúng có thể giúp xác định các xu hướng hoặc giá trị ngoại lệ bị ẩn.
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 quan điểm hoặc phát hiện nội dung rác
Phân cụm: Một cách hiệu quả để nắm bắt các mối quan hệ là tạo các cụm và hình ảnh trực quan về các mục nhúng.
Lưu trữ mục nhúng
Khi đưa các mục nhúng vào sản xuất, bạn thường 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 có 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 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.
Mô hình nhúng
Mô hình được phát hành rộng rãi
Mô hình cũ
embedding-001
(Ngừng hoạt động từ ngày 14 tháng 8 năm 2025)text-embedding-004
(Ngừng hoạt động kể từ ngày 14 tháng 1 năm 2026)
Sử dụng tính năng nhúng
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 Gemini Embedding chỉ nhằm mục đích chuyển đổi định dạng dữ liệu đầu vào của bạn thành một biểu diễn bằng số. Mặc dù Google chịu trách nhiệm cung cấp một mô hình nhúng giúp chuyển đổi định dạng dữ liệu đầu vào của bạn sang định dạng số theo 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 mà họ nhập và các vectơ nhúng thu được. 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 nội dung bạn tải lên. Đừng tạo nội dung vi phạm quyền sở hữu 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 khi sử dụng và Điều khoản dịch vụ của Google.
Bắt đầu xây dựng bằng các thành phần nhúng
Hãy xem sổ tay bắt đầu nhanh về các mục 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.