为什么要做Prompt模板?

如果每次都从零写Prompt,有三个问题:效率低、质量不稳定、无法迭代。模板化之后:同一个任务每次输出格式一致;改一个地方可以影响所有调用;可以做版本管理,追踪哪个版本效果最好。

变量插值设计

用占位符标记需要动态替换的部分:

TEMPLATE = """
你是一位{role},专注于{domain}领域。

请分析以下内容:
{content}

输出格式:
- 核心观点:...
- 风险提示:...
- 操作建议:...
"""

def render(role, domain, content):
    return TEMPLATE.format(role=role, domain=domain, content=content)

模板的分层结构

# 基础模板(通用规则)
BASE = "你是一个AI助手,总是用中文回答,输出简洁清晰。"

# 场景模板(继承基础)
STOCK_ANALYST = BASE + "\n你还是专业的A股分析师,分析时给出明确买卖建议。"

# 实例(填入具体数据)
prompt = STOCK_ANALYST + f"\n请分析以下股票:{stock_data}"

完整Prompt模板系统示例

from dataclasses import dataclass
from typing import Dict

@dataclass
class PromptTemplate:
    name: str
    version: str
    template: str
    variables: list[str]

    def render(self, **kwargs) -> str:
        missing = [v for v in self.variables if v not in kwargs]
        if missing:
            raise ValueError(f"缺少变量: {missing}")
        return self.template.format(**kwargs)

# 定义模板
templates = {
    "stock_analysis_v2": PromptTemplate(
        name="stock_analysis",
        version="2.0",
        template="""你是专业A股分析师。
分析股票:{ticker} ({name})
数据:{data}
给出:技术面分析、操作建议、止损价位。""",
        variables=["ticker", "name", "data"]
    )
}

# 使用
t = templates["stock_analysis_v2"]
prompt = t.render(ticker="002472", name="双环传动", data="收盘价36.67...")

Prompt版本管理

Prompt模板是AI工程化的基础。没有模板管理,AI功能会像"黑盒子"——每次结果不一样,也不知道为什么变了。