大模型开发手记(十):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) 则保存了跨会话的持久信息(例如"张三不喜欢雨天,偏好简洁回答"),可以在下一次运行时作为静态或动态上下文的初始数据加载进来。
相关推荐
胡少侠72 小时前
LangChain 重构 RAG:LCEL 管道语法 + 多轮对话记忆
ai·重构·langchain·agent·rag
1941s2 小时前
Google Agent Development Kit (ADK) 指南 第四章:Agent 开发与编排
人工智能·python·langchain·agent·adk
qq_452396232 小时前
【Python × AI】LangChain 深度剖析:从组件解耦到 LCEL 的逻辑美学
人工智能·python·ai·langchain
翱翔的苍鹰5 小时前
通过LangChain Agent模拟实现美团外卖下单场景
人工智能·深度学习·语言模型·自然语言处理·langchain·vllm
勇往直前plus6 小时前
LangChain 动态系统提示词(@dynamic_prompt)深入解析
langchain·prompt
猫头虎6 小时前
从零开始,一步步安装和配置OpenClaw汉化版详细安装指南
langchain·开源·prompt·github·aigc·ai编程·agi
翱翔的苍鹰7 小时前
什么是 Deep Agents?
人工智能·windows·语言模型·自然语言处理·langchain·开源
1941s7 小时前
Google Agent Development Kit (ADK) 指南 第三章:核心概念与架构
人工智能·python·langchain·agent·adk