忘掉重启?不存在!LangGraph 与 PostgreSQL 联手给 AI 装上永生记忆
1.3 Conditional Edge —— 让流程「带脑子」• 作用:根据 State 中的某个字段值,在运行时动态选择下一步节点,实现非线性、递归甚至循环逻辑。• 典型写法:```pythonelse:```LangGraph 会把 routing_fn 的返回值(节点名)作为下一步要调度的节点。• 收益:– 减少硬编码 if/else,逻辑集中在一处。– 同一套图可服务多种业务场景(客服、
开场:当 AI 患上“断片症”——为什么你的 Agent 需要一颗“永生记忆”
今天的 LLM 像一位才华横溢却宿醉未醒的天才:每次对话都从零开始,昨天的洞察、上周的教训,一关机就蒸发。
• 招聘助手刚帮你筛完 50 份简历,重启后却问你“想找什么岗位?”
• 智能客服承诺跟进投诉,第二天却满脸陌生:“请问您反馈过什么问题?”
这种“金鱼级”记忆不仅让用户体验崩溃,也锁死了 Agent 向高阶任务演进的脖子。
破局之道:给 Agent 外挂一颗 **不会掉电的大脑**——长期记忆系统。
它要求:
1. 跨会话持久化:今天聊的,明年还能续上。
2. 结构化检索:秒级捞出“三年前某项目的技术债列表”。
3. 可反思升级:Agent 能从自己写过的代码、踩过的坑中自我进化。
本篇文章就是一份 “记忆永续”<现场破解>:
• 主刀框架:LangGraph——把 LLM、工具链、状态机编织成可演化的工作流;
• 记忆仓:PostgreSQL——ACID、向量、JSONB、全文检索一把抓;
• 现场 Demo:20 行代码即可让 Agent 记住用户偏好、对话历史、任务上下文,并支持“时间旅行式”回滚。
我们将拆解存储 schema、向量索引、会话窗口、自我反思四条主线,并给出可直接复制的开源模板。读完即可让你的 Agent 从“七秒记忆”进化为“终身学霸”。
1:LangGraph 图架构与检查点深度解析
在真正动手编码之前,让我们先把 LangGraph 的「五脏六腑」拆成 4 个核心概念,逐层剖开,看看它们如何协作,最终让 Agent 拥有“记忆”与“思考”的能力。
1.1 Agent State —— Agent 的「瞬时意识」
• 本质:一个普通的 Python dict 或 TypedDict,但语义上它是 Agent 在 t 时刻的完整快照。
• 里面装什么:
– messages:List[BaseMessage] – 对话历史,包括用户输入、LLM 回复、工具回包。
– current_task:str – 当前正在执行的任务描述,方便后续节点判断“我该干什么”。
– tool_outputs:Dict[str, Any] – 工具调用后的结构化结果,供下游节点校验或再次加工。
– user_profile:Dict[str, Any] – 长期记忆片段,例如用户偏好、已学会的知识。
• 运行时行为:
– 每次节点函数被调用时,都会拿到一份 State 的只读副本。
– 节点函数返回一个「补丁」dict,只写需要变更的字段;LangGraph 会自动合并回全局 State。
– State 的 schema 可以随时扩展,无需重启服务,只要节点逻辑兼容即可。
1. 2 Graph —— Agent 的「流程骨架」
• 建模方式:有向图(Directed Graph)。
– 节点(Node):一个 Python callable,签名统一为
```python
def my_node(state: State) -> State | dict:
```
常见节点:
• llm_node:调用大模型生成回复或下一步计划。
• tool_node:执行外部工具(搜索、计算、API 调用)。
• memory_node:把本轮关键信息写入长期存储。
– 边(Edge):定义节点之间的流转关系。
• 普通边:固定从 A → B。
• 条件边:见下一节。
1.3 Conditional Edge —— 让流程「带脑子」
• 作用:根据 State 中的某个字段值,在运行时动态选择下一步节点,实现非线性、递归甚至循环逻辑。
• 典型写法:
```python
def routing_fn(state: State) -> str:
if state["current_task"] == "need_search":
return "search_tool"
elif state["retry_count"] > 3:
return "fallback"
else:
return "continue_llm"
```
LangGraph 会把 routing_fn 的返回值(节点名)作为下一步要调度的节点。
• 收益:
– 减少硬编码 if/else,逻辑集中在一处。
– 同一套图可服务多种业务场景(客服、招聘、代码助手),只需换 routing 函数。
1.4 Checkpointer —— 长期记忆的「时光机」
• 职责:
– 在图执行过程中,按步骤把 State 序列化并写入持久化后端。
– 当进程重启或用户重新连接时,根据 session_id 把 State 完整拉回内存,实现「断点续跑」。
• 存储粒度:
– 每个节点运行完都会触发一次 checkpoint,因此可以回溯到任意中间步骤。
• 支持的 Backend(全部实现同一接口):
– SQLiteCheckpointer:本地文件,零依赖,适合原型。
– PostgresCheckpointer:ACID、JSONB、向量扩展,一条 SQL 就能做语义检索。
– RedisCheckpointer:亚毫秒级读写,适合高频会话缓存。
– 自定义:只要继承 BaseCheckpointer,实现 save(thread_id, step, state) 与 load(thread_id, step) 即可。
• 数据一致性:
– 默认使用可序列化隔离级别(PostgreSQL)或 Lua 脚本(Redis)保证并发安全。
– 支持「只读重放」模式:允许一个线程写入,多个线程并行读取历史快照做 A/B 回溯。
──────────────────
State 是「此刻的我」,Graph 是「我要怎么走」,Conditional Edge 是「看情况拐弯」,Checkpointer 是「把这一切都刻进硬盘」。
掌握这四件套,LangGraph 就从「流程框架」升级为「带记忆、能思考、可扩展的 Agent 操作系统」。
借助 Checkpointer 机制,LangGraph 将 Agent 的运行时状态与其持久化存储解耦,赋予开发者灵活选择多种后端(如 SQLite、PostgreSQL、Redis 等)的能力,从而实现对长期记忆的高效管理与定制化存储。
2:PostgreSQL:为 AI Agent 注入持久记忆的强力引擎
在众多持久化存储方案中,PostgreSQL 凭借其卓越的性能和功能,成为关系型数据库中的领先选择,也使其成为 AI Agent 长期记忆管理的理想后端:
2.1结构化强、一致性高 :
作为关系型数据库,PostgreSQL 天然适合处理结构化数据。Agent 的状态信息,如对话历史、用户画像、工具调用记录等,均可清晰映射到数据库表结构中,保障数据的一致性与完整性。
2.2高可靠性与数据持久性 :
PostgreSQL 支持完整的事务机制(ACID)、数据备份与恢复策略,能够在系统故障或崩溃时确保数据不丢失,满足关键业务场景下的高可用需求。
2.3灵活高效的查询能力 :
借助 SQL,开发者可以轻松实现对 Agent 行为日志、用户交互记录的复杂查询、统计与分析。结合扩展如 pgvector,还能直接在数据库中进行向量检索,赋能知识检索与语义记忆能力。
2.4良好的可扩展性 :
通过读写分离、分区表、逻辑复制以及集群解决方案(如 Citus),PostgreSQL 可以轻松应对大规模并发访问和数据增长,适应生产环境下的高性能需求。
2.5成熟生态与广泛支持 :
拥有活跃的社区、丰富的第三方工具以及成熟的运维体系,显著降低了开发与运维门槛,提升了系统的稳定性和可持续发展能力。
2.6与 LangGraph 原生集成 :
LangGraph 提供了内置的 PostgresSaver 组件,简化了 PostgreSQL 的接入流程,使开发者能够快速构建具备长期记忆能力的智能代理应用。
3:把 LangGraph 的脑电波焊进 Postgres
接下来,直接workshop!
我们将手撕一个 ReAct Agent,把它的大脑切片放进 PostgreSQL——让每一步推理、每一次工具调用、每一句对话都实时写库,真正做到“关机不丢魂,重启即满血”。
3.1 环境准备与依赖安装
首先,确保你的 Python 环境就绪,并安装必要的库:

3.2 PostgreSQL 启动脚本设置
请确保你已部署并运行了一个 PostgreSQL 实例,并为 Agent 的记忆存储需求创建好专用的数据库和访问用户。
3.2.1 通过 psql 创建数据库和用户
连接到你的 PostgreSQL 服务器(例如,使用 psql -U postgres -h localhost 并输入密码),然后执行以下 SQL 命令

PostgreSQL 连接字符串 (URI)
根据你的设置,连接字符串通常遵循以下格式:postgresql+psycopg2://<user>:<password>@<host>:<port>/<database_name>
3. 3构建 LangGraph ReAct Agent
我们将构建一个经典的 ReAct Agent,它能够接收用户输入,决定是调用工具还是直接回答,并执行相应操作。
3.3.1 Agent 状态定义
Agent 的状态是其内部信息的载体,messages 是最核心的部分,用于存储对话历史。

3.3.2 工具定义
Agent 通过调用工具来与外部世界交互,执行特定任务。这里我们定义一个简单的模拟网页搜索工具。

3.3.3LLM 配置
我们将使用 OpenAI 的模型,并绑定我们定义的工具。bind_tools 让 LLM 知道何时以及如何调用这些工具


3.3.4 Agent 节点与决策逻辑
我们将 Agent 的核心逻辑拆分为两个节点 (call_llm 和 call_tool) 和一个条件函数 (should_continue)。

3.4. 整合 PostgreSQL Checkpointer
现在,我们将 PostgresSaver 引入到我们的 LangGraph 应用中。

3.5. 运行 Agent 并测试长期记忆
现在,我们可以像使用普通 LangGraph 应用一样运行我们的 Agent,但每次调用 invoke 时,通过 config 参数传入一个唯一的 thread_id。这个 thread_id 就是 LangGraph 在 PostgreSQL 中存储和检索特定对话历史的键

只要全亮,就说明你的 Agent 真正拥有了“过目不忘”的超能力:
1. 工具调用闪现
输入“巴黎天气”,终端瞬间弹出一条日志:
```
[search_web] → query='巴黎 天气'
```
这是 ReAct 循环在“动手”而非“张嘴”。
2. 上下文穿越
紧接着问:“那法国的首都在哪里?”
无需再提“法国”,Agent 直接回答“巴黎”。
因为 PostgreSQL 里那条 `thread_id` 的快照把上一轮对话的“法国=巴黎”牢牢记住。
3. 数据库彩蛋
连上 Postgres,执行:
```sql
SELECT thread_id, checkpoint_id, metadata->>'step' AS step, length(state) AS bytes
FROM langgraph_checkpoints
ORDER BY checkpoint_id DESC
LIMIT 5;
```
你会看到 5 行新鲜出炉的“记忆切片”——每一行都是 Agent 在思考过程中的一个瞬间,字节数即当时的“意识大小”。
4:拓展与进阶:实现真正的“学习”与“推理”
仅仅保存对话历史只是长期记忆的起点。要让 Agent 具备更强大的“智慧”,还需要结合以下高级技术:
4.1 结构化知识库(RAG 与 pgvector)
对于招聘类 Agent 来说,仅记住对话历史远远不够,它还需要掌握丰富的招聘专业知识,例如职位描述模板、行业薪酬标准、企业文化分析、常见面试问题等。
4.1.1实现方式:
将这些非结构化文本资料转化为向量嵌入(Vector Embeddings),并存储在具备向量检索能力的数据库中。PostgreSQL 配合 pgvector 扩展后,能够原生支持向量存储与相似性搜索,是构建 RAG(Retrieval-Augmented Generation,检索增强生成)系统的理想选择。
4.1.2Agent 协作流程:
4.1.1.1 知识检索 Agent:
接收用户输入的查询请求,将其转换为向量表示,并在 PostgreSQL + pgvector 中查找最相关的信息片段。
4.1.1.2推理生成 Agent:
接收来自知识检索 Agent 的匹配结果以及用户的原始查询内容,结合大语言模型(LLM)进行综合理解和推理,最终输出更加精准、专业且上下文贴合的回答。
这种分工协作机制不仅提升了 Agent 的知识利用效率,也显著增强了其在招聘场景下的智能化服务能力。
4.2 让 Agent 把长篇对话蒸馏成一句话,再写进反思日记(Summarization & Reflection)
随着对话持续进行,messages 列表会不断增长,导致输入 LLM 的 Token 数量上升,不仅增加计算成本,还可能超出模型的上下文长度限制。
4.2.1解决方案:
引入一个“摘要 Agent”节点。当对话轮数达到设定阈值(如 10 至 20 轮),或检测到话题发生明显转变时,自动触发该节点。它将调用 LLM 对前 N 轮对话内容进行总结,生成一段简洁的历史摘要。
4.2.2存储与使用方式:
将生成的摘要信息存入 PostgreSQL 的独立数据表中,并与对应的 `thread_id` 关联,作为该对话的“长期记忆摘要”。在每次新对话开始时,将该摘要作为系统提示(System Prompt)或附加上下文注入至 LLM 输入中,从而在不传递完整历史消息的前提下,仍能为模型提供足够的背景信息,实现高效、连贯的对话体验。
4.3 学习与适应性(Learned Behaviors)
把“长期记忆”再升一级——让 Agent 真正“长脑子”:
4.3.1 学习引擎
• 自动嗅探:每轮对话后,Agent 把高频词、格式偏好、任务套路提炼成 JSON 片段。
• 结构落库:不丢进通用 state,而是写入专属的 `user_profile`、`task_pattern` 表——字段精细到「简历模板=PDF+两栏+技能置顶」。
4.3.2 一键调用
下次同用户开口,Agent 先用向量索引召回最相关的 3 条“学习卡片”,再决定用哪套模板、哪种语气,甚至直接给出上次审到一半的简历批注。
4.3.3 场景示例
招聘经理 Alice 偏爱「技能-项目-教育」倒序排版;Agent 记住后,再推新简历时自动按此排序,并把上一轮她最关注的“Kubernetes 经验”高亮置顶——零提示,一步到位。
5:挑战与最佳实践
尽管 AI Agent 的长期记忆能力展现出巨大潜力,但在实际落地过程中仍面临多重挑战:
5.1主要挑战
5.1.1. 数据隐私与安全风险
长期存储用户对话、个人信息等敏感内容,必须严格遵循 GDPR、CCPA 等数据保护法规。同时需实施数据加密、细粒度访问控制、定期审计和脱敏策略,确保数据在整个生命周期内的安全性。
5.1.2. 偏见与公平性问题
如果训练或历史数据中存在偏见,Agent 可能会在决策中继承甚至放大这些偏差。因此,需要持续监控其行为输出,评估模型公平性,并引入去偏机制来保障公正性。
5.1.3. 成本控制难题
海量数据的存储与处理、频繁的 LLM 调用以及向量检索操作都会带来可观的成本开销。通过对话摘要减少上下文长度、优化向量数据库结构等方式可有效降低成本压力。
5.1.4. 架构复杂度上升
引入数据库、RAG 模块、摘要 Agent 等组件显著提升了系统架构的复杂性。这要求团队具备扎实的 DevOps 与 MLOps 能力,以支持高效部署、实时监控和稳定维护。
5.1.5. 可解释性与可控性不足
当 Agent 行为出现异常时,如何追溯其决策路径?如何理解它调用了哪些记忆?这就需要完善的日志体系、使用 LangSmith 等可观测性工具,并设计必要时的人工干预机制。
5.1.6. 记忆模式的设计难题
如何划分不同类型的记忆(如消息历史、摘要、结构化知识)并建立有效的关联关系?这不仅影响系统的性能与扩展性,也直接决定了 Agent 的智能表现。
5.2 推荐的最佳实践
5.2.1分层记忆架构
结合短期记忆(当前对话上下文)、中期记忆(会话摘要)和长期记忆(外部知识库、用户画像),实现资源的最优利用。
5.2.2模块化开发与部署
将记忆管理、工具调用、推理生成等功能解耦为独立模块,提升系统的可维护性、灵活性与可扩展性。
5.2.3强化可观测性建设
利用 LangSmith 等工具全面记录每次运行过程,监控 Token 使用、响应延迟、错误率等关键指标,并可视化 Agent 的思考路径。
5.2.4持续迭代与优化
AI Agent 不应是静态系统,而应基于真实用户的反馈和行为数据不断优化记忆策略、推理逻辑和整体表现,推动其逐步走向成熟。
构建具备长期记忆能力的 AI Agent 是一个系统工程,既需要技术上的深思熟虑,也需要对业务场景的深入理解。只有兼顾效率、成本、安全与用户体验,才能真正释放 AI 的长期价值。
6:结语:迈向真正具备智能的 AI Agent
借助 LangGraph 强大的流程编排能力,结合 PostgreSQL 在数据持久化方面的稳定与灵活性,我们成功为 AI Agent 构建了“永不遗忘”的长期记忆系统。这不仅有效解决了其在状态管理和上下文延续方面的核心挑战,更让 Agent 从一个单纯的“对话响应器”,进化为能够持续学习、积累经验并提供个性化服务的“智能协作者”。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)