임베딩

Gemini API는 텍스트, 이미지, 동영상, 기타 콘텐츠의 임베딩을 생성하는 임베딩 모델을 제공합니다. 이러한 결과 임베딩은 시맨틱 검색, 분류, 클러스터링과 같은 작업에 사용할 수 있으며, 키워드 기반 접근 방식보다 더 정확하고 맥락을 인식하는 결과를 제공합니다.

최신 모델인 gemini-embedding-2는 Gemini API의 첫 번째 멀티모달 임베딩 모델입니다. 텍스트, 이미지, 동영상, 오디오, 문서를 통합된 임베딩 공간에 매핑하여 100개 이상의 언어로 교차 모달 검색, 분류, 클러스터링을 지원합니다. 자세한 내용은 멀티모달 임베딩 섹션을 참고하세요. 텍스트 전용 사용 사례의 경우 gemini-embedding-001를 계속 사용할 수 있습니다.

검색 증강 생성 (RAG) 시스템을 빌드하는 것은 AI 제품의 일반적인 사용 사례입니다. 임베딩은 사실 정확성, 일관성, 맥락 풍부성을 개선하여 모델 출력을 크게 향상하는 데 중요한 역할을 합니다. 관리형 RAG 솔루션을 사용하려면 RAG를 더 쉽게 관리하고 비용 효율적으로 수행할 수 있는 파일 검색 도구를 사용하세요.

임베딩 생성

embedContent 메서드를 사용하여 텍스트 임베딩을 생성합니다.

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)

자바스크립트

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

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

성능을 개선하기 위해 작업 유형 지정

분류부터 문서 검색까지 다양한 작업에 임베딩을 사용할 수 있습니다. 올바른 태스크 유형을 지정하면 의도한 관계에 맞게 임베딩을 최적화하여 정확성과 효율성을 극대화할 수 있습니다.

임베딩 2의 태스크 유형

gemini-embedding-2를 사용하는 텍스트 전용 작업의 경우 프롬프트에 작업 지침을 추가하는 것이 좋습니다. 올바른 작업 접두사를 사용하여 질문과 문서의 형식을 지정하면 됩니다.

다음 표는 gemini-embedding-2 모델을 사용하여 대칭 및 비대칭 사용 사례에 맞게 쿼리와 문서를 포맷하는 방법을 보여줍니다.

검색 사용 사례 (비대칭 형식)

비대칭 사용 사례에서는 쿼리에 작업 접두사를 추가하고 삽입하고 검색하려는 콘텐츠에 문서 구조를 적용합니다.

사용 사례 쿼리 구조 문서 구조
검색어 task: search result | query: {content} title: {title} | text: {content}
제목이 없으면 title: none을 사용합니다.
질의 응답 task: question answering | query: {content} title: {title} | text: {content}
사실확인 task: fact checking | query: {content} title: {title} | text: {content}
코드 검색 task: code retrieval | query: {content} title: {title} | text: {content}

사용 예

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

단일 입력 사용 사례 (대칭 형식)

대칭 사용 사례에서는 동일한 작업에 대해 질문과 문서에 동일한 형식을 사용합니다.

사용 사례 입력 구조
분류 task: classification | query: {content}
클러스터링 task: clustering | query: {content}
의미론적 유사도 task: sentence similarity | query: {content}
검색 또는 검색에는 사용하지 마세요. 의미론적 텍스트 유사성을 위한 것입니다.

사용 예

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

작업을 일관되게 사용하는 것이 중요합니다. 예를 들어 문서가 f'task: classification | query: {content}'로 삽입된 경우 쿼리도 이 작업 형식을 따라 삽입해야 합니다.

임베딩 1이 있는 태스크 유형

gemini-embedding-001의 경우 embedContent 메서드에서 task_type를 지정할 수 있습니다. 지원되는 작업 유형의 전체 목록은 지원되는 작업 유형 표를 참고하세요.

다음 예에서는 SEMANTIC_SIMILARITY를 사용하여 텍스트 문자열의 의미가 얼마나 유사한지 확인하는 방법을 보여줍니다.

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)

자바스크립트

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

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