Gemini 임베딩 연동

Gemini 임베딩 연동 (gemini)

Google Gemini는 텍스트, 이미지, 비디오, 오디오, PDF 그리고 이들의 교차 조합까지 하나의 통합된 벡터 공간으로 매핑할 수 있는 임베딩 모델을 제공해요. Gemini 아키텍처를 기반으로 하며 100개 이상의 언어를 지원해요.

아래 예시는 Gemini 임베딩을 Qdrant와 통합하는 방법을 보여줘요.

출처: Qdrant 공식 문서 — gemini

설정 (Setup)

먼저 PyPI에서 패키지를 설치해요.

# pip install google-genai qdrant-client
// npm install @google/genai @qdrant/js-client-rest

이제 Embedding Model API로 문서를 임베딩해서 검색(retrieval)에 쓰는 방법을 볼게요. 아래 예시는 gemini-embedding-2 모델과 RETRIEVAL_DOCUMENT task type으로 여러 문서를 임베딩해요.

문서 임베딩 (Embedding a document)

from google.genai import Client, types
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, PointStruct, VectorParams

gemini_client = Client()  # Needs the GEMINI_API_KEY env to be set
client = QdrantClient(url="http://localhost:6333")

texts = [
    "Qdrant is a vector database that is compatible with Gemini.",
    "Gemini is a family of natively multimodal, large language models (LLMs).",
]

embeddings = [
    gemini_client.models.embed_content(
        model="gemini-embedding-2",
        contents=text,
        config=types.EmbedContentConfig(task_type="RETRIEVAL_DOCUMENT"),
    ).embeddings[0]
    for text in texts
]
import { GoogleGenAI } from "@google/genai";
import { QdrantClient } from "@qdrant/js-client-rest";

const geminiClient = new GoogleGenAI(); // Needs the GEMINI_API_KEY env to be set
const client = new QdrantClient({ url: "http://localhost:6333" });

const texts = [
  "Qdrant is a vector database that is compatible with Gemini.",
  "Gemini is a family of natively multimodal, large language models (LLMs).",
];

const embeddings = await Promise.all(
  texts.map(async (text) => {
    const result = await geminiClient.models.embedContent({
      model: "gemini-embedding-2",
      contents: text,
      config: { taskType: "RETRIEVAL_DOCUMENT" },
    });
    return result.embeddings[0];
  })
);

참고: gemini-embedding-2는 입력이 여러 개면 하나로 합쳐진(aggregated) 임베딩 하나를 반환해요. 그래서 각 텍스트를 따로 임베딩하고, 호출(caller) 쪽에서 병렬화하는 게 좋아요.

gemini_client = Client()GEMINI_API_KEY 환경 변수가 설정되어 있어야 동작해요.

Qdrant 포인트 만들고 문서 인덱싱하기

Qdrant 포인트 만들기

points = [
    PointStruct(
        id=idx,
        vector=embedding.values,
        payload={"text": text},
    )
    for idx, (embedding, text) in enumerate(zip(embeddings, texts))
]
const points = texts.map((text, idx) => ({
  id: idx,
  vector: embeddings[idx].values,
  payload: { text },
}));

컬렉션 만들기 (Create Collection)

기본적으로 gemini-embedding-23072차원 임베딩 벡터를 출력해요. output_dimensionality 구성으로 이 크기를 더 작게(예: 768, 1536) 줄여서 저장 공간을 아낄 수 있어요. 위 예시에서는 기본값인 3072차원을 유지해요.

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=VectorParams(
        size=3072,
        distance=Distance.COSINE,
    )
)
await client.createCollection("{collection_name}", {
  vectors: { size: 3072, distance: "Cosine" },
});

컬렉션에 추가하기

client.upsert("{collection_name}", points)
await client.upsert("{collection_name}", { points });

문서 검색하기

문서가 인덱싱되면 같은 모델과 RETRIEVAL_QUERY task type으로 가장 관련성 높은 문서를 검색할 수 있어요.

query_result = gemini_client.models.embed_content(
    model="gemini-embedding-2",
    contents="Is Qdrant compatible with Gemini?",
    config=types.EmbedContentConfig(task_type="RETRIEVAL_QUERY"),
)
client.query_points(
    collection_name="{collection_name}",
    query=query_result.embeddings[0].values,
)
const queryResult = await geminiClient.models.embedContent({
  model: "gemini-embedding-2",
  contents: "Is Qdrant compatible with Gemini?",
  config: { taskType: "RETRIEVAL_QUERY" },
});
const searchResult = await client.query("{collection_name}", {
  query: queryResult.embeddings[0].values,
});

PDF 같은 파일도 직접 임베딩할 수 있어요.

with open("filename.pdf", "rb") as f:
    pdf_bytes = f.read()
pdf_part = types.Part.from_bytes(
    data=pdf_bytes,
    mime_type='application/pdf',
)
gemini_client.models.embed_content(
    model="gemini-embedding-2",
    contents=[pdf_part],
)
import { readFileSync } from "fs";
const pdfBytes = readFileSync("filename.pdf");
const base64 = pdfBytes.toString("base64");
await geminiClient.models.embedContent({
  model: "gemini-embedding-2",
  contents: [{ parts: [{ inlineData: { mimeType: "application/pdf", data: base64 } }] }],
});

지원되는 task types

API 호출에서 task_type 파라미터를 지정할 수 있어요. 이 파라미터는 임베딩의 의도된 용도를 나타내며, 의도된 관계에 맞게 임베딩을 최적화해 줘요.

Embedding Model API는 다양한 task type을 지원해요.

  • RETRIEVAL_DOCUMENT — 문서 검색에 최적화된 임베딩. 기사, 책, 웹 페이지를 인덱싱할 때 써요.
  • RETRIEVAL_QUERY — 일반 검색 쿼리에 최적화된 임베딩. 쿼리에는 RETRIEVAL_QUERY, 검색 대상 문서에는 RETRIEVAL_DOCUMENT를 써요.
  • SEMANTIC_SIMILARITY — 텍스트 유사도를 평가하기에 최적화된 임베딩.
  • CLASSIFICATION — 사전 정의된 라벨에 따라 텍스트를 분류하기에 최적화된 임베딩.
  • CLUSTERING — 유사도에 따라 텍스트를 군집화하기에 최적화된 임베딩.
  • CODE_RETRIEVAL_QUERY — 자연어 쿼리로 코드 블록을 검색하기에 최적화된 임베딩.
  • QUESTION_ANSWERING — 질문-답변 시스템의 질문을 위한 임베딩.
  • FACT_VERIFICATION — 검증이 필요한 명제(statement)를 위한 임베딩.

더 읽을거리 (Further Reading)

더 알아보기 (Learn more)