快速提示:使用Plotly Express可视化OpenAI矢量嵌入
#python #openai #vectorembeddings #plotlyexpress

抽象的

本文演示了如何使用t-SNE和Plotly Express可视化OpenAi矢量嵌入搜索词。我们以previous article的作品为基础,在那里我们展示了如何适应OpenAi示例与SinglestoredB一起工作。通过一些次要的代码修改,我们可以使用相同的示例可视化搜索词的向量嵌入。

本文中使用的笔记本文件可在GitHub中找到。

介绍

great article中,作者演示了如何使用多种技术可视化矢量嵌入。我们可以使用以前的OpenAI示例数据集,简化代码,并使用Plotly Express来呈现类似的可视化。让我们看看如何。

previous article中所述,我们将按照说明创建笔记本。

填写笔记本

首先,我们将安装OpenAi库:

!pip install openai --quiet

接下来,我们将指定我们的嵌入模型:

import openai

EMBEDDING_MODEL = "text-embedding-ada-002"

接下来,我们将设置OpenAI API密钥:

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
openai.api_key = os.environ["OPENAI_API_KEY"]

现在我们将添加更多库:

!pip install matplotlib --quiet
!pip install scikit-learn --quiet
!pip install wget --quiet

和进口:

import numpy as np
import pandas as pd
import wget
import ast

现在,我们将从OpenAI下载一个CSV文件,其中包含与冬季奥运会2022相关的文本和嵌入式文件:

embeddings_path = "https://cdn.openai.com/API/examples/data/winter_olympics_2022.csv"

file_path = "winter_olympics_2022.csv"

if not os.path.exists(file_path):
    wget.download(embeddings_path, file_path)
    print("File downloaded successfully.")
else:
    print("File already exists in the local file system.")

现在,我们将将文件读取到数据框中,然后将数据转换为numpy数组:

df = pd.read_csv(
    "winter_olympics_2022.csv"
)

# Convert embeddings from CSV str type to NumPy Array
embedding_array = np.array(
    df['embedding'].apply(ast.literal_eval).to_list()
)

我们的搜索词是“卷曲金牌”,我们将从Openai获得矢量嵌入:

from openai.embeddings_utils import get_embedding

query = "curling gold medal"
query_embedding_response = np.array(
    get_embedding(query, EMBEDDING_MODEL)
)

现在,我们将在搜索词和以前加载的向量嵌入之间找到并存储欧几里得的距离:

from scipy.spatial.distance import cdist

df['distance'] = cdist(
    embedding_array,
    [query_embedding_response]
)

并将值缩放在0和1之间,然后将它们存储在以下:
如下:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

scaler.fit(df[['distance']])

df['normalised'] = scaler.transform(df[['distance']])

最后,我们将创建一个T-SNE模型,并使用Plotly Express绘制数据:

import plotly.express as px
from sklearn.manifold import TSNE

# Create a t-SNE model
tsne_model = TSNE(
    n_components = 2,
    perplexity = 15,
    random_state = 42,
    init = 'random',
    learning_rate = 200
)
tsne_embeddings = tsne_model.fit_transform(embedding_array)

# Create a DataFrame for visualisation
visualisation_data = pd.DataFrame(
    {'x': tsne_embeddings[:, 0],
     'y': tsne_embeddings[:, 1],
     'Similarity': df['normalised']}
)

# Create the scatter plot using Plotly Express
plot = px.scatter(
    visualisation_data,
    x = 'x',
    y = 'y',
    color = 'Similarity',
    color_continuous_scale = 'rainbow',
    opacity = 0.3,
    title = f"Similarity to '{query}' visualised using t-SNE"
)

plot.update_layout(
    width = 650,
    height = 650
)

# Show the plot
plot.show()

输出应如图1所示。

Figure 1. Similarity to 'curling gold medal' visualised using t-SNE.

图1.与使用T-SNE可视化的“卷曲金牌”的相似性。

颜色指定与搜索词相似。在这种情况下,我们可以看到地块上的红色区域较近和较远的蓝色区域。

概括

数据可视化可用于获得对数据分布的见解,如previous article所示。在本文中,我们看到了如何使用向量嵌入和搜索词来创建T-SNE模型并使用Plotly Express可视化它。这个简单的示例显示了如何使用数据可视化来识别模式和趋势。