大模型开发手记(十):LangChain 上下文 精讲(上):讲明白什么是agent上下文

这里写目录标题

前言

  • 这篇博客和下篇博客主要讲明白什么是agent的上下文,上下文说白了就是agent系统中,除了大模型以外的所有信息
  • 当AI应用处理任务时,它需要的不仅是模型本身,更依赖上下文------即"完成任务所需的信息、工具和环境"。就像人工作时需要知道"我是谁"、"手头有哪些资源"、"之前说过什么",AI的上下文也分为三类:静态的配置信息(如用户ID、工具)、单次会话中动态变化的状态(如对话历史)、以及跨会话的长期记忆(如用户偏好)。合理管理上下文,能让AI变得更聪明、更懂你。
  • langchain官方文档将上下文按照可变性和生命周期两个维度进行了划分,并基于此,在LangGraph框架中提供了三种具体的上下文管理方式。

一、理解上下文,上下文划分

上下文就是agent系统或者ai应用中,除了大模型以外的所有信息,按照可变性和生命周期两个维度可以进行如下划分

  1. 按可变性划分
    • 静态上下文:指在应用执行期间不会改变的不可变数据。例如用户元数据、数据库连接、工具定义等。
    • 动态上下文:指在应用运行过程中会演化的可变数据。例如对话历史、中间结果、工具调用的返回值等。
  2. 按生命周期划分
    • 运行时上下文:其作用域仅限于单次运行或调用。每次新的执行(如一次invoke)都会重新创建。
    • 跨对话上下文:其数据会跨越多轮对话或会话持续存在。这通常用于实现应用的"记忆"功能。

二、三种上下文管理方式

LangGraph将上述两个维度结合,提供了三种具体的上下文管理方式,我们可以根据数据特性和需求选择:

上下文类型 描述 可变性 生命周期 访问方式
静态运行时上下文 在启动时传入的不可变配置数据,如用户信息、工具。 静态 单次运行 context 参数
动态运行时上下文 (State) 在单次运行中演变的可变数据,如当前步骤的中间结果。 动态 单次运行 状态对象(AgentState)
动态跨对话上下文 (Store) 跨多次运行持久化的共享数据,如用户偏好、长期记忆。 动态 跨对话 LangGraph 存储对象

三、深入解析三种上下文

3.1 静态运行时上下文

  1. 定义:在应用启动或单次执行(invoke)开始时通过context参数传入的不可变数据。它就像给这次执行设定的"配置"或"环境"。

  2. 用途:传递用户ID、用户名称、API密钥、数据库连接等在整个运行过程中保持不变的信息。

  3. 访问:自定义中间件和自定义工具中都可以访问。比如,在@dynamic_prompt中间件中,你可以像下面这样获取它:

    python 复制代码
    from 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)

  1. 定义:就是短期记忆,存储message列表、自定义字段等。

  2. 用途:存储会随运行步骤变化的数据,如对话历史、用户自定义信息等。

  3. 访问:自定义中间件和自定义工具中都可以访问并修改

    python 复制代码
    from 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)

  1. 定义:通过LangGraph存储对象管理的持久化、可变的共享数据。它类似于应用的长期记忆。

  2. 用途:存储用户档案、长期偏好、历史交互总结等需要在不同对话(多次invoke调用)中保留的信息。

  3. 访问:同样的可以在中间件或者工具中访问并修改。你需要先为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用于存储不可变的用户数据,就是静态运行时上下文。这三种上下文在实际应用中可以协同工作:

  1. 静态运行时上下文 提供了单次运行的初始配置(例如"当前用户是张三")。
  2. 动态运行时上下文 (State) 记录了这次运行中发生的所有变化(例如"张三问了天气,助手回复了晴天")。
  3. 动态跨对话上下文 (Store) 则保存了跨会话的持久信息(例如"张三不喜欢雨天,偏好简洁回答"),可以在下一次运行时作为静态或动态上下文的初始数据加载进来。
相关推荐
FserSuN6 小时前
LangChain DeepAgent 多 Agent 架构原理学习
架构·langchain
前进的李工9 小时前
LangChain使用AI工具赋能:解锁大语言模型无限潜力
开发语言·人工智能·语言模型·langchain·大模型
杨艺韬11 小时前
为什么需要理解 LangChain
langchain·agent
坤岭11 小时前
大模型“入侵”广告推荐
人工智能·langchain·推荐算法
嵌入式-小王13 小时前
LangChain框架(二)---- 提示词模板
python·langchain
来一斤小鲜肉13 小时前
一文搞懂:如何用 Spring AI 搭建 MCP Server 和 Client
后端·langchain
Csvn2 天前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
InKomorebi2 天前
LangChain Tools:BaseTool/Callable/Runnable 核心类型 | 三种工具定义方式 | 串行与并行调用 | 错误处理与重试降级
langchain
怕浪猫2 天前
第10章 RAG(检索增强生成)系统构建(LangChain实战)
langchain·aigc·ai编程
阿捞22 天前
python-langchain框架(3-20-智能问答ZeroShot_ReAct Agent 从零搭建)
python·react.js·langchain