Embedding은 문서의 내용을 벡터로 표현하는 것을 말한다. 벡터로 표현함으로써 문서 간의 유사도, 감성, 분류, 관련성 등에 활용할 수 있다.
쿼리 임베딩
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
load_dotenv()
embeddings = OpenAIEmbeddings()
text = "LangChain 임베딩 테스트"
query_result = embeddings.embed_query(text)
print(query_result[:3])
실행결과
[-0.008043124940034098, -0.018205062666630877, -0.006530683218275895]
embed_query를 통해 주어진 문장을 임베딩한다. 결과로 -1~1사이의 값이 나오는데 OpenAIEmbedding은 기본적으로 1536 차원을 사용한다.
문서 임베딩
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
load_dotenv()
embeddings = OpenAIEmbeddings()
text = "LangChain 임베딩 테스트"
query_result = embeddings.embed_documents(text)
print(query_result[0][:3])
Pairwise Embedding Distance
두 문장 사이의 유사도 계산하는 방법으로 pairwise_embedding_distance
를 사용하는 방법이 있다.
distance score를 리턴하는데 숫자가 작을수록 더 비슷하다는 것을 나타낸다.
from langchain.evaluation import load_evaluator
evaluator = load_evaluator("pairwise_embedding_distance")
text1 = "안녕하세요~"
text2 = "안녕하세요!"
result = evaluator.evaluate_string_pairs(prediction=text1, prediction_b=text2)
print(result)
실행결과
{'score': 0.024722142475624098}
또 다른 예제를 보자.
text1 = "사과가 너무 맛있어"
text2 = "오늘 비가 온다"
result = evaluator.evaluate_string_pairs(prediction=text1, prediction_b=text2)
print(result)
실행결과
{'score': 0.211710629844872}
서로 관련없는 값을 비교하는 score가 더 높을 것을 확인할 수 있다.
CacheBackedEmbeddings
임베딩은 재계산을 하지 않도록 일시적으로 저장될 수 있다.
CacheBackedEmbeddings을 사용해서 임베딩을 캐싱할 수 있다. CacheBackedEmbeddings은 key-value 저장소에 임베딩을 저장한다.
- underlying_embedder: 임베딩을 위해 사용되는 embedder.
- document_embedding_cache: 문서 임베딩을 캐싱하기 위한
ByteStore
중 하나. - namespace: (선택 사항, 기본값은
""
) 문서 캐시를 위해 사용되는 네임스페이스. 이 네임스페이스는 다른 캐시와의 충돌을 피하기 위해 사용됩니다. 예를 들어, 사용된 임베딩 모델의 이름으로 설정하십시오.
패키지 설치
pipenv install faiss-cpu
from dotenv import load_dotenv
from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import LocalFileStore
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
import time
load_dotenv()
embedding = OpenAIEmbeddings()
store = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
embedding,
store,
namespace=embedding.model,
)
raw_documents = TextLoader("./data/past_love.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
start = time.time()
db = FAISS.from_documents(documents, cached_embedder)
end = time.time()
print(f"1번째: {end - start:.5f} sec")
start = time.time()
db2 = FAISS.from_documents(documents, cached_embedder)
end = time.time()
print(f"2번째: {end - start:.5f} sec")
result = list(store.yield_keys())[:5]
print(result)
실행결과
1번째: 0.10535 sec
2번째: 0.00212 sec
['text-embedding-ada-002615b8e6e-eb20-5fef-b2ae-fce0061f70ae']
2번째 실행한 결과는 임베딩을 계산할 필요가 없기 때문에 빠르게 실행이 된다.
허깅페이스 임베딩 (HuggingFace Hub)
허깅페이스 토큰 발급
.env 파일에 api token정보를 추가한다.
HUGGINGFACEHUB_API_TOKEN=hf_xxx
임베딩 코드
import os
from dotenv import load_dotenv
from langchain_community.embeddings import (
HuggingFaceEmbeddings,
HuggingFaceBgeEmbeddings,
)
load_dotenv()
inference_api_key = os.environ.get("HUGGINGFACEHUB_API_TOKEN")
os.environ["HF_HOME"] = "./cache/"
embeddings = HuggingFaceEmbeddings()
# embeddings = HuggingFaceBgeEmbeddings()
text = "동해물과 백두산이 마르고 닳도록"
query_result = embeddings.embed_query(text)
print(query_result[:3])
실행결과
[0.05398166552186012, -0.054349444806575775, -0.024263666942715645]
HuggingFaceEmbeddings와 HuggingFaceBgeEmbeddings의 차이점
HuggingFaceEmbeddings
- 일반 목적의 임베딩:
- 다양한 자연어 처리(NLP) 작업에 사용할 수 있는 범용 임베딩 생성.
- BERT, RoBERTa, GPT-2와 같은 Hugging Face에서 제공하는 다양한 사전 훈련된 언어 모델을 사용할 수 있음.
- 적용 가능한 모델:
- Hugging Face의
transformers
라이브러리를 통해 제공되는 거의 모든 모델을 사용할 수 있음. - 주로 문장, 단락, 또는 단어 수준의 임베딩을 생성하는 데 사용됨.
- Hugging Face의
HuggingFaceBgeEmbeddings
- 특정 목적의 임베딩:
- 특정 작업이나 도메인에 최적화된 임베딩을 생성하는 데 사용됨.
- 예를 들어, 특정 데이터셋이나 작업(예: 바이오메디컬 텍스트, 법률 문서 등)에 맞춰 훈련된 모델을 사용할 수 있음.
- 커스텀 모델:
- BERT와 같은 기본 모델을 사용하더라도, 특정 작업에 맞춰 추가 훈련(fine-tuning)된 모델을 사용할 수 있음.
- 예를 들어, 특정 작업에 맞춰 추가적으로 훈련된 BioBERT, LegalBERT와 같은 모델을 사용할 수 있음.
HuggingFaceEmbeddings는 범용적인 텍스트 임베딩을 생성하는 데 적합하며, 다양한 사전 훈련된 모델을 사용할 수 있습니다.
HuggingFaceBgeEmbeddings는 특정 작업이나 도메인에 맞춰 최적화된 텍스트 임베딩을 생성하는 데 적합하며, 추가 훈련된 모델을 사용할 수 있습니다.