【LangChain】System Prompt工程化实践:让AI"人设"不崩塌的艺术

0 阅读15分钟

System Prompt工程化实践:让AI"人设"不崩塌的艺术

想象一下,你请了一位顶级厨师来家里做饭。如果你只说"做个好吃的",他可能会端出一盘法式鹅肝——但你其实想要的是家常红烧肉。System Prompt就是那个**"点菜说明书"**,它决定了AI是变成严谨的程序员、贴心的客服,还是毒舌的评论家。

今天,我们就来聊聊如何把这份"说明书"写得既专业又优雅。


一、静态Prompt:AI的"基础人设"

静态Prompt就像给AI设定的出厂配置,决定了它的基本性格和行为模式。

1. 基础结构:角色-任务-约束三板斧

from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate

# 一个优秀的System Prompt应该包含三个要素
system_template = """你是一位{role}。你的任务是{task}。

【行为准则】
1. {rule_1}
2. {rule_2}
3. {rule_3}

【输出格式】
{output_format}

【注意事项】
{warnings}
"""

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(system_template),
    HumanMessagePromptTemplate.from_template("{user_input}")
])

# 实例化:让AI变成"代码审查员"
code_reviewer_prompt = prompt.partial(
    role="资深Python代码审查专家,拥有10年开源项目维护经验",
    task="审查用户提供的代码,找出潜在bug、性能瓶颈和不符合PEP8规范的地方",
    rule_1="先肯定代码的优点,再指出问题,保持建设性态度",
    rule_2="对严重问题(如安全隐患)使用[严重]标签,一般建议使用[建议]标签",
    rule_3="提供具体的修改示例,不要只讲理论",
    output_format="""## 审查摘要
总体评分:X/10

## 发现的问题
1. [严重/建议] 问题描述
   - 位置:行号X
   - 修复建议:代码示例

## 优点亮点
...""",
    warnings="不要修改代码的功能逻辑,只优化实现方式"
)

2. 进阶技巧:Few-Shot嵌入

让AI"看几个例子"往往比长篇大论更有效:

from langchain_core.prompts import FewShotChatMessagePromptTemplate

# 定义示例对话
examples = [
    {
        "input": "帮我写个快速排序",
        "output": """```python
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)```
复杂度:O(n log n)平均,O(n²)最坏情况。适用于大数据集,但非稳定排序。"""
    },
    {
        "input": "这段代码有什么问题?def add(a,b): return a+b",
        "output": """功能上没问题,但可以更Pythonic:
```python
def add(a: int, b: int) -> int:
    \"\"\"返回两个数的和。\"\"\"
    return a + b```

改进点:
1. 添加类型注解
2. 添加文档字符串
3. 考虑异常处理(如输入非数字类型)"""
    }
]

example_prompt = ChatPromptTemplate.from_messages([
    ("human", "{input}"),
    ("ai", "{output}")
])

few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

final_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位代码助手,遵循以下示例的风格回答问题:"),
    few_shot_prompt,
    ("human", "{user_input}")
])

3. 模块化Prompt管理

当项目变大,Prompt也需要"工程化"管理:

# prompts/configs/base.py
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class PromptConfig:
    """Prompt配置类,便于版本管理和A/B测试"""
    name: str
    version: str
    system_template: str
    variables: List[str]
    temperature: float = 0.7
    max_tokens: Optional[int] = None
    
    def format(self, **kwargs) -> str:
        return self.system_template.format(**kwargs)

# prompts/characters/coder.py
coder_config = PromptConfig(
    name="python_coder",
    version="1.2.0",
    system_template="""你是一位{expertise}Python开发者。
风格偏好:{style}
代码标准:遵循{standard}规范。
{additional_context}""",
    variables=["expertise", "style", "standard", "additional_context"],
    temperature=0.2,  # 代码需要确定性
    max_tokens=2000
)

# 使用示例
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=coder_config.temperature)
formatted_prompt = coder_config.format(
    expertise="擅长高性能计算和算法优化的",
    style="简洁优雅,注重注释",
    standard="Google Python Style Guide",
    additional_context="当前项目使用Python 3.11,依赖numpy和pandas"
)

二、动态Prompt:让AI"见人说人话"

静态Prompt像制服,动态Prompt像智能变色衣——根据场景自动调整。

1. 使用函数动态生成Prompt

from typing import Dict, Any
from langchain_core.prompts import SystemMessage

