OpenAI Embedding
OpenAI Embedding
OpenAI의 텍스트 임베딩 API. text-embedding-ada-002 등.
OpenAI Embedding
OpenAI의 텍스트 임베딩 API. text-embedding-ada-002 등.
OpenAI Embedding은 텍스트를 고차원 벡터(숫자 배열)로 변환하는 API 서비스입니다. 이 벡터는 텍스트의 의미를 수치로 표현하여, 유사한 의미의 텍스트는 벡터 공간에서 가까이 위치합니다. 시맨틱 검색, RAG, 추천 시스템, 클러스터링 등에 핵심적으로 사용됩니다.
2022년 text-embedding-ada-002가 출시되며 대중화되었고, 2024년 text-embedding-3-small/large가 출시되어 성능과 비용 효율이 크게 향상되었습니다. text-embedding-3 시리즈는 dimensions 파라미터로 벡터 크기를 조절할 수 있어 저장 공간 최적화가 가능합니다.
Embedding은 텍스트를 의미 기반으로 비교할 수 있게 합니다. 키워드 검색과 달리 "강아지"와 "반려견"이 유사하다는 것을 인식하고, "Apple 회사"와 "사과 과일"을 구분할 수 있습니다. 코사인 유사도(cosine similarity)로 벡터 간 거리를 측정합니다.
실무에서 가장 흔한 활용은 RAG(검색 증강 생성)입니다. 문서를 임베딩으로 변환해 벡터 DB에 저장하고, 질문이 들어오면 유사한 문서를 검색해 LLM에 컨텍스트로 제공합니다. text-embedding-3-small은 $0.02/1M 토큰으로 대부분의 용도에 충분하며, 고품질이 필요하면 text-embedding-3-large($0.13/1M)를 사용합니다.
# OpenAI Embedding API 사용 예제
# pip install openai numpy
from openai import OpenAI
import numpy as np
client = OpenAI()
# ===== 1. 기본 임베딩 생성 =====
response = client.embeddings.create(
model="text-embedding-3-small",
input="인공지능은 미래 기술의 핵심입니다."
)
embedding = response.data[0].embedding
print(f"임베딩 차원: {len(embedding)}") # 1536
# ===== 2. 배치 임베딩 (여러 텍스트) =====
texts = [
"강아지는 귀엽습니다.",
"반려견과 함께 산책했어요.",
"오늘 날씨가 좋습니다."
]
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
embeddings = [item.embedding for item in response.data]
print(f"생성된 임베딩 수: {len(embeddings)}")
# ===== 3. 차원 축소 (비용/저장 최적화) =====
response = client.embeddings.create(
model="text-embedding-3-small",
input="테스트 문장입니다.",
dimensions=512 # 기본 1536에서 512로 축소
)
print(f"축소된 차원: {len(response.data[0].embedding)}") # 512
# ===== 4. 코사인 유사도 계산 =====
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 유사도 비교
query = "귀여운 강아지"
query_emb = client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
for i, text in enumerate(texts):
similarity = cosine_similarity(query_emb, embeddings[i])
print(f"'{text}' 유사도: {similarity:.4f}")
# 출력:
# '강아지는 귀엽습니다.' 유사도: 0.8912
# '반려견과 함께 산책했어요.' 유사도: 0.7234
# '오늘 날씨가 좋습니다.' 유사도: 0.3456
# ===== 5. RAG용 문서 검색 함수 =====
def find_similar_documents(query, documents, top_k=3):
"""쿼리와 가장 유사한 문서 top_k개 반환"""
# 쿼리 임베딩
query_emb = client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
# 문서 임베딩 (실제로는 미리 계산해서 DB에 저장)
doc_embeddings = client.embeddings.create(
model="text-embedding-3-small",
input=documents
)
# 유사도 계산 및 정렬
similarities = []
for i, doc_emb in enumerate(doc_embeddings.data):
sim = cosine_similarity(query_emb, doc_emb.embedding)
similarities.append((i, sim, documents[i]))
similarities.sort(key=lambda x: x[1], reverse=True)
return similarities[:top_k]
# 사용 예시
# results = find_similar_documents("AI 기술", documents)
"문서 검색에 text-embedding-3-small 쓰면 됩니다. $0.02/1M 토큰이라 100만 문서 임베딩해도 20달러 정도고, dimensions=512로 줄이면 벡터 DB 비용도 절반으로 줄어요. 정확도 손실은 5% 미만입니다."
"OpenAI Embedding은 텍스트의 의미를 고차원 벡터로 변환합니다. text-embedding-3 시리즈는 MTEB 벤치마크 상위권이고, dimensions 파라미터로 256~3072 사이 조절이 가능합니다. RAG에서는 청크된 문서를 임베딩해 벡터 DB에 저장하고, 쿼리와 코사인 유사도로 검색합니다."
"검색 정확도가 낮으면 청크 크기 문제일 수 있어요. 512토큰 청크에 128토큰 오버랩이 일반적인 시작점이고, 도메인에 따라 조정이 필요합니다. large 모델로 바꾸면 10% 정도 향상되지만 비용이 6배입니다."
임베딩은 한 번 생성하면 변하지 않습니다. 반드시 벡터 DB(Pinecone, Chroma 등)에 저장해서 재사용하세요.
text-embedding-3은 최대 8191 토큰입니다. 긴 문서는 적절한 크기로 청킹(chunking)해야 합니다.
문서를 적절한 크기로 청킹 → 임베딩 생성 → 벡터 DB 저장 → 쿼리 시 유사 문서 검색. Batch API 사용 시 50% 비용 절감 가능.