可视化分析:gte-base-zh编码的文本向量空间分布
可视化分析gte-base-zh编码的文本向量空间分布你有没有想过一段段文字在计算机的“大脑”里究竟是什么样子的它们不是我们看到的字符而是一串串高维的数字也就是我们常说的“向量”。这些向量构成了一个复杂的“语义空间”相似的文本在这个空间里会靠得更近。今天我们就用一种直观的方式带你看看这个神秘的空间——通过可视化技术把gte-base-zh模型生成的文本向量从几百维的高空“降维”到我们能看懂的二维平面看看它到底有多聪明。gte-base-zh是一个专门为中文优化的文本嵌入模型它的核心任务就是把任何一段中文文本转换成一个固定长度的、富含语义信息的向量。这个向量就像是文本的“数字指纹”。我们这次要做的就是把这些“指纹”画出来看看不同主题的文档比如科技、体育、娱乐新闻在这个空间里是杂乱无章地混在一起还是能清晰地各自聚成一团。这能最直观地检验一个模型是否真正理解了文本的含义。1. 准备工作收集文本与生成向量在开始画图之前我们得先准备好“颜料”——也就是不同主题的文本数据并把它们转换成向量。1.1 构建一个迷你文本数据集为了展示效果我们手动创建一个小型数据集包含三个清晰的主题科技、体育和娱乐。每个主题下有几条简短的文本。# 示例构建一个简单的多主题文本数据集 texts [ # 科技类 人工智能正在深刻改变各行各业。, 深度学习模型需要大量的数据进行训练。, 云计算提供了弹性的计算和存储资源。, 第五代移动通信技术提升了网络速度。, # 体育类 昨晚的足球比赛决赛异常激烈。, 篮球运动员需要出色的弹跳力和团队配合。, 游泳世锦赛诞生了新的世界纪录。, 马拉松比赛考验选手的耐力和意志。, # 娱乐类 最新上映的电影获得了很高的票房。, 这位歌手的巡回演唱会门票一票难求。, 综艺节目的收视率再创新高。, 喜剧演员的表演逗得观众捧腹大笑。 ] # 对应的主题标签 labels [科技] * 4 [体育] * 4 [娱乐] * 41.2 使用gte-base-zh生成文本向量接下来我们使用gte-base-zh模型将这些文本句子转化为向量。这里我们使用FlagEmbedding库它是目前使用这个模型比较方便的方式。from FlagEmbedding import FlagModel # 加载gte-base-zh模型 # 首次运行会自动下载模型请确保网络通畅 model FlagModel(BAAI/bge-base-zh, query_instruction_for_retrieval为这个句子生成表示以用于检索相关文章) # 对文本列表进行编码生成向量 # 这些向量的维度通常是768维 embeddings model.encode(texts) print(f生成了 {len(embeddings)} 个向量。) print(f每个向量的维度是{embeddings[0].shape})运行后你会得到一组768维的向量。现在我们手里有了一堆高维空间中的点下一步就是想办法把它们展现在二维图上。2. 降维与可视化让高维空间可见我们的屏幕是二维的如何展示768维的数据这就需要“降维”技术。我们主要尝试两种流行的方法t-SNE和UMAP。它们的目标都是在降低维度的同时尽可能保留高维空间中的数据点之间的相对距离关系比如原来近的点在二维图上依然近。2.1 使用t-SNE进行可视化t-SNE非常适合可视化高维数据的局部结构能很好地将不同类别的数据点分开。import matplotlib.pyplot as plt from sklearn.manifold import TSNE import numpy as np # 使用t-SNE将768维向量降至2维 tsne TSNE(n_components2, random_state42, perplexity3) embeddings_2d_tsne tsne.fit_transform(embeddings) # 为不同主题分配颜色和标记 label_to_color {科技: red, 体育: blue, 娱乐: green} label_to_marker {科技: o, 体育: s, 娱乐: ^} colors [label_to_color[label] for label in labels] markers [label_to_marker[label] for label in labels] # 绘制t-SNE结果图 plt.figure(figsize(10, 8)) for label, color, marker in zip([科技, 体育, 娱乐], [red, blue, green], [o, s, ^]): # 筛选出当前标签的数据点 indices [i for i, l in enumerate(labels) if l label] plt.scatter(embeddings_2d_tsne[indices, 0], embeddings_2d_tsne[indices, 1], ccolor, labellabel, markermarker, s100, alpha0.7, edgecolorsw, linewidth1.5) plt.title(文本向量空间分布可视化 (t-SNE), fontsize16, fontweightbold) plt.xlabel(t-SNE 维度 1, fontsize12) plt.ylabel(t-SNE 维度 2, fontsize12) plt.legend(fontsize12) plt.grid(True, linestyle--, alpha0.5) plt.tight_layout() plt.show()效果观察如果gte-base-zh模型语义理解能力好你应该能看到红色科技、蓝色体育、绿色娱乐的点分别形成了三个相对独立的簇。同一个颜色的点彼此靠近不同颜色的点彼此远离。perplexity参数可以调整它大致表示每个点会考虑多少个近邻对于小数据集可以设小一点如3大数据集可以设大一些如30。2.2 使用UMAP进行可视化UMAP是另一种强大的降维方法它在保留全局数据结构方面有时表现更好而且速度通常比t-SNE快。import umap # 使用UMAP将768维向量降至2维 reducer umap.UMAP(n_components2, random_state42, n_neighbors3, min_dist0.1) embeddings_2d_umap reducer.fit_transform(embeddings) # 绘制UMAP结果图 plt.figure(figsize(10, 8)) for label, color, marker in zip([科技, 体育, 娱乐], [red, blue, green], [o, s, ^]): indices [i for i, l in enumerate(labels) if l label] plt.scatter(embeddings_2d_umap[indices, 0], embeddings_2d_umap[indices, 1], ccolor, labellabel, markermarker, s100, alpha0.7, edgecolorsw, linewidth1.5) plt.title(文本向量空间分布可视化 (UMAP), fontsize16, fontweightbold) plt.xlabel(UMAP 维度 1, fontsize12) plt.ylabel(UMAP 维度 2, fontsize12) plt.legend(fontsize12) plt.grid(True, linestyle--, alpha0.5) plt.tight_layout() plt.show()效果对比将UMAP的结果图与t-SNE的放在一起看。两者可能展现出略微不同的聚类形态。有时UMAP的簇间距更清晰全局布局更规整。你可以通过调整n_neighbors考虑近邻的数量和min_dist控制点的聚集紧密程度来获得更满意的可视化效果。3. 深入分析模型能力与边界探索通过上面的图我们已经有了直观感受。现在我们更进一步设计一些更有挑战性的案例来看看模型的“火眼金睛”到底有多厉害以及它的边界在哪里。3.1 测试细粒度语义区分我们让主题更接近看看模型还能不能分清楚。比如区分“科技”下的两个子话题“人工智能”和“云计算”。# 细粒度文本示例 fine_grained_texts [ 神经网络是深度学习的基础模型。, # AI 大语言模型展现了惊人的对话能力。, # AI 云服务器可以根据需求弹性伸缩。, # 云计算 对象存储是一种海量数据存储服务。, # 云计算 转会市场上的球员身价屡创新高。, # 足球-体育 点球大战是决定比赛胜负的残酷方式。 # 足球-体育 ] fine_grained_labels [AI, AI, 云计算, 云计算, 足球, 足球] # 生成向量并可视化以UMAP为例 fine_embeddings model.encode(fine_grained_texts) reducer_fine umap.UMAP(n_components2, random_state42, n_neighbors2) fine_embeddings_2d reducer_fine.fit_transform(fine_embeddings) # 绘图 plt.figure(figsize(8, 6)) scatter plt.scatter(fine_embeddings_2d[:, 0], fine_embeddings_2d[:, 1], c[0,0,1,1,2,2], cmaptab10, s150, alpha0.8, edgecolorsk) # 添加文本标注 for i, txt in enumerate(fine_grained_texts): plt.annotate(txt[:10]..., (fine_embeddings_2d[i, 0], fine_embeddings_2d[i, 1]), fontsize9, alpha0.8) plt.title(细粒度语义区分可视化, fontsize14) plt.colorbar(scatter, label类别 (0:AI, 1:云计算, 2:足球)) plt.grid(True, linestyle--, alpha0.3) plt.tight_layout() plt.show()这个测试能看出模型是否捕捉到了更细微的语义差异。理想情况下“AI”的两个点应该紧挨着“云计算”的两个点也紧挨着而“足球”的两个点则在另一个区域。如果它们还能彼此分开说明模型的语义表示非常细腻。3.2 探索模型的“困惑”案例没有模型是完美的。我们故意制造一些容易混淆的句子看看向量空间会怎么分布。# 容易混淆的文本示例 ambiguous_texts [ 苹果公司发布了新一代手机。, # 科技品牌 这个苹果又大又红非常好吃。, # 水果 Python是一种流行的编程语言。, # 科技语言 蟒蛇是生活在热带雨林中的大型蛇类。 # 动物 ] ambiguous_labels [科技-品牌, 水果, 科技-语言, 动物] # 生成向量并可视化 ambiguous_embeddings model.encode(ambiguous_texts) reducer_amb umap.UMAP(n_components2, random_state42) ambiguous_embeddings_2d reducer_amb.fit_transform(ambiguous_embeddings) plt.figure(figsize(8, 6)) for i, (label, color) in enumerate(zip(ambiguous_labels, [darkorange, limegreen, royalblue, brown])): plt.scatter(ambiguous_embeddings_2d[i, 0], ambiguous_embeddings_2d[i, 1], ccolor, labellabel, s200, alpha0.8, edgecolorsw, linewidth2) plt.annotate(label, (ambiguous_embeddings_2d[i, 0], ambiguous_embeddings_2d[i, 1]), fontsize11, fontweightbold) plt.title(多义词与易混淆文本的向量分布, fontsize14) plt.legend() plt.grid(True, linestyle--, alpha0.3) plt.tight_layout() plt.show()这里“苹果”和“Python”都是多义词。一个好的模型应该能将“科技苹果”和“水果苹果”在向量空间里拉开距离同时让“科技苹果”和“科技Python”相对靠近。这个可视化能生动地展示模型处理一词多义和上下文理解的能力。4. 总结通过这一系列的可视化实验我们可以清晰地看到gte-base-zh模型构建的文本向量空间并非杂乱无章而是有着深刻的语义结构。对于差异明显的主题如科技、体育、娱乐它能很好地将不同类别的文本向量区分开来形成清晰的聚类。即使在更细粒度的语义区分上它也表现出了不错的能力。当然可视化也揭示了模型的一些边界比如处理极端多义词或非常相近的短语时向量可能会比较接近。这完全符合我们的预期也说明了可视化不仅是一个展示工具更是一个强大的分析工具能帮助我们直观理解模型的强项和待改进之处。这种可视化方法非常实用。比如在构建智能客服系统时你可以用它来检查用户的各种问法是否都聚集在正确的答案向量周围在做内容推荐时可以看看用户历史兴趣和待推荐内容在向量空间里的距离。它让黑盒的“向量”变成了可观察、可分析的图形为模型的选择、调优和应用提供了宝贵的直观依据。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。