def generate_dynamic_prompt(
    user_context: Dict[str, Any],
    conversation_history: list,
    available_tools: list
) -> SystemMessage:
    """
    根据用户状态动态构建System Prompt
    就像根据客人忌口调整菜谱
    """
    
    # 基础人设
    base_persona = "你是一位智能助手。"
    
    # 根据用户经验水平调整深度
    experience_level = user_context.get("experience_level", "intermediate")
    depth_instructions = {
        "beginner": "使用简单类比解释概念,避免术语,多举生活例子。",
        "intermediate": "可以适当使用专业术语,但需要简要解释。",
        "expert": "直接深入技术细节,无需解释基础概念。"
    }
    
    # 根据可用工具调整能力描述
    tool_capabilities = ""
    if available_tools:
        tool_list = ", ".join([t.name for t in available_tools])
        tool_capabilities = f"你可以使用以下工具:{tool_list}。使用工具时先说明意图。"
    
    # 根据对话历史调整语气
    message_count = len(conversation_history)
    if message_count > 10:
        rapport = "你们已经交流一段时间了,可以保持友好轻松的语气,适当使用之前的上下文。"
    else:
        rapport = "保持专业、清晰的初次交流风格。"
    
    # 组装最终Prompt
    dynamic_content = f"""{base_persona}

【当前用户画像】
经验水平:{experience_level}
{depth_instructions[experience_level]}

【能力范围】
{tool_capabilities}

【对话风格】
{rapport}

【当前会话信息】
已交互轮数:{message_count}
用户ID:{user_context.get('user_id', 'anonymous')}
"""
    
    return SystemMessage(content=dynamic_content)

# 使用示例
context = {
    "user_id": "user_123",
    "experience_level": "beginner",
    "preferred_language": "zh"
}
history = []  # 实际应该是历史消息列表
tools = []    # 实际注册的工具

system_msg = generate_dynamic_prompt(context, history, tools)

2. LangChain的@dynamic_prompt风格实现

虽然LangChain没有内置@dynamic_prompt装饰器,但我们可以这样实现类似功能:

from functools import wraps
from typing import Callable, Union
from langchain_core.messages import SystemMessage

class DynamicPromptRegistry:
    """动态Prompt注册中心,类似中间件机制"""
    
    def __init__(self):
        self.generators: Dict[str, Callable] = {}
    
    def register(self, name: str):
        def decorator(func: Callable):
            self.generators[name] = func
            @wraps(func)
            def wrapper(*args, **kwargs):
                return func(*args, **kwargs)
            return wrapper
        return decorator
    
    def generate(self, name: str, context: Dict) -> SystemMessage:
        if name not in self.generators:
            raise ValueError(f"Unknown prompt generator: {name}")
        return self.generators[name](context)

# 全局注册表
prompt_registry = DynamicPromptRegistry()

# 定义不同的动态Prompt生成器
@prompt_registry.register("coding_assistant")
def coding_assistant_prompt(ctx: Dict) -> SystemMessage:
    language = ctx.get("language", "Python")
    difficulty = ctx.get("difficulty", "medium")
    
    content = f"""你是一位{language}专家。
当前难度设置:{difficulty}
{'请提供详细的分步解释。' if difficulty == 'easy' else '请直接给出最优解。'}
"""
    return SystemMessage(content=content)

@prompt_registry.register("writing_coach")
def writing_coach_prompt(ctx: Dict) -> SystemMessage:
    genre = ctx.get("genre", "general")
    tone = ctx.get("tone", "professional")
    
    return SystemMessage(content=f"""你是一位{genre}写作教练。
语气要求:{tone}
{'注重情感共鸣和故事性' if tone == 'casual' else '注重逻辑结构和事实准确性'}
""")

# 在Agent中使用
from langchain.agents import create_openai_functions_agent

def create_adaptive_agent(registry: DynamicPromptRegistry, prompt_name: str):
    def agent_factory(context: Dict):
        system_msg = registry.generate(prompt_name, context)
        # 结合system_msg创建agent...
        return system_msg
    return agent_factory

# 实际调用
context = {"language": "Rust", "difficulty": "hard"}
system_message = prompt_registry.generate("coding_assistant", context)

三、Anthropic Prompt Caching:给Prompt装个"缓存器"

想象你有一本1000页的说明书,每次提问都要翻一遍。Anthropic的Prompt Caching就是让你把常用章节"折个角",下次直接翻到。

