结合 Claude Code、Graphiti 和 Neo4j 构建 Agent 长记忆系统

在大型语言模型(LLM)应用中,为 Agent 增强“长期记忆”是一大挑战。常规对话上下文有长度限制,超出后模型容易遗忘早期信息,常见做法是借助RAG(检索增强生成)等手段将外部知识检索进来。但传统 RAG 多针对静态文档批处理,不善于处理频繁变化的对话数据。为此,我们选择了 Claude Code、Graphiti 和 Neo4j 组合,构建一个具备长期记忆的 AI Agent。

  • Claude Code:Anthropic 提供的开发者版对话平台,支持代码执行和 MCP(Model Context Protocol)插件接口,可让 AI 调用外部工具和资源。Claude Code 拥有超大上下文窗口,适合作为智能Agent的前端,使其可以在对话中动态存取“记忆”等外部资源。
  • Graphiti:Zep 公司开源的时序知识图谱框架,用于作为 AI 的“长时记忆”存储。Graphiti 可以将对话内容、结构化数据作为“episode”逐条写入知识图,并自动抽取其中的实体和关系 。它支持实时增量更新、双时间轴(事件发生与写入时间)记录和混合检索(语义+关键词+图遍历),能够在不重算全部知识的情况下快速查询历史信息 。Graphiti 已被用于 Zep 的 AI 内存层,经证明是当前 AI Agent 最先进的记忆方案 。
  • Neo4j:流行的图数据库,用于存储 Graphiti 构建的知识图谱。Neo4j 拥有ACID事务和强大的关系查询能力,与 Graphiti 完美适配。Graphiti 默认支持 Neo4j 5.x,通过 Bolt 协议连接,将嵌入向量等数据存入 Neo4j 节点。使用 Neo4j Desktop 可以方便地本地搭建图数据库 。

组合优势:Claude Code + Graphiti + Neo4j 的链路,使 AI Agent 拥有持久化、结构化的记忆。每次用户交互都通过 Graphiti 实时融合进知识图谱,Agent 能对知识进行语义+图混合搜索,低延迟检索相关历史,从而在不同会话之间保持“上下文感知” 。相比仅依赖LLM上下文或向量库,本方案可精确存取复杂关系和事件演变,为任务规划和推理提供依据。此外,Graphiti 针对动态数据设计,可处理经常更新的知识而无需频繁重建索引 ,非常适合需要持续学习的 Agent 应用。

安装与配置步骤

下面总结基于实践的安装与配置流程:

  1. 安装 Neo4j Desktop:从 Neo4j 官方网站下载 Neo4j Desktop 并安装。Neo4j Desktop 提供直观的界面来管理本地数据库,非常适合入门 。安装完成后启动 Neo4j Desktop。
  2. 创建数据库实例并设置密码:在 Neo4j Desktop 中创建一个新的本地图数据库(版本需 5.x 或更高)。首次启动数据库时会要求设置一个密码,请设定Neo4j 用户(默认用户名为 neo4j)的密码,并牢记此信息。默认情况下,Neo4j 的 Bolt 连接 URI 为 bolt://localhost:7687,后续 Graphiti 将通过此 URI 连接数据库。
  3. 克隆 Graphiti 仓库并配置环境:打开终端,克隆 Graphiti 源码仓库并进入目录:
git clone https://github.com/getzep/graphiti.git
cd graphiti/mcp_server

仓库中提供了 .env.example 模板文件。复制一份作为 .env 并根据实际情况填写Neo4j和OpenAI配置:

OPENAI_API_KEY=<你的OpenAI API密钥>
MODEL_NAME=gpt-4.1-mini        # 指定LLM模型名称,例如 OpenAI 的 GPT-4 mini 版本
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=<你的Neo4j密码>

