Langchain中Memory、State、Context、Runtime

从“数据在系统中如何存在和流动”的视角,将他们分为三个层级来理解:

  1. 宏观概念层:Memory(记忆);

  2. 架构实现层:State(状态)、Store(存储)、Context(上下文);

  3. 运行环境层:Runtime(运行时);

1、宏观概念:Memory(记忆)

Memory不是一个具体的类,而是一个功能目标。它的目的是让AI“记住”过去的事情。在Langchain/LangGraph中,记忆被拆分为两个具体的维度:

  • Short-term Memory****(短期记忆)

    • 本质:当前的对话流;

    • 作用:让AI知道你前面说了什么,该怎么回复你;

    • 实现:通常就是state中的messages列表;

    • 局限:受限于LLM的上下文窗口(Context window),对话太长会被截断或遗忘;

  • Long-term Memory(****长期记忆****)

    • 本质:跨会话的知识库;

    • 作用:让AI记住你的偏好(如旅行住宿偏好民宿)、用户信息,在本地/云端储存,可跨会话重复读取;

    • 实现:通过Store(如向量数据库,postgres);

from langchain.tools import tool, ToolRuntime
from langchain.messages import HumanMessage
from langgraph.types import Command

@tool
def get_last_user_message(runtime: ToolRuntime) -> str:
    """Get the most recent message from the user."""
    messages = runtime.state["messages"]

    # Find the last human message
    for message in reversed(messages):
        if isinstance(message, HumanMessage):
            return message.content

    return "No user messages found"

# Access custom state fields
@tool
def get_user_preference(
    pref_name: str,
    runtime: ToolRuntime
) -> str:
    """Get a user preference value."""
    preferences = runtime.state.get("user_preferences", {})
    return preferences.get(pref_name, "Not set")

@tool
def set_user_name(new_name: str) -> Command:
    """Set the user's name in the conversation state."""
    return Command(update={"user_name": new_name})

2、架构实现:State,Store,Context

这是Langchain/LangGraph 1.x中最核心的数据结构,决定了数据怎么流转。

State(状态)——“短期记忆的容器”

  • 定义:它是智能体在当前这一轮会话中所有信息的集合。

  • 特点:

    • 易失性:对话结束,State就销毁(除非通过checkpointer落盘);

    • 结构:通常是一个TypeDict或Pydantic Model,AgentState或继承自AgentState

    • 核心内容:包含messages(聊天记录),也可以包含自定义字段(如user_type);

Store(储存)——“****长期记忆****的硬盘”

  • 定义:它是跨对话、持久化的数据储存空间;

  • 特点:

    • 持久性:数据存在数据库(如Postgres,SQLite)里,服务重启也不丢。包含两个重要的部分 namespacekey

    • 共享性:不同的会话(Thread)可以访问同一个Store,通过namespacekey来读取指定内容;

    • 操作:通过store.put()store.get()主动读写,通过namespacekey来写入特定空间;

from typing import Any
from langgraph.store.memory import InMemoryStore
from langchain.agents import create_agent
from langchain.tools import tool, ToolRuntime
from langchain_openai import ChatOpenAI

# Access memory
@tool
def get_user_info(user_id: str, runtime: ToolRuntime) -> str:
    """Look up user info."""
    store = runtime.store
    user_info = store.get(("users",), user_id)
    return str(user_info.value) if user_info else "Unknown user"

# Update memory
@tool
def save_user_info(user_id: str, user_info: dict[str, Any], runtime: ToolRuntime) -> str:
    """Save user info."""
    store = runtime.store
    store.put(("users",), user_id, user_info)
    return "Successfully saved user info."

model = ChatOpenAI(model="gpt-4.1")

store = InMemoryStore()
agent = create_agent(
    model,
    tools=[get_user_info, save_user_info],
    store=store
)

# First session: save user info
agent.invoke({
    "messages": [{"role": "user", "content": "Save the following user: userid: abc123, name: Foo, age: 25, email: foo@langchain.dev"}]
})

# Second session: get user info
agent.invoke({
    "messages": [{"role": "user", "content": "Get user info for user with id 'abc123'"}]
})
# Here is the user info for user with ID "abc123":
# - Name: Foo
# - Age: 25
# - Email: foo@langchain.dev

Context(上下文)——“单次调用的参数包”

  • 定义:你在调用Agent(agent.invoke(...))时,临时传入的外部参数;

  • 特点

    • 只读****/临时:只在本次invoke调用中有效,用完即弃;

    • 用途:传递一些不需要存入State/Store的信息(无状态信息),如user_id

    • 实现:通过context=xxx进行配置;

from dataclasses import dataclass
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain.tools import tool, ToolRuntime

USER_DATABASE = {
    "user123": {
        "name": "Alice Johnson",
        "account_type": "Premium",
        "balance": 5000,
        "email": "alice@example.com"
    },
    "user456": {
        "name": "Bob Smith",
        "account_type": "Standard",
        "balance": 1200,
        "email": "bob@example.com"
    }
}

@dataclass
class UserContext:
    user_id: str

@tool
def get_account_info(runtime: ToolRuntime[UserContext]) -> str:
    """Get the current user's account information."""
    user_id = runtime.context.user_id

    if user_id in USER_DATABASE:
        user = USER_DATABASE[user_id]
        return f"Account holder: {user['name']}\nType: {user['account_type']}\nBalance: ${user['balance']}"
    return "User not found"

model = ChatOpenAI(model="gpt-4.1")
agent = create_agent(
    model,
    tools=[get_account_info],
    context_schema=UserContext,
    system_prompt="You are a financial assistant."
)

result = agent.invoke(
    {"messages": [{"role": "user", "content": "What's my current balance?"}]},
    context=UserContext(user_id="user123")
)

3、运行环境:Runtime

Runtime是LangGraph在执行节点(Node)时提供的一个环境对象

  • 定义:当Agent在执行某个工具或节点时,它能拿到的“工具箱”。

  • 包含内容

    • runtime.state:让工具能够访问短期记忆;

    • runtime.store:让工具能访问长期记忆;

    • runtime.context:让工具能读取本次调用的临时参数(如user_id);

  • 作用:它是链接“代码逻辑”与“外部数据”的桥梁。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容