View a markdown version of this page

高级主题和策略 - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

高级主题和策略

本页面上的主题

Multi-objective 优化

高级提示优化每次运行接受一个指标——每个样本只有一个标量分数。但是,它隐含地支持多目标(多维)优化:您可以将多个目标捆绑到一个标量(复合指标)中,该服务会针对该捆绑优化提示。本节介绍我们推荐的模式、每种模式何时合适,以及需要注意的故障模式。

这适用于所有垂直领域——任何你同时关心多件事的地方:准确性 + 语气、工具调用正确性 + 安全性、忠诚度 + 简洁、延迟友好度 + 完整性等等。

为什么一个指标实际上是多目标的

关于该系统的两个事实使它发挥了作用:

  • 该指标为每个样本返回一个浮点值。优化反馈回路将该标量读取为优化信号。你可以根据幕后任意数量的子分数来计算。

  • 两个指标后端都已经在内部汇总了子分数。

    • 默认 LLM-as-a-Judge 模板在三个维度(答案准确性、答案完整性、表达质量)上进行Overall评分,分配权重,并发出标准化为 [0,1] 的单一分数。自定义标准合并到同一个标量中。有关更多信息,请参阅 自定义 LLM-as-a-judge

    • Lambda/自定义代码指标返回一个数字,您可以控制其计算方式——包括任何子目标的组合。

因此,“每次运行一个指标” 是关于信号形状的合约,而不是对您可以优化的范围的限制。

将多个目标捆绑到单个指标中的模式

根据您的目标彼此之间的关系选择一个。

模式 1 — 加权总和(最常见)

final = w₁·s₁ + w₂·s₂ + ... + wₖ·sₖ,权重之和为 1。

何时使用:目标大致独立,你可以对它们进行排名。 Trade-offs 是可以接受的——只要金额增加,以牺牲另一个为代价来改进一个是可以的。

选择权重:

  • 按对用户的重要性进行权重,而不是按数据集中的频率进行权重。

  • 粗略地开始:0.5 / 0.3 / 0.2没问题。不要过度调整权重——这是一个单独的优化问题。

示例(代理/工具使用):

final = 0.5 * tool_correctness + 0.3 * answer_correctness + 0.2 * format_compliance

模式 2 — Hard-fail 大门(安全关键)

定义一个或多个门控目标。如果任何大门失效,则无论其余大门如何,分数均为 0(或某个楼层)。否则,分数是剩余目标的加权总和。

if not safety_check_passed: return 0.0 if wrong_tool_called_for_destructive_action: return 0.0 return 0.6 * accuracy + 0.4 * tone

何时使用:至少有一个目标是不可商量的(个人身份信息泄露、修改了错误的账户、拒绝违禁内容)。在 “平均水平良好” 的提示不可接受时,即使偶尔也无法达到安全栏,则使用此选项。

为什么这胜过刚刚加权:仅凭权重,优化器就可以在安全与质量之间进行权衡,同时还能爬坡得分。大门使施工无法进行权衡。

模式 3 — 约束 + 奖励 (Pareto-style)

选择最重要的目标作为奖励。其余部分表示为约束条件,当违反这些限制时,从奖励中减去(而不是将其归零)。

reward = task_accuracy penalty = 0.0 if response_too_long: penalty += 0.1 if missed_required_disclosure: penalty += 0.2 return max(0.0, reward - penalty)

何时使用:你想让一个主要目标发挥领导作用,但软次要目标仍应影响提示音。不如硬门脆弱,不如加权总和那么模棱两可。

图案 4 — Lambda 外 LLM-as-a-Judge 部、内部(推荐用于模糊 + 结构混合)

Lambda 指标计算确定性子分数(正则表达式、JSON 解析、架构验证),并对 Lambda 函数内部的模糊部分(语气、忠实度、乐于助人)调用 LLM-as-a-Judge 子评估。然后它将它们聚合成一个标量。

