**摘要:**本文介绍 LangChain 中 @dynamic_prompt 注解的用法,讲解如何通过该注解将函数注册为动态提示词中间件,并利用 ModelRequest 类型获取运行时上下文与系统提示词,实现系统提示词的动态覆盖与拼接,最后通过完整代码示例演示动态提示词中间件的配置与调用流程。
内容参考于:图灵AI大模型全栈
LangChain提供了@dynamic_prompt注解,这个注解写到函数上方,然后LangChain就会把函数看作为是一个修改提示词的函数,这个函数的返回值会覆盖系统提示词
如下图红框使用@dynamic_prompt注解,它的入参是一个ModelRequest类型

ModelRequest类型中可以得到下图红框的内容
# ---------------------------------------------------------------------------- # 字段名 | 作用 | 中间件常见操作 # ----------------|-------------------------------|--------------------------- # model | 要调用的模型实例 | 动态切换模型 # messages | 对话历史(不含 system) | 增删改消息 # system_message | 系统提示词 | 注入用户画像/场景设定 # tool_choice | 工具选择策略 | 强制/禁用工具调用 # tools | 提供给模型的工具列表 | 权限裁剪、按需挂载 # response_format | 结构化输出 schema 与策略 | 动态开关/替换 schema # state | 当前 Agent 完整状态 | 读业务字段做上下文注入 # runtime | 运行时环境(context/store...) | 取用户、推流、写长期存储 # model_settings | 模型参数(temperature 等) | 按场景动态调参
效果图:
带动态提示词中间件
不带动态提示词中间件
手动设置系统提示词,不带动态提示词中间件
手动设置系统提示词,带动态提示词中间件
在动态提示词中间件中获取设置的系统提示词,通过获取系统提示词可以进行拼接,然后动态提示词和手动设置的系统提示词就可以一起使用了,注意提示词在content中所以拼接的时候要request.system_message.content这样取
代码
python
from langchain.agents.middleware import dynamic_prompt, ModelRequest
from langchain.agents import create_agent
from dataclasses import dataclass
from langchain_qwq import ChatQwen
from dotenv import load_dotenv
import os
加载环境变量
load_dotenv()
初始化模型
llm = ChatQwen(
model="qwen3.7-flash",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL")
)
定义上下文的属性内容
@dataclass
class Context:
user_name: str # 用户名
创建动态提示词的函数
@dynamic_prompt
def state_aware_prompt(request: ModelRequest) -> str:
# 通过 ModelRequest 类型获取runtime运行时中的用户名
user_name = request.runtime.context.user_name
# 打印系统提示词
print(f"获取的系统提示词:{request.system_message}")
# print(user_name)
# 它返回的内容会覆盖系统提示词
return f"你是一个智能助手,请称呼用户为:{user_name}"
创建代理
agent = create_agent(
model=llm,
# 设置动态提示词中间件
middleware=[state_aware_prompt],
# 设置系统提示词
system_prompt="你是一个智能助手,请称呼用户为计算机王2",
# 设置上下文
context_schema=Context,
)
response = agent.invoke(
{"messages": [{"role": "user", "content": "你好呀"}]},
context=Context(user_name="计算机王")
)
print(response["messages"][-1].content)






