LangChain Neo4j 集成

LangChain 是一个用于 GenAI 编排的庞大库,它支持众多 LLM、向量存储、文档加载器和代理。它管理模板,将组件组合成链,并支持监控和可观察性。
广泛而深入的 Neo4j 集成允许进行向量搜索、Cypher 生成以及数据库查询和知识图谱构建。
以下是 图集成 的概述。
升级到 LangChain 0.1.0+ 时,请务必阅读本文:将 GraphAcademy Neo4j 和 LLM 课程更新到 Langchain v0.1。 |
安装
pip install langchain langchain-community
# pip install langchain-openai tiktoken
# pip install neo4j
功能包括
Neo4jVector
Neo4j Vector 集成支持多种操作
-
从 LangChain 文档创建向量
-
查询向量
-
使用其他图检索 Cypher 查询查询向量
-
从现有图数据构建向量实例
-
混合搜索
-
元数据过滤
from langchain.docstore.document import Document
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
loader = TextLoader("../../modules/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()
# The Neo4jVector Module will connect to Neo4j and create a vector index if needed.
db = Neo4jVector.from_documents(
docs, OpenAIEmbeddings(), 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)
混合搜索
混合搜索将向量搜索与全文搜索相结合,并对结果进行重新排序和去重。
from langchain.docstore.document import Document
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
loader = TextLoader("../../modules/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()
# The Neo4jVector Module will connect to Neo4j and create a vector index if needed.
db = Neo4jVector.from_documents(
docs, OpenAIEmbeddings(), url=url, username=username, password=password,
search_type: 'hybrid'
)
query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = db.similarity_search_with_score(query, k=2)
元数据过滤
元数据过滤通过允许根据特定节点属性细化搜索来增强向量搜索。这种集成方法通过利用向量的相似性和节点的上下文属性,确保获得更准确和相关的搜索结果。
db = Neo4jVector.from_documents(
docs,
OpenAIEmbeddings(),
url=url, username=username, password=password
)
query = "What did the president say about Ketanji Brown Jackson"
filter = {"name": {"$eq": "adam"}}
docs = db.similarity_search(query, filter=filter)
Neo4j 图
Neo4j 图集成是 Neo4j Python 驱动程序的包装器。它允许以简化的方式从 LangChain 查询和更新 Neo4j 数据库。许多集成允许您使用 Neo4j 图作为 LangChain 数据源。
from langchain_community.graphs import Neo4jGraph
graph = Neo4jGraph(url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD)
QUERY = """
"MATCH (m:Movie)-[:IN_GENRE]->(:Genre {name:$genre})
RETURN m.title, m.plot
ORDER BY m.imdbRating DESC LIMIT 5"
"""
graph.query(QUERY, genre="action")
CypherQAChain
CypherQAChain 是一个 LangChain 组件,允许您以自然语言与 Neo4j 图数据库交互。它使用 LLM 和图模式将用户问题转换为 Cypher 查询,将其针对图执行,并使用返回的上下文信息和原始问题与第二个 LLM 生成自然语言响应。
# pip install --upgrade --quiet langchain
# pip install --upgrade --quiet langchain-openai
from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
graph = Neo4jGraph(url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD)
# Insert some movie data
graph.query(
"""
MERGE (m:Movie {title:"Top Gun"})
WITH m
UNWIND ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"] AS actor
MERGE (a:Actor {name:actor})
MERGE (a)-[:ACTED_IN]->(m)
"""
)
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True
)
chain.run("Who played in Top Gun?")
高级 RAG 策略
除了基本的 RAG 策略之外,LangChain 中的 Neo4j 集成还支持高级 RAG 策略,这些策略允许更复杂的检索策略。它们也可用作 LangChain 模板。
-
常规 rag - 直接向量搜索
-
父子检索器 将表示特定概念的嵌入式块链接到父文档
-
假设问题 - 从文档块生成问题,并将其向量索引以获得更匹配的用户问题候选者
-
摘要 - 索引文档的摘要,而不是整个文档
-
https://python.langchain.ac.cn/docs/templates/neo4j-advanced-rag
pip install -U "langchain-cli[serve]"
langchain app new my-app --package neo4j-advanced-rag
# update server.py to add the neo4j-advanced-rag template as an endpoint
cat <<EOF > server.py
from fastapi import FastAPI
from langserve import add_routes
from neo4j_advanced_rag import chain as neo4j_advanced_chain
app = FastAPI()
# Add this
add_routes(app, neo4j_advanced_chain, path="/neo4j-advanced-rag")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
EOF
langchain serve
LangChain 模板
Langchain 模板 是一组预配置的链和组件,可用于构建 GenAI 工作流和应用程序。您可以在 LangChain Playground 上以交互方式测试它们,并使用 LangServe 运行它们以作为 REST API 运行,它们还与 [LangSmith] 集成以进行监控和可观察性。
通过从模板创建应用程序,它们的源代码将添加到您的应用程序中,您可以修改它们以适合您的需求。
模板列表
此 Cypher 模板 允许您使用 OpenAI LLM 以自然语言与 Neo4j 图数据库交互。
它将自然语言问题转换为 Cypher 查询(用于从 Neo4j 数据库中提取数据),执行查询,并根据查询结果提供自然语言响应。
此外,Cypher-FT 模板 利用全文索引来有效地将文本值映射到数据库条目,从而增强准确 Cypher 语句的生成。
此外,Cypher 内存模板 还具有一个对话内存模块,该模块将对话历史存储在 Neo4j 图数据库中。对话内存为每个用户会话唯一维护,确保个性化交互。
此外,Neo4j 生成模板 将基于 LLM 的知识图谱提取与 OpenAI 函数配对,并与 Neo4j AuraDB(一个完全托管的云图数据库)配对。
此外,Neo4j 向量内存模板 允许您将 LLM 与使用 Neo4j 作为向量存储的基于向量的检索系统集成。此外,它还使用 Neo4j 数据库的图功能来存储和检索特定用户会话的对话历史。将对话历史存储为图可以实现无缝的对话流程,还可以通过图分析来分析用户行为和文本块检索。
此外,父子检索器模板 允许您通过将文档拆分为较小的块并检索其原始或较大的文本信息来平衡精确的嵌入和上下文保留。
使用 Neo4j 向量索引,该软件包使用向量相似性搜索查询子节点并检索相应的父文本。
此外,Neo4j 语义层模板 旨在实现一个能够通过使用 OpenAI 函数调用的语义层与 Neo4j 等图数据库交互的代理。语义层为代理配备了一套强大的工具,允许它根据用户的意图与图数据库交互。
语义层
在(图)数据库之上构建语义层并不依赖于自动查询生成,而是提供了一系列 API 和工具,使 LLM 能够访问数据库及其结构。
与自动生成的查询不同,这些工具使用正确的查询和交互实现,并且仅从 LLM 获取参数,因此使用起来是安全的。
许多云 (LLM) 提供商通过函数调用(OpenAI、Anthropic)或扩展(Google Vertex AI、AWS Bedrock)提供类似的集成。
此类工具或函数的示例包括
-
检索具有特定名称的实体
-
检索节点的邻居
-
检索两个节点之间的最短路径
会话记忆
将会话(即用户会话中问题和答案的流程)存储在图中,使您可以分析会话历史并将其用于改善用户体验。
您可以为问题和答案建立嵌入索引,并将其链接回图中检索到的片段和实体,并使用用户反馈重新排列这些输入,以备将来类似问题的使用。