如何将 LangGraph AI 智能体连接至 PostgreSQL 实现持久化内存
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
在构建复杂的 AI 智能体(Agent)时,持久化内存(Persistent Memory)是实现连续对话、上下文理解和长期记忆的关键。虽然 LangGraph 在开发阶段提供了内存型的 MemorySaver,但对于生产环境,我们需要一个更加稳定、可扩展且支持高并发的数据库。PostgreSQL 作为业界标准的关系型数据库,凭借其出色的事务安全性和对向量扩展(如 pgvector)的支持,成为了存储智能体状态的首选。
在本教程中,我们将深入探讨如何将 LangGraph AI 智能体连接到 PostgreSQL 数据库。我们将涵盖使用 Docker 在本地部署 Postgres、云端数据库配置、连接池优化以及 Python 代码实现。为了确保智能体拥有高效的推理能力,我们将通过 n1n.ai 这一高性能 LLM API 聚合平台来调用大语言模型(例如 Claude 3.5 Sonnet 或 DeepSeek-V3),从而获得极低的延迟和极高的服务可用性。
为什么选择 PostgreSQL 作为 LangGraph 的状态存储?
LangGraph 使用“检查点(Checkpointer)”机制在图(Graph)的每一步执行后保存当前状态。这使得智能体能够具备以下生产级特性:
- 线程安全的多会话管理:允许多个用户同时与智能体交互,而不会发生状态冲突。
- 状态回溯(Time Travel):允许开发者或用户将智能体状态回滚到以前的任意步骤,以便进行调试或修正输入。
- 容错与恢复:当遇到网络波动、API 超时或服务器崩溃时,智能体可以从最后一个成功的检查点无缝恢复运行。
虽然 SQLite 适合本地测试,但在面对高并发、多实例部署以及数据备份需求时,PostgreSQL 的并发控制、行级锁和连接池技术是不可或缺的。
系统架构设计
我们的持久化 AI 智能体系统主要由三部分组成:
- 应用层:运行 LangGraph 引擎的 Python 应用程序,负责管理智能体的决策逻辑与工作流。
- LLM 网关层:通过 n1n.ai 统一分发 API 请求,动态路由至最快的 LLM 节点。
- 数据存储层:PostgreSQL 数据库(本地 Docker 部署或云端 RDS),用于持久化存储智能体的状态检查点。
+-------------------------------------------------------------+
| Python 应用程序 |
| |
| +------------------+ +--------------------+ |
| | LangGraph 智能体 | | PostgresSaver | |
| +--------+---------+ +---------+----------+ |
+------------|---------------------------------|--------------+
| |
| (LLM API 调用) | (状态检查点写入/读取)
v v
+----------------------------+ +--------------------------+
| n1n.ai API 网关 | | PostgreSQL 数据库 |
| (Claude / DeepSeek-V3) | | (Docker / 腾讯云/阿里云) |
+----------------------------+ +--------------------------+
第一步:部署 PostgreSQL 数据库
方案 A:使用 Docker Compose 进行本地部署
在本地开发环境中,使用 Docker Compose 可以最快地启动一个干净的 Postgres 实例。在项目根目录下创建一个 docker-compose.yml 文件:
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: langgraph_postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: langgraph_db
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
在终端中运行以下命令启动数据库:
docker compose up -d
方案 B:云端数据库配置
如果准备部署到生产环境,建议使用托管的 Postgres 服务(如 Supabase、Neon 或各大云厂商的 RDS)。获取其连接字符串(URI),格式通常如下:
postgresql://username:password@hostname:port/database_name?sslmode=require
第二步:初始化 Python 项目与依赖安装
创建一个新的虚拟环境并安装必要的依赖包。我们需要 langgraph、支持 Postgres 的检查点插件 langgraph-checkpoint-postgres,以及用于连接池管理的 psycopg。
python -m venv venv
source venv/bin/activate # Windows 系统使用: venv\Scripts\activate
pip install langgraph langgraph-checkpoint-postgres psycopg[binary,pool] langchain-openai python-dotenv
接着,在项目根目录下创建一个 .env 配置文件。我们将配置 n1n.ai 的 API 密钥,并将大模型请求基地址指向该平台:
N1N_API_KEY=您的_n1n_api_key
DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db
第三步:编写 LangGraph 智能体与 PostgresSaver 代码
接下来,我们将编写核心 Python 代码。为了保证高并发场景下的性能,我们使用 psycopg_pool 提供的连接池(Connection Pool)来高效管理数据库连接。这在 Web 服务或 API 接口中尤为重要,可避免频繁创建和销毁连接带来的开销。
创建 agent.py 文件并写入以下内容:
import os
from typing import Annotated, TypedDict
from dotenv import load_dotenv
from psycopg_pool import ConnectionPool
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.checkpoint.postgres import PostgresSaver
from langchain_core.messages import BaseMessage, HumanMessage
from langchain_openai import ChatOpenAI
load_dotenv()
# 定义智能体的状态结构
class AgentState(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
# 初始化 LLM 客户端,并配置指向 n1n.ai 网关
# 这样我们可以轻松调用包括 DeepSeek-V3 和 Claude 在内的前沿大模型
llm = ChatOpenAI(
model="deepseek-ai/DeepSeek-V3",
api_key=os.getenv("N1N_API_KEY"),
base_url="https://api.n1n.ai/v1"
)
# 定义调用大模型的节点
def call_model(state: AgentState):
response = llm.invoke(state["messages"])
return {"messages": [response]}
# 构建状态图(State Graph)
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.add_edge(START, "agent")
workflow.add_edge("agent", END)
# 获取数据库连接 URI
DB_URI = os.getenv("DATABASE_URL")
def run_agent():
# 创建 PostgreSQL 连接池
with ConnectionPool(conninfo=DB_URI, max_size=10) as pool:
# 初始化 Postgres 检查点管理器
checkpointer = PostgresSaver(pool)
# 自动创建所需的数据库表结构(如果不存在)
checkpointer.setup()
# 编译工作流,并注入 Postgres 检查点
app = workflow.compile(checkpointer=checkpointer)
# 配置会话 ID,用于区分不同用户的对话历史
config = {"configurable": {"thread_id": "session_user_999"}}
# 第一轮对话
print("--- 第一轮对话 ---")
user_msg = HumanMessage(content="你好,我叫小明。请记住我的名字。")
events = app.stream({"messages": [user_msg]}, config, stream_mode="values")
for event in events:
event["messages"][-1].pretty_print()
# 第二轮对话(验证数据库中是否持久化保存了记忆)
print("\n--- 第二轮对话 ---")
follow_up = HumanMessage(content="我的名字是什么?")
events = app.stream({"messages": [follow_up]}, config, stream_mode="values")
for event in events:
event["messages"][-1].pretty_print()
if __name__ == "__main__":
run_agent()
第四步:探索数据库内部表结构
当执行 checkpointer.setup() 后,LangGraph 会自动在指定的 PostgreSQL 数据库中创建几张表。我们可以连接到数据库并查看这些表结构,以便更好地理解其工作原理。
使用命令行进入 Docker 容器内的 Postgres 终端:
docker exec -it langgraph_postgres psql -U postgres -d langgraph_db
输入 \dt 命令列出所有表,您会看到以下结构:
| 表名 | 作用描述 |
|---|---|
checkpoints | 存储图(Graph)在每个执行步骤(Step)序列化后的状态快照。 |
checkpoint_blobs | 存储大二进制对象(BLOBs),包含具体的序列化状态载荷。 |
checkpoint_writes | 存储中间写入及通道更新数据,用于未完成事务的恢复。 |
checkpoint_writes | 追踪节点执行的元数据与副作用。 |
每次智能体执行一个节点时,LangGraph 都会向这些表中写入一条记录。如果您的智能体在执行工具调用(Tool Call)或网络请求时发生中断,它可以在下一次启动时,读取 checkpoints 表中的最新记录,直接恢复到中断前的状态。这种事务级的设计让系统具备极强的容错性。
生产环境最佳实践
1. Serverless 架构下的连接数限制
如果您将 Python 智能体部署在 AWS Lambda、Vercel Functions 或 Google Cloud Functions 等无服务器(Serverless)平台上,由于其实例会水平弹性伸缩,可能会在瞬间创建大量数据库连接,导致 PostgreSQL 的连接数耗尽。针对这种情况:
- 建议在数据库前置部署 PgBouncer 等连接池代理。
- 在代码中限制连接池的最小和最大连接数,例如设置
min_size=1和max_size=2。 - 确保在函数生命周期结束时,显式关闭并释放连接。
2. 数据清理与生命周期管理
随着时间的推移,checkpoints 表中的数据量可能会快速膨胀。为了防止数据库存储空间溢出,建议编写定期清理脚本(Cron Job),删除超过 30 天且已不活跃的 thread_id 历史记录。
3. 利用高性能 API 聚合降低网络延迟
在构建 AI 智能体时,网络延迟是影响用户体验的最大痛点。通过将 LLM API 统一接入到 n1n.ai,您可以利用其遍布全球的边缘加速网络,以极低的延迟与大模型进行交互。同时,通过 n1n.ai 提供的多模型负载均衡,即便某个大模型服务商出现暂时性宕机,您的智能体也能自动切换到备用模型,确保业务不中断。
总结
从内存存储转向 PostgreSQL 是将 LangGraph 智能体推向生产环境的必经之路。通过合理配置 PostgresSaver 和连接池,您可以为智能体提供坚实、可靠且具备事务保障的持久化记忆能力。
如果您正在寻找高可用、低延迟且支持多种前沿大模型的 API 接入方案,不妨尝试将您的智能体后端对接至 n1n.ai,让开发和运维变得更加简单高效。
Get a free API key at n1n.ai