dspy.MIPROv2
MIPROv2
(Multiprompt Instruction PRoposal Optimizer Version 2,多提示指令建议优化器版本2)是一种提示优化器,能够联合优化指令和少样本示例。它通过自举(bootstrapping)少样本示例候选项,提出基于任务不同动态的指令,并利用贝叶斯优化找到这些选项的最佳组合来实现这一点。它可以用于联合优化少样本示例和指令,也可以仅用于零样本优化的指令。
dspy.MIPROv2(metric: Callable, prompt_model: Optional[Any] = None, task_model: Optional[Any] = None, teacher_settings: Optional[dict] = None, max_bootstrapped_demos: int = 4, max_labeled_demos: int = 4, auto: Optional[Literal['light', 'medium', 'heavy']] = 'light', num_candidates: Optional[int] = None, num_threads: Optional[int] = None, max_errors: int = 10, seed: int = 9, init_temperature: float = 0.5, verbose: bool = False, track_stats: bool = True, log_dir: Optional[str] = None, metric_threshold: Optional[float] = None)
基类: Teleprompter
源代码位于 dspy/teleprompt/mipro_optimizer_v2.py
函数
compile(student: Any, *, trainset: List, teacher: Any = None, valset: Optional[List] = None, num_trials: Optional[int] = None, max_bootstrapped_demos: Optional[int] = None, max_labeled_demos: Optional[int] = None, seed: Optional[int] = None, minibatch: bool = True, minibatch_size: int = 35, minibatch_full_eval_steps: int = 5, program_aware_proposer: bool = True, data_aware_proposer: bool = True, view_data_batch_size: int = 10, tip_aware_proposer: bool = True, fewshot_aware_proposer: bool = True, requires_permission_to_run: bool = True, provide_traceback: Optional[bool] = None) -> Any
源代码位于 dspy/teleprompt/mipro_optimizer_v2.py
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
|
get_params() -> dict[str, Any]
示例用法
下面的程序展示了如何使用 MIPROv2 优化数学程序
import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric
# Import the optimizer
from dspy.teleprompt import MIPROv2
# Initialize the LM
lm = dspy.LM('openai/gpt-4o-mini', api_key='YOUR_OPENAI_API_KEY')
dspy.configure(lm=lm)
# Initialize optimizer
teleprompter = MIPROv2(
metric=gsm8k_metric,
auto="medium", # Can choose between light, medium, and heavy optimization runs
)
# Optimize program
print(f"Optimizing program with MIPROv2...")
optimized_program = teleprompter.compile(
dspy.ChainOfThought("question -> answer"),
trainset=gsm8k.train,
requires_permission_to_run=False,
)
# Save optimize program for future use
optimized_program.save(f"optimized.json")
MIPROv2
工作原理
从高层次上看,MIPROv2
通过为您的 LM 程序中的每个预测器创建少样本示例和新指令,然后使用贝叶斯优化搜索这些选项的最佳组合来工作。如果您想要一个可视化解释,请查看这个 Twitter 帖子。
以下是更详细的步骤分解
1) 自举少样本示例:从您的训练集中随机采样示例,并在您的 LM 程序中运行它们。如果程序对此示例的输出是正确的,则将其保留为有效的少样本示例候选项。否则,我们将尝试另一个示例,直到我们收集到指定数量的少样本示例候选项。此步骤创建 num_candidates
组,每组包含 max_bootstrapped_demos
个自举示例和 max_labeled_demos
个从训练集中采样的基本示例。
2) 提出指令候选项。指令提出器包括 (1) 训练数据集属性的生成摘要,(2) LM 程序代码和正在生成指令的特定预测器的生成摘要,(3) 先前自举的少样本示例,用于显示给定预测器的参考输入/输出,以及 (4) 随机采样的生成提示(例如,“要有创意”、“要简洁”等),以帮助探索潜在指令的特征空间。此上下文提供给 prompt_model
,由其编写高质量的指令候选项。
3) 找到少样本示例与指令的优化组合。最后,我们使用贝叶斯优化来选择指令和演示的哪些组合最适合我们程序中的每个预测器。这通过运行一系列 num_trials
次试验来实现,在每次试验中,都会在我们的验证集上评估一组新的提示。每次试验中(当 minibatch
=True
时),新提示集仅在大小为 minibatch_size
的小批量上进行评估。然后,每隔 minibatch_full_eval_steps
步,在完整的验证集上评估平均表现最好的提示集。在优化过程结束时,返回在完整验证集上表现最佳的提示集所对应的 LM 程序。
对于那些对更多细节感兴趣的人,可以在这篇论文中找到有关 MIPROv2
的更多信息,以及与 MIPROv2 相比其他 DSPy 优化器的研究。