使用 Vertex AI Prompt Optimizer 增强提示

九月 26, 2024
Ivan Nardini DevRel Engineer Cloud AI
George Lee Product Manager Cloud AI Research

在诸多用于从大型语言模型 (LLM) 中获得有意义输出的便捷方法中,提示设计和工程脱颖而出。但是,为大语言模型输入提示就像在复杂的迷宫中导航一样。

设计提示是一门相对较新的学科,有几种技术需要探索。如需了解相关内容,请查看提示工程指南。此外,要从 LLM 中获得最佳结果,您必须尝试各种指令和示例的组合才能获得所需输出。而且,即使您找到了理想的提示模板,也不能保证提示可以继续为其他 LLM 完成任务。因此,您最终需要花更多时间来将提示模板从一个模型迁移或运用到另一个模型。

为了缓解您在构建基于 LLM 的应用时可能遇到的“提示疲劳”,我们宣布推出 Vertex AI Prompt Optimizer 的公开预览版。在本博客中,您将了解如何通过 Vertex AI SDK for Python 开始使用 Vertex AI Prompt Optimizer。在本文结束时,您将更好地了解 Vertex AI Prompt Optimizer,以及它如何帮助您节省在提示工程上耗费的时间与精力,同时确保为 GenAI 应用准备好表现出色的提示。


Vertex AI Prompt Optimizer:从研究到投入使用

Vertex AI Prompt Optimizer 是一项提示优化服务,可帮助用户在 Vertex AI 上为任何首选模型找到最佳提示(指令和演示),其中指令包括提示模板的系统指令上下文任务演示指您在提示中提供的几个示例,以从模型响应中引出特定的风格或基调。Vertex AI Prompt Optimizer 基于 Google 研究关于自动提示优化 (APO) 方法的论文(已被 NeurIPS 2024 收录)。

假设您要解决如下所示的这个数学问题。您需要清晰的指令和示例来帮助解决这个问题。这些指令告诉我们解决问题的规则(例如,如何处理负数),示例则演示了如何应用这些规则。这就是 Vertex AI Prompt Optimizer 背后的原理。

为了找到最佳指令和示例,Vertex AI Prompt Optimizer 采用了基于 LLM 的迭代优化算法,其中优化器模型和评估器模型协同工作,生成并评估候选提示,然后根据用户想要参考的优化评估指标选择最佳指令和演示。Vertex AI Prompt Optimizer 的工作原理图如下所示。

只需使用几个标记示例(输入和真实输出对)和优化设置,Vertex AI Prompt Optimizer 便可为目标模型找到最佳提示(指令和演示),从而大大节省用户的时间和精力。最终,该产品简化了提示设计和提示工程的流程,并提高了基于 LLM 的应用的整体质量。用户现在可以轻松为特定任务制作新提示,或在 Vertex AI 上将提示从一个模型运用到另一个模型。

现在您已经更好地了解了 Vertex AI Prompt Optimizer 的工作原理,让我们来看看如何增强提示,以便在 Vertex AI 上用于 Google 模型。


开始使用 Vertex AI Prompt Optimizer

假设您要构建一个操作简单、可为如何烹饪更健康的菜肴提供建议的 AI 烹饪助手。例如,您会问“如何制作美味且令人满意的健康甜点,同时最大限度地减少添加的糖和不健康的脂肪?”。AI 烹饪助手回答道:“这里有一些关于如何在食谱中达到这种平衡的提示,可最大限度地减少添加的糖和不健康的脂肪:…”。下面是生成的答案示例。

Example of user question, context, prompt, answer

在 AI 烹饪助手的初始版本中,我们使用的是采用以下简单提示模板的 LLM:

根据有上下文的问题,给出问题的正确答案。\n问题:{{question}}\n上下文:{{context}}\n答案:{{target}}

根据您收集的问答评估数据集和使用 Vertex AI GenAI Evaluation 计算得出的问答评估指标,AI 烹饪助手的初始版本可以生成高质量且与上下文相关的答案。以下是评估指标报告的摘要。