1. 什么是Prompt Caching?

这是Anthropic Claude模型的特色功能,允许你:

  • 缓存长达128K tokens的上下文
  • 后续请求只需发送增量内容
  • 成本降低高达90%,延迟减少85%

2. LangChain中的实现

from langchain_anthropic import ChatAnthropic
from langchain_core.messages import SystemMessage, HumanMessage

# 初始化支持caching的模型
llm = ChatAnthropic(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
)

# 构造带缓存标记的消息
# 注意: LangChain目前对原生caching支持有限,需要手动控制API调用
from anthropic import Anthropic
import os

client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

def create_cached_conversation(
    system_prompt: str,  # 这部分会被缓存
    permanent_context: str,  # 长期知识,如产品文档
    dynamic_query: str  # 每次变化的问题
):
    """
    构造利用Prompt Caching的消息序列
    """
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1024,
        system=system_prompt,  # System prompt自动被优化缓存
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": permanent_context,
                        "cache_control": {"type": "ephemeral"}  # 标记为可缓存
                    },
                    {
                        "type": "text",
                        "text": f"基于以上文档,请回答:{dynamic_query}"
                        # 这部分不缓存,每次都变
                    }
                ]
            }
        ]
    )
    return response.content[0].text

# 实战:RAG场景下的Caching优化
class CachedRAGAssistant:
    def __init__(self, system_prompt: str, document_corpus: str):
        self.system = system_prompt
        # 预加载并缓存大文档
        self.cached_context = self._prepare_cache(document_corpus)
        self.client = Anthropic()
    
    def _prepare_cache(self, docs: str) -> str:
        # 实际项目中这里会处理大量文档
        return f"""【知识库内容 - 已缓存】
{docs[:100000]}  # 假设这是大量文档
"""
    
    def query(self, question: str) -> str:
        # 只有question是新的,其他都走缓存
        return create_cached_conversation(
            system_prompt=self.system,
            permanent_context=self.cached_context,
            dynamic_query=question
        )

# 使用示例
assistant = CachedRAGAssistant(
    system_prompt="你是一位专业的技术支持工程师,基于提供的产品文档回答问题。",
    document_corpus="..."  # 大量产品文档
)

# 第一次调用后,文档内容被缓存
answer1 = assistant.query("如何重置密码?")
# 第二次调用,只传输问题,复用缓存的文档,速度快10倍,成本低90%
answer2 = assistant.query("支持哪些支付方式?")

3. 缓存策略最佳实践

class PromptCacheStrategy:
    """Prompt分层缓存策略"""
    
    def __init__(self):
        self.layers = {
            "static": {  # 永不改变,长期缓存
                "content": "基础人设和全局规则",
                "ttl": "permanent"
            },
            "semi_static": {  # 小时级变化
                "content": "用户画像、会话上下文",
                "ttl": 3600
            },
            "dynamic": {  # 每次请求都变
                "content": "具体问题、实时数据",
                "ttl": 0
            }
        }
    
    def build_prompt(self, layers_data: Dict) -> list:
        """
        按层次构建Prompt,优化缓存命中率
        """
        messages = []
        
        # 第一层:System(自动被Claude缓存)
        messages.append({
            "role": "system",
            "content": layers_data["static"]
        })
        
        # 第二层:缓存的长期上下文
        messages.append({
            "role": "user", 
            "content": [
                {
                    "type": "text",
                    "text": f"<context>{layers_data['semi_static']}</context>",
                    "cache_control": {"type": "ephemeral"}
                }
            ]
        })
        
        # 第三层:实时问题(不缓存)
        messages.append({
            "role": "user",
            "content": layers_data["dynamic"]
        })
        
        return messages

四、多角色Prompt模板管理:AI的"人格分裂"艺术

一个复杂的Agent系统往往需要多个专家角色协同工作,就像 Avengers(复仇者联盟)各自有专长,但听命于统一指挥。

1. 角色定义与切换机制

from enum import Enum
from dataclasses import dataclass
from typing import Dict, List

class AgentRole(Enum):
    ANALYZER = "analyzer"      # 分析型:逻辑严谨,注重事实
    CREATIVE = "creative"      # 创意型:头脑风暴,发散思维  
    CRITIC = "critic"          # 批判型:找茬挑刺,风险评估
    EXECUTOR = "executor"      # 执行型:注重落地,细节导向
    COORDINATOR = "coordinator"  # 协调型:统筹全局,分配任务

