텍스트 임베딩 모델

텍스트 임베딩 모델은 주로 텍스트의 벡터 표현을 계산하는 데 사용됩니다. 여기서 "벡터"라는 용어는 수학적인 벡터, 즉 특성 벡터로도 알려진 것을 지칭합니다. 개발자로서 알아야 할 것은 텍스트 임베딩 모델이 텍스트의 특성 벡터를 계산할 수 있으며, 이를 통해 벡터 유사성 계산을 사용하여 유사한 특성을 가진 텍스트 내용을 식별할 수 있다는 것입니다.

팁: 텍스트 임베딩 모델에 대한 기본 지식은 텍스트 임베딩 모델 입문 튜토리얼을 참조하세요.

벡터 검색과 키워드 기반 검색의 차이점

  • 벡터 검색은 단어 벡터의 의미론적 유사성에 기반합니다. 쿼리와 결과의 단어가 정확히 일치하지 않더라도 의미론적으로 관련된 결과를 찾을 수 있습니다. 벡터 검색은 단어를 고차원 벡터 공간에 매핑하고 벡터 간 유사성을 계산합니다. 이는 단어 자체가 일치하지 않더라도 의미론적으로 유사하다면 관련된 결과를 찾을 수 있다는 것을 의미합니다.
  • 반면, 키워드 기반 검색은 간단한 문자열 매칭 프로세스입니다. 정확히 일치하는 쿼리 단어를 포함하는 결과만 반환합니다. 문서에서 다른 단어를 사용한다면 의미론적으로 유사하더라도 일치하지 않습니다.

Embeddings 클래스는 텍스트 임베딩 모델과 상호 작용하기 위해 특별히 설계된 클래스 유형입니다. 임베딩 모델 제공 업체는 다양하며(예: OpenAI, Cohere, Hugging Face 등), 이 클래스의 설계는 모든 제공 업체에 대한 표준 인터페이스를 제공하는 데 목적이 있습니다.

Embeddings 클래스는 텍스트의 벡터 표현을 생성합니다. 벡터 검색을 통해 벡터 공간에서 가장 유사한 텍스트 조각을 검색하는 등, 의미론적 검색을 수행할 수 있습니다.

LangChain의 기본 Embeddings 클래스는 두 가지 메서드를 노출합니다: 문서를 임베딩하는 메서드와 쿼리를 임베딩하는 메서드입니다. 전자는 여러 텍스트를 입력으로 사용하고, 후자는 단일 텍스트를 입력으로 사용합니다. 이들을 두 가지 다른 메서드로 취급하는 이유는 임베딩 제공 업체마다 검색할 문서 및 쿼리(검색 쿼리 자체)에 대해 다른 임베딩 방법이 있기 때문입니다.

빠른 시작

아래는 OpenAI의 임베딩 모델을 사용하는 예제입니다.

구성

먼저, OpenAI Python 패키지를 설치해야 합니다. LangChain에는 다양한 텍스트 임베딩 모델의 구현이 있기 때문에, 개발자는 자신의 선택에 따라 다른 모델의 종속성을 설치해야 합니다:

pip install langchain-openai

환경 변수를 통해 OpenAI 키를 구성합니다:

export OPENAI_API_KEY="..."

환경 변수를 설정하고 싶지 않다면, OpenAI LLM 클래스를 초기화할 때 openai_api_key라는 명명된 매개변수를 직접 전달하여 키를 전달할 수 있습니다:

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings(openai_api_key="...")

그렇지 않으면 매개변수 없이 초기화할 수 있습니다:

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings()

embed_documents

일괄 텍스트의 벡터 특성을 계산합니다:

embeddings = embeddings_model.embed_documents(
    [
        "안녕하세요!",
        "오, 안녕!",
        "당신의 이름은 무엇인가요?",
        "내 친구들은 나를 월드라고 부르죠",
        "안녕 세상!"
    ]
)
len(embeddings), len(embeddings[0])
(5, 1536)

embed_query

이 함수는 쿼리 텍스트의 벡터 특성을 계산합니다. 보통, 검색할 질문을 특성 벡터로 변환한 다음, 이 벡터를 사용하여 벡터 데이터베이스에서 유사한 텍스트를 조회합니다.

embedded_query = embeddings_model.embed_query("대화에서 언급된 이름은 무엇인가요?")
embedded_query[:5]
[0.0053587136790156364,
 -0.0004999046213924885,
 0.038883671164512634,
 -0.003001077566295862,
 -0.00900818221271038]