大模型系列: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
text | category | |
---|---|---|
0 | Morada Limited is a textile company based in ... | Company |
1 | The Armenian Mirror-Spectator is a newspaper ... | WrittenWork |
2 | Mt. Kinka (金華山 Kinka-zan) also known as Kinka... | NaturalPlace |
3 | Planning the Play of a Bridge Hand is a book ... | WrittenWork |
4 | Wang 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")
- 减少嵌入维度。
# 导入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>
文章来源:https://blog.csdn.net/wjjc1017/article/details/135303143
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!