文本嵌入和向量搜索技术可以帮助我们根据文档的含义及其相似性来检索文档 。但当需要根据日期或类别等特定标准来筛选信息时,这些技术就显得力不从心 。为了解决这个问题,我们可以引入元数据过滤或过滤向量搜索,这允许我们根据用户的特定需求来缩小搜索范围 。
【如何使用图数据库提高向量搜索精确度?】
文章插图
图片
例如,用户可能想要了解 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 语句,并从图形数据库检索相关文本块 。这个工具将提供四个可选输入参数:
- 主题:用户感兴趣的特定信息或主题 。
- 组织:用户希望查询信息的组织 。
- 国家:用户感兴趣的组织的国家 。
- 情感:文章的情感倾向 。
要跟随代码实践,您将需要一个 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 查询语句并检索相关信息 。为了清晰起见,我将代码分成了多个部分 。
- 首先,我们定义了一组输入参数,这些参数都是可选的文字输入 。特别地,topic 参数用来在文档中搜索特定的信息 。在实际应用中 , 我们会将 topic 参数的值用于向量相似性搜索 。另外三个参数则用于展示预过滤的方法 。如果所有预过滤参数都没有提供,我们可以直接利用现有的向量索引来检索相关文档 。如果提供了预过滤参数,我们会开始构建一个基础的 Cypher 查询语句,这个语句将用于后续的预过滤元数据方法 。我们使用 CYPHER runtime = parallel parallelRuntimeSupport=all 指令来告诉 Neo4j 数据库,在可能的情况下使用 并行运行时 。然后,我们准备一个匹配语句来选择 Chunk 节点和它们关联的 Article 节点 。
推荐阅读
- 线上MongoDB查询慢,如何通过索引优化直降响应时间?
- 探秘Python神器:eli5模块如何解读机器学习模型的预测结果?
- 为什么MySQL默认使用RR隔离级别?
- 使用 PHP 处理十亿行数据,如何极致提升处理速度?
- MongoDB索引使用总结
- 橄榄树嫁接方法腹接,橄榄树如何种植能高产 橄榄树的种植方法
- 水蒿的功效与作用图片 水蒿和艾草的区别
- 切换微信支付账号怎么设置,手机中的微信支付方式该如何设置
- 花王洗衣机槽清洗剂怎么用 花王洗衣机槽清洗剂如何用
- Excel如何纵向或竖向和,Excel函数怎么横列竖列分别和