使用Neo4j和LangChain构建高效的文本嵌入检索系统
引言
在处理大量文本数据时,如何平衡嵌入的精度和上下文的保留是一个重要问题。本文介绍如何使用Neo4j和LangChain构建一个高效的文本嵌入检索系统,通过将文档分割成较小的部分来实现这一平衡。我们将详细讲述如何设置环境、填充数据,并提供一个完整的代码示例。
主要内容
环境设置
在开始之前,你需要定义以下环境变量:
export OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
export NEO4J_URI=<YOUR_NEO4J_URI>
export NEO4J_USERNAME=<YOUR_NEO4J_USERNAME>
export NEO4J_PASSWORD=<YOUR_NEO4J_PASSWORD>
数据填充
要填充示例数据到数据库,你可以运行以下脚本:
python ingest.py
该脚本将dune.txt
文件中的文本处理并存储到Neo4j图数据库中。文本首先被分割成较大的块(“父”),然后进一步细分为较小的块(“子”),父子块有所重叠以保持上下文。存储后,子节点的嵌入使用OpenAI的嵌入计算,并存储回图中以便将来检索或分析。此外,还创建了一个名为retrieval
的向量索引,以便高效地查询这些嵌入。
使用方法
要使用此包,你首先需要安装LangChain CLI:
pip install -U langchain-cli
创建一个新的LangChain项目并安装此包:
langchain app new my-app --package neo4j-parent
或者将其添加到现有项目中:
langchain app add neo4j-parent
然后在server.py
文件中添加以下代码:
from neo4j_parent import chain as neo4j_parent_chain
add_routes(app, neo4j_parent_chain, path="/neo4j-parent")
(可选)配置LangSmith以帮助我们跟踪、监控和调试LangChain应用:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project> # if not specified, defaults to "default"
启动LangServe实例:
langchain serve
服务器启动后,你可以访问以下地址:
- http://localhost:8000
- http://127.0.0.1:8000/docs
- http://127.0.0.1:8000/neo4j-parent/playground
从代码中访问模板:
from langserve.client import RemoteRunnable
runnable = RemoteRunnable("http://localhost:8000/neo4j-parent")
代码示例
import os
from neo4j import GraphDatabase
from openai import OpenAI
# 使用API代理服务提高访问稳定性
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
NEO4J_URI = os.getenv("NEO4J_URI")
NEO4J_USERNAME = os.getenv("NEO4J_USERNAME")
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD))
openai = OpenAI(api_key=OPENAI_API_KEY)
def process_and_store_text(file_path):
with open(file_path, 'r') as file:
text = file.read()
# 分割文本并存储到Neo4j
# 假设已经定义了分割和存储函数
parent_chunks, child_chunks = split_text(text)
store_chunks_to_neo4j(driver, parent_chunks, child_chunks)
compute_and_store_embeddings(openai, driver, child_chunks)
process_and_store_text('dune.txt')
常见问题和解决方案
数据库连接问题
问题:无法连接到Neo4j数据库。
解决方案:确保Neo4j服务正在运行,并且环境变量中的URI、用户名和密码正确无误。
OpenAI API调用失败
问题:OpenAI API调用失败,提示网络错误。
解决方案:由于某些地区的网络限制,开发者可能需要使用API代理服务。确保API密钥和代理服务配置正确。
总结和进一步学习资源
本文介绍了如何使用Neo4j和LangChain构建一个高效的文本嵌入检索系统。通过分割文档和使用向量索引,可以在保留上下文的同时提高嵌入的精度。
进一步学习资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—