前言:
伴随着LLM模型的发展,一个优秀的Prompt对于任务成功起到了关键的作用。但目前大模型使用中的Prompt调优愈发成为一个痛点问题。如何优雅的解决这个痛点?
DSPy框架的出现使自动生成解决复杂问题的Prompt成为了现实。
只需输入你的问题,Prompt的调整,思维链,知识库等使用全部交由框架自动执行,最终给出一个令人满意的结果,并且这一切过程都可以被查看。
DSPy作为一个高效的自动化Prompt框架,为开发者提供了强大的工具,简化了复杂的Prompt生成和管理过程。本教程将带您在三十分钟内快速上手DSPy,帮助您轻松实现自动化Prompt的创建和优化。
为了帮助读者更深入的理解框架使用,笔者在官方教程之外还会额外增加自定义数据的教程,注意官方教程代码块命名为
Repo-office
, 自定义数据代码块命名为Repo-custom
,两个代码块功能如未特别说明则完全一致。
本文面向的读者主要是有一定编程基础,特别是对自然语言处理感兴趣的开发者。无论您是技术小白还是资深开发者,都可以通过本文了解并掌握DSPy的基本使用方法。
一:DSPy介绍
DSPy 是一款功能强大的框架。它可以用来自动优化大型语言模型(LLM)的提示词和响应。还能让我们的 LLM 应用即使在 OpenAI/Gemini/Claude版本升级也能正常使用。无论你有多少数据,它都能帮助你优化模型,获得更高的准确度和性能。通过选择合适的优化器,并根据具体需求进行调优,你可以在各种任务中获得出色的结果。
1.1 传统LLM使用的挑战
使用 LLM 构建复杂系统通常需要以下步骤:
- 将问题分解为多个步骤。
- 对每个步骤进行良好的提示,使其单独运行良好。
- 调整各个步骤以实现良好协作。
- 生成合成示例来微调每个步骤。
- 使用这些示例对较小的 LLM 进行微调以降低成本。
这种方法既复杂又耗时,并且每次更改pipeline、LLM 或数据时都需要重新调整提示和微调步骤。
1.2 DSPy
DSPy 通过以下两种方式简化了 LLM 优化过程:
- 分离流程和参数: DSPy 将程序流程(称为“模块(Module)”)与每个步骤的参数(LLM 提示prompt和权重weight)分离。这使得可以轻松地重新组合模块并调整参数,而无需重新编写提示或生成合成数据。
- 引入 优化器: DSPy 引入了新的“优化器”,这是一种 LLM 驱动的算法,可以根据您想要最大化的“指标”调整 LLM 调用的提示和/或权重。优化器可以自动探索最佳提示和权重组合,而无需人工干预。
DSPy 具有以下优势:

- 更强大的模型: DSPy 可以训练强大的模型(如 GPT-3.5 或 GPT-4)和本地模型,并且支持使用第三方的框架(如 OLLAMA 等),使其在执行任务时更加可靠,即具有更高的质量和/或避免特定的失败模式。
- 更少的提示: DSPy 优化器会将相同的程序 “编译 “成不同的指令、少量提示和/或权重更新(finetunes)。 这意味着您只需要更少的提示就可以获得相同甚至更好的结果。
- 更系统的方法: DSPy 提供了一种更系统的方法来使用 LLM 解决困难任务。您可以使用通用的模块和优化器来构建复杂的pipeline,而无需每次更改代码或数据时都重新编写提示。
DSPy 通过以下步骤工作:
-
定义程序流程:使用 DSPy 模块定义程序流程。每个模块代表程序的一步,并可以包含 LLM 调用、条件检查和其他操作。
-
设置指标:指定要优化的指标。指标可以是任何可以衡量系统性能的度量,例如准确性、速度或效率。
-
优化器:运行 DSPy 优化器。优化器将探索不同的 LLM 提示和权重组合,并根据指定的指标选择最佳组合。
DSPy 可用于各种 LM 应用,包括:
-
问答系统: DSPy 可以用于优化问答系统的 LLM 提示,以提高准确性和效率。
-
机器翻译: DSPy 可以用于优化机器翻译系统的 LLM 权重,以提高翻译质量。
-
文本摘要: DSPy 可以用于优化文本摘要系统的 LLM 提示,以生成更准确和更具信息量的摘要。
DSPy 适用于以下情况:
- 您需要在Pipeline中多次使用 LM
- 您需要训练强大的模型以执行困难的任务
- 您希望以更系统的方式使用 LM
二:代码及模块讲解
Github: [stanfordnlp/dspy: DSPy: The framework for programming—not prompting—foundation models]
完整的官方教程:
Repo-office
代码为完整官方教程中的部分实现讲解
2.1 配置环境, 安装DSPy并加载数据
配置环境
Repo-office
|Repo-custom
%load_ext autoreload
%autoreload 2
import sys
import os
try: # When on google Colab, let's clone the notebook so we download the cache.
import google.colab
repo_path = 'dspy'
!git -C $repo_path pull origin || git clone https://github.com/stanfordnlp/dspy $repo_path
except:
repo_path = '.'
if repo_path not in sys.path:
sys.path.append(repo_path)
# Set up the cache for this notebook
os.environ["DSP_NOTEBOOK_CACHEDIR"] = os.path.join(repo_path, 'cache')
import pkg_resources # Install the package if it's not installed
if not "dspy-ai" in {pkg.key for pkg in pkg_resources.working_set}:
!pip install -U pip
!pip install dspy-ai
!pip install openai~=0.28.1
# !pip install -e $repo_path
import dspy
定义模型并加载数据
Repo-office
在官方教程中使用LLM 为 gpt-3.5-turbo
,数据集为在线的ColBERTv2 服务器,托管维基百科 2017 年“摘要”搜索索引
问答数据集使用了HotPotQA
数据集中的一个小样本
import openai
openai.api_key =
turbo = dspy.OpenAI(model='gpt-3.5-turbo')
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)
from dspy.datasets import HotPotQA
# Load the dataset.
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)
# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
trainset_q = [x.with_inpu