这里写目录标题
- 前言
- 一、理解上下文,上下文划分
- 二、三种上下文管理方式
- 三、深入解析三种上下文
-
- [3.1 静态运行时上下文](#3.1 静态运行时上下文)
- [3.2 动态运行时上下文 (State)](#3.2 动态运行时上下文 (State))
- [3.3 动态跨对话上下文 (Store)](#3.3 动态跨对话上下文 (Store))
- 四、总结:如何协同工作?
前言
- 这篇博客和下篇博客主要讲明白什么是agent的上下文,上下文说白了就是agent系统中,除了大模型以外的所有信息
- 当AI应用处理任务时,它需要的不仅是模型本身,更依赖上下文------即"完成任务所需的信息、工具和环境"。就像人工作时需要知道"我是谁"、"手头有哪些资源"、"之前说过什么",AI的上下文也分为三类:静态的配置信息(如用户ID、工具)、单次会话中动态变化的状态(如对话历史)、以及跨会话的长期记忆(如用户偏好)。合理管理上下文,能让AI变得更聪明、更懂你。
- langchain官方文档将上下文按照可变性和生命周期两个维度进行了划分,并基于此,在LangGraph框架中提供了三种具体的上下文管理方式。
一、理解上下文,上下文划分
上下文就是agent系统或者ai应用中,除了大模型以外的所有信息,按照可变性和生命周期两个维度可以进行如下划分
- 按可变性划分
- 静态上下文:指在应用执行期间不会改变的不可变数据。例如用户元数据、数据库连接、工具定义等。
- 动态上下文:指在应用运行过程中会演化的可变数据。例如对话历史、中间结果、工具调用的返回值等。
- 按生命周期划分
- 运行时上下文:其作用域仅限于单次运行或调用。每次新的执行(如一次invoke)都会重新创建。
- 跨对话上下文:其数据会跨越多轮对话或会话持续存在。这通常用于实现应用的"记忆"功能。
二、三种上下文管理方式
LangGraph将上述两个维度结合,提供了三种具体的上下文管理方式,我们可以根据数据特性和需求选择:
| 上下文类型 | 描述 | 可变性 | 生命周期 | 访问方式 |
|---|---|---|---|---|
| 静态运行时上下文 | 在启动时传入的不可变配置数据,如用户信息、工具。 | 静态 | 单次运行 | context 参数 |
| 动态运行时上下文 (State) | 在单次运行中演变的可变数据,如当前步骤的中间结果。 | 动态 | 单次运行 | 状态对象(AgentState) |
| 动态跨对话上下文 (Store) | 跨多次运行持久化的共享数据,如用户偏好、长期记忆。 | 动态 | 跨对话 | LangGraph 存储对象 |
三、深入解析三种上下文
3.1 静态运行时上下文
-
定义:在应用启动或单次执行(invoke)开始时通过context参数传入的不可变数据。它就像给这次执行设定的"配置"或"环境"。
-
用途:传递用户ID、用户名称、API密钥、数据库连接等在整个运行过程中保持不变的信息。
-
访问:自定义中间件和自定义工具中都可以访问。比如,在@dynamic_prompt中间件中,你可以像下面这样获取它:
pythonfrom dataclasses import dataclass from langchain.agents import create_agent from langchain.agents.middleware import dynamic_prompt, ModelRequest # 1. 定义上下文的模式 @dataclass class ContextSchema: user_name: str # 2. 在动态提示词中访问静态上下文 @dynamic_prompt def personalized_prompt(request: ModelRequest) -> str: # 通过 request.runtime.context 访问 user_name = request.runtime.context.user_name return f"你是一个乐于助人的助手。请称呼用户为 {user_name}。" # 3. 创建Agent时指定上下文模式 agent = create_agent( model="claude-sonnet-4-6", middleware=[personalized_prompt], context_schema=ContextSchema ) # 4. 在调用时传入具体的静态上下文 agent.invoke( {"messages": [{"role": "user", "content": "今天天气怎么样?"}]}, context=ContextSchema(user_name="张三") # 静态上下文在此传入 )
3.2 动态运行时上下文 (State)
-
定义:就是短期记忆,存储message列表、自定义字段等。
-
用途:存储会随运行步骤变化的数据,如对话历史、用户自定义信息等。
-
访问:自定义中间件和自定义工具中都可以访问并修改。
pythonfrom langchain.agents import create_agent from langchain.agents.middleware import dynamic_prompt, ModelRequest from langchain.agents import AgentState # 1. 定义自定义状态模式 class CustomState(AgentState): user_name: str # 状态中包含用户姓名,但可能在运行中被更新 # 2. 在动态提示词中访问状态 @dynamic_prompt def personalized_prompt(request: ModelRequest) -> str: # 通过 request.state 访问动态状态 user_name = request.state.get("user_name", "用户") return f"你是一个乐于助人的助手。当前用户的姓名是 {user_name}。" # 3. 创建Agent时指定状态模式 agent = create_agent( model="claude-sonnet-4-6", state_schema=CustomState, # 传入状态模式 middleware=[personalized_prompt], ) # 4. 在调用时传入初始状态 agent.invoke({ "messages": "你好", "user_name": "李四" # 初始状态数据在此传入 })
3.3 动态跨对话上下文 (Store)
-
定义:通过LangGraph存储对象管理的持久化、可变的共享数据。它类似于应用的长期记忆。
-
用途:存储用户档案、长期偏好、历史交互总结等需要在不同对话(多次invoke调用)中保留的信息。
-
访问:同样的可以在中间件或者工具中访问并修改。你需要先为Agent或Graph启用"记忆"功能,才能使用Store。
python@tool def get_user_preferences(runtime: ToolRuntime[Context]) -> str: """获取用户偏好设置""" assert runtime.store is not None user_id = runtime.context.user_id namespace = ("users", user_id, "preferences") # 从Store中读取 pref = runtime.store.get(namespace, "saved_prefs") return str(pref.value) if pref else "未找到用户偏好"
四、总结:如何协同工作?
说白了,短期记忆就是动态运行时上下文、长期记忆就是动态跨对话上下文,还有一个context用于存储不可变的用户数据,就是静态运行时上下文。这三种上下文在实际应用中可以协同工作:
- 静态运行时上下文 提供了单次运行的初始配置(例如"当前用户是张三")。
- 动态运行时上下文 (State) 记录了这次运行中发生的所有变化(例如"张三问了天气,助手回复了晴天")。
- 动态跨对话上下文 (Store) 则保存了跨会话的持久信息(例如"张三不喜欢雨天,偏好简洁回答"),可以在下一次运行时作为静态或动态上下文的初始数据加载进来。