LangChain 提示词

system_prompt 参数

System Prompt(系统提示词)是控制 Agent 行为的核心手段。

create_agent() 的 system_prompt 参数接受两种形式:

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)

# 方式 1:字符串(最简单)
agent = create_agent(
    model=model,
    system_prompt="你是菜鸟教程 RUNOOB 的学习顾问,回答要简洁专业。",
)

# 方式 2:SystemMessage 对象(可复用)
system_msg = SystemMessage(
    content="你是菜鸟教程 RUNOOB 的学习顾问,回答要简洁专业。"
)
agent = create_agent(model=model, system_prompt=system_msg)

设计有效的 System Prompt

一个好的 system_prompt 应包含以下要素:

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool
from dotenv import load_dotenv
load_dotenv()

@tool
def search_course(keyword: str) -> str:
    """在菜鸟教程搜索课程"""
    courses = {
        "python": "Python3 基础教程(免费)",
        "html": "HTML 基础教程(免费)",
    }
    return courses.get(keyword.lower(), "未找到相关课程")


# 一个设计良好的 system_prompt
GOOD_PROMPT = """你是菜鸟教程 RUNOOB 的学习顾问。

## 你的职责
- 帮助用户找到合适的编程课程
- 回答编程学习相关的问题
- 根据用户水平推荐学习路径

## 行为准则
- 回答要简洁,每次不超过 3 句话
- 优先使用 search_course 工具查询课程信息
- 如果用户是零基础,优先推荐入门课程
- 不使用 emoji 表情
- 不知道的就说不知道,不要编造"""

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    tools=[search_course],
    system_prompt=GOOD_PROMPT,
)

result = agent.invoke({
    "messages": [HumanMessage(content="我零基础,想学编程,推荐什么?")]
})
print(result["messages"][-1].content)

运行结果:

对于零基础学编程,建议从 **Python** 入手,语法简单易读,应用广泛。或者从 **HTML + CSS** 开始,马上能看见网页效果,学习更有成就感。你可以直接访
问菜鸟教程网站 runoob.com,首页就有这些零基础教程。

@dynamic_prompt——动态生成提示词

静态 system_prompt 对所有用户一视同仁。但实际应用中,你可能需要根据用户信息、对话上下文、时间等动态调整提示词。

@dynamic_prompt 装饰器让你在每次模型调用前动态生成 system_prompt。

from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool


@tool
def search_course(keyword: str) -> str:
    """在菜鸟教程搜索课程"""
    courses = {
        "python": "Python3 基础教程(免费,20小时)",
        "html": "HTML 基础教程(免费,15小时)",
        "java": "Java 基础教程(免费,25小时)",
    }
    return courses.get(keyword.lower(), "未找到相关课程")


# @dynamic_prompt 装饰器:接收 ModelRequest,返回新的 system_prompt
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
    """根据对话上下文动态生成个性化提示词"""
    messages = request.state.get("messages", [])
    message_count = len(messages)

    # 可以根据不同的条件动态调整提示词
    base_prompt = "你是菜鸟教程 RUNOOB 的学习顾问。"

    if message_count <= 2: # 对话刚开始,耐心引导 return base_prompt + ( "用户刚开始对话,请先热情问候," "然后询问他们的学习目标和当前水平。" ) elif message_count > 10:
        # 长对话,提醒保持简洁
        return base_prompt + (
            "对话已经比较长了,回答要尽量简洁,"
            "每次不超过 2 句话。"
        )
    else:
        # 正常对话阶段
        return base_prompt + (
            "根据用户之前的问题推荐合适的课程,"
            "使用 search_course 工具查询课程信息。"
        )


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    tools=[search_course],
    middleware=[personalized_prompt],  # 通过 middleware 注入
)

# 第一次对话(message_count <= 2,引导模式)
result = agent.invoke({
    "messages": [HumanMessage(content="你好")]
})
print(f"第一轮回复: {result['messages'][-1].content}")

@dynamic_prompt 进阶——结合运行时上下文

@dynamic_prompt 的 request 参数提供了丰富的信息:

from datetime import datetime
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest


@dynamic_prompt
def context_aware_prompt(request: ModelRequest) -> str:
    """根据用户信息、时间和对话阶段动态生成提示词"""
    # 从 runtime.context 获取用户信息
    context = request.runtime.context
    user_name = context.get("user_name", "同学") if context else "同学"
    user_level = context.get("user_level", "入门") if context else "入门"

    # 获取当前时间
    now = datetime.now()
    greeting = "早上好" if now.hour < 12 else "下午好" if now.hour < 18 else "晚上好" # 获取当前消息数 messages = request.state.get("messages", []) prompt = f"""你是菜鸟教程 RUNOOB 的学习顾问。 当前时间:{now.strftime('%Y年%m月%d日 %H:%M')} 用户信息:{user_name},{user_level} 级别 ## 行为准则 - 称呼用户为"{user_name}" - 根据用户级别({user_level})推荐合适难度的课程 - 回答要友好但不啰嗦""" # 长对话时追加简化提示 if len(messages) > 20:
        prompt += "\n- 对话很长了,回答尽量精简"

    return prompt

@dynamic_prompt 在每次模型调用前都会执行,所以提示词可以随对话推进而变化。但注意不要在里面做太重的计算,否则会影响响应速度。

手动控制 System Prompt 的优先级

如果同时设置了 create_agent() 的 system_prompt 和 @dynamic_prompt middleware,middleware 的优先级更高——它会覆盖静态提示词。

如果你希望 middleware 的提示词和静态提示词合并而不是覆盖,可以在 @dynamic_prompt 中手动拼接。request 中没有直接暴露原有的 system_prompt,所以如果需要保留原有内容,建议将静态提示词作为变量在函数中引用。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