结构化 Prompt 设计
结构化 Prompt 设计是构建企业级 AI 应用的基础,通过模板化和组件化提高开发效率。
一、设计原则
1.1 模块化原则
结构化 Prompt = 角色 + 任务 + 上下文 + 约束 + 格式
每个模块独立、可复用、可组合
1.2 模板化设计
# 基础模板
PROMPT_TEMPLATE = """
# 角色设定
{role}
# 任务描述
{task}
# 上下文信息
{context}
# 约束条件
{constraints}
# 输出格式
{format}
"""
二、组件库设计
2.1 角色组件
ROLE_COMPONENTS = {
"expert": "你是一位资深专家,在该领域有 10 年以上经验",
"teacher": "你是一位耐心的教师,擅长用简单语言解释复杂概念",
"reviewer": "你是一位严格的审稿人,注重细节和逻辑",
"assistant": "你是一位高效的助手,回答简洁明了"
}
2.2 任务组件
TASK_COMPONENTS = {
"analyze": "请分析以下内容,识别关键点和模式",
"summarize": "请总结以下内容,提取核心要点",
"generate": "请根据要求生成内容",
"evaluate": "请评估以下内容,指出优缺点"
}
2.3 格式组件
FORMAT_COMPONENTS = {
"json": "请以 JSON 格式输出,包含以下字段:{fields}",
"markdown": "请使用 Markdown 格式,包含标题、列表和代码块",
"table": "请使用表格格式,列包括:{columns}",
"bullet": "请使用项目符号列表,每条不超过 50 字"
}
三、模板系统
3.1 基础模板
class PromptTemplate:
def __init__(self, template: str):
self.template = template
def render(self, **kwargs) -> str:
return self.template.format(**kwargs)
def validate(self, **kwargs) -> bool:
# 验证必填字段
required_fields = self._extract_fields()
for field in required_fields:
if field not in kwargs:
return False
return True
3.2 组合模板
class CompositePrompt:
def __init__(self):
self.components = []
def add_component(self, component: str, position: int = -1):
if position == -1:
self.components.append(component)
else:
self.components.insert(position, component)
def build(self) -> str:
return "\n\n".join(self.components)
3.3 模板继承
# 基础模板
BASE_TEMPLATE = """
你是一位{role}。
请完成以下任务:{task}
"""
# 扩展模板
ADVANCED_TEMPLATE = BASE_TEMPLATE + """
约束条件:
{constraints}
输出格式:
{format}
示例:
{examples}
"""
四、版本管理
4.1 版本控制
# 目录结构
prompts/
├── v1/
│ ├── article_writer.txt
│ └── code_reviewer.txt
├── v2/
│ ├── article_writer.txt
│ └── code_reviewer.txt
└── current/
└── article_writer.txt -> v2/article_writer.txt
4.2 A/B 测试
# 测试配置
class PromptABTest:
def __init__(self, variant_a: str, variant_b: str):
self.variant_a = variant_a
self.variant_b = variant_b
def test(self, test_cases: list) -> dict:
results = {"a": [], "b": []}
for case in test_cases:
response_a = self.call_llm(self.variant_a, case)
response_b = self.call_llm(self.variant_b, case)
results["a"].append(self.evaluate(response_a))
results["b"].append(self.evaluate(response_b))
return {
"a_avg": sum(results["a"]) / len(results["a"]),
"b_avg": sum(results["b"]) / len(results["b"])
}
五、最佳实践
5.1 参数验证
def validate_prompt_params(params: dict, schema: dict) -> bool:
for key, rules in schema.items():
if key not in params:
if rules.get("required", False):
return False
if key in params:
value = params[key]
if "max_length" in rules and len(value) > rules["max_length"]:
return False
return True
5.2 缓存优化
from functools import lru_cache
import hashlib
class PromptCache:
def __init__(self):
self.cache = {}
def _get_key(self, prompt: str) -> str:
return hashlib.md5(prompt.encode()).hexdigest()
@lru_cache(maxsize=1000)
def get_or_generate(self, prompt: str, generator):
key = self._get_key(prompt)
if key not in self.cache:
self.cache[key] = generator(prompt)
return self.cache[key]
5.3 质量检查
class PromptQualityChecker:
def check(self, prompt: str) -> dict:
issues = []
# 检查长度
if len(prompt) > 4000:
issues.append("Prompt 过长,可能影响效果")
# 检查清晰度
if "?" not in prompt and "请" not in prompt:
issues.append("缺少明确的指令词")
# 检查示例
if "示例" not in prompt and "example" not in prompt.lower():
issues.append("建议添加示例")
return {
"score": 100 - len(issues) * 20,
"issues": issues
}
六、总结
结构化 Prompt 核心要点:
| 组件 | 作用 | 示例 |
|---|---|---|
| 角色 | 设定身份 | ”你是一位专家” |
| 任务 | 明确目标 | ”请分析以下内容” |
| 约束 | 限制范围 | ”控制在 500 字以内” |
| 格式 | 规范输出 | ”以 JSON 格式输出” |
| 示例 | 提供参考 | ”示例:…” |
结构化设计让 Prompt 开发从艺术变为工程,支持规模化、可维护的 AI 应用开发。