其中 OPENAI_API_KEY 是 Graphiti 用于调用 OpenAI 接口进行LLM推理和嵌入的密钥,MODEL_NAME 可以指定OpenAI模型(如 gpt-3.5-turbo 或 gpt-4 系列,默认示例使用的是 GPT-4.1 mini 模型),Neo4j 部分填写刚才创建数据库的连接信息和凭证。

  1. 安装所需工具(uv、uvicorn、claude-cli):
  • uv:Graphiti 推荐使用 Astral 开发的 uv 工具来管理Python环境和依赖。先通过 pip install uv 安装 uv 。然后在 graphiti/mcp_server 目录下执行 uv sync,该命令会根据项目的锁定文件安装所需的Python包。uv 类似于 pip,但能更快速地同步依赖。若不使用 uv,也可以手动创建虚拟环境并使用 pip install -r requirements.txt 安装依赖。
  • uvicorn:如果打算通过 HTTP SSE 方式运行服务,需要安装 ASGI 服务器 uvicorn(通常已在依赖中)。确保命令行下可以调用 uvicorn(例如 pip install uvicorn)。
  • claude-cli:Claude Code 提供了命令行工具来管理 MCP 插件。安装 claude CLI 工具(例如通过 pip install anthropic 或其他途径,具体可参考 Anthropic 文档)。安装后,命令行应能使用 claude 命令,用于添加MCP服务器等配置 。
  1. 启动 Graphiti MCP Server 并在 Claude 中注册插件:Graphiti 仓库自带 MCP Server 实现,用于充当 Claude 等前端与 Graphiti 后端之间的桥梁。启动步骤有两种方式:
  • 方法A:通过 Claude Code CLI 启动(stdio 模式):这种方式将 Graphiti MCP Server 作为 Claude 的子进程,通过标准输入输出通信。在命令行执行以下命令将 Graphiti 插件添加到 Claude Code(user范围):
claude mcp add-json graphiti-memory '{
  "type": "stdio",
  "command": "/usr/local/bin/uv",
  "args": [
    "run", "--directory", "/path/to/graphiti/mcp_server", 
    "graphiti_mcp_server.py", "--transport", "stdio"
  ],
  "env": {
    "OPENAI_API_KEY": "<你的OpenAI密钥>",
    "MODEL_NAME": "gpt-4.1-mini",
    "NEO4J_URI": "bolt://localhost:7687",
    "NEO4J_USER": "neo4j",
    "NEO4J_PASSWORD": "<你的Neo4j密码>"
  }
}'

将上述命令中的路径和参数替换为实际值(例如 uv 可执行路径、Graphiti 仓库位置等)。执行后,Claude Code 会登记一个名为 “graphiti-memory” 的 MCP 插件,Claude 在对话中需要用到记忆时会自动启动该Server并通过 stdio 通信。

  • 方法B:独立运行 Graphiti Server(SSE 模式):这种方式下 Graphiti 作为独立服务,通过 HTTP Server-Sent Events (SSE) 接口供 Claude 访问。可以执行:
cd graphiti/mcp_server
uv run graphiti_mcp_server.py --transport sse --model gpt-4.1-mini

上述命令将 Graphiti MCP Server 以 SSE 模式跑在本地(默认监听 0.0.0.0:8000)。成功启动后,使用 Claude CLI 将此服务添加为 MCP 插件:

claude mcp add --transport sse --scope user graphiti-memory http://localhost:8000/sse

这样Claude就注册了一个名为 “graphiti-memory” 的远程MCP服务(通过HTTP连接)。—scope user 表示对此用户全局可用(也可用 —scope project 针对某项目)。完成后,可在 Claude Code 界面的“MCP Servers”列表中看到 graphiti-memory 插件。

完成以上安装配置后,Claude Agent 就拥有了 Graphiti 知识图谱作为长时记忆存储。接下来可以尝试与 Claude 进行对话,记录信息并验证内存功能。

使用验证

要确认 Graphiti 内存是否正常工作,可以从Neo4j侧直接检查数据是否写入:

  • 知识图谱节点检查:打开 Neo4j Browser(Neo4j Desktop 内置)连接到刚才的数据库,执行 Cypher 查询:MATCH (n:Episodic) RETURN n LIMIT 25; 。Graphiti 将每条对话或信息片段存储为 “Episodic” 标签的节点,可通过该查询查看最新写入的若干 Episode 节点及其属性。如果能看到节点列表,说明 Claude 已成功将对话内容存进 Neo4j。

