LangChain Neo4j 集成

LangChain 是一个庞大的生成式 AI 编排库,支持众多 LLM、向量存储、文档加载器和代理。它管理模板,将组件组合成链,并支持监控和可观测性。
广泛而深入的 Neo4j 集成支持向量搜索、Cypher 生成、数据库查询和知识图谱构建。
以下是图集成的概述。
升级到 LangChain 0.1.0+ 时,请务必阅读本文:将 GraphAcademy Neo4j 和 LLM 课程更新到 Langchain v0.1。 |
安装
pip install langchain langchain-community langchain-neo4j
# 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_neo4j 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, 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)
混合搜索
混合搜索结合了向量搜索和全文搜索,并对结果进行重新排序和去重。
from langchain.docstore.document import Document
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_neo4j 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, embeddings, 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_neo4j 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, params={"genre": "action"})
CypherQAChain
CypherQAChain 是 LangChain 的一个组件,它允许您以自然语言与 Neo4j 图数据库进行交互。它使用 LLM 和图模式将用户问题转换为 Cypher 查询,对图执行该查询,并使用返回的上下文信息和原始问题与第二个 LLM 一起生成自然语言响应。
# pip install --upgrade --quiet langchain
# pip install --upgrade --quiet langchain-openai
from langchain_neo4j import Neo4jGraph, GraphCypherQAChain
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,
allow_dangerous_requests=True
)
chain.run("Who acted in Top Gun?")
高级 RAG 策略
除了基本的 RAG 策略,LangChain 中的 Neo4j 集成还支持高级 RAG 策略,这些策略允许更复杂的检索策略。这些也以 LangChain 模板的形式提供。
-
常规 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
语义层
位于(图)数据库之上的语义层不依赖于自动查询生成,而是提供了一系列 API 和工具,使 LLM 能够访问数据库及其结构。
与自动生成的查询不同,这些工具是安全的,因为它们使用正确的查询和交互实现,并且只从 LLM 获取参数。
许多云(LLM)提供商通过函数调用(OpenAI、Anthropic)或扩展(Google Vertex AI、AWS Bedrock)提供类似的集成。
此类工具或函数的示例包括
-
检索具有特定名称的实体
-
检索节点的邻居
-
检索两个节点之间的最短路径
对话记忆
将对话(即用户会话的问题和答案流程)存储在图中,可以分析对话历史并用其改进用户体验。
您可以为嵌入建立索引,并将问题和答案链接回图中检索到的块和实体,并使用用户反馈重新排序这些输入,以应对未来类似的问题。
相关链接
作者 |
|
社区支持 |
|
LangChain 仓库 |
|
LangChain 问题 |
|
LangChain Neo4j 仓库 |
|
LangChain Neo4j API 文档 |
|
LangChain Neo4j 问题 |
|
文档 |
|
文档 |
|
入门套件 |
|
Jupyter |