Skip to main content
Neo4j 是一个开源图数据库,内置支持向量相似度搜索
它支持:
  • 近似最近邻搜索
  • 欧几里得相似度和余弦相似度
  • 结合向量和关键词搜索的混合搜索
本笔记本展示了如何使用 Neo4j 向量索引 (Neo4jVector)。 请查看 安装说明
我们要使用 OpenAIEmbeddings,因此需要获取 OpenAI API 密钥。

使用余弦距离的相似度搜索(默认)

处理向量存储

上面,我们从头创建了一个向量存储。然而,我们经常希望与现有的向量存储一起工作。为此,我们可以直接初始化它。
我们也可以使用 from_existing_graph 方法从现有图初始化向量存储。此方法从数据库中拉取相关的文本信息,并计算并将文本嵌入存储回数据库。
Neo4j 还支持关系向量索引,其中嵌入作为关系属性存储并进行索引。关系向量索引无法通过 LangChain 填充,但您可以将其连接到现有的关系向量索引。

元数据过滤

Neo4j 向量存储还支持通过结合并行运行时和精确最近邻搜索来过滤元数据。需要 Neo4j 5.18 或更高版本。 相等过滤具有以下语法。
元数据过滤还支持以下操作符:
  • $eq: 等于
  • $ne: 不等于
  • $lt: 小于
  • $lte: 小于或等于
  • $gt: 大于
  • $gte: 大于或等于
  • $in: 在值列表中
  • $nin: 不在值列表中
  • $between: 介于两个值之间
  • $like: 文本包含值
  • $ilike: 小写文本包含值
您还可以在过滤器之间使用 OR 操作符

添加文档

我们可以将文档添加到现有的向量存储中。

使用检索查询自定义响应

您还可以通过使用自定义 Cypher 片段来自定义响应,该片段可以从图中获取其他信息。底层,最终的 Cypher 语句构造如下:
检索查询必须返回以下三列:
  • text: Union[str, Dict] = 用于填充文档 page_content 的值
  • score: Float = 相似度分数
  • metadata: Dict = 文档的其他元数据
在此 博客文章 中了解更多。
这是一个示例,将所有节点属性(除了 embedding)作为字典传递给 text 列,
您还可以将 Cypher 参数传递给检索查询。参数可用于额外过滤、遍历等…

混合搜索(向量 + 关键词)

Neo4j 集成了向量和关键词索引,允许您使用混合搜索方法
要从现有索引加载混合搜索,您必须同时提供向量和关键词索引

检索器选项

本节展示如何将 Neo4jVector 用作检索器。

带来源的问答

本节介绍如何在索引上执行带来源的问答。这是通过使用 RetrievalQAWithSourcesChain 完成的,它负责从索引中查找文档。