Встраивания

API Gemini предлагает модели векторного представления текста для генерации встраивания слов, фраз, предложений и кода. Эти базовые модели используются в сложных задачах обработки естественного языка, таких как семантический поиск, классификация и кластеризация, обеспечивая более точные и контекстно-зависимые результаты, чем подходы, основанные на ключевых словах.

Создание систем генерации с расширенным поиском информации (Retrieval Augmented Generation, RAG) — распространенный пример использования эмбеддингов. Эмбеддинги играют ключевую роль в значительном улучшении выходных данных модели за счет повышения фактической точности, согласованности и контекстной насыщенности. Они эффективно извлекают релевантную информацию из баз знаний, представленных эмбеддингами, которая затем передается в качестве дополнительного контекста во входном запросе языковым моделям, направляя их на генерацию более обоснованных и точных ответов.

Чтобы узнать больше о доступных вариантах модели встраивания, см. раздел « Версии модели» . Для более высокой пропускной способности при вдвое меньшей цене попробуйте пакетное встраивание API .

Генерация эмбеддингов

Для генерации текстовых вставок используйте метод embedContent :

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();

Идти

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

ОТДЫХ

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

Также можно создавать векторные представления для нескольких фрагментов одновременно, передавая их в виде списка строк.

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();

Идти

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

