임베딩

Gemini API는 단어, 구, 문장, 코드의 임베딩을 생성하는 텍스트 임베딩 모델을 제공합니다. 이러한 파운데이션 임베딩은 시맨틱 검색, 분류, 클러스터링과 같은 고급 NLP 작업을 지원하여 키워드 기반 접근 방식보다 더 정확하고 컨텍스트를 인식하는 결과를 제공합니다.

검색 증강 생성 (RAG) 시스템을 빌드하는 것은 임베딩의 일반적인 사용 사례입니다. 임베딩은 사실 기반 정확도, 일관성, 맥락적 풍부함이 개선된 모델 출력을 크게 향상하는 데 중요한 역할을 합니다. 이러한 시스템은 임베딩으로 표현되는 기술 자료에서 관련 정보를 효율적으로 검색한 후 언어 모델의 입력 프롬프트에 추가 컨텍스트로 전달하여 더 많은 정보에 기반한 정확한 대답을 생성하도록 안내합니다.

사용 가능한 임베딩 모델 변형에 대해 자세히 알아보려면 모델 버전 섹션을 참고하세요. 엔터프라이즈급 애플리케이션과 대량 워크로드의 경우 Vertex AI에서 임베딩 모델을 사용하는 것이 좋습니다.

임베딩 생성

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)

자바스크립트

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

문자열 목록으로 전달하여 한 번에 여러 청크의 삽입을 생성할 수도 있습니다.

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)

자바스크립트

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

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

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

다음 예시에서는 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}")

자바스크립트

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

다음은 이 코드 스니펫의 출력 예시를 보여줍니다.

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

지원되는 태스크 유형

작업 유형 설명
SEMANTIC_SIMILARITY 텍스트 유사성을 평가하도록 최적화된 임베딩입니다. 추천 시스템, 중복 감지
분류 사전 설정된 라벨에 따라 텍스트를 분류하도록 최적화된 임베딩 감정 분석, 스팸 감지
클러스터링 유사성을 기반으로 텍스트를 클러스터링하는 데 최적화된 임베딩 문서 정리, 시장 조사, 이상 감지
RETRIEVAL_DOCUMENT 문서 검색에 최적화된 임베딩입니다. 검색을 위해 기사, 책 또는 웹페이지를 색인 생성합니다.
RETRIEVAL_QUERY 일반 검색어에 최적화된 임베딩입니다. 쿼리에는 RETRIEVAL_QUERY를 사용하고 검색할 문서에는 RETRIEVAL_DOCUMENT를 사용합니다. 맞춤검색
CODE_RETRIEVAL_QUERY 자연어 쿼리를 기반으로 코드 블록을 검색하는 데 최적화된 임베딩입니다. 질문에는 CODE_RETRIEVAL_QUERY를 사용하고 검색할 코드 블록에는 RETRIEVAL_DOCUMENT를 사용합니다. 코드 추천 및 검색
QUESTION_ANSWERING 질문에 답변하는 문서를 찾는 데 최적화된 질문 답변 시스템의 질문 임베딩입니다. 질문에는 QUESTION_ANSWERING를 사용하고 검색할 문서에는 RETRIEVAL_DOCUMENT를 사용합니다. 채팅 상자
FACT_VERIFICATION 확인해야 하는 진술의 임베딩으로, 진술을 뒷받침하거나 반박하는 증거가 포함된 문서를 검색하는 데 최적화되어 있습니다. 타겟 텍스트에는 FACT_VERIFICATION를 사용하고 검색할 문서에는 RETRIEVAL_DOCUMENT를 사용합니다. 자동 사실 확인 시스템

임베딩 크기 제어

Gemini 임베딩 모델인 gemini-embedding-001는 Matryoshka Representation Learning (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}")

자바스크립트

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

코드 스니펫의 출력 예시:

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 점수가 나와 있습니다. MTEB는 일반적으로 사용되는 삽입 벤치마크입니다. 특히 결과에 따르면 성능이 임베딩 차원의 크기와 엄격하게 연결되어 있지는 않으며, 낮은 차원이 높은 차원과 비슷한 점수를 달성합니다.

MRL 측정기준 MTEB 점수
2048 68.16
1536 68.17
768 67.99
512 67.55
256 66.19
128 63.31

사용 사례

텍스트 임베딩은 다음과 같은 다양한 일반적인 AI 사용 사례에 매우 중요합니다.

  • 검색 증강 생성 (RAG): 임베딩은 모델의 컨텍스트에서 관련 정보를 검색하고 통합하여 생성된 텍스트의 품질을 향상합니다.
  • 정보 검색: 입력 텍스트가 주어졌을 때 의미상 가장 유사한 텍스트나 문서를 검색합니다.

    문서 검색 튜토리얼

  • 검색 재순위 지정: 쿼리에 대해 초기 결과에 시맨틱 점수를 매겨 가장 관련성 높은 항목에 우선순위를 지정합니다.

    검색 재순위 지정 튜토리얼

  • 이상 감지: 임베딩 그룹을 비교하면 숨겨진 추세나 이상치를 식별하는 데 도움이 됩니다.

    이상 감지 튜토리얼

  • 분류: 감정 분석 또는 스팸 감지와 같은 콘텐츠를 기반으로 텍스트를 자동으로 분류합니다.

    분류 튜토리얼

  • 클러스터링: 임베딩의 클러스터와 시각화를 만들어 복잡한 관계를 효과적으로 파악합니다.

    클러스터링 시각화 튜토리얼

임베딩 저장

임베딩을 프로덕션에 적용할 때는 벡터 데이터베이스를 사용하여 고차원 임베딩을 효율적으로 저장, 색인 생성, 검색하는 것이 일반적입니다. Google Cloud는 BigQuery, AlloyDB, Cloud SQL을 비롯하여 이 용도로 사용할 수 있는 관리형 데이터 서비스를 제공합니다.

다음 튜토리얼에서는 Gemini Embedding과 함께 다른 서드 파티 벡터 데이터베이스를 사용하는 방법을 보여줍니다.

모델 버전

속성 설명
모델 코드

Gemini API

gemini-embedding-001

지원되는 데이터 유형

입력

텍스트

출력

텍스트 임베딩

토큰 한도[*]

입력 토큰 한도

2,048

출력 차원 크기

유연함, 지원: 128~3072, 권장: 768, 1536, 3072

버전
자세한 내용은 모델 버전 패턴을 참고하세요.
  • 안정화 버전: gemini-embedding-001
  • 실험적: gemini-embedding-exp-03-07
최신 업데이트 2025년 6월

책임감 있는 사용 알림

새 콘텐츠를 만드는 생성형 AI 모델과 달리 Gemini Embedding 모델은 입력 데이터의 형식을 수치 표현으로 변환하는 데만 사용됩니다. Google은 입력 데이터의 형식을 요청된 숫자 형식으로 변환하는 삽입 모델을 제공할 책임이 있지만, 사용자는 입력한 데이터와 결과 삽입에 대한 모든 책임을 집니다. Gemini 임베딩 모델을 사용하면 본인이 업로드하는 모든 콘텐츠에 대해 필요한 권리를 보유함을 확인하는 것으로 간주됩니다. 타인의 지식 재산 및 개인 정보 보호 권리를 침해하는 콘텐츠를 생성해서는 안 됩니다. 이 서비스 사용 시 Google의 금지된 사용 정책Google 서비스 약관이 적용됩니다.

임베딩으로 빌드 시작하기

임베딩 빠른 시작 노트북을 확인하여 모델 기능을 살펴보고 임베딩을 맞춤설정하고 시각화하는 방법을 알아보세요.