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 向量集成支持许多操作

  • 从 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 模板 允许您以自然语言与 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)提供类似的集成。

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

会话内存

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

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

知识图谱构建

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

图转换器 是允许您从非结构化文档中提取结构化数据并将其转换为知识图谱的工具。

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

入门套件

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

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

视频和教程