SPO:自我监督提示优化的全景指南

在大语言模型(LLMs)日益普及的今天,提示(Prompt)的设计和优化成为了解锁其潜力的关键。然而,传统的提示优化方法往往依赖人工反馈或外部标注数据,既昂贵又难以扩展。为了解决这一问题,SPO(Self-Supervised Prompt Optimization,自我监督提示优化)应运而生。SPO 是一款面向大语言模型的自动化提示优化工具,其核心特点是无需外部监督,通过模型自身的输出信号实现高效优化。

本文将详细解析 SPO 的核心优势、实验结果、快速启动指南以及其在提示优化领域的革命性贡献。


✨ SPO 的核心优势

SPO 的设计理念围绕四大核心优势展开,使其在提示优化领域脱颖而出:

  • 💸 超低成本:每个任务的优化成本仅为 $0.15,比传统方法高效 17.8 至 90.9 倍。
  • 🏷️ 零监督依赖:无需任何人工标注或外部反馈,完全自我监督。
  • ⚡ 通用适配:支持封闭式和开放式任务,适应性极强。
  • 🔄 自我演化:通过 LLM-as-judge 机制实现自动优化,持续提升性能。

这些特性使 SPO 成为一个既高效又灵活的提示优化工具,适用于多种任务场景。


📊 实验结果:性能与成本的对比

封闭式任务

SPO 在封闭式任务(如数学求解、事实验证等)中表现出色,显著降低了优化成本,同时保持了与最先进方法相当的性能。

  • 成本效率:SPO 的优化成本仅为现有方法的 1.1% 至 5.6%。
  • 性能稳定:在多个数据集上,SPO 的性能与最先进方法持平甚至更优。

开放式任务

在开放式任务(如写作、角色扮演等)中,SPO 同样展现了强大的优化能力,显著提升了模型的生成质量。

实验表明,SPO 能够在不同模型配置下提升性能,适应多样化的任务需求。


🚀 快速启动指南

SPO 的使用非常简单,只需按照以下步骤即可快速实现提示优化:

1. 配置 API 密钥

config/config2.yaml 文件中配置 LLM 参数。可以参考示例文件 examples/spo/config2.example.yaml

2. 定义迭代模板

创建一个迭代模板文件,例如 metagpt/ext/spo/settings/task_name.yaml,其结构如下:

prompt: |
  Please solve the following problem.

requirements: |
  ...

count: None

qa:
  - question: |
      ...
    answer: |
      ...

  - question: |
      ...
    answer: |
      ...

字段说明

  • prompt:初始提示,用于引导模型生成输出。
  • requirements:期望的效果或输出特性,例如“生成更多逻辑思考”或“使用更幽默的语言”。
  • count:生成提示的目标字数(可选)。
  • qa:用于迭代的问答对,可以包含 3 个左右的问题。

3. 实现 PromptOptimizer

SPO 提供了三种运行方式,用户可以根据需求选择合适的方式:

方式 1:Python 脚本

通过 Python 脚本运行优化器:

from metagpt.ext.spo.components.optimizer import PromptOptimizer
from metagpt.ext.spo.utils.llm_client import SPO_LLM

if __name__ == "__main__":
  # 初始化 LLM 设置
  SPO_LLM.initialize(
    optimize_kwargs={"model": "claude-3-5-sonnet-20240620", "temperature": 0.7},
    evaluate_kwargs={"model": "gpt-4o-mini", "temperature": 0.3},
    execute_kwargs={"model": "gpt-4o-mini", "temperature": 0}
  )

  # 创建并运行优化器
  optimizer = PromptOptimizer(
    optimized_path="workspace",  # 输出目录
    initial_round=1,  # 起始轮次
    max_rounds=10,  # 最大优化轮次
    template="Poem.yaml",  # 模板文件
    name="Poem",  # 项目名称
  )

  optimizer.optimize()

方式 2:命令行界面

通过命令行运行优化器:

python -m examples.spo.optimize

支持的命令行选项:

--opt-model            优化模型(默认:claude-3-5-sonnet-20240620)
--opt-temp             优化温度(默认:0.7)
--eval-model           评估模型(默认:gpt-4o-mini)
--eval-temp            评估温度(默认:0.3)
--exec-model           执行模型(默认:gpt-4o-mini)
--exec-temp            执行温度(默认:0)
--workspace            输出目录路径(默认:workspace)
--initial-round        初始轮次(默认:1)
--max-rounds           最大轮次(默认:10)
--template             模板文件名(默认:Poem.yaml)
--name                 项目名称(默认:Poem)

获取帮助:

python -m examples.spo.optimize --help

方式 3:Streamlit Web 界面

使用 Streamlit 提供的 Web 界面,体验更友好的用户交互方式:

pip install "streamlit~=1.42.0"
python -m streamlit run metagpt/ext/spo/app.py

4. 查看优化结果

优化完成后,结果将存储在指定的工作目录中,结构如下:

workspace
  └── Project_name
      └── prompts
          ├── results.json 
          ├── round_1
          │   ├── answers.txt
          │   └── prompt.txt
          ├── round_2
          │   ├── answers.txt
          │   └── prompt.txt
          ├── ...
          └── round_n
              ├── answers.txt
              └── prompt.txt
  • results.json:记录每轮迭代是否成功及相关信息。
  • prompt.txt:对应轮次的优化提示。
  • answers.txt:使用提示生成的输出结果。

📜 引用与致谢

如果您在研究中使用了 SPO,请引用以下论文:

@misc{xiang2025spo,
      title={Self-Supervised Prompt Optimization}, 
      author={Jinyu Xiang and Jiayi Zhang and Zhaoyang Yu and Fengwei Teng and Jinhao Tu and Xinbing Liang and Sirui Hong and Chenglin Wu and Yuyu Luo},
      year={2025},
      eprint={2502.06855},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2502.06855}, 
}

🌟 总结

SPO 是提示优化领域的一次革命性突破。通过自我监督的方式,它摆脱了对外部参考的依赖,实现了超低成本的高效优化。无论是封闭式任务还是开放式任务,SPO 都展现了卓越的性能和广泛的适用性。如果您正在寻找一种高效、灵活且易用的提示优化工具,SPO 无疑是您的最佳选择!

评论

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客

最近浏览