返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

告别提示工程,未来属于DSPy(下)

[复制链接]
链载Ai 显示全部楼层 发表于 1 小时前 |阅读模式 打印 上一主题 下一主题

介绍DSPy框架的核心概念、编程模型、编译器功能,并通过简单的示例展示其应用。


2.3 提词器:自动化提示优化DSPy程序

提词器在DSPy程序中扮演着优化器的角色。提词器利用特定的性能指标来优化DSPy程序模块的提示,与编译器协同工作,以提升程序执行的效率和效果。

以BootstrapFewShot为例,这是一个简单的提词器使用示例:

fromdspy.telepromptimportBootstrapFewShot

teleprompter=BootstrapFewShot(metric=dspy.evaluate.answer_exact_match)

目前,DSPy支持五种类型的提词器,各有所长:

  • dspy.LabeledFewShot:定义预测器使用k个样本的数量。
  • dspy.BootstrapFewShot:引导式启动。
  • dspy.BootstrapFewShotWithRandomSearch:在BootstrapFewShot的基础上增加了随机搜索的特性。
  • dspy.BootstrapFinetune:将提词器设定为BootstrapFewShot,专门用于编译过程中的微调。
  • dspy.Ensemble:将多个程序集成,统一不同的输出为单一结果。

不同的提词器在优化成本与质量方面有不同的取舍。

3 DSPy编译器

DSPy编译器会在内部跟踪你的程序,然后使用优化器(提词器)进行优化,来提升程序性能。这一优化过程会根据你选用的语言模型(LM)规模和特性进行调整:

  • 对于大型语言模型(LLMs),DSPy编译器会构建少量但高质量的示例提示。
  • 对于规模较小的语言模型,则会进行自动微调训练。

简而言之,DSPy编译器能够智能地将程序模块与优质的提示、微调、推理和增强策略相匹配。在后台,编译器会模拟程序在不同输入下的各种运行版本,通过引导式学习不断自我完善,以适应你的特定任务需求。这一过程与神经网络的训练过程颇为相似。

前面创建的ChainOfThought模块,虽然它为语言模型提供了一个良好的起点,帮助模型理解任务,但可能并非最佳提示。正如以下图像所示,DSPy编译器优化了初始提示,省去了手动调整提示的繁琐步骤。

编译器采用以下输入,如代码和图片所示:

  • 程序
  • 提词器(包括定义的验证指标)
  • 一些训练样本

fromdspy.telepromptimportBootstrapFewShot

#带有问题和答案对的小型训练集

trainset=[dspy.Example(question="Whatwerethetwomainthingstheauthorworkedonbeforecollege?",
answer="Writingandprogramming").with_inputs('question'),
dspy.Example(question="Whatkindofwritingdidtheauthordobeforecollege?",
answer="Shortstories").with_inputs('question'),
...
]

#提词器将引导缺失的标签:推理链和检索上下文

teleprompter=BootstrapFewShot(metric=dspy.evaluate.answer_exact_match)

compiled_rag=teleprompter.compile(RAG(),trainset=trainset)

4 DSPy实践:构建简单的RAG流程

现在已经掌握了DSPy的核心概念,接下来将这些知识应用到实践中,构建自己的第一个DSPy流程。

检索增强生成(RAG)目前在生成式AI领域非常流行。因此,从使用DSPy构建简单的RAG流程开始学习是有非常有意义的。

在开始之前,先安装DSPy。

要安装dspy-ai Python包,可以使用pip

pipinstalldspy-ai

步骤1:初始化设置

首先,需要先配置好语言模型(LM)和检索模型(RM):

  • 语言模型(LM):采用OpenAI提供的gpt-3.5-turbo模型。为此,需要OpenAI的API密钥。如果你没有,可以注册OpenAI账户并创建新的密钥来获取。

  • 检索模型(RM):使用Weaviate,这是一个开源的向量数据库。接下来,用一些示例数据来初始化这个数据库。