ОТДЫХ

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"requests": [{
    "model": "models/gemini-embedding-001",
    "content": {
    "parts":[{
        "text": "What is the meaning of life?"}]}, },
    {
    "model": "models/gemini-embedding-001",
    "content": {
    "parts":[{
        "text": "How much wood would a woodchuck chuck?"}]}, },
    {
    "model": "models/gemini-embedding-001",
    "content": {
    "parts":[{
        "text": "How does the brain work?"}]}, }, ]}' 2> /dev/null | grep -C 5 values
    ```

Укажите тип задачи для повышения производительности.

Эмбеддинги можно использовать для решения широкого спектра задач, от классификации до поиска документов. Указание правильного типа задачи помогает оптимизировать эмбеддинги для предполагаемых взаимосвязей, обеспечивая максимальную точность и эффективность. Полный список поддерживаемых типов задач см. в таблице «Поддерживаемые типы задач» .

В следующем примере показано, как использовать SEMANTIC_SIMILARITY для проверки степени сходства смысловых значений текстовых строк.

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();

Идти

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

ОТДЫХ

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

Ниже приведен пример выходных данных из этого фрагмента кода:

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

Поддерживаемые типы задач

Тип задачи Описание Примеры
СЕМАНТИЧЕСКОЕ СХОДСТВО Оптимизированные векторные представления для оценки сходства текста. Рекомендательные системы, обнаружение дубликатов
КЛАССИФИКАЦИЯ Оптимизированные векторные представления для классификации текстов в соответствии с заданными метками. Анализ настроений, обнаружение спама
КЛАСТЕРИЗАЦИЯ Оптимизированные векторные представления позволяют кластеризовать тексты на основе их сходства. Организация документации, исследование рынка, выявление аномалий.
ПОЛУЧЕНИЕ ДОКУМЕНТА Встраивания, оптимизированные для поиска по документам. Индексирование статей, книг или веб-страниц для поиска.
RETRIEVAL_QUERY Встраивания оптимизированы для общих поисковых запросов. Используйте RETRIEVAL_QUERY для запросов; RETRIEVAL_DOCUMENT для извлекаемых документов. Пользовательский поиск
ЗАПРОС НА ПОЛУЧЕНИЕ КОДА Встраивания, оптимизированные для извлечения блоков кода на основе запросов на естественном языке. Используйте CODE_RETRIEVAL_QUERY для запросов; RETRIEVAL_DOCUMENT для извлечения блоков кода. Предложения по коду и поиск
ВОПРОСЫ И ОТВЕТЫ Встраивание вопросов в систему вопросов и ответов, оптимизированное для поиска документов, отвечающих на вопрос. Используйте QUESTION_ANSWERING для вопросов; RETRIEVAL_DOCUMENT для извлекаемых документов. Чат
ПРОВЕРКА ФАКТОВ Встраивания для утверждений, требующих проверки, оптимизированы для поиска документов, содержащих доказательства, подтверждающие или опровергающие утверждение. Используйте FACT_VERIFICATION для целевого текста; RETRIEVAL_DOCUMENT для поиска документов. Автоматизированные системы проверки фактов

Контроль размера встраивания

Модель эмбеддинга Gemini, gemini-embedding-001 , обучается с использованием метода обучения представлению «матрёшка» (MRL), который учит модель изучать многомерные эмбеддинги, начальные сегменты (или префиксы) которых также являются полезными, более простыми версиями тех же данных.

Используйте параметр output_dimensionality для управления размером выходного вектора эмбеддинга. Выбор меньшей размерности выходного вектора может сэкономить место для хранения и повысить вычислительную эффективность для последующих приложений, практически не жертвуя качеством. По умолчанию выводится 3072-мерный вектор эмбеддинга, но вы можете уменьшить его размер без потери качества, чтобы сэкономить место для хранения. Мы рекомендуем использовать 768, 1536 или 3072 размерности выходного вектора.

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();

Идти

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

ОТДЫХ

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 '{
        "content": {"parts":[{ "text": "What is the meaning of life?"}]},
        "output_dimensionality": 768
    }'

Пример вывода из фрагмента кода:

Length of embedding: 768

Обеспечение качества для меньших размеров

Векторные представления для 3072 измерений нормализованы. Нормализованные векторные представления обеспечивают более точное семантическое сходство за счет сравнения направления вектора, а не его величины. Для других измерений, включая 768 и 1536, необходимо нормализовать векторные представления следующим образом:

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

Пример выходных данных из этого фрагмента кода:

Normed embedding length: 768
Norm of normed embedding: 1.000000

В следующей таблице показаны результаты MTEB — широко используемого бенчмарка для эмбеддингов — для различных размерностей. Примечательно, что результаты показывают, что производительность не строго зависит от размера размерности эмбеддинга: эмбеддинги с меньшей размерностью показывают результаты, сопоставимые с эмбеддингами с большей размерностью.

Размерность МRL Оценка MTEB
2048 68.16
1536 68.17
768 67.99
512 67.55
256 66.19
128 63.31

Варианты использования

Встраивание текста имеет решающее значение для целого ряда распространенных сценариев использования ИИ, таких как:

Хранение эмбеддингов

При внедрении эмбеддингов в производство часто используются векторные базы данных для эффективного хранения, индексирования и извлечения многомерных эмбеддингов. Google Cloud предлагает управляемые сервисы данных, которые можно использовать для этой цели, включая BigQuery , AlloyDB и Cloud SQL .

В следующих руководствах показано, как использовать сторонние векторные базы данных с Gemini Embedding.

Версии моделей

Свойство Описание
Код модели

API Gemini

gemini-embedding-001

Поддерживаемые типы данных

Вход

Текст

Выход

Встраивание текста

Ограничения на количество токенов [*]

Ограничение на количество введенных токенов

2048

Размеры выходных данных

Гибкий, поддерживает: 128–3072, рекомендуется: 768, 1536, 3072

версии
Для получения более подробной информации ознакомьтесь с шаблонами версий модели .
  • Стабильная версия: gemini-embedding-001
  • Экспериментальная функция: gemini-embedding-exp-03-07 (устареет в октябре 2025 г.)
Последнее обновление Июнь 2025 г.

Пакетные встраивания

Если задержка не является проблемой, попробуйте использовать модель Gemini Embeddings с Batch API . Это позволит значительно повысить пропускную способность при цене, составляющей 50% от стоимости интерактивного Embedding. Примеры начала работы можно найти в руководстве по Batch API .

Уведомление об ответственном использовании

В отличие от генеративных моделей ИИ, создающих новый контент, модель Gemini Embedding предназначена только для преобразования формата ваших входных данных в числовое представление. Хотя Google отвечает за предоставление модели встраивания, которая преобразует формат ваших входных данных в запрошенный числовой формат, пользователи сохраняют полную ответственность за вводимые ими данные и полученные в результате встраивания. Используя модель Gemini Embedding, вы подтверждаете, что обладаете необходимыми правами на любой загружаемый вами контент. Не создавайте контент, нарушающий права интеллектуальной собственности или права на неприкосновенность частной жизни других лиц. Использование вами этого сервиса регулируется нашей Политикой запрещенного использования и Условиями использования Google .

Начните создавать с помощью эмбеддингов.

Ознакомьтесь с кратким руководством по эмбеддингам , чтобы изучить возможности модели и узнать, как настраивать и визуализировать ваши эмбеддинги.

Уведомление об устаревании устаревших моделей

Следующие модели будут выведены из эксплуатации в октябре 2025 года: - embedding-001 - embedding-gecko-001 - gemini-embedding-exp-03-07 ( gemini-embedding-exp )