LangChain Neo4j 集成

1AH05dvGA 7db EMySc9AAw

LangChain 是一个用于 GenAI 编排的庞大库,它支持众多 LLM、向量存储、文档加载器和代理。它管理模板,将组件组合成链,并支持监控和可观察性。

广泛而深入的 Neo4j 集成允许进行向量搜索、Cypher 生成以及数据库查询和知识图谱构建。

以下是 图集成 的概述。

升级到 LangChain 0.1.0+ 时,请务必阅读本文:将 GraphAcademy Neo4j 和 LLM 课程更新到 Langchain v0.1
llm chatbot python

安装

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 模板。

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
jfDNiPa5ccefX6h0HiVzJbqnlgAZgfPda90truHSfbwSs3JkfxZ xbA9mZE8y2fNf 3n5cgVhbdhN0ryuMoK2JNbMgTe1OLJMA6CQRhWBxzdKRLVurUFDndT7ki4vMh cdv3SAn040HTpab9XkzGj5Q

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)提供类似的集成。

此类工具或函数的示例包括

会话记忆

将会话(即用户会话中问题和答案的流程)存储在图中,使您可以分析会话历史并将其用于改善用户体验。

您可以为问题和答案建立嵌入索引,并将其链接回图中检索到的片段和实体,并使用用户反馈重新排列这些输入,以备将来类似问题的使用。

知识图谱构建

从非结构化数据(如 PDF 文档)创建知识图谱曾经是一项复杂且耗时的任务,需要训练和使用专门的大型 NLP 模型。

图转换器 是一种工具,可用于从非结构化文档中提取结构化数据并将其转换为知识图谱。

您可以查看 LLM 图构建器 中从 PDF、YouTube 脚本、维基百科文章等提取知识图谱的实际应用、代码和演示。

入门套件

入门套件 演示了如何使用 LangChain 运行 FastAPI 服务器,以回答存储在 Neo4j 实例中的数据查询。单个端点可用于使用 向量索引链GraphCypherQA 链 或两者的组合答案来检索答案。 langserve 分支包含使用 LangServe 的相同服务的示例。

有关入门套件的使用说明和更多详细信息,请参阅此 开发者博客文章

视频和教程