【自然语言处理与大模型】LangChainV1.0入门指南:核心组件Short-term Memory

LangChain v1.0 版本对 Memory(记忆) 组件进行了深度优化与工程化重构,使其不仅支持多轮对话上下文管理,更成为构建生产级智能体(Agent)不可或缺的核心能力之一。在 LangChain 从"实验性框架"迈向"企业级平台"的关键转型中,Memory 模块被赋予了更清晰的职责边界、更灵活的策略机制以及更强的可扩展性,从而支撑复杂任务场景下的长期记忆、状态追踪与个性化交互。

一、LangChain中Memory的作用

在 LangChain v1.0 架构中,Memory 不再仅仅是简单的对话缓冲区,而是作为 智能体上下文感知与持续学习能力的基础设施。其核心作用包括:

  1. 历史存储:保存用户与 AI 的完整交互记录(如 HumanMessage、AIMessage、ToolMessage 等);
  2. 上下文维护:在多轮对话或跨会话中保持话题连贯性,避免"失忆";
  3. 信息检索与提炼:支持从短期记忆(原始对话)中提取结构化长期记忆(如用户偏好、任务进度、实体关系);
  4. 状态管理:通过 State 机制维护单次会话中的临时变量与中间结果

二、短期记忆(Short-term Memory)

短期记忆的本质是线程级状态管理。在 LangGraph 中:

短期记忆 = Agent 状态(State) + 检查点持久化(Checkpointer) + 线程标识(thread_id)。

  • 状态(State):通常是一个包含 messages 字段的字典或 Pydantic 模型(如 MessagesState 或自定义 CustomState),用于存储当前会话的所有消息、中间变量、工具调用结果等。
  • 检查点器(Checkpointer):负责将状态序列化并持久化到内存、SQLite、PostgreSQL 等后端。每次状态变更(如新增一条消息)都会触发一次检查点保存。
  • 会话ID(thread_id):作为会话的唯一标识符,确保不同用户或不同对话之间的状态完全隔离。即使多个用户并发交互,也不会发生记忆混淆。

1、使用示例

python 复制代码
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from dotenv import load_dotenv
from langgraph.checkpoint.memory import InMemorySaver
from langchain.messages import HumanMessage
import time

# 加载 .env 文件中的环境变量(通常用于存放 API Key)
# override=True 确保重新加载环境变量,覆盖已有的系统变量
load_dotenv(override=True)

# 初始化大模型,这里使用的是 DeepSeek 的聊天模型
# LangChain 的 init_chat_model 是一个统一接口,可以适配多种模型提供商
model = init_chat_model(model="deepseek-chat")

# 创建内存保存器 (Checkpointer)
# 这是 LangGraph 的核心概念之一,用于在对话过程中保存和恢复状态(记忆)
checkpointer = InMemorySaver()

# 定义 Agent 的配置
# "thread_id" (线程ID) 非常关键:它相当于对话的 ID,用于区分不同的会话记忆
# 使用时间戳作为 ID,确保每次运行脚本时的线程 ID 不同(但在同一次运行中复用)
timestamp = time.time() 
config = {
    "configurable": {"thread_id": f"{int(timestamp)}"}
}

# 创建 Agent 实例
# model: 指定使用的底层大模型
# tools: 工具列表,这里为空,表示 Agent 只能进行对话,不能调用外部工具(如搜索、计算器等)
# checkpointer: 传入上面的内存保存器,赋予 Agent 记忆能力
# system_prompt: 设定 Agent 的角色和行为模式
agent = create_agent(
    model=model,
    tools=[],
    checkpointer=checkpointer,
    system_prompt="你是一个翻译官,擅长中英互译。"
)

# 第一轮对话输入
input_1 = {
    "messages": [HumanMessage("你好,我叫小呆。")]
}

# 调用 Agent (Response A)
# 使用 config,这意味着这次对话会记录在 thread_id 对应的内存中
# Agent 会记住 "我叫小呆" 这个信息
response_a = agent.invoke(
    input=input_1,
    config=config
)

# 第二轮对话输入(测试是否记得之前的信息)
input_2 = {
    "messages": [HumanMessage("你好,我叫什么?")]
}

# 定义一个新的配置 (config_2),使用完全不同的 thread_id
# 这代表开启了一个全新的、独立的对话会话
config_2 = {
    "configurable": {"thread_id": f"{int(time.time())}"}  # 这里生成了一个新的时间戳 ID
}

# 调用 Agent (Response B)
# 使用新的 config_2,Agent 看不到 config_1 中的历史记录
# 因此,Agent 应该不知道用户叫 "小呆",因为它处于一个新的 "线程" 中
response_b = agent.invoke(
    input=input_2,
    config=config_2
)

# 调用 Agent (Response C)
# 再次使用最初的 config
# 这会恢复到第一个会话的记忆中
# Agent 应该能回想起用户叫 "小呆",因为它共享同一个 thread_id
response_c = agent.invoke(
    input=input_2,
    config=config
)

# 输出结果进行对比
print("Response A (第一次对话):")
print(response_a)

print("\nResponse B (新线程,无记忆):")
print(response_b)

print("\nResponse C (回到原线程,有记忆):")
print(response_c)

代码运行逻辑:

  1. checkpointer (记忆核心) :这是 LangGraph 区别于传统简单 API 调用的关键。它允许 Agent 在多次 invoke 调用之间保存状态。
  2. thread_id (记忆索引) :你可以把 thread_id 想象成数据库中的主键。
    • Response A :向 ID 为 100 的记录里写入了名字。
    • Response B :向 ID 为 200 的新记录提问,因为 200 是空的,所以 Agent 不知道名字。
    • Response C :又回到 ID 为 100 的记录提问,Agent 读取了历史记录,所以知道名字。
  3. System Prompt:虽然输入是在对话,但因为设定了 "你是一个翻译官",Agent 可能会试图在回答的同时进行翻译,或者在回复格式上符合翻译官的身份。
相关推荐
m0_692457102 小时前
图像梯度处理
图像处理·人工智能·计算机视觉
朗心心理2 小时前
心灵栖所 · 未来疗愈场,长春师专打造“科技×艺术×东方正念”三维心理成长中心
人工智能·科技·心理
围炉聊科技2 小时前
4090实战:ComfyUI运行Qwen-Image-Edit-2511模型指南(含避坑要点)
人工智能
沛沛老爹2 小时前
从Web开发到AI应用——用FastGPT构建实时问答系统
前端·人工智能·langchain·rag·advanced-rag
戴西软件2 小时前
CAxWorks.VPG车辆工程仿真软件:打造新能源汽车安全的“数字防线“
android·大数据·运维·人工智能·安全·低代码·汽车
yuanmenghao2 小时前
自动驾驶中间件iceoryx-介绍
人工智能·中间件·自动驾驶
weixin199701080162 小时前
哔哩哔哩 item_search_video - 根据关键词获取视频列表接口对接全攻略:从入门到精通
人工智能·音视频
山海青风2 小时前
人工智能基础与应用 - 数据处理、建模与预测流程 2 : 数据与问题类型
人工智能·python
这张生成的图像能检测吗2 小时前
(论文速读)VJTNN+GAN分子优化的图到图翻译
人工智能·图神经网络·生成模型·分子设计·药物发现