Bedrock Prompt Optimization 进阶版:5 个模型同时对比,一条 Prompt 自动调到能打

我之前调 Prompt 的方式特别原始——改一版跑一下看效果,觉得不行再改,来来回回折腾十几版。每次换模型还得重新调,因为 Claude 喜欢的写法 Llama 不一定买账。

这个事情耗时间就算了,关键是没有量化标准。"感觉好像好了一点"——这种判断靠直觉,不靠谱。

亚马逊云科技 5 月发布了 Amazon Bedrock Advanced Prompt Optimization,直接解决了这两个痛点:自动优化 + 多模型同时对比。说白了就是把我手动调 Prompt 的活自动化了,而且一次跑 5 个模型的结果让你横向比较。

这东西能干嘛

核心能力三个:

  1. 自动优化 Prompt — 输入你的原始 Prompt + 期望输出样本,系统自动迭代生成更优版本
  2. 多模型对比 — 同时在最多 5 个模型上跑优化后的 Prompt,看哪个模型效果最好
  3. 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 控制台操作:

  1. 打开 Amazon Bedrock Console
  2. 左侧导航 → Prompt managementPrompt optimizer
  3. 输入你的原始 Prompt
  4. 提供 2-5 个输入输出样本(评估用)
  5. 选择目标模型(最多 5 个)
  6. 点击 Optimize

系统会自动迭代几个版本,每个版本都会用你提供的样本做评估打分。

通过 API 使用

import boto3
import json

bedrock = 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.0
    
    return {'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 费),这个价格不贵。

限制和注意事项

  1. 样本数量:至少 2 个样本,建议 5-10 个覆盖不同场景
  2. 支持区域:目前 us-east-1、us-west-2、eu-central-1
  3. 模型选择:只能选 Bedrock 上可用的模型,不支持自定义模型
  4. 优化时间:简单 Prompt 几分钟,复杂的(多步推理)可能需要 10-15 分钟
  5. 不是银弹:如果你的 Prompt 逻辑本身有问题(比如指令矛盾),优化也救不了

我的判断

Prompt Engineering 一直是个玄学活——同样的意思换个表达方式,效果天差地别。这个工具把"调参"变成了有评估标准的自动化流程,方向是对的。

特别是多模型对比这个功能。之前选模型基本靠"跑一遍 benchmark 看看",现在可以针对你自己的场景做对比,结果更有参考价值。

对于已经有成熟 Prompt 但想换模型的团队,迁移功能能省不少事。毕竟手动把一个调了几周的 Prompt 适配到新模型,谁都不乐意干。


相关链接:

posted @ 2026-05-25 19:36  亚马逊云开发者  阅读(9)  评论(0)    收藏  举报