大模型系列:OpenAI使用技巧_做文本向量化以及2D、3D可视化

2023-12-30 11:28:54

使用OpenAI做文本向量化Embedings

本笔记本包含一些有用的代码片段,您可以使用这些代码片段通过OpenAI API将文本嵌入到“text-embedding-ada-002”模型中。

# 导入openai模块
import openai
# 创建一个名为embedding的变量,使用openai.Embedding.create()方法创建一个嵌入式对象
# input参数是要嵌入的文本,model参数是要使用的模型
embedding = openai.Embedding.create(
    input="Your text goes here", model="text-embedding-ada-002"
)["data"][0]["embedding"]

# 计算embedding的长度并输出
len(embedding)
1536

建议使用“tenacity”包或其他指数退避实现来更好地管理API速率限制,因为过快地频繁调用API可能会触发速率限制。使用以下函数可以确保您尽快获得嵌入。

# 导入openai模块
import openai

# 定义一个变量num_embeddings,表示嵌入的数量,这里设置为一个较大的数值
num_embeddings = 10000

# 循环num_embeddings次,进行嵌入操作
for i in range(num_embeddings):
    # 调用openai.Embedding.create方法创建一个嵌入
    # 参数input表示要嵌入的文本内容,这里填写"Your text goes here"
    # 参数model表示使用的嵌入模型,这里选择"text-embedding-ada-002"
    embedding = openai.Embedding.create(
        input="Your text goes here", model="text-embedding-ada-002"
    )
    
    # 从返回结果中获取嵌入向量
    # 返回结果是一个字典,其中"data"字段是一个列表,列表中的第一个元素是一个字典,其中"embedding"字段是嵌入向量
    embedding_vector = embedding["data"][0]["embedding"]
    
    # 打印嵌入向量的长度
    print(len(embedding_vector))
# 导入必要的库
import openai
from tenacity import retry, wait_random_exponential, stop_after_attempt

# 定义一个装饰器函数,用于重试函数调用
@retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6))
def get_embedding(text: str, model="text-embedding-ada-002") -> list[float]:
    # 使用OpenAI的Embedding API获取文本的嵌入向量
    return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"]

# 调用get_embedding函数获取文本的嵌入向量
embedding = get_embedding("Your text goes here", model="text-embedding-ada-002")

# 打印嵌入向量的长度
print(len(embedding))
1536

在2D中可视化嵌入

我们将使用t-SNE将嵌入的维度从1536降低到2。一旦嵌入被降低到两个维度,我们可以在2D散点图中绘制它们。数据集是在Get_embeddings_from_dataset Notebook中创建的。

1. 降维

我们使用t-SNE分解将维度降至2维。

# 导入必要的库
import pandas as pd
from sklearn.manifold import TSNE
import numpy as np
from ast import literal_eval

# 加载嵌入数据
datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv"
df = pd.read_csv(datafile_path)

# 将嵌入数据转换为浮点数列表的列表
matrix = np.array(df.embedding.apply(literal_eval).to_list())

# 创建t-SNE模型并转换数据
tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
vis_dims = tsne.fit_transform(matrix)
vis_dims.shape # 输出转换后的数据形状
(1000, 2)

2. 绘制嵌入图

我们按照每个评论的星级评分进行着色,从红色到绿色。

即使在降维后的二维空间中,我们仍然可以观察到良好的数据分离。

import matplotlib.pyplot as plt  # 导入matplotlib.pyplot模块
import matplotlib  # 导入matplotlib模块
import numpy as np  # 导入numpy模块

colors = ["red", "darkorange", "gold", "turquoise", "darkgreen"]  # 定义颜色列表
x = [x for x, y in vis_dims]  # 获取vis_dims中的x坐标
y = [y for x, y in vis_dims]  # 获取vis_dims中的y坐标
color_indices = df.Score.values - 1  # 计算颜色索引

colormap = matplotlib.colors.ListedColormap(colors)  # 创建颜色映射
plt.scatter(x, y, c=color_indices, cmap=colormap, alpha=0.3)  # 绘制散点图,使用颜色映射和透明度

