https://betterprogramming.pub/openais-embedding-model-with-vector-database-b69014f04433
Introduction
OpenAI는 2022년 12월 임베딩 모델을 텍스트 임베딩-ada-002로 업데이트했습니다. 새 모델은 다음을 제공합니다:
- 90%-99.8% 저렴한 비용
- 1/8 임베딩 차원 크기로 vector database cost 절감
- 사용 편의성을 위한 엔드포인트 통합
- 텍스트 검색, 코드 검색 및 문장 유사성을 위한 최첨단 성능
- 컨텍스트 창이 2048에서 8192로 증가
이 튜토리얼에서는 클러스터링 작업을 통해 임베딩 엔드포인트를 안내한다. 벡터 데이터베이스에서 이러한 임베딩을 저장하고 검색. 임베딩 모델 및 벡터 데이터베이스와 관련된 질문을 다룬다. 이전 버전의 임베딩 엔드포인트에서 비용 측면이 문제가 되었던 이유는 무엇인가?, 임베딩 모델을 실제로 NLP 작업에 어떻게 사용할 수 있을지?, 벡터 데이터베이스란 무엇인가? OpenAI 텍스트 임베딩을 벡터 데이터베이스 서비스에 통합하는 방법은 무엇인가? 벡터 데이터베이스에 쿼리를 수행하는 방법은 무엇인가?
이 튜토리얼을 사용하려면 OpenAI API 액세스가 필요하다. 토큰은 300개의 리뷰에 몇 센트의 비용이 든다.
!pip install plotly
!pip install -U scikit-learn
import os
import time # optional
import pandas as pd
import numpy as np
import openai
from openai.embeddings_utils import get_embedding, cosine_similarity
import matplotlib
import matplotlib.pyplot as plt
OpenAI API 키를 추가. 이 예제에서는 윈도우에 환경 변수로 저장된 변수를 사용.
openai.api_key = os.getenv("OPENAI_API_KEY")
본 예제는 Text Embedding과 t-SNE만 사용
embedding 함수 정의
def get_embedding(text, model="text-embedding-ada-002"):
text = text.replace("\n", " ")
return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']
Context 데이터를 embedding vector로 변환 (embedding dim = 1536)
df['ada_embedding'] = df['Context'].apply(lambda x : get_embedding(x, model="text-embedding-ada-002"))
list로 변환
matrix = np.array(df.ada_embedding.to_list())
t-SNE란?
t-SNE(TSNE)는 데이터 포인트의 선호도를 확률로 변환합니다. 원래 공간의 선호도는 가우시안 합동 확률로 표현되고 임베디드 공간의 선호도는 t 분포로 표현됩니다. 따라서 t-SNE는 로컬 구조에 특히 민감하며 기존 기법에 비해 몇 가지 다른 장점이 있습니다:
- 단일 맵에서 다양한 축척의 구조 드러내기
- 여러 개의 서로 다른 매니폴드 또는 클러스터에 있는 데이터 드러내기
- 중앙에 포인트가 밀집되는 경향 감소
t-sne 분포 차원 축소
t-sne이 사용 데이터의 분포를 고려한 decomposition 방법으로 text embedding cluster에 주로 사용
tsne = TSNE(n_components=2, perplexity=15, random_state=11, init='random', learning_rate=200)
vis_dims = tsne.fit_transform(matrix)
vis_dims.shape
x = [x for x,y in vis_dims]
y = [y for x,y in vis_dims]
input embedding vector columns
df['embedding_x'] = x
df['embedding_y'] = y
plot의 point 색을 생성하기 위한 random color 함수 정의
import random
def random_color():
"""
Generate a random color in hexadecimal format.
"""
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return "#{:02x}{:02x}{:02x}".format(r, g, b)
scatter plot 생성
fig, ax = plt.subplots(figsize=(15, 10))
for color,category in zip([random_color() for i in range(len(df['category'].unique()))],df['INQUIRY_TYPE'].unique()):
p = df[df['category']==category]
ax.scatter(p['embedding_x'], p['embedding_y'], color=color, alpha=0.3,label=f'{category}')
avg_x = p['embedding_x'].mean()
avg_y = p['embedding_y'].mean()
ax.scatter(avg_x, avg_y, marker="x", color=color, s=100)
ax.set_title("Clusters of Context visualized 2d with K-means(with text-embedding-ada-002)", fontsize=14)
plt.legend()
plt.show()
'Natural Language Processing' 카테고리의 다른 글
Textbooks Are All You Need (0) | 2023.07.02 |
---|---|
LLM Context 확장 불가능은 아니다. (token size 늘리기 정리) (0) | 2023.06.28 |
[Langchain] paper-translator (0) | 2023.06.16 |
LIMA : Less is More for Alignment (0) | 2023.06.13 |
paper-translator test (LIMA: Less Is More for Alignment) (0) | 2023.06.08 |