图形数据库:向量搜索中结构与嵌入结合

2025年02月06日 由 alex 发表 5003 0

想象一下你正在用零散的信息来解决一个复杂的难题。


传统的数据库搜索就像翻阅 Rolodex 一样——你寻找精确匹配或简单属性:“谁有红头发?”或“谁有一辆蓝色汽车?” ——有用,但有限。向量相似性搜索改变了游戏规则,让你可以问:“还有哪些作品看起来像这个?”它擅长寻找语义相似性,揭示可能隐藏的模式。


7


但复杂的谜题不仅仅关乎单个碎片 — 它们关乎万物如何连接。这正是图形数据库的闪光点。它们映射关系:“谁与谁有联系?”或“两点之间的最短路径是什么?”图形可以帮助你看到更大的图景。


现在想象一下将这两种功能结合起来。你不仅可以找到看起来相似的部分,还可以立即看到它们如何融入更广泛的背景中。例如,识别与另一名嫌疑人相似的嫌疑人是不够的——重要的是揭示他们的网络:他们的同伙、行动和互动。


这种向量相似性搜索和图遍历的融合为通过含义和关系理解数据创造了一个强大的新范式。

  • 矢量数据库擅长揭示语义相似性:“这个文档感觉像那个文档”或“这个图像类似于那个图像”。
  • 同时,图形数据库解开了关系和层次结构:“谁与谁有联系?”或“两个节点之间的最短路径是什么?”


理解向量嵌入


8


向量嵌入将复杂数据(如文本、图像或图中的节点)转换为固定长度的数值向量。虽然上图是在三维平面上,但 OpenAI 的 API(例如text-embedding-3-small)会生成1536 维向量。这些高维表示可以实现详细的上下文理解,这对于语义搜索、推荐系统等任务至关重要。


我们可以使用余弦相似度搜索等算法来找到相似度分数,以确定两个词的相似程度。


