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 来实现,该链从索引中查找文档。