Skip to content

Prompt Templates

提示词模板(Prompt Templates)是构建高效 Agent 的关键。LangChain 提供了多种方式来定义和管理提示词,从简单的字符串模板到动态生成的复杂提示词。

系统提示词

系统提示词(System Prompt)定义了 Agent 的整体行为、角色和约束。在 create_agent 中通过 system_prompt 参数传入:

python
from langchain import create_agent
from langchain.chat_models import init_chat_model

# 简单字符串提示词
agent = create_agent(
    model=init_chat_model("openai/gpt-4o"),
    tools=[],
    system_prompt="你是一个友好的中文助手。请始终用中文回复。",
)

# 多行字符串提示词
system_prompt = """
你是一个代码审查助手。

规则:
1. 检查代码安全性
2. 指出性能问题
3. 提供改进建议
4. 保持专业语气
"""

agent = create_agent(
    model=init_chat_model("openai/gpt-4o"),
    tools=[],
    system_prompt=system_prompt,
)

# 从文件读取(推荐用于复杂提示词)
with open("prompts/system.md", "r", encoding="utf-8") as f:
    system_prompt = f.read()

agent = create_agent(
    model=init_chat_model("openai/gpt-4o"),
    tools=[],
    system_prompt=system_prompt,
)

动态提示词

动态提示词允许根据运行时上下文、用户信息或对话状态动态生成提示词内容。使用 @dynamic_prompt 装饰器:

python
from langchain.prompts import dynamic_prompt
from datetime import datetime

@dynamic_prompt
def customer_support_prompt(context: dict) -> str:
    """根据用户信息和上下文动态生成客服提示词。"""
    user_name = context.get("user_name", "用户")
    user_tier = context.get("user_tier", "普通")
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M")
    
    tier_instructions = {
        "VIP": "该用户是 VIP 客户,提供优先服务。",
        "普通": "按标准流程服务。",
    }
    
    return f"""你是一个客服助手。

当前时间:{current_time}
用户姓名:{user_name}
用户等级:{user_tier}
服务策略:{tier_instructions.get(user_tier, "按标准流程服务。")}

请根据用户的等级提供相应级别的服务。"""

# 在 Agent 中使用
agent = create_agent(
    model=init_chat_model("openai/gpt-4o"),
    tools=[],
    system_prompt=customer_support_prompt,
    context_schema={
        "user_name": str,
        "user_tier": str,
    },
)

@dynamic_prompt 参数

@dynamic_prompt 装饰的函数接收一个 context 字典参数,包含 Agent 运行时上下文:

python
from langchain.prompts import dynamic_prompt

@dynamic_prompt
def prompt_with_context(context: dict) -> str:
    # context 包含以下字段:
    # - user_id: 用户 ID
    # - conversation_id: 对话 ID
    # - tools: 可用工具列表
    # - 自定义 context_schema 字段
    
    tools_list = context.get("tools", [])
    tool_names = [t.name for t in tools_list]
    
    return f"""你是一个助手。可用工具:{', '.join(tool_names)}

选择最合适的工具来回答用户问题。"""

多语言提示词

python
from langchain.prompts import dynamic_prompt

@dynamic_prompt
def multilingual_prompt(context: dict) -> str:
    """根据用户语言偏好生成对应语言的提示词。"""
    language = context.get("language", "中文")
    
    prompts = {
        "中文": f"你是一个助手。请用中文回复。",
        "English": "You are a helpful assistant. Reply in English.",
        "日本語": "あなたは役立つアシスタントです。日本語で返信してください。",
    }
    
    return prompts.get(language, prompts["中文"])

agent = create_agent(
    model=init_chat_model("openai/gpt-4o"),
    tools=[],
    system_prompt=multilingual_prompt,
    context_schema={"language": str},
)

模板组合

将多个提示词模板组合在一起:

python
from langchain.prompts import dynamic_prompt

# 基础行为定义
BASE_BEHAVIOR = "你是一个安全的 AI 助手,严格遵循用户指令。"

# 角色定义
ROLES = {
    "teacher": "你是一位耐心的老师,用简单易懂的方式解释问题。",
    "coder": "你是一位资深程序员,提供高质量的代码和最佳实践。",
    "writer": "你是一位专业作家,具有出色的文字表达能力。",
}

# 格式要求
FORMAT_RULES = "所有回复使用 Markdown 格式,代码块标明语言。"

@dynamic_prompt
def composed_prompt(context: dict) -> str:
    """组合多个模板元素。"""
    role = context.get("role", "coder")
    extra_rules = context.get("extra_rules", "")
    
    return f"""{BASE_BEHAVIOR}

## 角色设定
{ROLES.get(role, ROLES["coder"])}

## 格式要求
{FORMAT_RULES}

## 附加规则
{extra_rules}
"""

提示词版本管理

对于生产环境,建议对提示词进行版本管理:

python
from langchain.prompts import dynamic_prompt
import json
from pathlib import Path

class PromptManager:
    """提示词版本管理器。"""
    
    def __init__(self, prompts_dir: str = "prompts/"):
        self.prompts_dir = Path(prompts_dir)
        self.versions = self._load_versions()
    
    def _load_versions(self):
        version_file = self.prompts_dir / "versions.json"
        if version_file.exists():
            return json.loads(version_file.read_text())
        return {}
    
    def get_prompt(self, name: str, version: str = "latest"):
        if version == "latest":
            version = self.versions.get(name, {}).get("latest", "v1")
        prompt_file = self.prompts_dir / name / f"{version}.md"
        return prompt_file.read_text(encoding="utf-8")

# 使用
prompt_manager = PromptManager()

@dynamic_prompt
def versioned_prompt(context: dict) -> str:
    prompt_version = context.get("prompt_version", "latest")
    return prompt_manager.get_prompt("system", prompt_version)

提示词优化建议

  1. 明确角色设定:清晰定义 Agent 的身份和职责
  2. 具体约束:说明语言、格式、行为边界
  3. 示例引导:在提示词中加入 1-2 个示例(few-shot)
  4. 分步指令:复杂任务拆分为步骤说明
  5. 负面约束:明确告诉模型"不要做什么"
  6. 版本追踪:使用文件管理不同版本的提示词
  7. A/B 测试:对不同提示词版本进行效果对比

示例:完整的生产级提示词

markdown
# 角色
你是一个金融分析助手,专注于回答股票、基金和市场相关的问题。

# 行为约束
- 始终使用中文回复
- 基于可靠数据回答问题,不得编造信息
- 涉及投资建议时,必须声明"以上不构成投资建议"
- 对于不确定的信息,明确表示"我不确定"

# 输出格式
- 数据使用表格展示
- 重要数字使用加粗
- 复杂概念使用分类说明

# 可用工具
{tools_description}

下一步

本站为非官方中文学习站点,不代表 LangChain 官方。部分内容参考官方文档并重新整理为中文学习笔记。