Prompt 模板与变量系统
High Contrast
Dark Mode
Light Mode
Sepia
Forest
2 min read325 words

Prompt 模板与变量系统

当 Prompt 从实验走向生产,你需要一个可维护的模板系统:版本管理、变量注入、条件逻辑,让 Prompt 像代码一样工程化。

模板化全景

graph TB A[原始Prompt] --> B[识别变量] B --> C[模板化] C --> D[变量注入] D --> E[最终Prompt] F[模板仓库] --> C G[上下文数据] --> D style A fill:#ffcdd2,stroke:#c62828,stroke-width:2px style C fill:#e3f2fd,stroke:#1565c0,stroke-width:2px style E fill:#c8e6c9,stroke:#43a047,stroke-width:2px

模板引擎实现

from dataclasses import dataclass, field
import re
@dataclass
class PromptTemplate:
"""Prompt 模板引擎"""
name: str
template: str
description: str = ""
version: str = "1.0"
required_vars: set[str] = field(default_factory=set)
def __post_init__(self):
# 自动提取 {{variable}} 形式的变量
self.required_vars = set(
re.findall(r"\{\{(\w+)\}\}", self.template)
)
def render(self, **kwargs) -> str:
"""渲染模板,注入变量"""
missing = self.required_vars - set(kwargs.keys())
if missing:
raise ValueError(f"缺少必需变量: {missing}")
result = self.template
for key, value in kwargs.items():
result = result.replace(f"{{{{{key}}}}}", str(value))
return result
@property
def variable_count(self) -> int:
return len(self.required_vars)
# 示例:情感分析模板
sentiment_template = PromptTemplate(
name="sentiment_analysis",
template="""你是一个{{domain}}领域的情感分析专家。
请对以下{{content_type}}进行情感分析,输出格式为JSON:
- sentiment: positive / negative / neutral
- confidence: 0.0-1.0
- keywords: 关键情感词列表
内容:
{{text}}
JSON输出:""",
description="通用情感分析模板",
version="2.1",
)
# 渲染
prompt = sentiment_template.render(
domain="电商",
content_type="商品评论",
text="包装很精美,但是物流太慢了,等了一周才到。",
)
print(f"变量: {sentiment_template.required_vars}")
print(f"渲染结果:\n{prompt}")

条件模板

from dataclasses import dataclass
@dataclass
class ConditionalTemplate:
"""支持条件分支的模板"""
blocks: dict[str, str] = field(default_factory=dict)
def add_block(self, name: str, content: str) -> None:
self.blocks[name] = content
def compose(self, include: list[str]) -> str:
"""按顺序组装选中的模块"""
parts = []
for name in include:
if name in self.blocks:
parts.append(self.blocks[name])
return "\n\n".join(parts)
# 构建模块化 Prompt
builder = ConditionalTemplate()
builder.add_block("role", "你是一位资深的{role}。")
builder.add_block("context", "背景信息:\n{context}")
builder.add_block("examples", "参考示例:\n{examples}")
builder.add_block("task", "任务:\n{task}")
builder.add_block("format", "请以{format}格式输出。")
builder.add_block("constraints", "约束:\n- 不超过{max_words}字\n- 使用{language}回答")
# 简单任务:只用 role + task
simple = builder.compose(["role", "task"])
# 复杂任务:全部模块
full = builder.compose(
["role", "context", "examples", "task", "format", "constraints"]
)
print(f"简单模板 ({len(simple)} 字符)")
print(f"完整模板 ({len(full)} 字符)")

模板最佳实践

实践 说明 示例
变量命名 使用 snake_case,语义明确 {{user_query}}{{q}}
版本管理 每次迭代递增版本号 v1.0 → v1.1 → v2.0
默认值 为可选变量设置合理默认值 language 默认 "中文"
转义处理 防止用户输入破坏模板结构 限制 {{ }} 字符
长度监控 渲染后检查 token 长度 超限时截断 context
A/B 测试 同一任务维护多个模板版本 对比输出质量

模板管理建议

graph LR A[模板仓库] --> B[版本控制
Git] A --> C[分类管理
按场景] A --> D[评测记录
准确率] B --> E[回滚能力] C --> F[快速查找] D --> G[持续优化] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:2px style E fill:#c8e6c9,stroke:#43a047,stroke-width:2px style G fill:#fff9c4,stroke:#f9a825,stroke-width:2px

本章小结

下一章:Zero-shot 与 Few-shot