
从“数据在系统中如何存在和流动”的视角,将他们分为三个层级来理解:
宏观概念层:Memory(记忆);
架构实现层:State(状态)、Store(存储)、Context(上下文);
运行环境层: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)里,服务重启也不丢。包含两个重要的部分
namespace和key;共享性:不同的会话(Thread)可以访问同一个Store,通过
namespace和key来读取指定内容;操作:通过
store.put()和store.get()主动读写,通过namespace和key来写入特定空间;
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);
作用:它是链接“代码逻辑”与“外部数据”的桥梁。