Встраивания

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

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

Подробнее о доступных вариантах моделей встраивания см. в разделе « Версии моделей» . Для корпоративных приложений и высокообъемных рабочих нагрузок мы рекомендуем использовать модели встраивания на базе Vertex AI .

Генерация вложений

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

Питон

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

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

Питон

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

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

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

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

Питон

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

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

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 Встраивание оптимизировано для извлечения блоков кода на основе запросов на естественном языке. Используйте CODE_RETRIEVAL_QUERY для запросов; RETRIEVAL_DOCUMENT для извлечения блоков кода. Предложения кода и поиск
ВОПРОС_ОТВЕТ Встраивание вопросов в вопросно-ответную систему, оптимизированное для поиска документов, отвечающих на вопрос. Используйте QUESTION_ANSWERING для вопросов; RETRIEVAL_DOCUMENT для документов, которые нужно найти. Чатбокс
ПРОВЕРКА_ФАКТ Встраивание для утверждений, требующих проверки, оптимизированное для поиска документов, содержащих доказательства, подтверждающие или опровергающие утверждение. Используйте FACT_VERIFICATION для целевого текста; RETRIEVAL_DOCUMENT для поиска документов. Автоматизированные системы проверки фактов

Управление размером встраивания

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

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

Питон

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: YOUR_GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "contents": [
        {"parts": [{"text": "What is the meaning of life?"}]}
    ],
    "embedding_config": {
        "output_dimensionality": 768
    }
}'

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

Length of embedding: 768

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

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

Питон

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, широко используемого бенчмарка для встраивания, для различных измерений. Примечательно, что результаты показывают, что производительность не строго привязана к размеру встраиваемого измерения: измерения с меньшими размерами достигают оценок, сопоставимых с показателями с большими размерами.

Измерение MRL Оценка MTEB
2048 68.16
1536 68.17
768 67.99
512 67.55
256 66.19
128 63.31

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

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

  • Генерация дополненной информации (RAG): встраивание повышает качество генерируемого текста за счет извлечения и включения релевантной информации в контекст модели.
  • Поиск информации: поиск наиболее семантически схожего текста или документов по заданному фрагменту входного текста.

    Учебное по поиску документов

  • Переоценка результатов поиска : определение приоритетов для наиболее релевантных элементов путем семантической оценки первоначальных результатов по запросу.

    Учебное по переоценке поиска

  • Обнаружение аномалий: сравнение групп внедрений может помочь выявить скрытые тенденции или выбросы.

    Учебное пособие по обнаружению аномалий

  • Классификация: автоматическая классификация текста на основе его содержания, например, анализ настроений или обнаружение спама.

    Классификационный учебник

  • Кластеризация: эффективно изучайте сложные взаимосвязи, создавая кластеры и визуализации ваших внедрений.

    Учебное пособие по визуализации кластеризации

Хранение вложений

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

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

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

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

API Близнецов

gemini-embedding-001

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

Вход

Текст

Выход

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

Лимиты токенов [*]

Лимит входных токенов

2,048

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

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

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

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

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

Начните строительство с встраиваниями

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