@dataclass
class RoleProfile:
    name: str
    system_prompt: str
    temperature: float
    max_tokens: int
    allowed_tools: List[str]
    voice_style: str  # 用于语音输出的风格提示

class MultiRolePromptManager:
    """多角色Prompt管理器"""
    
    def __init__(self):
        self.roles: Dict[AgentRole, RoleProfile] = {
            AgentRole.ANALYZER: RoleProfile(
                name="数据分析师",
                system_prompt="""你是数据分析师Dr.Data。你的特点是:
- 只说确定的事实,不确定时明确标注"推测"
- 使用数据支撑观点,提供统计显著性
- 回答结构:结论->依据->置信度->缺失信息
- 禁止:主观臆断、情绪化表达""",
                temperature=0.1,  # 低温度确保确定性
                max_tokens=1500,
                allowed_tools=["data_query", "statistical_analysis", "visualization"],
                voice_style="冷静、客观、略带学术腔"
            ),
            
            AgentRole.CREATIVE: RoleProfile(
                name="创意总监",
                system_prompt="""你是创意总监Muse。你的特点是:
- 思维跳跃,善于跨界联想
- 使用"如果...会怎样"的提问方式
- 鼓励疯狂想法,后期再收敛
- 回答结构:核心创意->3个变体->跨界类比->实现脑洞
- 禁止:过早否定、强调不可能""",
                temperature=0.9,  # 高温度增加创造性
                max_tokens=2000,
                allowed_tools=["image_generation", "trend_search", "brainstorming"],
                voice_style="热情、跳跃、充满感染力"
            ),
            
            AgentRole.CRITIC: RoleProfile(
                name="风险管控官",
                system_prompt="""你是风险管控官Skeptic。你的特点是:
- 专门寻找逻辑漏洞和潜在风险
- 使用红队思维(Red Teaming)
- 评估法律、伦理、技术、商业四维度风险
- 回答结构:风险点->严重程度->触发条件->缓解方案
- 禁止:和稀泥、回避尖锐问题""",
                temperature=0.3,
                max_tokens=1200,
                allowed_tools=["compliance_check", "risk_matrix", "case_study_search"],
                voice_style="严肃、直接、略带警惕"
            ),
            
            AgentRole.EXECUTOR: RoleProfile(
                name="执行工程师",
                system_prompt="""你是执行工程师Builder。你的特点是:
- 把想法变成可执行步骤
- 每个建议都包含:具体动作->负责人->截止时间->验收标准
- 优先关注资源约束和依赖关系
- 回答结构:任务分解->依赖图->风险点->检查清单
- 禁止:模糊表述、忽略落地细节""",
                temperature=0.2,
                max_tokens=1800,
                allowed_tools=["project_management", "code_generation", "resource_planning"],
                voice_style="务实、简洁、行动导向"
            ),
            
            AgentRole.COORDINATOR: RoleProfile(
                name="项目协调员",
                system_prompt="""你是项目协调员Orchestrator。你的特点是:
- 理解各专家角色能力边界
- 将复杂任务分解并分配给合适角色
- 同步上下文,确保信息不丢失
- 回答结构:任务理解->角色分配->协作流程->同步机制
- 禁止:越俎代庖、信息不同步""",
                temperature=0.4,
                max_tokens=1000,
                allowed_tools=["role_router", "context_sync", "progress_tracker"],
                voice_style="清晰、中立、组织性强"
            )
        }
    
    def get_prompt(self, role: AgentRole) -> str:
        return self.roles[role].system_prompt
    
    def get_config(self, role: AgentRole) -> Dict:
        profile = self.roles[role]
        return {
            "temperature": profile.temperature,
            "max_tokens": profile.max_tokens,
            "system_prompt": profile.system_prompt
        }
    
    def switch_role(self, current_role: AgentRole, trigger: str) -> AgentRole:
        """
        基于触发条件自动切换角色
        就像团队会议中,根据议题自动换主讲人
        """
        switch_map = {
            "需要数据分析": AgentRole.ANALYZER,
            "来个创意": AgentRole.CREATIVE,
            "有什么风险": AgentRole.CRITIC,
            "怎么落地": AgentRole.EXECUTOR,
            "协调一下": AgentRole.COORDINATOR
        }
        
        for keyword, target_role in switch_map.items():
            if keyword in trigger:
                return target_role
        return current_role

2. 多角色协作流程

