Gemini 임베딩 연동
Gemini 임베딩 연동 (gemini)
Google Gemini는 텍스트, 이미지, 비디오, 오디오, PDF 그리고 이들의 교차 조합까지 하나의 통합된 벡터 공간으로 매핑할 수 있는 임베딩 모델을 제공해요. Gemini 아키텍처를 기반으로 하며 100개 이상의 언어를 지원해요.
아래 예시는 Gemini 임베딩을 Qdrant와 통합하는 방법을 보여줘요.
설정 (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-2는 3072차원 임베딩 벡터를 출력해요. 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)를 위한 임베딩.