如何使用图数据库提高向量搜索精确度?

文本嵌入和向量搜索技术可以帮助我们根据文档的含义及其相似性来检索文档 。但当需要根据日期或类别等特定标准来筛选信息时,这些技术就显得力不从心 。为了解决这个问题,我们可以引入元数据过滤或过滤向量搜索,这允许我们根据用户的特定需求来缩小搜索范围 。
【如何使用图数据库提高向量搜索精确度?】

如何使用图数据库提高向量搜索精确度?

文章插图
图片
例如,用户可能想要了解 2021 年实施的新政策 。通过使用元数据过滤器,系统可以先筛选出 2021 年的文档,然后在这些文档中执行向量相似性搜索,以找到与用户兴趣最相关的文档 。这种先进行元数据过滤再执行向量搜索的两步策略,能够显著提高搜索的相关性和准确性 。
近期,Neo4j 引入了基于节点属性的 LangChAIn 元数据过滤支持 。由于图形数据库能够存储复杂的结构化和非结构化数据 , 我们可以利用这些数据来执行更精细的元数据过滤 。
如何使用图数据库提高向量搜索精确度?

文章插图
图片
以一个包含文章和组织信息的数据集为例,文章节点包含了文本和嵌入值,而与文章相关联的组织节点则包含了日期、情感、作者等更多信息 。通过这些信息,我们可以构建复杂的查询,以回答如
  • Rod Johnson 所在的公司是否实施了新的在家工作政策?
  • Neo4j 投资的公司是否有负面新闻?
  • 与为现代汽车供应的公司相关的供应链问题是否有任何值得注意的新闻?
等问题 。
在本篇博客中 , Tomaz Bratanic 将向我们展示如何结合 LangChain 和 OpenAI 函数调用代理来实现基于图的元数据过滤 。相关代码已在 https://Github.com/tomasonjo/blogs/blob/master/llm/graph_based_prefiltering.ipynb 上提供 。
概览我们将使用 Neo4j 托管的公共演示服务器上的 companies 图数据集 。您可以通过以下凭据访问该数据集:
URI: https://demo.neo4jlabs.com:7473/browser/用户名: companies密码: companies数据库: companies
如何使用图数据库提高向量搜索精确度?

文章插图
图片
数据集的完整模式包括以 Organization 节点为中心的丰富信息,涵盖供应商、竞争对手、位置、董事会成员等 。此外,还有提及特定组织的文章及其相应的文本块 。
我们将实现一个 OpenAI 代理,它可以根据用户输入动态生成 Cypher 语句,并从图形数据库检索相关文本块 。这个工具将提供四个可选输入参数:
  • 主题:用户感兴趣的特定信息或主题 。
  • 组织:用户希望查询信息的组织 。
  • 国家:用户感兴趣的组织的国家 。
  • 情感:文章的情感倾向 。
我们将根据这些输入参数动态构建相应的 Cypher 语句,从图形数据库检索相关信息,并利用大型语言模型(LLM)生成最终答案 。
要跟随代码实践,您将需要一个 OpenAI API 密钥 。
功能实现我们从设置 Neo4j 的连接凭证和相关连接开始 。
import osos.environ["OPENAI_API_KEY"] = "sk-"os.environ["NEO4J_URI"] = "neo4j+s://demo.neo4jlabs.com"os.environ["NEO4J_USERNAME"] = "companies"os.environ["NEO4J_PASSword"] = "companies"os.environ["NEO4J_DATABASE"] = "companies"embeddings = OpenAIEmbeddings()graph = Neo4jGraph()vector_index = Neo4jVector.from_existing_index( embeddings, index_name="news")我们使用 OpenAI 的文本嵌入技术,您需要一个 API 密钥来使用它 。接下来,我们定义了与 Neo4j 的连接,这使我们能够执行任意的 Cypher 语句 。最后,我们创建了一个 Neo4jVector 连接 , 它可以通过查询现有的向量索引来检索信息 。目前 , 我们不能将向量索引与预过滤方法结合使用 , 只能与后过滤方法结合使用 。但本文将专注于预过滤方法与全面向量相似性搜索的结合使用 。
本文的核心是一个名为 get_organization_news 的函数,它能够根据用户的需求动态生成 Cypher 查询语句并检索相关信息 。为了清晰起见,我将代码分成了多个部分 。