from langchain_core.messages import HumanMessage, AIMessage
from langgraph.graph import StateGraph, END

class MultiRoleAgentState:
    def __init__(self):
        self.messages: List = []
        self.current_role: AgentRole = AgentRole.COORDINATOR
        self.task_queue: List = []
        self.consensus: Dict = {}

class MultiRoleOrchestrator:
    """多角色协作编排器"""
    
    def __init__(self, prompt_manager: MultiRolePromptManager):
        self.pm = prompt_manager
        self.graph = self._build_graph()
    
    def _build_graph(self):
        # 定义状态机:Coordinator -> 分配任务 -> 各角色执行 -> 汇总
        workflow = StateGraph(MultiRoleAgentState)
        
        # 添加节点...
        # 这里简化展示核心逻辑
        
        return workflow.compile()
    
    def run_collaboration(self, task: str) -> str:
        """
        模拟团队协作解决复杂问题
        """
        # 阶段1:Coordinator分析任务
        coordinator_prompt = self.pm.get_prompt(AgentRole.COORDINATOR)
        plan = self._ask_role(AgentRole.COORDINATOR, f"请分析任务并制定协作计划:{task}")
        
        # 阶段2:并行执行各子任务
        results = {}
        for subtask in plan.subtasks:
            role = self.pm.switch_role(AgentRole.COORDINATOR, subtask.type)
            role_config = self.pm.get_config(role)
            results[subtask.id] = self._ask_role_with_config(role, subtask.description, role_config)
        
        # 阶段3:Critic审查
        consolidated = "\n\n".join([r.content for r in results.values()])
        critique = self._ask_role(
            AgentRole.CRITIC, 
            f"审查以下综合方案的风险:{consolidated}"
        )
        
        # 阶段4:Coordinator输出最终方案
        final = self._ask_role(
            AgentRole.COORDINATOR,
            f"基于各专家意见和审查反馈,输出最终执行方案。\n\n方案:{consolidated}\n\n审查意见:{critique}"
        )
        
        return final

    def _ask_role(self, role: AgentRole, query: str):
        # 实际调用LLM的封装
        config = self.pm.get_config(role)
        # ... 调用逻辑
        pass
    
    def _ask_role_with_config(self, role: AgentRole, query: str, config: Dict):
        # 带配置的调用
        pass

3. Prompt模板继承与组合

class PromptTemplateInheritance:
    """支持继承的Prompt模板系统"""
    
    def __init__(self):
        self.base_templates = {
            "professional": "你是专业领域的{specialty}专家。保持客观、准确、有帮助。",
            "friendly": "你是用户的友好伙伴。语气温暖、耐心、鼓励性。",
            "concise": "回答简洁明了,避免冗余。使用要点式输出。"
        }
        
        self.specialized_templates = {
            "tech_support": {
                "extends": "professional",
                "addition": "优先提供可执行的解决方案,而非理论解释。",
                "variables": {"specialty": "技术支持"}
            },
            "onboarding_helper": {
                "extends": ["friendly", "concise"],
                "addition": "引导用户完成新手流程,每步只给一个指令。",
                "variables": {"specialty": "用户引导"}
            }
        }
    
    def render(self, template_name: str, **extra_vars) -> str:
        template = self.specialized_templates[template_name]
        
        # 收集继承链
        bases = template.get("extends", [])
        if isinstance(bases, str):
            bases = [bases]
        
        # 组合Prompt
        parts = []
        for base in bases:
            base_prompt = self.base_templates[base]
            parts.append(base_prompt)
        
        parts.append(template["addition"])
        
        # 变量替换
        full_prompt = "\n".join(parts)
        variables = template.get("variables", {})
        variables.update(extra_vars)
        
        return full_prompt.format(**variables)

# 使用
renderer = PromptTemplateInheritance()
tech_prompt = renderer.render("tech_support")
# 结果:你是专业领域的技术支持专家。保持客观、准确、有帮助。优先提供可执行的解决方案,而非理论解释。

五、实战:一个完整的工程化Prompt系统

让我们把以上所有概念整合成一个生产级的Prompt管理系统:

import yaml
from pathlib import Path
from typing import Dict, Any, Optional
from jinja2 import Template