如果未能查询到任何 Episode 节点或 Graphiti 功能异常,建议从以下方面排查:

  • Bolt 连接问题:确认 Graphiti MCP Server 能连接上 Neo4j 数据库。检查 .env 配置的 NEO4J_URI 和端口是否正确,本地默认应为 bolt://localhost:7687。确保 Neo4j 数据库已启动且未设置防火墙阻止本地 Bolt 连接。如果 Neo4j 使用了非默认的数据库名称或用户名,也需要相应调整 Graphiti 配置。
  • OpenAI API Key 状态:Graphiti 在写入对话时,会调用 OpenAI 的模型来抽取实体和生成 embeddings 。如果提供的 API Key 无效或者余额不足,Graphiti 可能无法完成 Episode 的解析写入。可以查看运行 Graphiti Server 的终端输出日志,若出现 OpenAI 接口报错或余额不足的信息,则需要更换有效的 API Key(OpenAI 如开启数据分享可每日获得一定免费额度)或者确保账户有足够额度。
  • Claude 插件启用:确认 Graphiti MCP 插件已在 Claude 前端启用。在 Claude Code 中,新添加的 MCP Server 可能需要在对话界面中开启(如Claude Desktop中需要在对话窗口右上角“插件”列表里勾选启用)。如果插件未启用,Claude将不会实际调用 Graphiti。另请注意,Claude 对资源和提示类型的 MCP 功能默认不会自动触发调用 (详见下文),因此在测试时可以先提出与已记录内容相关的问题,看看 Claude 是否能够利用之前存储的记忆进行回答。

Graphiti Memory 的功能类别

作为 MCP Server,Graphiti 提供了三类接口能力,对应 MCP 定义的Resources、Tools 和 Prompts 三种类型 。理解这三者有助于发挥 Graphiti 内存的作用:

  1. Resources(资源工具):用于检索信息的接口。如从内部知识图谱或外部数据库获取内容。这类接口只读数据不产生副作用,作用是让 LLM 访问知识库中的历史信息。例如 Graphiti 提供检索节点、事实的资源接口,支持时间感知的查询,可以按时间或条件获取过往对话片段 。Claude 在需要引用记忆时,可以调用 Resource 类型的功能读取相关内容。
  2. Tools(工具):用于执行操作的接口,会对外部环境或数据产生变化。如通过 API 写入数据、进行计算等。Graphiti 的工具接口允许 LLM 将新的知识添加到图谱,或调用实时的搜索和图操作,实现在线更新记忆 。每当用户提供新信息,Claude Agent 可以调用 Graphiti 的工具类方法(如 add_episode)将其存为新节点,从而持续积累知识。
  3. Prompts(提示模板):指预定义的提示词模板或工作流,方便 LLM 和 MCP Server 之间复用复杂交互逻辑。例如 Graphiti 可能提供某些查询的模板,封装常用的多步操作 。这些 Prompt 模板可以视作Agent的一些“技能脚本”,当触发特定需求时调用。通过 Prompts,开发者可将标准查询模式固化,让 Claude 在需要时一键生成对 Graphiti 的查询请求。

需要注意,在 Claude Desktop 目前的实现中,Tools 类型的 MCP 接口(如Graphiti的写入/搜索功能)可以根据对话上下文自动调用,而 Resources 和 Prompts 类型则不会自动触发 。也就是说,即使 Graphiti 列出了可用的资源和提示模板,Claude 默认不知道何时用它们,除非用户主动附加。这一点在实际使用中尤为重要,下一节会讨论应对策略。

使用建议与踩坑记录

