最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折,立即尝试

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

作者
  • avatar
    姓名
    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 智能体系统主要由三部分组成:

  1. 应用层:运行 LangGraph 引擎的 Python 应用程序,负责管理智能体的决策逻辑与工作流。
  2. LLM 网关层:通过 n1n.ai 统一分发 API 请求,动态路由至最快的 LLM 节点。
  3. 数据存储层: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=1max_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