DSPY:停止提示开始编程
HTML 结构保持不变,将以下英文文本翻译为简体中文: 在使用LLM语言模型时面临的挑战之一是Prompt Engineering,它涵盖了各种宗教和艺术,而我自己在考虑提示时经常遇到问题,尽管有许多提示生成器。
大约1-2个月前,我在Reddit社区中得知了一个叫做DSPy的库,它彻底改变了我们与语言模型互动的方式。
DSPy将方法从复杂的提示写作转变为声明式编程,侧重于程序应该做什么,而不是如何做。
DSPy
DSPY 允许我们构建使用 LLM 模型进行复杂任务的程序,通过将它们拆分成较小的模块,而不是编写提示。
DSPy的工作原理是:
编译编程语言 -> 优化提示
我们将编写Python代码,指明每个步骤应该: DSPY将随后将这些代码编译为优化的命令或数据,以进行微调。对于各种LLM模型(从大型模型如GPT-4到更小,更具成本效益的模型) 这种方法使得更容易改变模型并实现更好的性能。
因此,我们节省了很多时间。我们不需要考虑如何提供模型,只需要考虑输入和输出。
从“如何”-> “什么”
DSPy的特点如下:
- 模块化编程:将复杂的任务分解为更小的模块。可重复使用。
- 自动优化:DSPy优化模型提示和超参数,即使使用小模型也能获得更好的结果。
- 支持广泛的机型:适用于各种云端和本地的LLM。
- 使用自然语言签名:用自然语言定义模块的输入/输出,使修改和学习变得简单。
- 思维链条的来源:使用诸如Predict、ChainOfThought、ProgramOfThought、ReACT等策略,并提取位于https://dspy-docs.vercel.app/cheatsheet/#dspy-programs文件中的数据。
教程
定义LLM客户
DSPy的LLM引擎使用Litellm,我们可以更改为其他提供商,甚至可以使用Ollama Local,在https://docs.litellm.ai/docs/providers文档中可以找到。
import dspy
lm = dspy.LM(model="ollama/openthaigpt1.5-7b-instruct-q4_k_m:latest", api_base="http://localhost:11434")
dspy.configure(lm=lm)
创建签名
我们创建的变量将成为LLM的提示,并且会有doc作为此签名的目的,我们将定义答案变量,这将是LLM的输出。运行此签名。
class BasicQA(dspy.Signature):
"""Answer questions with short factoid answers.""" # Object for LLM
question = dspy.InputField() # Input for LLM
answer = dspy.OutputField(desc="Only Result Number") # Output from LLM
InputField() = 输入一个LLM可以有多个
OutputField()= 从LLM输出可以是多变量的,取决于任务。
签名入口
我们创建的类将是我们调用已创建的签名的入口,我们将使LLM工作的方式是一连串的想法链。
class BasicQA_Entry(dspy.Module):
def __init__(self):
super().__init__()
self.progress = dspy.ChainOfThought(BasicQA)
def execute(self, question):
return self.progress(question=question)
执行流程
创建一个条目并运行它:创建一个使用思维链来调用签名并处理它的类,然后调用函数.execute
BE = BasicQA_Entry()
result = BE.execute(question="Sarah has 5 apples. She buys 7 more apples from the store and it's was bad and she return 1 apple to store. How many apples does Sarah have now?")
结果
对于此运行管道的输出,可以通过我们创建的对象的属性触发。在这部分中,我调用我们为此管道的输出创建的“answer”属性。
print("Result:", result)
print("Answers:", result.answer)
# Output
# Result: Prediction(
# rationale='We start with Sarah having 5 apples.\nShe then buys 7 more, so we add those to her total: 5 + 7 = 12 apples.\nHowever, one of the apples is bad and she returns it to the store. We subtract this from her total: 12 - 1 = 11 apples.',
# answer='11'
# )
# Answers: 11
总结
可以看出,DSPy 通过从提示写作切换到编程简化了与LLMs的工作,节省时间并提高生产效率。