LangChain Neo4j 集成

1AH05dvGA 7db EMySc9AAw

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

广泛而深入的 Neo4j 集成支持向量搜索、Cypher 生成、数据库查询和知识图谱构建。

以下是图集成的概述。

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

安装

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 - 直接向量搜索

  • 父-子检索器 - 将代表特定概念的嵌入块链接到父文档

  • 假设问题 - 从文档块生成问题并对其进行向量索引,以便为用户问题提供更好的匹配候选

  • 摘要 - 索引文档的摘要而非整个文档

  • 使用 Neo4j 实现高级检索 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
jfDNiPa5ccefX6h0HiVzJbqnlgAZgfPda90truHSfbwSs3JkfxZ xbA9mZE8y2fNf 3n5cgVhbdhN0ryuMoK2JNbMgTe1OLJMA6CQRhWBxzdKRLVurUFDndT7ki4vMh cdv3SAn040HTpab9XkzGj5Q

语义层

位于(图)数据库之上的语义层不依赖于自动查询生成,而是提供了一系列 API 和工具,使 LLM 能够访问数据库及其结构。

与自动生成的查询不同,这些工具是安全的,因为它们使用正确的查询和交互实现,并且只从 LLM 获取参数。

许多云(LLM)提供商通过函数调用(OpenAI、Anthropic)或扩展(Google Vertex AI、AWS Bedrock)提供类似的集成。

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

对话记忆

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

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

知识图谱构建

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

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

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

入门套件

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

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

作者

Tomaz Bratanic

社区支持

Neo4j 在线社区

LangChain 仓库

GitHub

LangChain 问题

问题

LangChain Neo4j 仓库

GitHub

LangChain Neo4j API 文档

API 文档

LangChain Neo4j 问题

问题

文档

Neo4j 集成

文档

图概述文档

入门套件

LangChain 入门套件

Jupyter

Jupyter Notebooks

视频与教程

© . All rights reserved.