论文概述
基于意图的提示校准引入了一种新的自动提示工程方法,解决了需要高质量基准数据集的挑战,而这些数据集在许多现实用例中难以获取且成本高昂。该方法使用迭代校准过程,联合生成边界用例的合成数据并根据此生成的数据集优化提示。通过在优化过程中创建边界案例而非预先需要大量标注数据,系统可以优化提示以更好地与用户意图对齐。该方法在有限数量的标注样本下优于最先进的方法,展示了强大的实用价值。
论文信息:
- 发布时间:2024-02-05
- 作者:Elad Levi, Eli Brosh, Matan Friedmann
- 机构:IBM Research
- 研究方向:提示工程, 大型语言模型推理
- 核心技术:提示优化
研究背景
自动提示工程通常需要大量高质量的标注数据,这在实际应用中往往难以获取。本研究针对以下问题展开:
现有问题
- 自动提示优化需要大量高质量基准数据
- 标注数据获取成本高昂且耗时
- 现有方法难以处理数据稀缺的场景
研究动机
本研究旨在开发一种在有限标注数据下也能有效工作的提示优化方法,通过合成边界案例来指导优化过程,特别关注自动提示工程、校准过程、合成边界案例等关键技术。
核心方法
方法概述
校准过程通过以下方式运作:(1)边界案例生成:大型语言模型基于当前提示行为生成代表边界案例和挑战场景的合成示例;(2)提示优化:分析模型在边界案例上的性能,识别提示未能捕获用户意图的地方;(3)迭代校准:在生成新边界案例和优化提示之间交替,逐步改进对齐;(4)意图规范:使用元提示指导什么构成”正确”行为,无需大量标签;(5)验证:小型用户标注示例集验证整体质量,而不用于直接优化。
本方法的核心在于通过迭代生成合成边界案例和优化提示的联合过程,在有限标注数据下实现有效的提示优化。
关键创新点
创新 1:引入使用合成边界案例的基于校准的提示优化
创新 2:消除了优化过程中对大型高质量基准数据集的需求
创新 3:联合优化:同时生成合成边界案例并优化提示
创新 4:通过迭代边界探索实现与用户意图的对齐
创新 5:在有限标注样本(仅5-10个示例)下超越最先进方法
创新 6:在现实任务上展示有效性:审核和生成
创新 7:代码开源于 https://github.com/Eladlev/AutoPrompt
创新 8:模块化设计便于适应其他任务
技术特点
- 数据高效:仅需5-10个标注样本即可有效工作
- 合成驱动:通过合成边界案例指导优化
- 意图对齐:聚焦于与用户意图的对齐
- 迭代改进:通过多轮校准持续提升
- 实用性强:显著降低标注负担
实验结果
Benchmark 性能
在现实商业任务上进行评估:(1)内容审核:检测用户生成内容中的策略违规;(2)文本生成:生成满足特定风格/质量要求的输出。与以下方法比较:人工设计的提示、APE、OPRO和需要大型标注数据集的方法。结果显示基于意图的校准仅用5-10个标注示例就达到了完全监督性能的85-90%。关键发现:(1)合成边界案例有效捕获失败模式;(2)迭代优化逐步改进意图对齐;(3)对主观任务效果好,其中”正确性”是微妙的;(4)显著减少标注负担。消融研究证实边界生成和校准循环都是必不可少的。
性能分析
实验结果表明,该方法在显著减少标注需求的同时,达到了接近完全监督方法的性能,特别适合数据稀缺的场景。
关键发现
- 数据效率高:仅需少量标注即可达到良好效果
- 边界案例关键:合成边界案例有效指导优化
- 迭代有效:多轮校准持续改进对齐
- 适合主观任务:对正确性定义微妙的任务特别有效
实际应用
适用场景
- 内容审核:检测和过滤不当内容
- 文本生成:生成符合特定要求的内容
- 数据稀缺场景:标注数据有限的应用
- 主观任务:正确性标准不明确的任务
实现建议
在实际项目中应用提示优化时,建议:
- 准备少量种子数据:收集5-10个高质量的标注示例
- 定义意图规范:明确什么是期望的行为
- 迭代校准:通过多轮边界案例生成和优化
- 验证对齐:使用验证集检查意图对齐质量
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 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 217 218 219 220 221
| class IntentBasedCalibration: def __init__(self, base_model, initial_prompt, seed_examples): self.model = base_model self.current_prompt = initial_prompt self.seed_examples = seed_examples self.boundary_cases = []
def calibrate(self, num_iterations=10): """执行迭代校准过程""" for i in range(num_iterations): print(f"校准迭代 {i+1}/{num_iterations}")
new_boundary_cases = self.generate_boundary_cases() self.boundary_cases.extend(new_boundary_cases)
performance = self.evaluate_on_boundary_cases()
failure_patterns = self.identify_failure_patterns(performance)
self.current_prompt = self.refine_prompt(failure_patterns)
alignment_score = self.validate_alignment() print(f"对齐分数: {alignment_score}")
if alignment_score > 0.9: print("达到满意的对齐水平") break
return self.current_prompt
def generate_boundary_cases(self, num_cases=10): """生成合成边界案例""" boundary_generation_prompt = f''' 当前提示: {self.current_prompt}
已知的种子示例: {self.format_examples(self.seed_examples)}
请生成{num_cases}个边界案例,即可能导致提示失败或产生不符合意图的输出的示例。 这些边界案例应该: 1. 挑战提示的边界 2. 测试边缘情况 3. 揭示潜在的失败模式
边界案例: '''
response = self.model.generate(boundary_generation_prompt) boundary_cases = self.parse_boundary_cases(response)
return boundary_cases
def evaluate_on_boundary_cases(self): """在边界案例上评估当前提示""" results = []
for case in self.boundary_cases: output = self.model.generate( f"{self.current_prompt}\n\n输入: {case['input']}" )
alignment = self.check_intent_alignment( case['input'], output, case.get('expected_behavior') )
results.append({ 'case': case, 'output': output, 'aligned': alignment })
return results
def identify_failure_patterns(self, performance): """识别失败模式""" failures = [p for p in performance if not p['aligned']]
if not failures: return []
analysis_prompt = f''' 以下是当前提示在边界案例上的失败情况:
{self.format_failures(failures)}
请分析这些失败,识别共同的失败模式和根本原因: '''
analysis = self.model.generate(analysis_prompt) patterns = self.parse_failure_patterns(analysis)
return patterns
def refine_prompt(self, failure_patterns): """基于失败模式优化提示""" if not failure_patterns: return self.current_prompt
refinement_prompt = f''' 当前提示: {self.current_prompt}
识别的失败模式: {self.format_patterns(failure_patterns)}
种子示例(期望行为): {self.format_examples(self.seed_examples)}
请优化提示以解决这些失败模式,同时保持对种子示例的正确行为: '''
refined_prompt = self.model.generate(refinement_prompt)
return refined_prompt
def check_intent_alignment(self, input_text, output, expected_behavior): """检查输出是否与意图对齐""" check_prompt = f''' 输入: {input_text} 输出: {output} 期望行为: {expected_behavior}
输出是否符合期望行为?请回答"是"或"否",并简要说明原因。 '''
response = self.model.generate(check_prompt)
return "是" in response
def validate_alignment(self): """使用种子示例验证整体对齐""" correct = 0
for example in self.seed_examples: output = self.model.generate( f"{self.current_prompt}\n\n输入: {example['input']}" )
if self.check_intent_alignment( example['input'], output, example['expected_output'] ): correct += 1
return correct / len(self.seed_examples)
def format_examples(self, examples): """格式化示例""" formatted = [] for ex in examples: formatted.append( f"输入: {ex['input']}\n期望输出: {ex['expected_output']}" ) return "\n\n".join(formatted)
def format_failures(self, failures): """格式化失败案例""" formatted = [] for f in failures: formatted.append( f"输入: {f['case']['input']}\n" f"输出: {f['output']}\n" f"问题: 不符合意图" ) return "\n\n".join(formatted)
def format_patterns(self, patterns): """格式化失败模式""" return "\n".join([f"- {p}" for p in patterns])
def parse_boundary_cases(self, response): """解析边界案例""" cases = [] return cases
def parse_failure_patterns(self, analysis): """解析失败模式""" patterns = [] return patterns
seed_examples = [ { 'input': '这是一个测试内容', 'expected_output': '内容安全,无需审核', 'expected_behavior': '识别安全内容' }, { 'input': '包含不当言论的内容', 'expected_output': '内容违规,需要审核', 'expected_behavior': '识别违规内容' } ]
initial_prompt = "请判断以下内容是否违反社区规范:"
calibrator = IntentBasedCalibration( base_model=gpt4_model, initial_prompt=initial_prompt, seed_examples=seed_examples )
optimized_prompt = calibrator.calibrate(num_iterations=10) print(f"优化后的提示:\n{optimized_prompt}")
|
相关资源