这些数据来自LlamaIndex GitHub仓库(遵循MIT许可协议)(https://github.com/run-llama/llama_index)。当然,也可以根据自己的需求,用其他数据来替代。

!mkdir-p'data'
!wget'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt'-O'data/paul_graham_essay.txt'

接下来,我们需要将文档拆分成单独的句子,并导入到数据库中。在本文的示例中,使用Weaviate的嵌入式版本,这个版本是免费的,并且不需要注册API密钥即可使用。

需注意的是,在导入数据时,要确保每个数据项都包含名为"content"的属性。这个属性将用于存储句子内容,是Weaviate进行数据检索和处理的关键。

importweaviate
fromweaviate.embeddedimportEmbeddedOptions
importre

#以嵌入模式连接到Weaviate客户端
client=weaviate.Client(embedded_options=EmbeddedOptions(),
additional_headers={
"X-OpenAI-Api-Key":"sk-<YOUR-OPENAI-API-KEY>",
}
)

#创建Weaviate模式
#DSPy假设集合中有文本键'content'
schema={
"classes":[
{
"class":"MyExampleIndex",
"vectorizer":"text2vec-openai",
"moduleConfig":{"text2vec-openai":{}},
"properties":[{"name":"content","dataType":["text"]}]
}
]
}

client.schema.create(schema)

#将文档分割为单个句子
chunks=[]
withopen("./data/paul_graham_essay.txt",'r',encoding='utf-8')asfile:
text=file.read()
sentences=re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s',text)
sentences=[sentence.strip()forsentenceinsentencesifsentence.strip()]
chunks.extend(sentences)

#批量填充向量数据库
client.batch.configure(batch_size=100)#配置批量

withclient.batchasbatch:#初始化批处理
fori,dinenumerate(chunks):#批量导入数据
properties={
"content":d,
}
batch.add_data_object(
data_object=properties,
class_name="MyExampleIndex"
)

现在,可以在全局设置中配置 LM 和 RM。

importdspy
importopenai
fromdspy.retrieve.weaviate_rmimportWeaviateRM

#设置OpenAIAPI密钥
openai.api_key="sk-<YOUR-OPENAI-API-KEY>"

#配置语言模型
lm=dspy.OpenAI(model="gpt-3.5-turbo")

#配置检索器
rm=WeaviateRM("MyExampleIndex",
weaviate_client=client)

#配置DSPy默认使用以下语言模型和检索模型
dspy.settings.configure(lm=lm,
rm=rm)

步骤2:数据准备

接下来,我们将收集一些训练示例(在这种情况下,是手动注释的)。

#包含问答对的小型训练集
trainset=[dspy.Example(question="Whatwerethetwomainthingstheauthorworkedonbeforecollege?",
answer="Writingandprogramming").with_inputs('question'),
dspy.Example(question="Whatkindofwritingdidtheauthordobeforecollege?",
answer="Shortstories").with_inputs('question'),
dspy.Example(question="Whatwasthefirstcomputerlanguagetheauthorlearned?",
answer="Fortran").with_inputs('question'),
dspy.Example(question="Whatkindofcomputerdidtheauthor'sfatherbuy?",
answer="TRS-80").with_inputs('question'),
dspy.Example(question="Whatwastheauthor'soriginalplanforcollege?",
answer="Studyphilosophy").with_inputs('question'),]

步骤3:构建DSPy程序

现在,开始着手编写DSPy程序。这个程序将构建一个检索增强生成(RAG)系统。首先,首先,我们需要定义一个名为GenerateAnswer的签名上下文,它描述了从问题到答案的转换过程:

classGenerateAnswer(dspy.Signature):
"""Answerquestionswithshortfactoidanswers."""

context=dspy.InputField(desc="maycontainrelevantfacts")
question=dspy.InputField()
answer=dspy.OutputField(desc="oftenbetween1and5words")

在定义了签名之后,编写一个自定义的RAG类,它继承自dspy.Module。在__init__():方法中,声明相关模块,在forward():方法中,描述模块之间的信息流。

classRAG(dspy.Module):
def__init__(self,num_passages=3):
super().__init__()
self.retrieve=dspy.Retrieve(k=num_passages)
self.generate_answer=dspy.ChainOfThought(GenerateAnswer)

defforward(self,question):
context=self.retrieve(question).passages
prediction=self.generate_answer(context=context,question=question)
returndspy.Prediction(context=context,answer=prediction.answer)

步骤4:编译与优化

最后,可以定义提词器并编译DSPy程序。这会更新ChainOfThought模块中使用的提示。对于这个示例,我们使用一个简单的BootstrapFewShot提词器。

fromdspy.telepromptimportBootstrapFewShot

#置一个基本的提词器,编译我们的RAG程序。
teleprompter=BootstrapFewShot(metric=dspy.evaluate.answer_exact_match)

#编译
compiled_rag=teleprompter.compile(RAG(),trainset=trainset)

现在调用RAG流程,如下所示:

pred=compiled_rag(question="Whatprogramminglanguagedidtheauthorlearnincollege?")

你可以评估结果,并在对流程的性能满意之前迭代过程。

推荐书单

《LANGCHAIN入门指南:构建高可复用、可扩展的LLM应用程序》

这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章,从LLM基础知识开始,通过LangChain这个开源框架为读者解读整个LLM应用开发流程。第1~2章概述LLM技术的发展背景和LangChain框架的设计理念。从第3章开始,分章深入介绍LangChain的6大模块,包括模型I/O、数据增强、链、记忆等,通过大量代码示例让读者了解其原理和用法。第9章通过构建PDF问答程序,帮助读者将之前学习的知识应用于实践。第10章则介绍集成,可拓宽LangChain的用途。第11章为初学者简要解析LLM的基础理论,如Transformer模型等。

本书以LangChain这个让人熟悉的框架为主线,引导读者一步一步掌握LLM应用开发流程,适合对大语言模型感兴趣的开发者、AI应用程序开发者阅读。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