def compute_score(prompt, prediction, gold, ...): structural = grade_format_and_tools(prediction) # 0..1 from regex semantic = call_llm_judge(prediction, gold, criteria) # 0..1 from LLMJ if structural < 1.0 and is_safety_critical(prompt): return 0.0 return 0.6 * semantic + 0.4 * structural

何时使用:你的目标是 “易于在代码中测试”(格式、工具名称、长度、引文的存在)和 “需要模型来判断”(语气、忠诚度、乐于助人)相结合。这通常比要求一个 LLM-as-a-Judge 提示生成单个综合分数更简洁,因为确定性部分不会在运行中出现偏差。

模式 5 — Multi-dimension LLM-as-a-Judge (没有 Lambda)

使用内置 LLM-as-a-Judge 流程,也可以使用定义customLLMJConfig.customLLMJPrompt您自己的尺寸和权重的。法官发出每维分数和Overall;系统解析为 [0, 1] 标量Overall(如果缺失Overall则求平均维度)。

何时使用:你所有的目标都是语义/模糊的,你没有确定性的子检查。作者速度最快。注意判断方差 — 重新运行同一个数据集两次,在将其视为优化信号之前,先检查分数稳定性。

选择图案

# 你有... 使用
1 2—4 个模糊目标,全部是语义的 图案 5(多维 LLM-as-a-Judge)
2 2—4 个目标将结构和语义融为一体 图案 4(Lambda 外 LLM-as-a-Judge 部 + 内部)
3 至少有一个不可谈判 safety/correctness 的标准 模式 2(硬失效门)— 与 1 或 4 结合使用
4 一个明确的主要目标 + 软偏好 模式 3(约束 + 奖励)
5 几个大致相等的独立目标 模式 1(加权总和)

你可以组合图案。典型的生产指标是 “加权总和+安全方面的硬性失效门槛”。

需要注意的故障模式

  • 奖励表面形式的黑客攻击。如果你的分数是 “响应中是否包含'确定'一词”,则优化器将编写提示,强制 “确定” 到每个输出中。优先考虑以结果为基础的子分数(工具名称、槽值、结构有效性),而不是关键词的存在。

  • 判断漂移。一种多维 LLM-as-a-Judge 度量标准,其权重因呼叫而异(因为要求法官选择它们)会给出噪声的优化信号。将权重固定在您的自定义标准中,或将维度权重移到 Lambda 代码中。

  • 综合分数饱和。如果该指标快速达到 0.95 并保持在这一水平,则您的子分数过于宽松。收紧评分标准;考虑提高最大门槛(例如,部分积分变成 0 而不是 1),这样优化器才有余量。

  • Sub-objectives 直接冲突。“简洁” 与 “完整性” 是一种真正的权衡取舍。加权和模式在该边界上选择一个操作点;如果你不喜欢,可以改变权重。

Pre-launch 清单

  • 根据完整数据集的初始提示计算指标,并检查每个维度的平均值,而不仅仅是标量。如果一个维度已经饱和,可以考虑将其从包中删除。

  • Spot-check 手工采集 5 个样品。该指标的判断是否与你的判断相符? 如果不是,请在优化提示之前修复指标。

优化多回合和分阶段提示

高级提示优化针对每个样本的评估对单个提示模板进行了优化。它本身不是回合感知——它无法在对话框中进行迭代或在特定回合处优化行为。分阶段提示是一种提示模板,其中多回合对话或工作流程在各个回合中重复使用相同的提示,提示本身包含工作流程的每个阶段、步骤或阶段的说明。要优化这些提示,请将对话框状态扁平化为模板的输入变量,将要细化的系统指令烘焙成细化后的系统指令promptTemplate,然后使用每个样本的参考响应探讨您真正关心的转变。

这种模式与垂直无关。它适用于在不断增长的环境中反复调用模型的任何地方,包括客户服务流程、代理工具使用循环、多步骤推理、辅导、代码助手轮换、以文档为基础的质量保证、分类工作流程等。

