LangChain LangGraph
Module 1 Module 2 Module 3
Module 3 · 中间件与 HITL
1 3.2 Managing Msgs
2 3.3 HITL
3 3.4 Dyn Models
4 3.4 Dyn Prompts
5 3.4 Dyn Tools
6 3.5 Email Agent
SUM Module Summary
HomeLangChainModule 3 · 中间件与 HITL3.4 Dyn Prompts
📓 Notebook 📖 Explained
LANGCHAIN MODULE 3 · LESSON 3.4b

动态 Prompt
dynamic_prompt · Runtime Context

本节根据运行时 context 动态生成 system prompt,让同一个 Agent 对不同用户使用不同语言回答。

1 动态 Prompt 的用途

System prompt 不一定是固定字符串。它可以根据用户语言、角色、权限、地区或业务上下文动态生成。本课用用户语言做最小示例。

输入 context生成的 system prompt
EnglishYou are a helpful assistant.
IrishYou are a helpful assistant. only respond in Irish.
SpanishYou are a helpful assistant. only respond in Spanish.

2 定义 LanguageContext

运行时上下文用 dataclass 表达。调用 Agent 时传不同的 user_language,middleware 就能生成不同 prompt。

Python
from dataclasses import dataclass
from langchain.agents.middleware import dynamic_prompt, ModelRequest

@dataclass
class LanguageContext:
    user_language: str = "English"
和 Module 2 的联系

Module 2 学过 runtime context;本节把 context 用在 prompt 生成,而不是工具读取。

3 用 @dynamic_prompt 生成系统提示

@dynamic_prompt 函数接收 ModelRequest,可以访问 request.runtime.context。返回值会成为本次模型调用的 system prompt。

Python
@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
返回的是 prompt

这个 middleware 不直接回答用户,而是为模型调用生成系统消息。真正的回答仍由模型完成。

4 创建 Agent

创建 Agent 时声明 context_schema 和 middleware。之后每次 invoke 都可以传不同 context。

Python
agent = create_agent(
    model=deepseek_model(),
    context_schema=LanguageContext,
    middleware=[user_language_prompt],
)
无需多个 Agent

不用为每种语言复制一个 Agent。一个 Agent 加动态 prompt,就能按 context 切换行为。

5 用不同语言调用同一个 Agent

Notebook 分别传入 Irish、Spanish、French,问题相同,但 system prompt 不同,因此回答语言也会变化。

Python
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)
可扩展模式

语言只是示例。同样模式可以按用户角色生成不同规则,按产品线生成不同术语,按地区生成不同合规提示。

6 本课 takeaway