인공지능 개발자 수다(유튜브 바로가기) 자세히보기

자연어처리/Langchain

[Langchain] 임베딩(Embedding)과 유사도 검색 방법 for Retriever

Suda_777 2025. 3. 6. 02:42

목차

    반응형

    1. 임베딩(Embedding)

    정의 : 임베딩은 단어, 문장, 이미지 등과 같은 데이터를 숫자 벡터(연속된 실수 공간)로 표현하는 방식

     

    (사진 출처: google 머신러닝 기초과정)

     

    단어나 문장을 임베딩 모델(BERT, GPT 등)을 통해 고정된 차원의 실수 벡터로 바꾸면, 각각의 벡터가 해당 단어(또는 문장)의 의미 정보를 함축적으로 담게 된다.

     

    이때, 데이터는 의미가 유사한 두 벡터는 사이가 가깝도록 만든다.

     


    2. 임베딩 모델

    주된 학습 목적은 의미가 유사한 문장은 유사한 벡터로, 의미가 다른 문장은 다른 벡터로 매핑하도록 하는 것

    생성 모델과 달리, 토큰을 문장으로 생성하는 것이 아니라 문장을 하나의 벡터로 표현하는 데 집중

     

    2.1. 고전적인 모델

    고전적인 모델에는 Word2vec이 유명하다.

    Word2vec 모델은 단어 자체를 벡터로 매핑하는 방식이다.

     

    2.2. Transformer 기반 모델

    최근에는 Transformer 기반의 LLM 모델을 임베딩 모델로 사용한다.

     

    결국 Retriever의 검색 성능은

    임베딩 모델의 성능이 아주 중요하다고 할 수 있다.

     

    Langchain에서 지원하는 모델에는 어떤 것들이 있는지 보자

    OpenAI : text-embedding-3-small,  text-embedding-3-ada-002,  text-embedding-3-large

    Ollama : llama3

    Google : text-embedding-004

    오픈소스 : BAAI/bge-m3

     

    예시코드 (Openai 모델 사용)

    import getpass
    import os
    from langchain_openai import OpenAIEmbeddings
    
    if not os.environ.get("OPENAI_API_KEY"):
      os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
    
    embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

     

    유료 모델은 api 형식으로 지원하며, 많이 비싸지 않아서

    많은 양을 벡터화 하지 않는다면 서버 비용 없이 저렴하고 간단하게 사용할 수 있다.

     

    오픈소스 모델은 프로젝트 상황에 맞게

    파인튜닝(Fine-tunning)을 할 수 있다는 장점이 있다.

     

    각 임베딩 모델에 대한 설명은

    논문 요약 포스팅에서 다루도록 하겠다.


    2. 유사도 검색 방법

    Retriever는 어떻게 유사한 텍스트를 검색할까?

    가장 많이 사용되는 방법은 코사인(Cosine) 유사도 이다.

     

    $$
    \cos(a,b) = \frac{a \cdot b}{\|a\|\cdot \|b\|}
    $$

     

    위 식은 두 점 사이의 거리를 나타낸다.

     

    비슷한 의미의 단어가 가까워지는 이유는

    임베딩 모델이 방대한 텍스트 학습을 통해, 비슷한 맥락(의미)을 가진 단어서로 인접한 벡터 좌표를 갖도록 조정하기 때문

     

    반응형