05. 提示程序(Prompt Programs)
概述
本指南介绍如何将提示组织成可重用、可组合的程序,以实现更复杂和强大的AI系统。
核心概念
- 模块化提示 - 将提示分解为可重用的组件
- 提示组合 - 组合多个提示以解决复杂问题
- 条件执行 - 根据条件选择不同的提示分支
- 循环和迭代 - 实现重复的提示执行
- 状态管理 - 跟踪和管理提示间的状态
提示程序架构
基本结构
提示程序
├── 初始化阶段
│ ├── 设置变量
│ ├── 加载上下文
│ └── 定义目标
├── 处理阶段
│ ├── 多个提示块
│ ├── 条件分支
│ └── 循环结构
├── 聚合阶段
│ ├── 收集结果
│ ├── 综合信息
│ └── 生成最终输出
└── 验证阶段
├── 检查质量
├── 错误处理
└── 反馈循环设计模式
模式 1: 管道(Pipeline)
结构:
输入 → 步骤1 → 步骤2 → 步骤3 → 输出示例:
原始文本 → 清洁 → 提取信息 → 格式化 → 输出适用场景:
- 顺序处理
- 数据转换
- 逐步精化
模式 2: 分支(Branching)
结构:
输入
├─ 条件1 → 分支A → 输出1
├─ 条件2 → 分支B → 输出2
└─ 条件3 → 分支C → 输出3示例:
问题分类
├─ 技术问题 → 技术支持流程
├─ 账户问题 → 账户管理流程
└─ 其他问题 → 一般咨询流程适用场景:
- 根据输入选择不同路径
- 多个处理分支
- 决策树
模式 3: 循环(Loop)
结构:
初始化
↓
执行提示
↓
评估结果
↓ 未完成
重复
↓ 完成
输出示例:
生成代码 → 测试 → 错误? → 调试提示 → 重新生成
↓ 无错误
返回代码适用场景:
- 迭代改进
- 直到满足条件
- 多轮对话
模式 4: 分而治之(Divide and Conquer)
结构:
大问题
├─ 分解1 → 解决1
├─ 分解2 → 解决2
├─ 分解3 → 解决3
└─ 合并 → 综合答案示例:
长文档总结
├─ 分割成段落
├─ 各段独立总结
├─ 综合各段摘要
└─ 生成整体总结适用场景:
- 大规模问题
- 并行处理
- 复杂分析
模式 5: 多智能体(Multi-Agent)
结构:
协调器
├─ Agent1(专家1)
├─ Agent2(专家2)
├─ Agent3(专家3)
└─ 聚合结果示例:
复杂决策
├─ 技术评估
├─ 成本分析
├─ 风险评估
└─ 综合建议适用场景:
- 需要多个视角
- 复杂决策
- 专业领域分析
实现技巧
1. 模块设计
python
# 定义可重用的提示模块
class PromptModule:
def __init__(self, name, template, parameters):
self.name = name
self.template = template
self.parameters = parameters
def execute(self, context):
# 执行提示
pass
def validate_output(self, output):
# 验证输出
pass2. 上下文管理
python
# 管理提示间的上下文传递
class PromptContext:
def __init__(self):
self.variables = {}
self.history = []
def set(self, key, value):
self.variables[key] = value
def get(self, key):
return self.variables.get(key)
def save_step(self, step_name, result):
self.history.append((step_name, result))3. 错误处理
python
# 在提示程序中处理错误
try:
result = execute_prompt(input_data)
if not validate_result(result):
# 尝试替代方案
result = execute_fallback_prompt(input_data)
except Exception as e:
# 错误处理和恢复
result = handle_error(e, input_data)4. 性能优化
- 缓存 - 缓存重复的提示结果
- 并行化 - 并行执行独立步骤
- 批处理 - 批量处理多个请求
- 流式处理 - 流式返回结果
实际例子
例子 1: 文档分析系统
输入: 原始文档
↓
步骤1: 清洁和规范化
↓
步骤2: 提取关键信息
↓
步骤3: 进行情感分析
↓
步骤4: 生成摘要
↓
步骤5: 识别行动项
↓
输出: 结构化分析报告例子 2: 客服助手系统
客户输入
↓
意图识别
├─ 常见问题? → FAQ数据库查询 → 返回答案
├─ 账户问题? → 账户查询系统 → 返回账户信息
└─ 复杂问题? → 逐步问诊 → 生成解决方案
↓
满意度评估
├─ 满意 → 结束
└─ 不满意 → 升级到人工客服例子 3: 研究论文分析
论文输入
↓
并行分析
├─ Agent1: 提取核心贡献
├─ Agent2: 评估方法论
├─ Agent3: 识别局限性
└─ Agent4: 分析影响
↓
结果综合
↓
生成分析报告调试和优化
调试技巧
- 日志记录 - 记录每一步的输入和输出
- 断点 - 在关键步骤暂停执行
- 验证检查 - 在各步骤验证中间结果
- 单元测试 - 测试各个模块
优化方向
- 减少步骤数 - 简化程序流程
- 减少Token使用 - 优化提示内容
- 提高并行度 - 增加并行执行
- 改进缓存 - 更好地利用缓存
最佳实践
- 清晰的设计 - 明确定义程序流程
- 模块化 - 创建可重用的模块
- 错误处理 - 优雅处理失败
- 文档化 - 记录程序逻辑
- 测试 - 充分测试各个部分
- 监控 - 跟踪系统性能
- 迭代改进 - 基于使用情况改进
高级主题
- 动态提示生成 - 在运行时生成提示
- 学习反馈 - 从执行结果学习
- 自适应程序 - 根据上下文调整程序
- 分布式执行 - 在多个系统上执行
- 版本管理 - 管理提示程序的版本
工具和框架
- LangChain - 提示链框架
- LlamaIndex - 数据索引和检索
- Semantic Kernel - 提示编排
- Agents and Tools - Agent框架
下一步
- 学习
06_schema_design.md- 结构化架构设计 - 探索
07_recursive_patterns.md- 递归和自相似模式 - 研究
00_min_prompt.md- 基础提示设计
相关资源
- 提示工程最佳实践
- LLM应用架构
- 系统设计原理
- 软件工程设计模式