速度和性能:

  • 查询延迟:即使在具有数百万嵌入的数据集中,PineconeDB 等工具也可以优化低于 50 毫秒的查询时间。
  • 批处理:嵌入 OpenAI 等 API 每秒可以处理数百个文本,使其适用于实时应用程序。
  • 维度与速度的权衡:虽然更高的维度(例如 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向量搜索则能找到行为类似于那些经常购买相似商品的其他客户的客户。


一般来说,维度越多,存储的“上下文”就越多——因此相似度搜索也就越准确!


9


以下是一些向量数据库提供商的示例:

  • PineconeDB:针对大规模低延迟相似度搜索进行了优化。它支持实时查询,并与机器学习工作流程集成。
  • Weaviate:提供模块化的、基于模式的存储,内置向量索引。它支持结合向量和符号过滤器的混合搜索。
  • pgvector:一个PostgreSQL扩展,用于将向量搜索嵌入关系数据库,使向量操作能够与传统的SQL查询一起使用。


知识图谱基础

为了充分理解向量相似度搜索和图数据库的融合,让我们首先分解它们的核心组件。


10


图通过将数据建模为相互连接的实体,提供了一种独特的视角。关键概念包括:

  • 节点:表示实体(例如,用户或产品)。
  • 边:定义关系(例如,“购买”、“与…为好友”)。
  • 属性:存储节点和边的元数据(例如,时间戳或权重)。


速度和性能:

  • 查询效率:像Neo4j这样的图数据库针对复杂的遍历查询进行了优化,即使在深度连接的数据中,也能在毫秒内返回结果。
  • 可扩展性:这些数据库旨在高效处理数十亿个节点和边,在规模上保持高性能。
  • 遍历与连接:通过直接遍历连接的节点,图数据库在关系查询中实现了O(n)的效率,这与具有多个连接的SQL查询的O(n^k)复杂度形成鲜明对比。这使得它们在分析相互连接的数据(如社交网络或推荐系统)时特别有利。


一些图数据库提供商的示例:

  • Neo4j:最流行的图数据库之一,提供高级图算法和分析及机器学习工作流的集成。
  • ArangoDB:支持图、文档和键值数据的多模型数据库,设计用于灵活性和可扩展性。
  • Amazon Neptune:一种完全托管的图数据库服务,支持属性图和RDF(资源描述框架)图。


结合图和向量:两种方法

记住:向量数据库告诉你什么相似,而图数据库告诉你它们如何连接。


方法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等技术。以下是它们的作用:

  1. 节点嵌入:像Node2Vec这样的技术通过在节点周围进行随机游走,并将其在图中的上下文编码为一个向量。例如,一个“Netflix”节点可能通过捕获与“电影”、“节目”和“订阅者”等相关节点的连接来嵌入其上下文。
  2. 边嵌入:像TransE这样的技术将节点之间的关系建模为向量平移。例如,在知识图中,关系“巴黎是法国的首都”变成一个向量操作:巴黎 + 是…的首都 ≈ 法国。
  3. 子图嵌入:像GraphSAGE这样的聚合方法将子图中的特征和关系总结为一个向量。例如,一个包含房屋、学校和杂货店节点的社区地图可能会嵌入为其连接性、交通模式和建筑类型的总结。


方法2:结合独立的图和向量数据库

当结合图遍历和向量相似度搜索时,目标是高效地处理这两种类型的查询。为此,我们需要一种称为混合索引结构的东西。可以将其视为一个智能系统,该系统以无缝协作的方式组织关系得分(图数据)和相似度得分(向量数据)。


关系得分量化图中连接的强度或性质。例如,两个用户频繁交互可能具有5的关系得分。


相似度得分告诉你两个实体基于其向量嵌入的相似程度。例如,本文前面提到的“苹果”和“香蕉”的相似度得分接近1。


工作原理:


图索引:想象一张地图,其中每个城市(节点)都通过道路(边)连接。此索引存储这些连接,以帮助回答诸如“如何从城市A到达城市B?”(最短路径查询)的问题。

向量索引:这部分将城市的“概况”信息(如人口、气候或氛围)组织到一个系统中,其中相似的城市被分组在一起。可以将其视为一种说“哪个城市与城市A最相似?”的方式。

集成层:这一层充当翻译器,让你能够结合这些系统。例如:“哪些与城市A相似的城市也直接与城市B相连?”


想象一个电子商务的推荐系统。Pinecone中的向量索引根据描述或评论识别与用户之前购买的产品相似的产品。同时,ArangoDB中的图索引揭示经常一起购买的产品。通过结合这两者,你可以推荐不仅相似而且在上下文上相关的商品。


有效规划查询

为了充分利用混合系统,我们需要一种策略来结合这两种搜索,而不使系统过载。以下是一些方法:


逐步执行(顺序执行):

  • 首先,使用向量相似度缩小结果范围。例如,找到最相似的10个产品。
  • 接下来,使用图遍历根据关系过滤这些结果,例如与这10个最相似产品一起购买的其他产品。


同时执行(并行执行):

  • 同时运行两种搜索,然后合并结果。例如,找到与产品A最相似的产品以及与产品A一起购买的其他产品,并比较相似度和关系得分来对商品进行排名。


预过滤(优化过滤):

  • 使用向量相似度快速减少搜索空间,然后再应用计算量更大的图算法。


加快速度:性能优化

高级:处理大型图和向量可能要求很高,但有方法可以提高效率:

  • 预计算:保存频繁查询的结果,以便无需重新运行。例如,缓存常见搜索的关系或集群。
  • 索引调优:针对最常见的查询模式对图和向量索引进行微调。对于图索引,这可能意味着优化边存储或聚类频繁访问的节点。对于向量索引,这可能涉及选择合适的维度或修剪不太相关的嵌入。
  • 分布式处理:使用多台机器分配工作负载。与依赖单台强大机器不同,分配任务允许跨数据集并行执行查询,减少瓶颈,并实现水平扩展,以高效处理更大的工作负载。


那么…哪个更好?


11


方法一:在图数据库中嵌入向量

许多现代图数据库,如Neo4j、ArangoDB和Amazon Neptune,现在都支持直接在图中嵌入向量,从而能够实现结合关系遍历和语义相似性的混合查询。


优势:

  • 统一的数据管理:在图中直接存储嵌入减少了管理多个系统的复杂性。
  • 混合查询:能够在单个查询中无缝结合向量相似性和图遍历,例如,在探索用户社区的同时识别与目标用户相似的用户。
  • 降低延迟:消除了系统间的数据传输,这对于实时应用至关重要。


挑战:

  • 可扩展性:图数据库在处理超过数千万个节点或维度超过1500的嵌入时,可能会遇到性能下降的问题。
  • 搜索精度:专用的向量数据库通常在极高维度数据的相似性搜索方面提供更快且更准确的结果。


方法二:结合独立系统

直到去年,图数据库还不支持直接在图中嵌入向量。这仍然是一项相对新的技术,而专用的向量数据库在速度方面,尤其是高维度相似性搜索方面,仍然具有优势。


优势:

  • 领域专业化:像Pinecone这样的向量数据库在高维度相似性搜索方面表现出色,而图数据库则优化用于处理复杂关系。
  • 可扩展性:每个系统可以独立扩展,使得管理包含数十亿节点或嵌入的数据集成为可能。
  • 定制化优化:两个系统都可以针对其特定工作负载进行微调,例如优化图遍历算法或相似性索引。


挑战:

  • 集成开销:保持系统之间的同步需要额外的基础设施,如ETL管道或中间件。
  • 查询延迟:结合两个系统的结果可能会引入延迟,特别是对于低延迟要求的应用。


考虑:结合独立的数据库可以提供领域特定的优势,如更快的相似性搜索,但系统间通信带来的额外延迟可能得不偿失。


[可选]下一步:构建结合专业网络的电影推荐引擎


12


考虑使用TMDB 5000电影数据集构建一个电影推荐引擎。这个引擎将整合向量嵌入和图遍历功能,基于内容和专业联系来推荐电影,并帮助你巩固对这些概念的理解。


注意:这只是一个高级项目概述。真正的乐趣和学习在于深入细节并找出解决方案!


  1. 数据收集:下载TMDB 5000电影元数据数据集。
  2. 数据预处理:清理数据,重点关注描述、类型和演员阵容。将电影描述转化为向量嵌入。
  3. 向量嵌入:使用OpenAI的嵌入API将描述转换为高维向量,以便进行基于相似性的推荐。
  4. 图数据库:设置一个图数据库(例如ArangoDB)来建模专业网络(例如演员、导演、制片人)及其与电影的关系。
  5. 相似性搜索:实现余弦相似性,以基于向量嵌入找到内容相似的电影。
  6. 图遍历:使用图遍历功能,根据专业联系(例如同一导演、演员)来推荐电影。
  7. 混合系统:将基于内容的推荐(向量相似性)与基于网络的建议(图遍历)相结合。
  8. 优化:预计算常见查询,并优化图/向量索引以提高性能。


这个项目将帮助你在实际应用中运用向量相似性和图遍历。


结论

最让我兴奋的是,这种融合不仅仅是一次迭代——它可能是一次范式转变。我们终于可以在大规模上结合意义与上下文,并且随着越来越多的图数据库添加原生向量支持,我相信我们正处于看到图数据库成为主流的边缘。



文章来源:https://medium.com/datadriveninvestor/vector-similarity-search-in-graph-databases-combining-graph-structure-with-embeddings-dcf09588ba5e
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消