高级提示优化实际上优化了什么

  • 输入:带有{{placeholder}}变量的promptTemplate字符串。

  • 每个样本:每个样本都evaluationSamples[i]提供这些变量的值和 areferenceResponse. 优化器对每个样本独立运行推断、评估、反馈和重写,然后汇总各个样本的指标。

  • 输出:精制promptTemplate。变量、数据集和指标是固定输入;只有模板会更改。

任何你想要优化的东西都必须promptTemplate存在于自身内部。每个样本(对话历史记录、当前用户查询、检索到的上下文)会有所不同{{variables}}。你想要完善的系统指令是模板的一部分,从来都不是输入变量,或者服务没有什么可重写的。

如果您希望服务改善第 N 回合的行为,请将回合 N 表示为一个样本的渲染提示加输入变量,并以此作为所需的回合 referenceResponse N 模型输出。

模式 A — Stage-at-a-time (推荐初学者)

一次优化对话的一个阶段。每个评估样本代表该阶段内的单一决策点。

这里的 “阶段” 就是你可以用一套连贯的成功标准来描述什么。垂直示例:

  • 代理/工具使用:计划制定回合、工具选择回合、工具结果解释回合、最终答案回合。

  • 客户支持:录入、验证、行动、确认、结算。

  • 辅导/教育:评估知识、解释概念、检查理解程度、总结。

  • 文件质量保证:以检索为依据的答案、后续澄清、引文交换。

  • 编程助手:规范澄清、代码生成、代码编写、测试编写。review/fix

何时使用模式 A

  • 您可以使用不同的成功标准命名不同的阶段。

  • 其中一个阶段是降低质量,你想在不打扰他人的情况下修复这个问题。

  • 你需要快速迭代和紧凑、可调试的反馈信号。

模板形状

特定阶段的系统指令已嵌入到模板中(这是服务重写的内容)。只有对话历史记录和当前回合是变量。以下结构仅供参考,未作规定。使用模型最能处理的任何分隔符或布局。唯一的要求是:(a)要优化的系统指令在模板内实时生效,以及(b)每个样本的变量引用为{{variablename}}

You are an assistant in the {STAGE_NAME} phase of a multi-turn task. - ...the policy / goals / format / tool-use rules for this phase... - ...constraints the model must satisfy at this point in the conversation... Conversation so far: {{conversation_so_far}} User's current message: {{user_query}}

样本形状

{ "inputVariables": [ {"conversation_so_far": "user: ...\nassistant: ...\n... (turns 1..N-1)"}, {"user_query": "...the user input that triggers this stage..."} ], "referenceResponse": "...the assistant output that satisfies the stage's success criteria..." }

优缺点

优点:反馈信号强,提示更小,优化运行速度更快,更容易编写有针对性的指标。

缺点:无法发现跨阶段偏差;你将在每个阶段运行一次服务,可能需要进行最后的集成测试。

模式 B — 完全扁平化对话(高级)

优化一个拥有整个多阶段策略的大型单体提示音。每个样本都是完整的对话直至探针转弯。

何时使用模式 B

  • 你的制作提示已经是单一的,你不想拆分它。

  • 您希望优化器查看较早的回合是如何设置后面的回合的,这样它的重写就可以保留跨阶段的流量。

  • 探测回合的正确性取决于各个阶段积累的背景信息(例如,“到第 N 回合,必须已经引用了正确的事实” 或 “必须已经调用了正确的工具”)。

模板形状

完整的单片多相系统提示符实际上位于模板内部。该服务在优化期间重写此正文。历史和当前的回合仍然是可变的。选择您的模型可以很好地处理的任何布局;要求仅是要优化的指令是模板的一部分,并通过{{name}}引用每个样本的数据。

You are an assistant for {TASK}. The conversation may proceed through phases: 1. {PHASE_1} — ... 2. {PHASE_2} — ... 3. {PHASE_3} — ... (...the entire multi-phase policy, tool-use rules, tone, formatting, refusal rules...) Conversation so far (turns 1..N-1, with role tags): {{conversation_so_far}} User's current message: {{user_query}}

