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) 기법을 사용하여 학습됩니다. 이 기법은 모델이 동일한 데이터의 더 간단한 버전이기도 한 초기 세그먼트 (또는 접두사)가 있는 고차원 임베딩을 학습하도록 합니다. 전체 3072차원 삽입을 사용하거나 품질 저하 없이 더 작은 크기로 잘라 스토리지 공간을 절약할 수 있습니다. 최상의 품질을 위해 첫 번째 768과 1536을 사용하는 것이 좋습니다.
output_dimensionality
매개변수를 사용하면 사용자가 출력 삽입 벡터의 크기를 제어할 수 있습니다. 더 작은 출력 크기를 선택하면 저장용량을 절약하고 다운스트림 애플리케이션의 계산 효율성을 높일 수 있으며 품질 측면에서 손실되는 부분은 거의 없습니다.
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
사용 사례
텍스트 임베딩은 다음과 같은 다양한 일반적인 AI 사용 사례에 매우 중요합니다.
- 검색 증강 생성 (RAG): 임베딩은 모델의 컨텍스트에서 관련 정보를 검색하고 통합하여 생성된 텍스트의 품질을 향상합니다.
정보 검색: 임베딩을 사용하여 입력 텍스트가 주어졌을 때 의미적으로 유사한 텍스트나 문서를 검색합니다.
이상 감지: 임베딩 그룹을 비교하면 숨겨진 추세나 이상치를 식별할 수 있습니다.
분류: 감정 분석 또는 스팸 감지와 같은 콘텐츠를 기반으로 텍스트를 자동으로 분류합니다.
클러스터링: 관계를 파악하는 효과적인 방법은 삽입의 클러스터와 시각화를 만드는 것입니다.
임베딩 저장
임베딩을 프로덕션에 적용할 때는 벡터 데이터베이스를 사용하여 고차원 임베딩을 효율적으로 저장, 색인 생성, 검색하는 것이 일반적입니다. Google Cloud는 BigQuery, AlloyDB, Cloud SQL을 비롯하여 이 용도로 사용할 수 있는 관리형 데이터 서비스를 제공합니다.
다음 튜토리얼에서는 Gemini Embedding과 함께 다른 서드 파티 벡터 데이터베이스를 사용하는 방법을 보여줍니다.
임베딩 모델
정식 버전 모델
레거시 모델
embedding-001
(2025년 8월 14일 지원 중단)text-embedding-004
(2026년 1월 14일 지원 중단)
임베딩 사용
새 콘텐츠를 만드는 생성형 AI 모델과 달리 Gemini Embedding 모델은 입력 데이터의 형식을 수치 표현으로 변환하는 데만 사용됩니다. Google은 입력 데이터의 형식을 요청된 숫자 형식으로 변환하는 삽입 모델을 제공할 책임이 있지만, 사용자는 입력한 데이터와 결과 삽입에 대한 모든 책임을 집니다. Gemini Embedding 모델을 사용하면 본인이 업로드하는 모든 콘텐츠에 대해 필요한 권리를 보유함을 확인하는 것으로 간주됩니다. 타인의 지식 재산이나 개인 정보 보호 권리를 침해하는 콘텐츠를 생성하면 안 됩니다. 이 서비스 사용 시 Google의 금지된 사용 정책 및 Google 서비스 약관이 적용됩니다.
임베딩으로 빌드 시작하기
삽입 빠른 시작 노트북을 확인하여 모델 기능을 살펴보고 삽입을 맞춤설정하고 시각화하는 방법을 알아보세요.