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 向量集成支持许多操作
-
从 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 模板 允许您以自然语言与 Neo4j 图数据库交互,使用 OpenAI LLM。
它将自然语言问题转换为 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)提供类似的集成。
此类工具或函数的示例包括
-
检索具有特定名称的实体
-
检索节点的邻居
-
检索两个节点之间的最短路径
会话内存
将会话(即用户会话的问答流程)存储在图中,可以让您分析对话历史并将其用于改善用户体验。
您可以为问题和答案建立索引并将其链接回图中检索到的片段和实体,并使用用户反馈来重新排序这些输入以供将来类似的问题使用。