想象一下你正在用零散的信息来解决一个复杂的难题。
传统的数据库搜索就像翻阅 Rolodex 一样——你寻找精确匹配或简单属性:“谁有红头发?”或“谁有一辆蓝色汽车?” ——有用,但有限。向量相似性搜索改变了游戏规则,让你可以问:“还有哪些作品看起来像这个?”它擅长寻找语义相似性,揭示可能隐藏的模式。
但复杂的谜题不仅仅关乎单个碎片 — 它们关乎万物如何连接。这正是图形数据库的闪光点。它们映射关系:“谁与谁有联系?”或“两点之间的最短路径是什么?”图形可以帮助你看到更大的图景。
现在想象一下将这两种功能结合起来。你不仅可以找到看起来相似的部分,还可以立即看到它们如何融入更广泛的背景中。例如,识别与另一名嫌疑人相似的嫌疑人是不够的——重要的是揭示他们的网络:他们的同伙、行动和互动。
这种向量相似性搜索和图遍历的融合为通过含义和关系理解数据创造了一个强大的新范式。
理解向量嵌入
向量嵌入将复杂数据(如文本、图像或图中的节点)转换为固定长度的数值向量。虽然上图是在三维平面上,但 OpenAI 的 API(例如text-embedding-3-small)会生成1536 维向量。这些高维表示可以实现详细的上下文理解,这对于语义搜索、推荐系统等任务至关重要。
我们可以使用余弦相似度搜索等算法来找到相似度分数,以确定两个词的相似程度。
速度和性能:
自己尝试一下:
from openai import OpenAI
import numpy as np
from numpy.linalg import norm
client = OpenAI(api_key='YOUR_API_KEY')
# You can change any of the texts here!
texts = ["apple", "banana", "computer"]
# Get embeddings for all texts
responses = client.embeddings.create(
input=texts,
model="text-embedding-3-small"
)
embeddings = [r.embedding for r in responses.data]
# Calculate similarity scores with cosine similarity algorithm
sim1 = np.dot(embeddings[0], embeddings[1]) / (norm(embeddings[0]) * norm(embeddings[1]))
sim2 = np.dot(embeddings[0], embeddings[2]) / (norm(embeddings[0]) * norm(embeddings[2]))
sim3 = np.dot(embeddings[0], embeddings[3]) / (norm(embeddings[0]) * norm(embeddings[3]))
print(f"Similarity (apple-banana): {sim1:.3f}")
print(f"Similarity (apple-computer): {sim2:.3f}")
print(f"Similarity (apple-{user_text}): {sim3:.3f}")
考虑这一点:PostgreSQL查询可能找到上个月购买过某产品的所有客户,而Pinecone向量搜索则能找到行为类似于那些经常购买相似商品的其他客户的客户。
一般来说,维度越多,存储的“上下文”就越多——因此相似度搜索也就越准确!
以下是一些向量数据库提供商的示例:
知识图谱基础
为了充分理解向量相似度搜索和图数据库的融合,让我们首先分解它们的核心组件。
图通过将数据建模为相互连接的实体,提供了一种独特的视角。关键概念包括:
速度和性能:
一些图数据库提供商的示例:
结合图和向量:两种方法
记住:向量数据库告诉你什么相似,而图数据库告诉你它们如何连接。
方法1:在图数据库中存储向量嵌入
如前所述,图数据库本质上将数据存储为节点、边和属性,但这种结构针对检索、查询执行和图遍历(例如,查找用户的所有朋友及其帖子)进行了优化。
节点、边和…子图?
然而,大多数机器学习模型、相似度计算和下游任务(例如,推荐系统、欺诈检测、聚类)需要固定长度的数值向量作为输入(例如,之前来自OpenAI的1536维向量)!
例如,在社交网络中:
自己动手试试:
from openai import OpenAI
import networkx as nx
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import numpy as np
client = OpenAI(api_key='YOUR_API_KEY')
# Create a simple graph
G = nx.Graph()
G.add_edges_from([("User1", "Movie1"), ("User1", "Movie2"),
("User2", "Movie1"), ("User2", "Movie3"),
("User3", "Movie3"), ("User3", "Movie4")])
nx.draw(G, with_labels=True, node_color="lightblue", font_size=10)
plt.title("Graph: Users and Movies")
plt.show()
# Generate embeddings using OpenAI API
def get_embedding(node):
return client.embeddings.create(input=node, model="text-embedding-3-small")["data"][0]["embedding"]
embeddings = np.array([get_embedding(node) for node in G.nodes()])
# Reduce dimensions and visualize
embeddings_2d = PCA(n_components=2).fit_transform(embeddings)
plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1], c="lightblue")
for i, node in enumerate(G.nodes()):
plt.text(embeddings_2d[i, 0], embeddings_2d[i, 1], node, fontsize=9)
plt.title("Node Embeddings Visualization")
plt.show()
节点、边和子图如何变成向量?
为了将图元素转换为向量,应用了诸如Node2Vec、TransE和GraphSAGE等技术。以下是它们的作用:
方法2:结合独立的图和向量数据库
当结合图遍历和向量相似度搜索时,目标是高效地处理这两种类型的查询。为此,我们需要一种称为混合索引结构的东西。可以将其视为一个智能系统,该系统以无缝协作的方式组织关系得分(图数据)和相似度得分(向量数据)。
关系得分量化图中连接的强度或性质。例如,两个用户频繁交互可能具有5的关系得分。
相似度得分告诉你两个实体基于其向量嵌入的相似程度。例如,本文前面提到的“苹果”和“香蕉”的相似度得分接近1。
工作原理:
图索引:想象一张地图,其中每个城市(节点)都通过道路(边)连接。此索引存储这些连接,以帮助回答诸如“如何从城市A到达城市B?”(最短路径查询)的问题。
向量索引:这部分将城市的“概况”信息(如人口、气候或氛围)组织到一个系统中,其中相似的城市被分组在一起。可以将其视为一种说“哪个城市与城市A最相似?”的方式。
集成层:这一层充当翻译器,让你能够结合这些系统。例如:“哪些与城市A相似的城市也直接与城市B相连?”
想象一个电子商务的推荐系统。Pinecone中的向量索引根据描述或评论识别与用户之前购买的产品相似的产品。同时,ArangoDB中的图索引揭示经常一起购买的产品。通过结合这两者,你可以推荐不仅相似而且在上下文上相关的商品。
有效规划查询
为了充分利用混合系统,我们需要一种策略来结合这两种搜索,而不使系统过载。以下是一些方法:
逐步执行(顺序执行):
同时执行(并行执行):
预过滤(优化过滤):
加快速度:性能优化
高级:处理大型图和向量可能要求很高,但有方法可以提高效率:
那么…哪个更好?
方法一:在图数据库中嵌入向量
许多现代图数据库,如Neo4j、ArangoDB和Amazon Neptune,现在都支持直接在图中嵌入向量,从而能够实现结合关系遍历和语义相似性的混合查询。
优势:
挑战:
方法二:结合独立系统
直到去年,图数据库还不支持直接在图中嵌入向量。这仍然是一项相对新的技术,而专用的向量数据库在速度方面,尤其是高维度相似性搜索方面,仍然具有优势。
优势:
挑战:
考虑:结合独立的数据库可以提供领域特定的优势,如更快的相似性搜索,但系统间通信带来的额外延迟可能得不偿失。
[可选]下一步:构建结合专业网络的电影推荐引擎
考虑使用TMDB 5000电影数据集构建一个电影推荐引擎。这个引擎将整合向量嵌入和图遍历功能,基于内容和专业联系来推荐电影,并帮助你巩固对这些概念的理解。
注意:这只是一个高级项目概述。真正的乐趣和学习在于深入细节并找出解决方案!
这个项目将帮助你在实际应用中运用向量相似性和图遍历。
结论
最让我兴奋的是,这种融合不仅仅是一次迭代——它可能是一次范式转变。我们终于可以在大规模上结合意义与上下文,并且随着越来越多的图数据库添加原生向量支持,我相信我们正处于看到图数据库成为主流的边缘。