임베딩 모델 통합
임베딩 모델 통합 (Embedding model integrations)
임베딩 모델은 문장·문단·트윗 같은 원문 텍스트를 그 의미를 담은 고정 길이 벡터로 변환해요. 이 벡터 덕분에 정확한 단어 대신 의미 기준으로 텍스트를 비교·검색할 수 있고, 아이디어가 비슷한 텍스트는 벡터 공간에서 가까이 놓입니다. 예를 들어 *"machine learning"*이라는 문구만 매칭하는 대신, 다른 표현을 쓰더라도 관련 개념을 다루는 문서를 찾아낼 수 있어요. (현재 LangChain은 텍스트 기반 임베딩 모델을 다루며, 멀티모달 임베딩은 미지원.)
출처: 공식문서
작동 방식
- 벡터화 (Vectorization): 모델이 각 입력 문자열을 고차원 벡터로 인코딩.
- 유사도 점수 (Similarity scoring): 벡터를 수학적 지표로 비교해 텍스트 간 연관성을 측정.
유사도 지표: 코사인 유사도(Cosine similarity, 두 벡터 사이 각도), 유클리드 거리(Euclidean distance, 점 사이 직선 거리), 내적(Dot product, 한 벡터가 다른 벡터에 투영된 정도).
import numpy as np
def cosine_similarity(vec1, vec2):
dot = np.dot(vec1, vec2)
return dot / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
similarity = cosine_similarity(query_embedding, document_embedding)
print("Cosine Similarity:", similarity)
인터페이스 (Interface)
LangChain은 텍스트 임베딩 모델을 위한 표준 인터페이스를 Embeddings로 제공해요. 주요 메서드 두 가지:
embed_documents(texts: List[str]) → List[List[float]]: 문서 목록을 임베딩.embed_query(text: str) → List[float]: 단일 쿼리를 임베딩.
인터페이스는 쿼리와 문서를 각각 다른 전략으로 임베딩할 수 있게 허용하지만, 실제로는 대부분의 프로바이더가 같은 방식으로 처리해요.
인기 통합 (Top integrations)
대표적으로 AzureOpenAIEmbeddings, OpenAIEmbeddings, GoogleGenerativeAIEmbeddings, OllamaEmbeddings, DatabricksEmbeddings, Sentence Transformers on Hugging Face, MistralAIEmbeddings, CohereEmbeddings, NVIDIAEmbeddings, PerplexityEmbeddings, TogetherEmbeddings 등이 있어요. 전체 목록은 아래 "모든 임베딩 모델" 섹션을 참고하세요.
일반적인 배포 패턴
실무에서 대부분 팀은 네 패턴 중 하나로 수렴해요.
- 호스티드 플래그십: OpenAI
text-embedding-3-large, Cohereembed-english-v3, Googlegemini-embedding-001, Voyagevoyage-3. API 호출 한 번, 기본으로 최상급 품질, 로컬 인프라 불필요. 호출당 비용과 데이터 이탈 의존성 존재. - 로컬 오픈소스:
BAAI/bge-*,mixedbread-ai/mxbai-embed-*,Qwen/Qwen3-Embedding-*,nomic-ai/modernbert-embed-*,sentence-transformers/all-*. 한 번 다운로드하면 어디서든 실행, 호출당 비용 없음, 데이터가 환경 밖으로 안 나감. 소규모에선 호스티드 API보다 CPU에서 느릴 수 있고 GPU가 있으면 경쟁력 있거나 더 빠름. - 로컬 오픈소스 스페셜리스트: 도메인·언어·태스크에 특화된 미세튠 모델. 강한 오픈 베이스(예:
BAAI/bge-m3)에서 시작해 몇 천 개 인도메인 쌍으로 미세튠하면 해당 도메인 retrieval 정확도에서 호스티드 플래그십을 이기는 경우가 많음. - 프로덕션 규모 셀프호스트: 같은 오픈 모델을 Text Embeddings Inference (TEI)나 Ollama로 서빙. 로컬 추론의 경제성 + 호스티드 프로바이더의 수평 확장과 API 편의성.
LangChain은 네 패턴을 동일하게 취급해요 — Embeddings 서브클래스를 인스턴스화해 벡터스토어나 리트리버에 넘기면 됩니다. 패턴 (2)(3)은 HuggingFaceEmbeddings, 패턴 (4)는 TEI의 OpenAI 호환 엔드포인트에 OpenAIEmbeddings, 또는 OllamaEmbeddings를 써요.
고려 요소
- 품질 (Quality): MTEB 리더보드에서 시작. retrieval·clustering·classification·reranking 전반을 벤치마크하며 업계 기준이에요. 리더보드 수치가 항상 그대로 전이되진 않으니 커밋 전에
우리 데이터로 소규모 평가를 돌려보세요(LangSmith 도구 활용). - 비용 (Cost): 호스티드 임베딩은 백만 토큰당 수 센트에서 ~$0.15 범위. 한 번 임베딩하고 하루 수천 번 조회하는 코퍼스는 보통 쿼리 측 비용이 지배적. 로컬 추론은 호출당 비용 0이지만 CPU(느림) 또는 GPU(자본/클라우드 비용)가 필요.
- 지연시간 (Latency): 호스티드 임베딩 API는 요청당 약 50-200ms 네트워크 지연 추가. 로컬 CPU는 작은 모델(
all-MiniLM-L6-v2급)로 짧은 쿼리에 10-100ms, 큰 모델에 50-500ms. GPU에선 로컬이 호스티드 왕복보다 보통 빠름. 배치 인덱싱은 요청당 지연보다 처리량이 중요 — GPU에서HuggingFaceEmbeddings에encode_kwargs={"batch_size": 64}이상 고려. - 차원 (Dimensionality): 384(소형 ST 모델), 768(
all-mpnet-base-v2,bge-base), 1024(bge-large, Cohere v3, Voyage), 1536(OpenAItext-embedding-3-small, Qwen3-Embedding-0.6B), 3072+(OpenAItext-embedding-3-large, Qwen3-Embedding-4B/8B). 큰 벡터는 보통 더 정확하지만 저장·쿼리 연산을 더 소비. 여러 최신 모델(OpenAItext-embedding-3-*,mixedbread-ai/mxbai-embed-large-v1, Matryoshka 학습 ST 모델, Qwen3-Embedding)이 truncation을 지원해 더 작은 차원으로 품질 저하를 완만하게 잘라냄. - 컨텍스트 길이: 대부분 클래식 모델이 512 토큰에 그침. 최신 모델은
nomic-ai/modernbert-embed-base·Alibaba-NLP/gte-multilingual-base·BAAI/bge-m3(8192), OpenAItext-embedding-3-*(8191)처럼 더 긴 컨텍스트 지원. 청크가 길면 긴 컨텍스트 모델 선호. - 다국어:
BAAI/bge-m3,intfloat/multilingual-e5-*,Alibaba-NLP/gte-multilingual-*,Qwen/Qwen3-Embedding-*(오픈,HuggingFaceEmbeddings경유), Cohereembed-multilingual-v3, OpenAItext-embedding-3-*(호스티드). - 쿼리·문서 프롬프트: E5·BGE·Qwen3-Embedding·GTE 같은 여러 최신 오픈 모델은 쿼리와 문서에 다른 텍스트 프리픽스를 학습했어요.
HuggingFaceEmbeddings로 쓸 때 프롬프트를 명시적으로 전달하세요.from langchain_huggingface import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings( model_name="intfloat/e5-large-v2", encode_kwargs={"prompt": "passage: "}, query_encode_kwargs={"prompt": "query: "}, ) - 라이선싱: 대부분 인기 오픈 임베딩 모델이 허용적(Apache 2.0, MIT). 최근 일부 스페셜리스트 모델은 프로덕션 사용에 상용 라이선스 필요. 배포 전 라이선스 확인.
단일 벡터 덴스 임베딩 너머
- 스파스·하이브리드 retrieval: 덴스 임베딩은 정확 매칭 쿼리(제품 코드·명명 엔티티·코드 식별자)를 키워드 인덱스만큼 잘 못 다뤄요. 하이브리드 retrieval은 덴스 인덱스 + BM25 또는 스파스 신경 인덱스(SPLADE,
BAAI/bge-m3의 스파스 출력)를 결합. - Late-interaction·멀티벡터: ColBERT 스타일 모델은 청크별이 아니라 토큰별 벡터를 만들고 late interaction으로 쿼리를 문서에 스코어링. 복잡한 쿼리에서 단일 벡터 덴스 retrieval보다 보통 정확하지만 저장은 더 크고 인덱싱은 더 복잡. 오픈 모델로
jinaai/jina-colbert-v2,answerdotai/answerai-colbert-small-v1,lightonai/LateOn등. LangChain 내장 리트리버는 단일 벡터 임베딩을 타깃 — late interaction은 보통 전문화 인덱스(Vespa, Qdrant 멀티벡터, PyLate) 필요.
시작점 (Starting points)
- 빠른 프로토타입(호스티드):
OpenAIEmbeddings(model="text-embedding-3-small") - 빠른 프로토타입(로컬, API 키 없음):
HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", encode_kwargs={"normalize_embeddings": True}) - 프로덕션(호스티드, 품질 우선):
VoyageAIEmbeddings(model="voyage-3")또는OpenAIEmbeddings(model="text-embedding-3-large") - 프로덕션(오픈, 품질 우선):
HuggingFaceEmbeddings(model_name="BAAI/bge-m3", encode_kwargs={"normalize_embeddings": True})(TEI로 서빙) - 다국어(오픈):
HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large")+ 쿼리/문서 프롬프트 설정
캐싱 (Caching)
임베딩을 저장하거나 임시 캐시해 재계산을 피할 수 있어요. CacheBackedEmbeddings는 텍스트를 해시해 키로 쓰는 키-값 스토어에 임베딩을 저장해요. 주된 초기화 방법은 from_bytes_store이며 인자는: underlying_embedder(임베딩에 쓸 embedder), document_embedding_cache(문서 임베딩 캐시용 ByteStore), batch_size(선택, 스토어 업데이트 사이 문서 수), namespace(선택, 캐시 충돌 방지 — 임베딩 모델 이름으로 설정 권장), query_embedding_cache(선택, 쿼리 임베딩 캐시 ByteStore 또는 True로 문서 캐시 재사용).
⚠️ 이기종 임베딩 모델을 쓸 때 충돌을 피하려면 항상
namespace를 설정하세요. 또CacheBackedEmbeddings는 기본적으로 쿼리 임베딩을 캐시하지 않아요 — 원하면query_embedding_cache를 지정해야 합니다.
import time
from langchain_classic.embeddings import CacheBackedEmbeddings # [!code highlight]
from langchain_classic.storage import LocalFileStore # [!code highlight]
from langchain_core.vectorstores import InMemoryVectorStore
# Create your underlying embeddings model
underlying_embeddings = ... # e.g., OpenAIEmbeddings(), HuggingFaceEmbeddings(), etc.
store = LocalFileStore("./cache/") # [!code highlight]
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings,
store,
namespace=underlying_embeddings.model
)
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")
프로덕션에서는 DB나 클라우드 스토리지 같은 더 견고한 영구 스토어를 쓰는 게 일반적이에요. 스토어 통합을 참고하세요.
모든 임베딩 모델
전체 통합 목록(다운로드 수 포함)은 원문 문서의 "All embedding models" 통합 다운로드 테이블을 참고하세요: AzureOpenAIEmbeddings, OpenAIEmbeddings, Gemini Enterprise Agent Platform, GoogleGenerativeAIEmbeddings, BedrockEmbeddings, OllamaEmbeddings, DatabricksEmbeddings, BGE on Hugging Face, Hugging Face, Instructor embeddings on Hugging Face, Sentence Transformers on Hugging Face, Text embeddings inference, FireworksEmbeddings, MistralAIEmbeddings, CohereEmbeddings, Pinecone, NVIDIAEmbeddings, WatsonxEmbeddings, PerplexityEmbeddings, Oracle AI vector search generate, Elasticsearch, BasetenEmbeddings, OCIGenAIEmbeddings, TogetherEmbeddings, SambanovaEmbeddings, Voyage AI, UpstageEmbeddings, Naver, NomicEmbeddings, OpensolrEmbeddings, Cloudflare workers AI, Nebius, AimlapiEmbeddings, PolarDBPGEmbeddings, Localai, PredictionGuardEmbeddings, BrainiallEmbeddings, DoublewordEmbeddings, Modelscope, ForgeEmbeddings, Lindorm, Netmind, GreenNodeEmbeddings, EmpirioLabsEmbeddings, TelnyxEmbeddings, ANEEmbeddings, KeiroEmbeddings, Isaacus 등.
더 알아보기 (Learn more)
- Embeddings 인터페이스 — 표준 API 참조
- 벡터스토어 통합 — 임베딩을 벡터스토어에 연결
- MTEB 리더보드 — 모델 품질 벤치마크
- Text Embeddings Inference (TEI) — 오픈 모델 셀프호스트 서빙