2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

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

发布日期:2024-09-01 22:44:33 浏览次数: 2975
作者:AI科技论谈

微信搜一搜,关注“AI科技论谈”

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


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

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

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

from dspy.teleprompt import BootstrapFewShot

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编译器优化了初始提示,省去了手动调整提示的繁琐步骤。

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

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

from dspy.teleprompt import BootstrapFewShot

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

trainset = [dspy.Example(question="What were the two main things the author worked on before college?"
                          answer="Writing and programming").with_inputs('question'),
            dspy.Example(question="What kind of writing did the author do before college?"
                          answer="Short stories").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

pip install dspy-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进行数据检索和处理的关键。

import weaviate
from weaviate.embedded import EmbeddedOptions
import re

# 以嵌入模式连接到 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 = []
with open("./data/paul_graham_essay.txt"'r', encoding='utf-8'as file:
    text = file.read()
    sentences = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s', text)
    sentences = [sentence.strip() for sentence in sentences if sentence.strip()]
    chunks.extend(sentences)

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

with client.batch as batch:  # 初始化批处理
    for i, d in enumerate(chunks):  # 批量导入数据
        properties = {
            "content": d,
        }
        batch.add_data_object(
            data_object=properties,
            class_name="MyExampleIndex"
        )

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

import dspy
import openai
from dspy.retrieve.weaviate_rm import WeaviateRM

# 设置 OpenAI API 密钥
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="What were the two main things the author worked on before college?"
                          answer="Writing and programming").with_inputs('question'),
            dspy.Example(question="What kind of writing did the author do before college?"
                          answer="Short stories").with_inputs('question'),
            dspy.Example(question="What was the first computer language the author learned?"
                          answer="Fortran").with_inputs('question'),
            dspy.Example(question="What kind of computer did the author's father buy?"
                          answer="TRS-80").with_inputs('question'),
            dspy.Example(question="What was the author's original plan for college?"
                          answer="Study philosophy").with_inputs('question'),]

步骤3:构建DSPy程序

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

class GenerateAnswer(dspy.Signature):
    """Answer questions with short factoid answers."""

    context = dspy.InputField(desc="may contain relevant facts")
    question = dspy.InputField()
    answer = dspy.OutputField(desc="often between 1 and 5 words")

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

class RAG(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
    
    def forward(self, question):
        context = self.retrieve(question).passages
        prediction = self.generate_answer(context=context, question=question)
        return dspy.Prediction(context=context, answer=prediction.answer)

步骤4:编译与优化

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

from dspy.teleprompt import BootstrapFewShot

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

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

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

pred = compiled_rag(question = "What programming language did the author learn in college?")

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

推荐书单

《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应用程序开发者阅读。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