前言
随着大模型技术的普及和应用场景的扩展,开发者往往陷入无休止的 Prompt 调优中。市面上出现了提示词工程师这一角色,相关的技巧文章也层出不穷。然而,Prompt 工程在实际落地中面临诸多挑战。
提示工程的局限性
虽然 Prompt 的技巧和调优效果明显,但没有任何一种策略能解决所有类型的问题。LLM 对提示词非常敏感,这意味着除了要求输出内容外,还需约束其格式、条件等以确保稳定性。一旦条件或数据微调,结果可能天差地别,需要重新调整 Prompt。
这引出了两个核心问题:
- 何时能摆脱繁琐的手工编写各种 Prompt?
- 如何真正像与'人'沟通一样理解需求,而非依赖特定格式的指令?
DSPy 简介
在此背景下,DSPy(Declarative Self-improving Language Model Programming)作为一种全新的 LLM 应用方式应运而生。它不讨论与 Prompt 工程的好坏,而是提供了一种系统化的构建方法。
什么是 DSPy
DSPy 是斯坦福大学 NLP 研究人员开发的'基础模型编程'框架,旨在解决基于语言模型(LM)的应用程序脆弱性问题。它优先考虑编程而不是提示,允许您重新编译整个流水线,以便根据您的特定任务进行优化,而不是每当更改一个组件时重复人工提示工程。
DSPy 将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。它将根据您的程序,自动优化如何针对您的特定任务提示(或微调)LM。
核心思想
-
Signatures(签名):手动设计的提示 -> 用签名取代
告诉 DSPy 需要做什么,而不是如何做。例如:输入是文档,输出是摘要;输入是上下文 + 问题,输出是回复。
-
Modules(模块):提示技巧 -> 转变为模块化
在 DSPy 中是模块化组件,如
dspy.ChainOfThought、dspy.ProgramOfThought,类似于可调用的函数。 -
Optimizers(优化器):复杂的提示工程 -> 通过提词器和编译器自动完成
根据某个指标对整个流程自动优化。
工作流程
使用 DSPy 构建基于 LM 的应用的工作流程与训练神经网络类似:
- 收集数据集:收集一些程序输入和输出的示例(例如问答对),用于优化 pipeline。
- 编写 DSPy 程序:用签名 (signature) 和模块 (module) 以及组件之间的信息流定义程序的逻辑,以解决任务。
- 定义验证逻辑:使用验证度量和优化器 (teleprompter) 定义优化程序的逻辑。
- 编译 DSPy 程序:DSPy 编译器考虑训练数据、编写程序、优化器和验证度量,以优化程序(例如提示或微调)。
- 迭代:通过改进数据、编写程序或验证来重复该过程,直到对 pipeline 的性能感到满意为止。
实战案例
为了更直观地理解,我们以解决多跳问题为例,比如:'姚明的妻子的出生年龄?'这是一个典型的多跳问题,单轮搜索难以解决。大多数系统可以得出'姚明的妻子是谁',但无法回答后续年龄问题。使用 DSPy 只需几行代码即可实现并优化。
环境配置
import dspy
turbo = dspy.OpenAI(model='gpt-3.5-turbo')
colbertv2 = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
dspy.settings.configure(lm=turbo, rm=colbertv2 )