Graph of evaluation metrics, showing question_answering_quality/mean is 4 times as high in mean value as groundedness/mean

结果不错。但就相关问题而言,生成的答案质量仍有改进的空间。假设您想为助手使用 Gemini 1.5 Flash(更高效的 LLM),但您以前没有使用 Gemini 模型系列的经验,因而无法找到表现更好的提示模板来使用 Gemini 1.5 Flash 完成任务。此时,Vertex AI Prompt Optimizer 便可派上用场了。

要使用 Vertex AI Prompt Optimizer 增强提示模板,请执行以下步骤:

  1. 准备好提示模板
  2. 将标记示例上传到 Cloud Storage 存储桶
  3. 配置优化设置
  4. 运行优化作业
  5. 获取经过优化的提示并评估优化效果


1. 准备好提示模板

首先,准备好要优化的提示模板。Vertex AI Prompt Optimizer 希望提示包含指令模板(提示模板的固定部分,在给定任务的所有查询中共享),以及上下文和任务模板(提示模板的动态部分,随任务发生变化)。下面是您准备在问答任务中将其与 Vertex AI Prompt Optimizer 一起使用的原始模板。

INSTRUCTION_TEMPLATE = """
根据有上下文的问题,给出问题的正确答案
"""
 
CONTEXT_TASK_TEMPLATE = """
问题:{{question}}
答案:{{target}}
"""

2. 将标记示例上传到 Cloud Storage 存储桶

接下来,Vertex AI Prompt Optimizer 需要使用 CSV 或 JSONL 文件,其中包含将在优化过程中使用的标记样本(输入、真实输出对)。在此用例中,建议标记与目标模型存在冲突的来源模型中的示例,这将有助于确定需要改进的领域。您可以在下面找到您上传到 Google Cloud 存储桶的标记示例。

{"target":"Here\'s how to tackle those delicious red meats and pork while keeping things healthy:\\n\\n**Prioritize Low and Slow:**\\n\\n* **Braising and Stewing:** These techniques involve gently simmering meat in liquid over low heat for an extended period. This breaks down tough collagen, resulting in incredibly tender and flavorful meat. Plus, since the cooking temperature is lower, it minimizes the formation of potentially harmful compounds associated with high-heat cooking. \\n\\n* **Sous Vide:** This method involves sealing meat in a vacuum bag and immersing it in a precisely temperature-controlled water bath...","question":"What are some techniques for cooking red meat and pork that maximize flavor and tenderness while minimizing the formation of unhealthy compounds? \\n\\nnContext:\\nRed meat and pork should be cooked to an internal temperature of 145\\u00b0F (63\\u00b0C) to ensure safety. \\nMarinating meat in acidic ingredients like lemon juice or vinegar can help tenderize it by breaking down tough muscle fibers. \\nHigh-heat cooking methods like grilling and pan-searing can create delicious browning and caramelization, but it\'s important to avoid charring, which can produce harmful compounds. \\n"}

3. 配置优化设置

要运行提示优化作业,您还需要为 Vertex AI Prompt Optimizer 配置优化设置,并将 Vertex AI Prompt Optimizer 作业作为 Vertex AI Training 自定义作业运行。它支持 Vertex LLM API 支持的任何 Google 模型,以及各种评估指标,包括基于计算、基于 LLM 甚至是用户定义的评估指标。这是因为 Vertex AI Prompt Optimizer 已与 Vertex Rapid Evaluation Service 集成。为了传递这些配置,Vertex AI Prompt Optimizer 需要接受 JSON 配置文件的参数列表或 Google Cloud 存储桶文件路径。以下是 Vertex AI Prompt Optimizer 中的一些基本配置示例。

params = {
    'num_steps': OPTIMIZATION_STEPS,
    'system_instruction': SYSTEM_INSTRUCTION,
    'prompt_template': PROMPT_TEMPLATE,
    'target_model': TARGET_MODEL,
    'eval_metrics_types': EVALUATION_METRICS,
    'optimization_mode': OPTIMIZATION_MODE,
    'num_template_eval_per_step': OPTIMIZATION_PROMPT_PER_STEPS,
    'num_demo_set_candidates': DEMO_OPTIMIZATION_STEPS,
    'demo_set_size': DEMO_OPTIMIZATION_PROMPT_PER_STEPS,
    'input_data_path': INPUT_DATA_FILE_URI,
    'output_data_path': OUTPUT_DATA_FILE_URI,
 
}