class ProductionPromptManager:
    """
    生产级Prompt管理系统
    特性:
    - YAML配置管理
    - 版本控制
    - A/B测试支持
    - 动态变量注入
    - 多语言支持
    """
    
    def __init__(self, config_path: str = "prompts/"):
        self.config_path = Path(config_path)
        self.prompts: Dict[str, Any] = {}
        self.versions: Dict[str, str] = {}
        self._load_prompts()
    
    def _load_prompts(self):
        """从YAML文件加载Prompt配置"""
        for file in self.config_path.glob("*.yaml"):
            with open(file, 'r', encoding='utf-8') as f:
                data = yaml.safe_load(f)
                self.prompts.update(data.get('prompts', {}))
                self.versions.update(data.get('versions', {}))
    
    def get(
        self, 
        prompt_id: str, 
        variables: Optional[Dict] = None,
        version: Optional[str] = None,
        context: Optional[Dict] = None
    ) -> str:
        """
        获取并渲染Prompt
        
        Args:
            prompt_id: Prompt标识符
            variables: 模板变量
            version: 指定版本(用于A/B测试)
            context: 动态上下文(用于条件逻辑)
        """
        # 版本控制
        active_version = version or self.versions.get(prompt_id, "latest")
        prompt_def = self.prompts.get(prompt_id, {})
        
        if active_version != "latest" and "versions" in prompt_def:
            prompt_def = prompt_def["versions"].get(active_version, prompt_def)
        
        # 获取基础模板
        template_str = prompt_def.get("template", "")
        
        # 条件渲染(基于context)
        conditions = prompt_def.get("conditions", [])
        for condition in conditions:
            if self._eval_condition(condition["when"], context):
                template_str += "\n" + condition["append"]
        
        # Jinja2渲染
        template = Template(template_str)
        rendered = template.render(**(variables or {}))
        
        return rendered
    
    def _eval_condition(self, condition: str, context: Optional[Dict]) -> bool:
        """评估条件表达式"""
        if not context:
            return False
        # 简化的条件评估,实际可用eval或安全解析器
        try:
            return eval(condition, {"__builtins__": {}}, context)
        except:
            return False
    
    def list_prompts(self) -> Dict:
        """列出所有可用Prompt"""
        return {
            pid: {
                "description": p.get("description", ""),
                "current_version": self.versions.get(pid, "latest"),
                "variables": p.get("variables", [])
            }
            for pid, p in self.prompts.items()
        }

# 配置示例 (prompts/customer_service.yaml)
"""
prompts:
  customer_service_bot:
    description: "智能客服机器人主Prompt"
    version: "2.1.0"
    variables: ["user_tier", "product_line", "language"]
    template: |
      你是{{ product_line }}的专属客服助手。
      用户等级:{{ user_tier }}
      {% if user_tier == "VIP" %}
      对VIP用户:优先处理,提供专属折扣权限,可直接升级至人工。
      {% endif %}
      
      【服务准则】
      1. 使用{{ language }}回复
      2. 首次响应时间 < 30秒
      3. 复杂问题提供步骤清单
      
    conditions:
      - when: "context.get('is_weekend', False)"
        append: "注意:当前为周末,非紧急技术问题建议工作日处理。"
      - when: "context.get('user_tier') == 'enterprise'"
        append: "企业级客户:可提及SLA保障和专属客户经理。"
    
    versions:
      "2.0.0": # 旧版本保留用于回滚
        template: "..."
"""

# 使用示例
manager = ProductionPromptManager("./prompts")

# 普通调用
prompt_v1 = manager.get(
    "customer_service_bot",
    variables={
        "user_tier": "VIP",
        "product_line": "云服务",
        "language": "中文"
    },
    context={"is_weekend": True}
)

# A/B测试:50%流量使用新版本
import random
version = "2.1.0-beta" if random.random() > 0.5 else "2.0.0"
prompt_ab = manager.get("customer_service_bot", version=version)

总结:Prompt工程化的三个层次

层次特点适用场景
静态Prompt固定模板,变量替换确定性任务、标准化回复
动态Prompt上下文感知,条件渲染个性化交互、多轮对话
智能Prompt多角色协作,缓存优化复杂Agent系统、企业级应用

记住:好的Prompt不是写出来的,是迭代出来的。建议建立Prompt版本库,记录每次改动的效果数据(用户满意度、任务完成率、Token成本),用数据驱动优化。


下集预告:在下一篇《Agent状态管理与记忆系统》中,我们将探讨如何让AI记住"你上周说过喜欢川菜",以及短期记忆和长期记忆的区别。敬请期待!

关注公众号【dev派】,发送 "agent" 获取全部源码和模板