基于实际体验,这里总结一些使用Graphiti长记忆过程中值得注意的建议和可能遇到的坑:

  • 调试 Graphiti 写入:当发现对话内容没有写入Neo4j时,可以检查 Graphiti MCP Server 的控制台输出日志。Graphiti 启动时会打印使用的模型名、Group ID等信息,执行写入时如发生错误(例如 OpenAI 返回格式不符合预期),通常也会有异常堆栈打印在日志中。调试时,可尝试直接调用 Graphiti 的 API(例如 REST 接口)添加测试数据,或使用简短且结构清晰的输入触发 add_episode,以隔离问题。确保 .env 已正确加载(可以在启动命令中显式指定 —env-file .env 以防万一)。如果 Graphiti 提示embedding或解析schema错误,通常是模型输出不符合预期 JSON 格式导致的。
  • 避免 Schema 错误:Graphiti 要求所使用的 LLM 支持结构化输出,以确保提取实体关系时格式正确 。建议使用 OpenAI 的 GPT-4 或新版 GPT-3.5 等具备函数调用或严格JSON输出能力的模型。如果使用不支持结构化输出的模型(尤其是体量较小的模型),可能出现 Graphiti 无法解析返回内容、Episode 写入失败的情况(表现为日志报错 schema mismatch 等)。另外,第一次运行 Graphiti 会在 Neo4j 上创建所需索引和约束,如看到 IndexAlreadyExists 提示可忽略 。在调整 Graphiti 的实体/关系类型定义时,尽量保持与Neo4j模式一致,避免因为模式不符导致写入错误。
  • Claude 中正确触发 Memory:为了让 Claude 充分利用 Graphiti 长期记忆,需要在对话策略上进行一些引导。目前Claude对 Resource/Prompt 并非自动使用,因此用户或开发者需要主动触发。有几种实践技巧:其一,在对话最开始就提示Claude可以使用Graphiti记忆,并在需要时应先查询图谱。例如可以设定系统提示:“请先搜索已有知识再回答”。其二,熟练运用 Claude 界面提供的**“引用 (References)”** 功能:在 Claude Desktop 中,可点击“+”号从 MCP Server 附加存储的记忆片段作为参考资料 。其三,参考官方建议制定对话约定——例如 “先检索后回答” 和 “有新信息立即记录”。 上述规则可作为Claude的提示,让模型养成遇到新偏好/事实就调用 add_episode 保存,遇到问题先调用 search_nodes/search_facts 检索相关节点和关系的习惯。这种显式的提示能大大提高 Graphiti 内存的利用率。总之,目前需要一定人为引导,未来版本Claude可能会让AI自动意识到可用的记忆资源并调用。

通过以上工具链的稳定配置和调整,Claude Code 与 Graphiti + Neo4j 的集成可以顺利运行,一个具备长时记忆的 AI Agent 也就搭建完成了。在真实开发中,我们应不断根据日志和对话表现去优化提示策略,确保AI既“记得住”用户提供的知识,又能在需要时准确想起并加以利用。这套方案在复杂项目中能有效避免信息遗忘,大幅提升Agent长程任务的连贯性和智能水平。今后若Claude插件机制升级,实现自动利用Resource/Prompt,那么AI长记忆将更加得心应手。希望以上踩坑心得能帮助大家更容易地复现这一强大的长记忆Agent方案!

Ge Yuxu • AI & Engineering

脱敏说明:本文所有出现的表名、字段名、接口地址、变量名、IP地址及示例数据等均非真实,仅用于阐述技术思路与实现步骤,示例代码亦非公司真实代码。示例方案亦非公司真实完整方案,仅为本人记忆总结,用于技术学习探讨。
    • 文中所示任何标识符并不对应实际生产环境中的名称或编号。
    • 示例 SQL、脚本、代码及数据等均为演示用途,不含真实业务数据,也不具备直接运行或复现的完整上下文。
    • 读者若需在实际项目中参考本文方案,请结合自身业务场景及数据安全规范,使用符合内部命名和权限控制的配置。

Data Desensitization Notice: All table names, field names, API endpoints, variable names, IP addresses, and sample data appearing in this article are fictitious and intended solely to illustrate technical concepts and implementation steps. The sample code is not actual company code. The proposed solutions are not complete or actual company solutions but are summarized from the author's memory for technical learning and discussion.
    • Any identifiers shown in the text do not correspond to names or numbers in any actual production environment.
    • Sample SQL, scripts, code, and data are for demonstration purposes only, do not contain real business data, and lack the full context required for direct execution or reproduction.
    • Readers who wish to reference the solutions in this article for actual projects should adapt them to their own business scenarios and data security standards, using configurations that comply with internal naming and access control policies.

版权声明:本文版权归原作者所有,未经作者事先书面许可,任何单位或个人不得以任何方式复制、转载、摘编或用于商业用途。
    • 若需非商业性引用或转载本文内容,请务必注明出处并保持内容完整。
    • 对因商业使用、篡改或不当引用本文内容所产生的法律纠纷,作者保留追究法律责任的权利。

Copyright Notice: The copyright of this article belongs to the original author. Without prior written permission from the author, no entity or individual may copy, reproduce, excerpt, or use it for commercial purposes in any way.
    • For non-commercial citation or reproduction of this content, attribution must be given, and the integrity of the content must be maintained.
    • The author reserves the right to pursue legal action against any legal disputes arising from the commercial use, alteration, or improper citation of this article's content.

Copyright © 1989–Present Ge Yuxu. All Rights Reserved.