Promptim是一个实验性的提示词 优化库,帮助你系统地改进你的 AI 系统。
Promptim自动化了针对特定任务改进提示词的过程。你提供初始提示词、一个数据集和自定义评估器(以及可选的人工反馈),然后promptim运行一个优化循环,生成一个旨在超越原始提示词的改进版提示词。
从评估驱动开发到提示词优化
AI 工程师的一项核心职责是提示词工程。这涉及手动调整提示词以产生更好的结果。
一种有用的方法是通过评估驱动开发。这涉及首先创建一个输入数据集(以及可选的预期输出),然后定义若干评估指标。每次你对提示词做出更改时,你都可以在数据集上运行它,然后对输出进行评分。通过这种方式,你可以衡量提示词的性能,并确保它在改进,或者至少没有退步。像LangSmith这样的工具可以帮助进行数据集整理和评估。
提示词优化背后的理念是利用这些定义良好的数据集和评估指标来自动改进提示词。你可以以自动化的方式对提示词提出更改建议,然后用这种评估方法对新提示词进行评分。像DSPy这样的工具已经在这方面进行了多年的开创性探索。
为什么要进行提示词优化?
进行提示词优化有几个动机:
节省时间:手动提示词工程往往是一个耗时的过程。自动化的提示词优化可以加速提示词工程工作并节省工程时间。
带来严谨性:提示词工程有时更像是一门艺术而非科学——因此这为过程带来了一些严谨性。请注意,评估驱动开发总体上可以帮助实现这一点。
便于在模型之间切换:不同的模型往往需要不同的提示策略。切换模型提供商并不只是改变你调用的 URL 那么简单;你通常还需要修改提示。提示优化可以加速这一过程,因为你可以把大部分精力放在开发评估(evals)上(评估与模型无关),而不是放在提示上(提示与模型相关)。
Promptim 的工作原理
我们很高兴发布我们在提示优化方面的首次尝试。它是一个开源库(promptim),与 LangSmith 集成(我们用 LangSmith 进行数据集管理、提示管理、结果跟踪,以及(可选的)人工标注。
核心算法如下:
- 指定一个 LangSmith 数据集、一个 LangSmith 中的提示,以及在本地定义的评估器。你还可以选择指定
train/dev/test数据集拆分。 - 我们在
dev(或完整)数据集上运行初始提示,以获得基线分数。 - 然后我们遍历
train(或完整)数据集中的所有示例。我们在所有示例上运行提示,然后对它们打分。接着我们把结果(输入、输出、期望输出、分数)传给一个元提示(metaprompt)并要求它针对当前提示提出修改建议 - 然后我们用更新后的提示在
dev拆分上重新计算指标。 - 如果指标显示有提升,就保留更新后的提示。如果没有提升,则保留原始提示。
- 这一过程重复
N次
你还可以选择增加一个留下人工反馈的步骤。当你没有好的自动化指标,或者想基于自动化指标无法提供的反馈来优化提示时,这很有用。这一步使用LangSmith 的标注队列(Annotation Queues)。
提示优化的局限性
尽管我们对提示优化感到兴奋,但我们并不认为它是万灵药。在这个过程中保留人工介入仍然值得——哪怕只是对最终结果做一次合理性检查。这也是我们使用LangSmith 的 Prompt Hub来存储提示的部分原因——这样你之后可以轻松地审查这些提示。
Promptim 与 DSPy 的对比
DSPy 是优化领域的领先工具。值得把我们的方法与他们的方法做个比较。
首先,这一初步工作仅专注于优化单个提示词。DSPy 则专注于优化你的整个"复合 AI 系统"。我们目前选择专注于单个提示词,因为我们认为这在当下是一个更易处理的问题。
其次,我们更注重保留人类在环(human-in-the-loop),而 DSPy 则更多地移除了人类。一个例子是将其接入标注队列,以便在优化过程中获得人类反馈。另一个例子是将这些提示词存储在 LangSmith 中,便于事后轻松审阅。最后一个例子是在 LangSmith 中跟踪评估结果。
第三,我们专注于重写提示词,并力求在这方面做到非常出色,而 DSPy 提供了更广泛的系统优化方案(微调、少样本提示)。
💡
由于这些差异,我们将promptim和dspy视为针对不同问题的不同工具。
未来工作
随着基础模型趋于稳定,我们对提示词优化越来越感到兴奋。我们期待的事情包括:
- 在以下方面进一步推进动态少样本提示
- 将
promptim集成到 LangSmith UI 中 - 向以下添加更多优化方法
promptim - 将 LangGraph 图作为整体进行优化,而不仅仅是提示词(理想情况下通过与 DSPy 集成)
你可以试用 Promptim就在今天:pip install promptim。查看这个 YouTube 视频了解演示,并通过GitHub或Twitter给我们留言,提供任何反馈。