langchain / / 2024. 6. 5. 15:08

[langchain] 임베딩 (Embedding)

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

  1. 일반 목적의 임베딩:
    • 다양한 자연어 처리(NLP) 작업에 사용할 수 있는 범용 임베딩 생성.
    • BERT, RoBERTa, GPT-2와 같은 Hugging Face에서 제공하는 다양한 사전 훈련된 언어 모델을 사용할 수 있음.
  2. 적용 가능한 모델:
    • Hugging Face의 transformers 라이브러리를 통해 제공되는 거의 모든 모델을 사용할 수 있음.
    • 주로 문장, 단락, 또는 단어 수준의 임베딩을 생성하는 데 사용됨.

HuggingFaceBgeEmbeddings

  1. 특정 목적의 임베딩:
    • 특정 작업이나 도메인에 최적화된 임베딩을 생성하는 데 사용됨.
    • 예를 들어, 특정 데이터셋이나 작업(예: 바이오메디컬 텍스트, 법률 문서 등)에 맞춰 훈련된 모델을 사용할 수 있음.
  2. 커스텀 모델:
    • BERT와 같은 기본 모델을 사용하더라도, 특정 작업에 맞춰 추가 훈련(fine-tuning)된 모델을 사용할 수 있음.
    • 예를 들어, 특정 작업에 맞춰 추가적으로 훈련된 BioBERT, LegalBERT와 같은 모델을 사용할 수 있음.

HuggingFaceEmbeddings는 범용적인 텍스트 임베딩을 생성하는 데 적합하며, 다양한 사전 훈련된 모델을 사용할 수 있습니다.

HuggingFaceBgeEmbeddings는 특정 작업이나 도메인에 맞춰 최적화된 텍스트 임베딩을 생성하는 데 적합하며, 추가 훈련된 모델을 사용할 수 있습니다.

참고

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유