可视化 Kangas 中的嵌入

在本 Jupyter Notebook 中,我们将构建一个包含嵌入数据和二维投影的 Kangas DataGrid。

什么是 Kangas?

Kangas 是一个开源的、混合媒体的、类似数据帧的工具,面向数据科学家。它由 Comet 公司开发,该公司致力于帮助用户减少将模型投入生产的阻力。

1. 设置

首先,我们 pip 安装 kangas,然后导入它。

%pip install kangas --quiet
import kangas as kg

2. 构建 Kangas DataGrid

我们创建一个包含原始数据和嵌入的 Kangas Datagrid。数据由多行评论组成,嵌入由 1536 个浮点值组成。在此示例中,我们直接从 GitHub 获取数据,以防您在此笔记本电脑内运行此笔记本电脑。

我们使用 Kangas 将 CSV 文件读入 DataGrid 以进行进一步处理。

data = kg.read_csv("https://raw.githubusercontent.com/openai/openai-cookbook/main/examples/data/fine_food_reviews_with_embeddings_1k.csv")
Loading CSV file 'fine_food_reviews_with_embeddings_1k.csv'...


1001it [00:00, 2412.90it/s]
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 2899.16it/s]

我们可以查看 CSV 文件的字段:

data.info()
DataGrid (in memory)
    Name   : fine_food_reviews_with_embeddings_1k
    Rows   : 1,000
    Columns: 9
#   Column                Non-Null Count DataGrid Type       
--- -------------------- --------------- --------------------
1   Column 1                       1,000 INTEGER             
2   ProductId                      1,000 TEXT                
3   UserId                         1,000 TEXT                
4   Score                          1,000 INTEGER             
5   Summary                        1,000 TEXT                
6   Text                           1,000 TEXT                
7   combined                       1,000 TEXT                
8   n_tokens                       1,000 INTEGER             
9   embedding                      1,000 TEXT

并查看第一行和最后一行:

data
row-id Column 1 ProductId UserId Score Summary Text combined n_tokens embedding
1 0 B003XPF9BO A3R7JR3FMEBXQB 5 where does one Wanted to save Title: where do 52 [0.007018072064
2 297 B003VXHGPK A21VWSCGW7UUAR 4 Good, but not W Honestly, I hav Title: Good, bu 178 [-0.00314055196
3 296 B008JKTTUA A34XBAIFT02B60 1 Should advertis First, these sh Title: Should a 78 [-0.01757248118
4 295 B000LKTTTW A14MQ40CCU8B13 5 Best tomato sou I have a hard t Title: Best tom 111 [-0.00139322795
5 294 B001D09KAM A34XBAIFT02B60 1 Should advertis First, these sh Title: Should a 78 [-0.01757248118
...
996 623 B0000CFXYA A3GS4GWPIBV0NT 1 Strange inflamm Truthfully wasn Title: Strange 110 [0.000110913533
997 624 B0001BH5YM A1BZ3HMAKK0NC 5 My favorite and You've just got Title: My favor 80 [-0.02086931467
998 625 B0009ET7TC A2FSDQY5AI6TNX 5 My furbabies LO Shake the conta Title: My furba 47 [-0.00974910240
999 619 B007PA32L2 A15FF2P7RPKH6G 5 got this for th all i have hear Title: got this 50 [-0.00521062919
1000 999 B001EQ5GEO A3VYU0VO6DYV6I 5 I love Maui Cof My first experi Title: I love M 118 [-0.00605782261
[1000 rows x 9 columns]
* Use DataGrid.save() to save to disk
** Use DataGrid.show() to start user interface

现在,我们创建一个新的 DataGrid,将数字转换为 Embedding:

import ast # 将数字列表的字符串转换为数字列表

dg = kg.DataGrid(
    name="openai_embeddings",
    columns=data.get_columns(),
    converters={"Score": str},
)
for row in data:
    embedding = ast.literal_eval(row[8])
    row[8] = kg.Embedding(
        embedding, 
        name=str(row[3]), 
        text="%s - %.10s" % (row[3], row[4]),
        projection="umap",
    )
    dg.append(row)

新的 DataGrid 现在具有正确的嵌入列数据类型。

dg.info()
DataGrid (in memory)
    Name   : openai_embeddings
    Rows   : 1,000
    Columns: 9
#   Column                Non-Null Count DataGrid Type       
--- -------------------- --------------- --------------------
1   Column 1                       1,000 INTEGER             
2   ProductId                      1,000 TEXT                
3   UserId                         1,000 TEXT                
4   Score                          1,000 TEXT                
5   Summary                        1,000 TEXT                
6   Text                           1,000 TEXT                
7   combined                       1,000 TEXT                
8   n_tokens                       1,000 INTEGER             
9   embedding                      1,000 EMBEDDING-ASSET

我们只需保存 datagrid,就完成了。

dg.save()

3. 渲染 2D 投影

要直接在笔记本中渲染数据,只需显示它即可。请注意,每一行都包含一个嵌入投影。

滚动到最右侧以查看每行的嵌入投影。

投影空间中点的颜色代表分数。

dg.show()

按“Score”分组以查看每个组的行。

dg.show(group="Score", sort="Score", rows=5, select="Score,embedding")

此数据网格的一个示例托管在此处:https://kangas.comet.com/?datagrid=/data/openai_embeddings.datagrid