Skip to content
清晨的一缕阳光
返回

结构化 Prompt 设计

结构化 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 应用开发。


分享这篇文章到:

上一篇文章
故宫简介
下一篇文章
Spring Boot 常见问题排查