DSPy实战:三十分钟无痛上手自动化Prompt框架

前言:

伴随着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 构建复杂系统通常需要以下步骤:

  1. 将问题分解为多个步骤。
  2. 对每个步骤进行良好的提示,使其单独运行良好。
  3. 调整各个步骤以实现良好协作。
  4. 生成合成示例来微调每个步骤。
  5. 使用这些示例对较小的 LLM 进行微调以降低成本。

这种方法既复杂又耗时,并且每次更改pipeline、LLM 或数据时都需要重新调整提示和微调步骤。

1.2 DSPy

DSPy 通过以下两种方式简化了 LLM 优化过程:

  1. 分离流程和参数: DSPy 将程序流程(称为“模块(Module)”)与每个步骤的参数(LLM 提示prompt和权重weight)分离。这使得可以轻松地重新组合模块并调整参数,而无需重新编写提示或生成合成数据。
  2. 引入 优化器: DSPy 引入了新的“优化器”,这是一种 LLM 驱动的算法,可以根据您想要最大化的“指标”调整 LLM 调用的提示和/或权重。优化器可以自动探索最佳提示和权重组合,而无需人工干预。

DSPy 具有以下优势:

扫描二维码关注公众号,回复: 17560397 查看本文章
  • 更强大的模型: DSPy 可以训练强大的模型(如 GPT-3.5 或 GPT-4)和本地模型,并且支持使用第三方的框架(如 OLLAMA 等),使其在执行任务时更加可靠,即具有更高的质量和/或避免特定的失败模式。
  • 更少的提示: DSPy 优化器会将相同的程序 “编译 “成不同的指令、少量提示和/或权重更新(finetunes)。 这意味着您只需要更少的提示就可以获得相同甚至更好的结果。
  • 更系统的方法: DSPy 提供了一种更系统的方法来使用 LLM 解决困难任务。您可以使用通用的模块和优化器来构建复杂的pipeline,而无需每次更改代码或数据时都重新编写提示。

DSPy 通过以下步骤工作:

  1. 定义程序流程:使用 DSPy 模块定义程序流程。每个模块代表程序的一步,并可以包含 LLM 调用、条件检查和其他操作。

  2. 设置指标:指定要优化的指标。指标可以是任何可以衡量系统性能的度量,例如准确性、速度或效率。

  3. 优化器:运行 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]

完整的官方教程:

Getting Started: 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

猜你喜欢

转载自blog.csdn.net/2401_84495872/article/details/140488955
今日推荐