本节根据运行时 context 动态生成 system prompt,让同一个 Agent 对不同用户使用不同语言回答。
System prompt 不一定是固定字符串。它可以根据用户语言、角色、权限、地区或业务上下文动态生成。本课用用户语言做最小示例。
| 输入 context | 生成的 system prompt |
|---|---|
English | You are a helpful assistant. |
Irish | You are a helpful assistant. only respond in Irish. |
Spanish | You are a helpful assistant. only respond in Spanish. |
运行时上下文用 dataclass 表达。调用 Agent 时传不同的 user_language,middleware 就能生成不同 prompt。
from dataclasses import dataclass
from langchain.agents.middleware import dynamic_prompt, ModelRequest
@dataclass
class LanguageContext:
user_language: str = "English"Module 2 学过 runtime context;本节把 context 用在 prompt 生成,而不是工具读取。
@dynamic_prompt 函数接收 ModelRequest,可以访问 request.runtime.context。返回值会成为本次模型调用的 system prompt。
@dynamic_prompt
def user_language_prompt(request: ModelRequest) -> str:
"""Generate system prompt based on user role."""
user_language = request.runtime.context.user_language
base_prompt = "You are a helpful assistant."
if user_language != "English":
return f"{base_prompt} only respond in {user_language}."
elif user_language == "English":
return base_prompt这个 middleware 不直接回答用户,而是为模型调用生成系统消息。真正的回答仍由模型完成。
创建 Agent 时声明 context_schema 和 middleware。之后每次 invoke 都可以传不同 context。
agent = create_agent(
model=deepseek_model(),
context_schema=LanguageContext,
middleware=[user_language_prompt],
)不用为每种语言复制一个 Agent。一个 Agent 加动态 prompt,就能按 context 切换行为。
Notebook 分别传入 Irish、Spanish、French,问题相同,但 system prompt 不同,因此回答语言也会变化。
response = agent.invoke(
{"messages": [HumanMessage(content="Hello, how are you?")]},
context=LanguageContext(user_language="Irish"),
)
print(response["messages"][-1].content)
response = agent.invoke(
{"messages": [HumanMessage(content="Hello, how are you?")]},
context=LanguageContext(user_language="Spanish"),
)
print(response["messages"][-1].content)
response = agent.invoke(
{"messages": [HumanMessage(content="Hello, how are you?")]},
context=LanguageContext(user_language="French"),
)
print(response["messages"][-1].content)语言只是示例。同样模式可以按用户角色生成不同规则,按产品线生成不同术语,按地区生成不同合规提示。
dynamic_prompt 用于运行时生成 system prompt。context_schema 配合使用。