Vertex AI Prompt Optimizer 允许您通过仅优化指令、仅优化演示或同时优化两者 (optimization_mode) 来优化提示,并且允许您在设置系统指令、将要优化的提示模板(system_instructionprompt_template)以及要优化的模型 (target_model) 之后,通过设置评估指标、用于改进提示的迭代次数等来调节优化过程。查看文档,详细了解支持的优化参数。

获取示例和配置后,请将其上传到 Google Cloud 存储桶,如下所示。

from etils import epath
 
# 上传配置
with epath.Path(CONFIG_FILE_URI).open('w') as config_file:
      json.dump(args, config_file)
config_file.close()
 
# upload prompt opt dataset
prepared_prompt_df.to_json(INPUT_DATA_FILE_URI, orient="records", lines=True)

4. 运行优化作业

此时,一切都已准备就绪,请使用 Vertex AI SDK for Python 运行您的首次 Vertex AI Prompt Optimizer 作业。

WORKER_POOL_SPECS = [{
    'machine_spec': {
        'machine_type': 'n1-standard-4',
    },
    'replica_count': 1,
    'container_spec': {
        'image_uri' : APD_CONTAINER_URI,
        'args': ["--config=" + CONFIG_FILE_URI]
}}]
 
custom_job = aiplatform.CustomJob(
      display_name=PROMPT_OPTIMIZATION_JOB,
      worker_pool_specs=WORKER_POOL_SPECS,
  )
 
custom_job.run()

注意 Vertex AI Prompt Optimizer 使用 Vertex AI Prompt Optimizer 容器作为 Vertex AI Training 自定义作业运行的方式。该服务同时利用 Vertex AI Training 和 Vertex AI GenAI Evaluation 的事实证明了 Vertex AI 如何提供运行 GenAI 的平台,即使是那些直接来自本案例的研究人员。

提交 Vertex AI Prompt Optimizer 作业后,您可以通过 Vertex AI Training 自定义作业视图进行监控,如下所示。

Training custom jobs view in Vertex AI

5. 获取经过优化的提示并评估优化效果

优化作业成功运行后,您可以在输出 Cloud Storage 存储桶中找到经过优化的指令或演示 JSON 文件,也可以同时找到两者。借助一些辅助函数,您可以获得以下输出,表明用于根据您定义的指标获得最佳指令的优化步骤。

Optimized instruction report in Vertex AI

与经过优化的演示得到的结果相同。

最后,您可以使用经过优化的输出生成新的响应。下面是使用经过优化的系统指令模板生成的响应示例。

Gemini_answer_with_apd example

如果您使用这些指令,通过 Vertex AI GenAI Evaluation 运行新一轮的评估,您可能会得到如下所示的输出,其中提示经过优化的模型的性能优于之前的模型,而之前的提示模板则与您选择的评估指标相对应。

Graph showing increased question_answering_quality/mean

总结

在操作基于 LLM 的应用的过程中,提示工程是最重要且最具挑战性的步骤之一。为了帮助您制作提示模板,Vertex AI Prompt Optimizer 需要为 Vertex AI 上的任何首选模型找到最佳提示(指令和演示)。

本文展示了一个示例,说明如何通过 Vertex AI SDK for Python 使用 Vertex AI Prompt Optimizer,以此增强 Gemini 模型的提示模板。您还可以通过此处的界面笔记本使用 Vertex AI Prompt Optimizer。

总之,Vertex AI Prompt Optimizer 可以为您节省在提示工程上耗费的时间与精力,同时确保为 GenAI 应用提供表现出色的提示。

感谢您的阅读!


未来计划

是否要详细了解 Vertex AI Prompt Optimizer 及其使用方法?请查看以下资源:

文档

Github 示例

Google Cloud 博客