如何有效可视化存储在ChromaDB中的向量嵌入?
可视化ChromaDB中OpenAI嵌入向量的实操方案
实现逻辑
OpenAI的嵌入是1536维高维数据,必须通过降维算法压缩到2D/3D空间才能可视化。结合ChromaDB的API提取向量,再用UMAP/PCA降维,最后用可视化工具关联文本元数据,就能直观看到向量的聚类分布。
1. 从ChromaDB导出向量与文本
先加载已持久化的Chroma集合,提取所有存储的向量、文档和元数据:
import chromadb from langchain_openai import OpenAIEmbeddings import numpy as np # 初始化嵌入模型与Chroma客户端 embeddings = OpenAIEmbeddings() client = chromadb.PersistentClient(path="./chroma_db") # 默认集合名为langchain,若自定义过需修改 collection = client.get_collection("langchain") # 提取完整数据(包含向量、文档、元数据) data = collection.get(include=["embeddings", "documents", "metadatas"]) vectors = np.array(data["embeddings"]) docs = data["documents"] metadatas = data["metadatas"]
2. 高维向量降维
推荐用UMAP(聚类效果稳定、速度优于t-SNE),也可以用PCA做快速初步分析:
# 安装依赖 !pip install umap-learn matplotlib plotly pandas import umap reducer = umap.UMAP(n_components=2, random_state=42) # 降维到2D平面 reduced_vectors = reducer.fit_transform(vectors)
3. 可视化实现
基础静态可视化(Matplotlib)
适合小数据集,直接标注文本片段:
import matplotlib.pyplot as plt plt.figure(figsize=(14, 10)) plt.scatter(reduced_vectors[:, 0], reduced_vectors[:, 1], alpha=0.7, s=50) # 为每个点添加文本标注(数据量<100时适用) for idx, doc in enumerate(docs): plt.text(reduced_vectors[idx, 0], reduced_vectors[idx, 1], doc[:60] + "...", fontsize=7, alpha=0.8) plt.title("ChromaDB向量嵌入UMAP降维分布") plt.xlabel("UMAP维度1") plt.ylabel("UMAP维度2") plt.tight_layout() plt.show()
交互式可视化(Plotly)
适合大数据集,鼠标悬停可查看完整文本片段与元数据:
import pandas as pd import plotly.express as px # 构造可视化用DataFrame df = pd.DataFrame({ "x": reduced_vectors[:, 0], "y": reduced_vectors[:, 1], "文档预览": [doc[:120] + "..." for doc in docs], "来源文件": [meta.get("source", "未知") for meta in metadatas] }) # 生成交互式散点图 fig = px.scatter(df, x="x", y="y", hover_data=["文档预览", "来源文件"], title="ChromaDB 向量嵌入交互式可视化") fig.update_traces(marker=dict(size=8, opacity=0.7)) fig.show()
进阶玩法
- 查询向量对比:生成查询文本的嵌入,加入降维数组,用不同颜色标记,直观看到查询与相关文档的聚类关系。
- 聚类上色:用K-Means对降维后的向量分组,给不同簇分配颜色,快速识别主题聚类。
内容的提问来源于stack exchange,提问作者Anay
相关产品推荐
相关产品推荐

