LangChain + Neo4j 集成

概述

LangChain 是一个用于构建由大型语言模型驱动的应用程序的 Python 工具包。它提供可组合的链和代理、庞大的集成生态系统、记忆和检索系统,以及生产必备的回调、追踪和评估工具等功能。

安装

pip install langchain langchain-neo4j langchain-mcp-adapters

核心功能

  • 可组合的链和 ReAct 风格的代理

  • 通过 langchain-neo4j 包实现原生 Neo4j 集成

  • 通过 langchain-mcp-adapters 支持 MCP 服务器

  • 使用 @tool 装饰器创建自定义工具

  • 几乎支持所有主要的 LLM 提供商(OpenAI、Anthropic、Google、Cohere、Mistral、AWS Bedrock、Azure 等)

示例

Notebook 描述

langchain.ipynb

LangChain 与 Neo4j 集成的演练,包括 MCP 服务器设置、自定义工具创建、向量搜索和查询执行

扩展点

1. MCP 集成

LangChain 通过 langchain-mcp-adapters 包支持 MCP 服务器。使用 MultiServerMCPClient 连接到 MCP 服务器并检索工具。

  • Neo4j MCP 服务器: 利用 mcp-neo4j-cypher 进行模式读取和 Cypher 查询执行

2. 直接 Neo4j 集成

langchain-neo4j 包提供原生集成,以获得更高的控制力

  • Neo4jGraph: 直接连接 Neo4j,在自定义工具中执行 Cypher 查询

  • Neo4jVector: 向量存储集成,用于对图数据进行语义搜索,支持混合搜索和自定义检索查询

3. 自定义工具/函数

使用 @tool 装饰器定义自定义 Neo4j 工具

  • 通过文档字符串指定工具名称和描述

  • 实现使用 Neo4jGraphNeo4jVector 执行 Cypher 查询的函数

  • 将结果以结构化 JSON 返回

  • 在单一代理中将 MCP 工具与自定义工具结合

4. Neo4j 检查点保存器

langchain-neo4j 包提供检查点保存器,用于将代理状态持久化到 Neo4j

  • Neo4jSaver: 同步检查点,用于存储对话历史和代理状态

  • AsyncNeo4jSaver: 异步变体,用于非阻塞的检查点操作

from langgraph.checkpoint.neo4j import AsyncNeo4jSaver

async with await AsyncNeo4jSaver.from_conn_string(
    uri=NEO4J_URI,
    user=NEO4J_USERNAME,
    password=NEO4J_PASSWORD,
    database=NEO4J_DATABASE
) as checkpointer:
    await checkpointer.setup()

    agent = create_agent(
        model,
        tools,
        system_prompt=prompt,
        checkpointer=checkpointer,
    )

MCP 身份验证

支持的机制

环境变量(STDIO 传输) - 对于本地 MCP 服务器(如 mcp-neo4j-cypher),凭证通过生成时的 env 参数传递。

HTTP Header(HTTP/SSE 传输) - 对于远程 MCP 服务器,通过 headers 参数传递 API 密钥或 Bearer 令牌(例如 Authorization: Bearer ${API_TOKEN})。

OAuth 2.0(客户端内部) - 当前 Python SDK 不支持在客户端内部进行 OAuth2 MCP 认证。

配置示例(STDIO 传输)

cypher_mcp_config = {
    "neo4j-database": {
        "transport": "stdio",
        "command": "uvx",
        "args": ["mcp-neo4j-cypher"],
        "env": {
            "NEO4J_URI": os.environ.get("NEO4J_URI"),
            "NEO4J_USERNAME": os.environ.get("NEO4J_USERNAME"),
            "NEO4J_PASSWORD": os.environ.get("NEO4J_PASSWORD"),
            "NEO4J_DATABASE": os.environ.get("NEO4J_DATABASE", "neo4j")
        }
    }
}
© . This site is unofficial and not affiliated with Neo4j, Inc.