1. 단어 기반 Retrieval 방법론의 한계
기존의 단어 기반 검색 방식은 단어의 문맥이나 의미를 고려하지 않기 때문에, 동의어나 다의어를 구분하는 데 한계가 있습니다. 예를 들어, "bank"라는 단어는 문맥에 따라 "은행" 또는 "강둑"을 의미할 수 있지만, 단순한 단어 매칭 방식은 이러한 차이를 인식하지 못합니다. 이로 인해, 검색의 정확성이 떨어지고 원하는 정보를 찾기 어렵게 만듭니다.
2. 임베딩(Embeddings) 등장
이러한 문제를 해결하기 위해 등장한 개념이 **임베딩(Embeddings)**입니다. 임베딩은 단어를 숫자로 표현하는 방법론으로, 단어 간의 의미적 유사성을 반영하여 숫자 벡터로 변환합니다. 이 숫자 벡터들은 딥러닝 모델을 통해 학습되며, 비슷한 의미를 가진 단어는 유사한 숫자 벡터로 표현됩니다.
현재 임베딩의 성능은 Transformer 기반 딥러닝 모델에서 가장 뛰어나며, 최근에는 **LLM(대형 언어 모델)**을 그대로 활용하여 임베딩을 생성하는 방식도 많이 사용되고 있습니다. 이러한 방식은 성능 면에서 탁월하지만, 비용과 속도 면에서 비효율적일 수 있는 단점이 있습니다.
3. 임베딩을 사용할 때 알아야 할 점
임베딩을 활용할 때 주의해야 할 몇 가지 중요한 사항이 있습니다:
- 차원 수: 임베딩 벡터의 차원이 높을수록 더 정교한 의미 표현이 가능합니다. 즉, 차원 수가 높으면 성능이 향상되는 경향이 있습니다.
- 비용과 연산 시간: 차원 수가 높아질수록 연산 시간이 길어지고, 특히 API 사용 시 비용이 더 높아질 수 있습니다. 따라서 성능과 비용 간의 균형을 고려해야 합니다.
4. OpenAI Embeddings API
OpenAI는 Embeddings API를 제공하여, 사용자가 간편하게 텍스트 임베딩을 생성할 수 있도록 돕습니다. 이 API는 두 가지 주요 임베딩 모델을 제공합니다:
- text-embedding-3-small: 1536차원의 벡터를 생성하는 모델
- text-embedding-3-large: 3072차원의 벡터를 생성하는 더 정교한 모델
이 중 text-embedding-3-large는 더 높은 차원의 임베딩을 제공하여, 더 나은 성능을 기대할 수 있지만 그만큼 비용이 더 발생할 수 있습니다. 반면, API 비용은 GPT-3.5나 GPT-4와 같은 언어 모델을 사용하는 것보다 저렴하기 때문에, 적절한 성능과 비용의 균형을 맞출 수 있습니다.
OpenAI Embeddings API 호출하는 방법
import os
from openai import OpenAI
openai_api_key = "sk-"
client = OpenAI(api_key=openai_api_key)
embedding = client.embeddings.create(
input='내일 날씨는 어때?',
model='text-embedding-3-small'
)
embedding
Embeddings API 를 활용하여 텍스트 간의 유사도 구하기
import numpy as np
def get_embedding(text, model='text-embedding-3-small'):
client = OpenAI(api_key=openai_api_key)
response = client.embeddings.create(
input=text,
model=model
)
return response.data[0].embedding
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
#
text1 = "The quick brown fox jumps over the lazy dog."
text2 = "A fast brown animal leaps over a sleeping dog."
embedding1 = get_embedding(text1)
embedding2 = get_embedding(text2)
similarity = cosine_similarity(embedding1, embedding2)
print(f"유사도: {similarity}")
embedding1 = get_embedding(text1, model='text-embedding-3-large')
embedding2 = get_embedding(text2, model='text-embedding-3-large')
similarity = cosine_similarity(embedding1, embedding2)
print(f"유사도: {similarity}")
OpenAI Embeddings API를 활용하여 관련있는 텍스트를 Retrieve(검색) 예시
import openai
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# OpenAI API 키 설정
openai.api_key = 'your-api-key-here'
# 임베딩을 생성하는 함수
def get_embedding(text, model="text-embedding-ada-002"):
response = openai.Embedding.create(
input=text,
model=model
)
return response['data'][0]['embedding']
# 코사인 유사도를 계산하는 함수
def cosine_similarity_score(embedding1, embedding2):
embedding1 = np.array(embedding1).reshape(1, -1)
embedding2 = np.array(embedding2).reshape(1, -1)
return cosine_similarity(embedding1, embedding2)[0][0]
# 검색을 위한 함수: 입력 쿼리에 대해 가장 관련있는 텍스트를 반환
def retrieve_similar_texts(query, documents, embeddings):
query_embedding = get_embedding(query)
similarities = [cosine_similarity_score(query_embedding, doc_embedding) for doc_embedding in embeddings]
# 가장 유사한 텍스트의 인덱스를 찾음
best_match_index = np.argmax(similarities)
return documents[best_match_index], similarities[best_match_index]
# 비교할 문서들 (리스트 형태로 문서들을 준비)
documents = [
"The quick brown fox jumps over the lazy dog.",
"Artificial intelligence and machine learning are transforming many industries.",
"The capital of France is Paris.",
"Quantum computing is the future of technology.",
"A fast brown animal leaps over a sleeping dog."
]
# 각 문서의 임베딩 생성
embeddings = [get_embedding(doc) for doc in documents]
# 사용자가 입력한 검색 쿼리
query = "What is the future of technology?"
# 쿼리와 가장 유사한 문서 검색
best_match, similarity_score = retrieve_similar_texts(query, documents, embeddings)
print(f"Best matching document: {best_match}")
print(f"Similarity score: {similarity_score:.4f}")
결론
임베딩은 단어의 의미와 문맥을 반영한 벡터 표현으로, 기존 단어 기반 검색 방식의 한계를 극복하는 중요한 방법론입니다. OpenAI Embeddings API를 활용하면 고성능 임베딩을 손쉽게 생성할 수 있으며, 사용 목적에 따라 차원 수와 비용을 고려해 적절한 모델을 선택하는 것이 중요합니다.
OpenAI의 임베딩 API는 LLM 기반의 성능을 최대한 활용하면서도 비용 효율적으로 사용할 수 있는 강력한 도구입니다.
'RAG' 카테고리의 다른 글
RAG를 활용한 LLM 추론 파이프라인 이해와 실습 [9] (1) | 2024.09.07 |
---|---|
RAG 고려사항 [8] (7) | 2024.09.02 |
RAG 벡터 검색 [7] (4) | 2024.09.02 |
RAG 벡터 데이터베이스 [6] (4) | 2024.08.31 |
RAG 검색 방법 [5] (0) | 2024.08.31 |