이 개요는 텍스트 기반 임베딩 모델을 다룹니다. LangChain은 현재 멀티모달 임베딩을 지원하지 않습니다.
임베딩 모델은 문장, 단락, 트윗과 같은 원시 텍스트를 의미론적 의미를 담은 고정 길이의 숫자 벡터로 변환합니다. 이러한 벡터를 통해 기계는 정확한 단어가 아닌 의미를 기반으로 텍스트를 비교하고 검색할 수 있습니다.
실제로 이는 유사한 아이디어를 가진 텍스트들이 벡터 공간에서 서로 가까이 배치된다는 것을 의미합니다. 예를 들어, *“machine learning”*이라는 구문만 정확히 매칭하는 대신, 임베딩은 다른 표현을 사용하더라도 관련된 개념을 논의하는 문서들을 찾아낼 수 있습니다.
작동 방식
- 벡터화 — 모델이 각 입력 문자열을 고차원 벡터로 인코딩합니다.
- 유사도 점수화 — 벡터들을 수학적 메트릭을 사용하여 비교함으로써 기본 텍스트들이 얼마나 밀접하게 관련되어 있는지 측정합니다.
유사도 메트릭
임베딩을 비교하는 데 일반적으로 사용되는 여러 메트릭이 있습니다:
- 코사인 유사도 — 두 벡터 사이의 각도를 측정합니다.
- 유클리드 거리 — 점들 사이의 직선 거리를 측정합니다.
- 내적 — 한 벡터가 다른 벡터에 얼마나 투영되는지 측정합니다.
다음은 두 벡터 간 코사인 유사도를 계산하는 예제입니다:
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)
인터페이스
LangChain은 Embeddings 인터페이스를 통해 텍스트 임베딩 모델(예: OpenAI, Cohere, Hugging Face)에 대한 표준 인터페이스를 제공합니다.
두 가지 주요 메서드를 사용할 수 있습니다:
embed_documents(texts: List[str]) → List[List[float]]: 문서 목록을 임베딩합니다.
embed_query(text: str) → List[float]: 단일 쿼리를 임베딩합니다.
인터페이스는 쿼리와 문서를 서로 다른 전략으로 임베딩할 수 있도록 허용하지만, 대부분의 제공업체는 실제로 동일한 방식으로 처리합니다.
주요 통합
임베딩을 다시 계산할 필요가 없도록 저장하거나 임시로 캐시할 수 있습니다.
임베딩 캐싱은 CacheBackedEmbeddings를 사용하여 수행할 수 있습니다. 이 래퍼는 임베딩을 키-값 저장소에 저장하며, 텍스트를 해시하고 해시를 캐시의 키로 사용합니다.
CacheBackedEmbeddings를 초기화하는 주요 지원 방법은 from_bytes_store입니다. 다음 매개변수를 받습니다:
underlying_embedder: 임베딩에 사용할 임베더입니다.
document_embedding_cache: 문서 임베딩을 캐싱하기 위한 ByteStore입니다.
batch_size: (선택사항, 기본값 None) 저장소 업데이트 사이에 임베딩할 문서 수입니다.
namespace: (선택사항, 기본값 "") 문서 캐시에 사용할 네임스페이스입니다. 충돌을 방지하는 데 도움이 됩니다(예: 임베딩 모델 이름으로 설정).
query_embedding_cache: (선택사항, 기본값 None) 쿼리 임베딩을 캐싱하기 위한 ByteStore, 또는 document_embedding_cache와 동일한 저장소를 재사용하려면 True로 설정합니다.
import time
from langchain_classic.embeddings import CacheBackedEmbeddings
from langchain_classic.storage import LocalFileStore
from langchain_core.vectorstores import InMemoryVectorStore
# Create your underlying embeddings model
underlying_embeddings = ... # e.g., OpenAIEmbeddings(), HuggingFaceEmbeddings(), etc.
# Store persists embeddings to the local filesystem
# This isn't for production use, but is useful for local
store = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings,
store,
namespace=underlying_embeddings.model
)
# Example: caching a query embedding
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")
# Subsequent calls use the cache
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")
프로덕션 환경에서는 일반적으로 데이터베이스나 클라우드 스토리지와 같은 더욱 견고한 영구 저장소를 사용합니다. 옵션은 저장소 통합을 참조하세요.
모든 임베딩 모델