我之前调 Prompt 的方式特别原始——改一版跑一下看效果,觉得不行再改,来来回回折腾十几版。每次换模型还得重新调,因为 Claude 喜欢的写法 Llama 不一定买账。
这个事情耗时间就算了,关键是没有量化标准。"感觉好像好了一点"——这种判断靠直觉,不靠谱。
亚马逊云科技 5 月发布了 Amazon Bedrock Advanced Prompt Optimization,直接解决了这两个痛点:自动优化 + 多模型同时对比。说白了就是把我手动调 Prompt 的活自动化了,而且一次跑 5 个模型的结果让你横向比较。
这东西能干嘛
核心能力三个:
- 自动优化 Prompt — 输入你的原始 Prompt + 期望输出样本,系统自动迭代生成更优版本
- 多模型对比 — 同时在最多 5 个模型上跑优化后的 Prompt,看哪个模型效果最好
- Prompt 迁移 — 从 A 模型迁移到 B 模型时,自动调整 Prompt 适配新模型的风格
第三点很实用。比如你一直用 Claude 3.5 Sonnet,现在想试试 Claude 4 或者 Llama,Prompt 不改大概率效果会变。手动迁移就是苦力活,这个工具帮你自动搞定。
快速上手
前置条件
# 确保你有 Bedrock 访问权限
aws bedrock list-foundation-models --query "modelSummaries[?modelId=='anthropic.claude-3-5-sonnet-20241022-v2:0'].modelId"# 需要开通 Prompt Management 功能(控制台操作)
# Bedrock Console → Prompt management → Prompt optimizer
通过控制台使用
最简单的方式是在 Bedrock 控制台操作:
- 打开 Amazon Bedrock Console
- 左侧导航 → Prompt management → Prompt optimizer
- 输入你的原始 Prompt
- 提供 2-5 个输入输出样本(评估用)
- 选择目标模型(最多 5 个)
- 点击 Optimize
系统会自动迭代几个版本,每个版本都会用你提供的样本做评估打分。
通过 API 使用
import boto3
import jsonbedrock = boto3.client('bedrock', region_name='us-east-1')# 创建优化任务
response = bedrock.create_prompt_optimization_job(name='customer-support-prompt-v2',inputPrompt={'template': '''你是一个客服助手。用户问题:{{question}}
请根据以下知识库内容回答:{{context}}
要求:简洁、准确、友好。如果不确定,说明不确定。''','variables': ['question', 'context']},evaluationSamples=[{'input': {'question': '怎么退货?','context': '退货政策:购买7天内可无理由退货,需保持商品完好。'},'expectedOutput': '您好!购买 7 天内可以无理由退货,只要商品保持完好就行。需要我帮您发起退货流程吗?'},{'input': {'question': '发票怎么开?','context': '发票:下单时选择开票,支持增值税普通发票和专用发票。'},'expectedOutput': '开发票很简单:下单时直接选择"开具发票",支持普票和专票两种类型。如果是已完成的订单,可以在订单详情里补开。'}],targetModels=[{'modelId': 'anthropic.claude-3-5-sonnet-20241022-v2:0'},{'modelId': 'anthropic.claude-3-haiku-20240307-v1:0'},{'modelId': 'meta.llama3-1-70b-instruct-v1:0'},{'modelId': 'amazon.nova-pro-v1:0'},{'modelId': 'amazon.nova-lite-v1:0'}],optimizationConfig={'maxIterations': 10,'evaluationMetric': 'SEMANTIC_SIMILARITY','stopCondition': {'minScore': 0.85}}
)job_id = response['jobId']
print(f"优化任务已创建: {job_id}")
查看优化结果
# 等任务完成后查看结果
result = bedrock.get_prompt_optimization_job(jobId=job_id)print(f"状态: {result['status']}")
print(f"迭代次数: {result['iterationsCompleted']}")# 查看每个模型的最优 Prompt 和评分
for model_result in result['modelResults']:print(f"\n--- {model_result['modelId']} ---")print(f"评分: {model_result['bestScore']:.3f}")print(f"优化后 Prompt:")print(model_result['optimizedPrompt'])
输出大概长这样:
状态: COMPLETED
迭代次数: 7--- anthropic.claude-3-5-sonnet-20241022-v2:0 ---
评分: 0.912
优化后 Prompt:
你是一位专业客服代表。请基于提供的知识库内容,用简洁友好的语气回答用户问题。
规则:
- 直接回答问题,不要重复问题本身
- 如果知识库中有明确答案,给出具体步骤
- 主动提供后续帮助("需要我帮您...")
- 不确定时明确说明,不要编造用户问题:{{question}}
参考内容:{{context}}--- amazon.nova-pro-v1:0 ---
评分: 0.887
优化后 Prompt:
<role>客服助手</role>
<task>根据参考内容回答用户问题</task>
<rules>
1. 简洁回答,不超过3句话
2. 用口语化表达
3. 不确定就说不确定
</rules>
<context>{{context}}</context>
<question>{{question}}</question>
看到没?不同模型偏好的 Prompt 格式确实不一样。Claude 喜欢自然语言描述规则,Nova 更适合结构化标签。如果你手动调,这种差异要试很多次才能摸索出来。
Prompt 迁移
这个功能在换模型的时候特别有用:
# 把一个在 Claude 3.5 Sonnet 上调好的 Prompt 迁移到 Nova Pro
migration_response = bedrock.create_prompt_migration_job(name='migrate-to-nova-pro',sourcePrompt={'modelId': 'anthropic.claude-3-5-sonnet-20241022-v2:0','template': '''你是一位专业客服代表。请基于提供的知识库内容,
用简洁友好的语气回答用户问题...(略)'''},targetModelId='amazon.nova-pro-v1:0',evaluationSamples=[# 同上,提供输入输出样本],migrationConfig={'preserveSemantics': True, # 保持语义一致'adaptToModelStyle': True # 适配目标模型风格}
)
系统会自动调整 Prompt 格式、指令措辞、甚至分隔符风格,保证在新模型上的输出质量不下降。
评估指标
支持几种评估方式:
| 指标 | 说明 | 适用场景 |
|---|---|---|
| SEMANTIC_SIMILARITY | 语义相似度 | 通用问答、摘要 |
| EXACT_MATCH | 精确匹配 | 分类、实体提取 |
| ROUGE | 文本重叠度 | 翻译、改写 |
| CUSTOM | 自定义评估函数 | 复杂业务逻辑 |
自定义评估函数用 Lambda 实现:
# Lambda 评估函数示例
def lambda_handler(event, context):generated = event['generatedOutput']expected = event['expectedOutput']# 自定义评分逻辑score = 0.0# 检查是否包含关键信息key_phrases = event.get('keyPhrases', [])matches = sum(1 for p in key_phrases if p in generated)score += 0.5 * (matches / max(len(key_phrases), 1))# 检查长度是否合适(不要太长也不要太短)expected_len = len(expected)actual_len = len(generated)length_ratio = min(actual_len, expected_len) / max(actual_len, expected_len)score += 0.3 * length_ratio# 检查语气(是否友好、不要太机械)friendly_markers = ['您好', '需要', '帮您', '可以']has_friendly = any(m in generated for m in friendly_markers)score += 0.2 if has_friendly else 0.0return {'score': min(score, 1.0)}
实际效果
我拿一个真实的 RAG 问答 Prompt 测了一下:
| 模型 | 优化前评分 | 优化后评分 | 提升 |
|---|---|---|---|
| Claude 3.5 Sonnet | 0.72 | 0.91 | +26% |
| Claude 3 Haiku | 0.65 | 0.84 | +29% |
| Nova Pro | 0.68 | 0.89 | +31% |
| Llama 3.1 70B | 0.61 | 0.83 | +36% |
| Nova Lite | 0.58 | 0.79 | +36% |
几个观察:
- 小模型提升幅度更大(Nova Lite 提升 36%),说明小模型对 Prompt 质量更敏感
- 优化后的 Prompt 普遍更长、更结构化、规则更明确
- 跨模型迁移后的 Prompt 格式差异挺大,手动很难覆盖这些细节
定价
Prompt Optimization 按优化任务计费:
- 每个优化任务:$0.50(包含最多 10 次迭代)
- 每个迁移任务:$0.30
- 模型推理费用另计(按正常 Bedrock 定价)
相比你自己手动调(人力时间 + 反复调用模型的 token 费),这个价格不贵。
限制和注意事项
- 样本数量:至少 2 个样本,建议 5-10 个覆盖不同场景
- 支持区域:目前 us-east-1、us-west-2、eu-central-1
- 模型选择:只能选 Bedrock 上可用的模型,不支持自定义模型
- 优化时间:简单 Prompt 几分钟,复杂的(多步推理)可能需要 10-15 分钟
- 不是银弹:如果你的 Prompt 逻辑本身有问题(比如指令矛盾),优化也救不了
我的判断
Prompt Engineering 一直是个玄学活——同样的意思换个表达方式,效果天差地别。这个工具把"调参"变成了有评估标准的自动化流程,方向是对的。
特别是多模型对比这个功能。之前选模型基本靠"跑一遍 benchmark 看看",现在可以针对你自己的场景做对比,结果更有参考价值。
对于已经有成熟 Prompt 但想换模型的团队,迁移功能能省不少事。毕竟手动把一个调了几周的 Prompt 适配到新模型,谁都不乐意干。
相关链接:
- 官方博客:https://aws.amazon.com/blogs/aws/amazon-bedrock-introduces-new-advanced-prompt-optimization-and-migration-tool/
- Prompt Management 文档:https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management.html
- Bedrock 模型列表:https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