样品形状(探头在任意转弯 N 处)

{ "inputVariables": [ {"conversation_so_far": "user: ...\nassistant: ...\n[tool_call: X(...)]\n... (turns 1..N-1)"}, {"user_query": "...the user input at turn N..."} ], "referenceResponse": "...desired assistant output at turn N..." }

为什么模式 B 能比模式 A 更好用

  • 优化器可以看到阶段的进展conversation_so_far,因此优化反馈可以同时推理各个阶段。

  • 部署单个优化的提示音时无需将多个优化的阶段提示拼接在一起,从而减少了后期处理。

模式 B 的注意事项

  • 前几回合的随机性。制作助理的轮次可能并不总是与预设的轮次conversation_so_far完全匹配。将预设历史记录视为预期的轨迹;在生产中,早期回合中的偏移会使优化失效。使用具有代表性的真实对话截图,而不是综合的幸福之路。

  • 代币成本。历史悠久,每次试验的推理成本都飙升。该服务运行了许多候选对象 × 样本 × 迭代。相应地进行预算,如果成本是瓶颈,可以考虑截断到最近的 K 个回合再加上摘要。

  • 参考响应偏差。referenceResponse鉴于那段历史,应该是正确的助手会说的话。如果您的参考响应过于狭窄(只有一个可接受的措辞),则优化器将过度拟合。尽可能使用能够对结果(工具名称、槽值、决策)进行评分的指标,而不是表面形态匹配的指标。

Tool-call 在特定时刻进行验证

该服务会看到助手的文本输出。要对 “模型是否在第 N 回合使用正确的参数调用工具 X” 进行评分,请选择一个:

  • 输出中的约定:让助手发出结构化代币,<tool>X(arg=...)</tool>并在 Lambda 指标中 regex/JSON 使用解析进行评分。最便宜,最可靠。

  • LLM-as-a-Judge 自定义标准:提供 acustomLLMJPrompt,询问法官:“回复 (a) 命名工具X,(b) 包含论点arg,(c) 是否符合要求的措辞Y?” 每个子检查都是 +1;汇总。易于创作,差异更大。

  • 带下游仿真的 Lambda 指标:如果您有工具执行工具,请通过它运行模型输出,并根据观察到的副作用进行评分。保真度最高,设置最多。

有关多轮或多次检查(工具正确性以及色调和完整性)的复合标准,请参阅本节。Multi-objective 优化

  • 从舞台上对质量影响最大的模式A开始。获取有效指标、20—50 个样本数据集和一次端到端运行的优化。在您投资更大规模的 Pattern B 运行之前,这会验证您的数据集和指标。

  • 然后使用完整的单体提示和多目标复合指标运行一次模式 B,以捕捉模式 A 可能错过的跨阶段回归。

  • 在迭代提示符之前迭代数据集。如果该服务重写了你的指标,但生产行为没有改善,那么指标或数据集通常是问题所在。

何时不对多回合使用高级提示优化

  • 对话框策略/状态机错误(错误的阶段过渡逻辑):平面提示重写无法修复此问题。首先修复编排层。

  • 工具架构错误:该服务不会更改工具定义。它只能更改要求模型使用它们的提示。

  • 在预设历史和实时历史记录之间漂移:如果真实对话在几回合后与您的评估样本存在很大差异,则模式 B 的优化信号很弱。除了理想状态外,捕获真正可接受的生产轨迹以进行优化运行还有帮助。

  • 所需的行为取决于优化器从未看到的私有状态(例如,模型只能通过工具调用学习的用户帐户数据):在探测样本中conversation_so_far明确显示该状态,或者接受服务只能调整表面行为。

入门清单

  • 选择你关心的探测转弯。每个样本都变成一个或多个样本。

  • 决定模式 A 或 B(或两者兼而有之 — 先是 A,然后是 B)。

  • 构建 20 多个具有真实conversation_so_far和简洁referenceResponse价值的代表性样本。