AI Agent 第二十一篇:【2026零基础AI教程21·番外1】LangGraph长效记忆+人格固化实战,实现连续对话、用户记忆、专属AI人设,彻底解决多轮失忆、问答割裂、风格飘移问题
🎯 前言:终章之后,补齐商用最后短板
在上一篇终章20篇主教程中,我们已经完成了LangGraph全栈商用项目整合,实现了工具调用、RAG知识库、意图识别、容错兜底、输出管控的完整闭环。
但如果直接上线商用,依然存在两个用户感知极强、致命体验短板:
-
多轮对话失忆:AI无法记住历史偏好、对话上下文断裂,每一轮都是“全新陌生人”
-
人设风格漂移:时而严肃、时而口语、时而啰嗦、时而简短,没有固定AI人格
-
无用户长效记忆:记不住用户身份、使用习惯、历史需求,无法做到个性化AI
功能完整只是能用,记忆+人设才是好用。
本篇作为系列番外第一篇,专门补齐市面90%教程缺失的商用记忆系统。手把手实现:短期对话记忆+长效用户记忆+AI人格固化,让你的AI Agent拥有“记忆、性格、认知”,真正对标市面成熟产品(ChatGPT、智能客服、企业助手)。
一、为什么必须做长效记忆系统?
1.1 原生LangGraph记忆的缺陷
我们之前使用的 MemorySaver 仅仅是单会话临时记忆:
-
只保存当前线程对话
-
重启项目、切换会话、刷新页面全部清空
-
无法沉淀用户长期数据
1.2 商用AI必备两种记忆
-
短期工作记忆:本轮多轮对话上下文连贯,问答不割裂
-
长期用户记忆:记住用户偏好、身份、历史问题、使用习惯,永久留存
只有双层记忆结合,AI才能从「工具机器人」升级为「专属智能助手」。
二、本篇落地核心能力
-
会话级短期记忆:多轮对话无缝衔接,上下文自动关联
-
用户级长效记忆:自动提取用户信息、偏好、需求,永久沉淀
-
AI人格固化机制:锁定回答风格、语气、人设,永不漂移
-
记忆去重+轻量化:避免记忆冗余、上下文爆炸、Token暴涨
-
记忆可查询、可清空、可迭代:完整记忆管理能力
三、商用记忆系统架构设计
采用企业通用双层记忆架构:
-
记忆读取节点:对话开始自动加载用户历史记忆+本轮上下文
-
人格注入节点:固定AI人设与输出风格
-
对话生成节点:结合记忆+人设+问题生成答案
-
记忆更新节点:自动提炼新信息、增量更新长效记忆
全程无感自动记忆,无需用户手动操作。
四、完整可运行代码(记忆+人格固化终版)
from dotenv import load_dotenv
import os
import json
from typing import TypedDict, List
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
# 环境配置
load_dotenv()
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = os.getenv("LANGSMITH_API_KEY")
os.environ["LANGCHAIN_PROJECT"] = "LangGraph-长效记忆人格系统"
# 模型初始化
llm = ChatOpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL"),
model="gpt-3.5-turbo",
temperature=0.1
)
# 全局长效记忆存储(生产可替换为数据库)
LONG_TERM_MEMORY = {
"user_info": "",
"user_preference": "",
"history_key_demand": []
}
# ===================== 状态定义(新增记忆字段) =====================
class MemoryState(TypedDict):
user_input: str
session_history: List[str] # 短期会话记忆
long_memory: dict # 长效用户记忆
ai_persona: str # AI人设
answer: str
# ===================== 核心节点 =====================
# 1、人设固化节点(永久固定AI风格)
def persona_fix_node(state: MemoryState) -> MemoryState:
# 工业级固定人设,永不漂移
state["ai_persona"] = """
【AI固定人设】
身份:专业、简洁、耐心的AI技术助手
回答风格:通俗易懂、结构清晰、无废话、不啰嗦、不浮夸
语气:友好、沉稳、专业
禁止:网络梗、过度口语、长篇水话、答非所问
统一输出结构:先核心结论,再补充说明
"""
return state
# 2、记忆读取节点
def memory_load_node(state: MemoryState) -> MemoryState:
state["long_memory"] = LONG_TERM_MEMORY
return state
# 3、记忆增强生成节点(结合人设+短期+长期记忆)
def memory_generate_node(state: MemoryState) -> MemoryState:
session_context = "\n".join(state["session_history"])
long_info = json.dumps(state["long_memory"], ensure_ascii=False)
prompt = f"""
{state['ai_persona']}
【用户短期对话上下文】
{session_context}
【用户长期记忆信息】
{long_info}
【用户当前问题】
{state['user_input']}
要求:
1、结合用户历史对话与长期偏好作答,保持对话连贯
2、严格遵守固定人设风格,不漂移、不跑偏
3、记住用户之前的提问、偏好、习惯
4、回答简洁精准、逻辑清晰
"""
res = llm.invoke(prompt)
state["answer"] = res.content.strip()
# 追加本轮对话至短期记忆
state["session_history"].append(f"用户:{state['user_input']}")
state["session_history"].append(f"AI:{state['answer']}")
return state
# 4、长效记忆更新节点(自动提炼用户信息)
def memory_update_node(state: MemoryState) -> MemoryState:
prompt = f"""
根据用户最新对话,提炼用户长效信息,仅输出JSON:
字段:user_info(用户身份/特征)、user_preference(回答偏好)、history_key_demand(关键需求列表)
历史记忆:{json.dumps(LONG_TERM_MEMORY, ensure_ascii=False)}
最新对话:用户提问:{state['user_input']}
规则:增量更新、不重复、保留旧信息、补充新信息
"""
res = llm.invoke(prompt)
content = res.content.strip().replace("```json","").replace("```","")
try:
new_mem = json.loads(content)
LONG_TERM_MEMORY["user_info"] = new_mem.get("user_info", LONG_TERM_MEMORY["user_info"])
LONG_TERM_MEMORY["user_preference"] = new_mem.get("user_preference", LONG_TERM_MEMORY["user_preference"])
# 去重合并关键需求
for item in new_mem.get("history_key_demand", []):
if item not in LONG_TERM_MEMORY["history_key_demand"]:
LONG_TERM_MEMORY["history_key_demand"].append(item)
except:
pass
print("🧠 长效记忆自动更新完成")
return state
# ===================== 搭建记忆工作流 =====================
graph = StateGraph(MemoryState)
graph.add_node("persona_fix", persona_fix_node)
graph.add_node("memory_load", memory_load_node)
graph.add_node("generate", memory_generate_node)
graph.add_node("memory_update", memory_update_node)
graph.add_edge(START, "persona_fix")
graph.add_edge("persona_fix", "memory_load")
graph.add_edge("memory_load", "generate")
graph.add_edge("generate", "memory_update")
graph.add_edge("memory_update", END)
memory_workflow = graph.compile(checkpointer=MemorySaver())
# ===================== 测试多轮记忆对话 =====================
if __name__ == "__main__":
config = {"configurable": {"thread_id": "user_2026_001"}}
# 多轮连续对话测试
rounds = [
"我是一名AI初学者,我想学习LangGraph工程化",
"那你之后回答尽量通俗一点,不要太学术",
"帮我总结一下LangGraph的核心价值"
]
session_hist = []
for question in rounds:
res = memory_workflow.invoke({
"user_input": question,
"session_history": session_hist,
"long_memory": {},
"ai_persona": "",
"answer": ""
}, config=config)
session_hist = res["session_history"]
print(f"\n🤔 用户:{question}")
print(f"💡 AI:{res['answer']}")
print("\n✅ 最终长效用户记忆:")
print(json.dumps(LONG_TERM_MEMORY, ensure_ascii=False, indent=2))
五、核心原理深度拆解
5.1 双层记忆隔离机制
短期会话记忆:保存本轮多轮问答上下文,保证对话连贯,随会话更新。
长效用户记忆:提炼用户身份、偏好、核心需求,永久沉淀,重启不丢失。
双层隔离完美解决:上下文过长爆炸 + 用户记忆丢失两大行业难题。
5.2 人设强制固化原理
绝大多数AI项目风格漂移的根源:人设仅写在首次Prompt,没有全局固定。
本方案每一轮对话强制注入人设节点,从流程层面锁死风格,无论多少轮对话、多少场景切换,人设永远统一。
5.3 增量记忆更新机制
不覆盖旧记忆、只补充新信息,自动去重、自动提炼,避免记忆混乱与冗余,实现越用越智能、越用越懂用户。
六、生产级优化拓展
-
记忆持久化数据库:将全局记忆存入SQLite/MySQL,永久留存
-
记忆权重淘汰:淘汰老旧无效记忆,保留高价值用户信息
-
用户隔离记忆:多用户独立记忆空间,互不干扰
-
记忆手动管理:支持用户清空记忆、查看记忆、修改偏好
七、本篇总结
1、短期记忆解决多轮对话断裂体验问题;
2、长效记忆解决AI不懂用户、无法个性化商用问题;
3、人设固化解决风格漂移、输出不稳定质感问题;
4、本篇能力是AI Agent从“工具Demo”升级为产品级助手的核心关键。
📌 下一篇预告(最终收尾篇)
第二十二篇·最终完结篇:项目打包、Docker容器化、云端服务器部署、前后端联调、线上正式上线全套流程
更多推荐


所有评论(0)