for score in [0, 1, 2, 3, 4]:  # 遍历评分列表
    avg_x = np.array(x)[df.Score - 1 == score].mean()  # 计算相应评分的x均值
    avg_y = np.array(y)[df.Score - 1 == score].mean()  # 计算相应评分的y均值
    color = colors[score]  # 获取相应评分的颜色
    plt.scatter(avg_x, avg_y, marker='x', color=color, s=100)  # 绘制均值点

plt.title("Amazon ratings visualized in language using t-SNE")  # 设置图表标题
Text(0.5, 1.0, 'Amazon ratings visualized in language using t-SNE')

在三维空间中可视化嵌入向量

示例使用PCA将嵌入的维度从1536降低到3。然后我们可以在一个3D图中可视化数据点。小数据集dbpedia_samples.jsonl是通过从DBpedia验证数据集中随机抽样200个样本进行策划的。

1. 加载数据集和查询嵌入

# 导入pandas库import pandas as pd# 使用pandas库的read_json函数读取jsonl格式的数据文件,并将其存储在变量samples中samples = pd.read_json("data/dbpedia_samples.jsonl", lines=True)# 获取samples中"category"列的唯一值,并进行排序,存储在变量categories中categories = sorted(samples["category"].unique())# 输出DBpedia样本的类别及其对应的数量print("Categories of DBpedia samples:", samples["category"].value_counts())# 输出samples的前几行数据samples.head()
Categories of DBpedia samples: Artist                    21
Film                      19
Plant                     19
OfficeHolder              18
Company                   17
NaturalPlace              16
Athlete                   16
Village                   12
WrittenWork               11
Building                  11
Album                     11
Animal                    11
EducationalInstitution    10
MeanOfTransportation       8
Name: category, dtype: int64
textcategory
0Morada Limited is a textile company based in ...Company
1The Armenian Mirror-Spectator is a newspaper ...WrittenWork
2Mt. Kinka (金華山 Kinka-zan) also known as Kinka...NaturalPlace
3Planning the Play of a Bridge Hand is a book ...WrittenWork
4Wang Yuanping (born 8 December 1976) is a ret...Athlete
# 从utils.embeddings_utils模块中导入get_embeddings函数from utils.embeddings_utils import get_embeddings# NOTE: 以下代码将会向/embeddings发送一个批量大小为200的查询# 使用get_embeddings函数,将samples["text"]列表转换为向量矩阵,使用"text-embedding-ada-002"模型matrix = get_embeddings(samples["text"].to_list(), model="text-embedding-ada-002")
  1. 减少嵌入维度。
# 导入PCA模块from sklearn.decomposition import PCA# 创建PCA对象,设置降维后的维度为3pca = PCA(n_components=3)# 对矩阵进行降维操作vis_dims = pca.fit_transform(matrix)# 将降维后的结果转换为列表,并将其添加到样本数据中samples["embed_vis"] = vis_dims.tolist()

3. 绘制低维度嵌入的图表

# 设置matplotlib的交互模式%matplotlib widget# 导入matplotlib和numpy库import matplotlib.pyplot as pltimport numpy as np# 创建一个大小为10x5的图形对象fig = plt.figure(figsize=(10, 5))# 添加一个3D坐标轴ax = fig.add_subplot(projection='3d')# 获取颜色映射cmap = plt.get_cmap("tab20")# 针对每个样本类别单独绘制散点图,以便设置标签名称for i, cat in enumerate(categories):    # 获取该类别的样本嵌入向量    sub_matrix = np.array(samples[samples["category"] == cat]["embed_vis"].to_list())    # 分别获取x、y、z坐标    x=sub_matrix[:, 0]    y=sub_matrix[:, 1]    z=sub_matrix[:, 2]    # 生成该类别的颜色    colors = [cmap(i/len(categories))] * len(sub_matrix)    # 绘制散点图    ax.scatter(x, y, zs=z, zdir='z', c=colors, label=cat)# 设置x、y、z轴的标签ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')# 设置图例位置ax.legend(bbox_to_anchor=(1.1, 1))
<matplotlib.legend.Legend at 0x1622180a0>
Figure

文章来源:https://blog.csdn.net/wjjc1017/article/details/135303143
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。