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 |