当前位置: 首页 > news >正文

你还在为写好Prompt而头疼吗,带你走进DSPy-Program LLMs之初体验

前言

随着大模型的使用和应用越来越频繁,也越来越广泛,大家有没有陷入到无限制的研究、调优自己的prompt。

随之,市面上也出现了提示词工程师,更有专门的提示工程一说。

现在网上搜一搜,有各种各样的写提示词的技巧,包括我自己也专门写过相关的文章。

再聊prompt

不知道大家有没有感受,prompt的技巧和调优效果很明显,但是没有什么提示词策略是可以解决所有类型的问题的。

LLMs本身对提示词是非常敏感的,这意味着,在实际实验过程中,除了要求大模型输出某个内容,还需要约束它按照某种格式,各种条件约束下输出,以确保整体的稳定性。你稍微改变条件或者数据,都会导致结果的返回发生变化,甚至有时候天差地别,你又需要重新调整或者优化prompt。

关于prompt我有两个问题:

  1. 根据OpenAI的工程师自述,起先在开发大模型的过程中,并没有提示工程这一说,而是后来在使用过程中大家发现通过一些技巧可以提高大模型的涌现能力。实际上就是大量的玩家在试玩大模型之后总结出的技巧。

我什么时候能不费劲巴拉的写各种各样的prompt。

  1. 都说我们看待LLM要像对待“人”一样,什么时候我真正能像和一个“人”沟通,能理解我在说什么和我需要什么 。
    在这里插入图片描述

Hello Programming-DSPy

在这个过程中,DSPy一种program的全新的大模型应用方式出现了。

在这里我们不讨论两者的好与坏,随着LLM的多模态能力的发展和Multil Agents的发展,没准哪天就可以傻瓜式的提问了。

DSPy是什么

DSPy [1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架, 是一个旨在解决基于语言模型(LM)的应用程序脆弱性问题的框架,它优先考虑编程而不是提示。它允许您重新编译整个流水线,以便根据您的特定任务进行优化,而不是每当您更改一个组件时,就重复一轮人工提示工程。

DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。然后,DSPy 将根据您的程序,自动优化如何针对您的特定任务提示(或微调)LM。

DSPy的核心思想

  • Signatures:手动设计的提示 -> 用签名取代

是我们告诉DSPY需要做什么,而不是告诉他应该如何做。例如:输入是文档,输出是摘要;输入是上下文+问题,输出是问题回复。

  • Modules:提示技巧 -> 转变为模块化

在DSPY是一些模块化的组件,比如说:dspy.ChainOfThought、dspy.ProgramOfThought,类似于一些可调用的函数

  • Optimizers:复杂的提示工程 -> 通过提词器和DSPy编译器自动完成

根据某个指标对整个流程自动优化。

DSPy是如何工作的

image.png

使用DSPy构建基于LM的应用的工作流程如上图所示,与训练神经网络的工作流程类似。

  1. 收集数据集:收集一些程序输入和输出的示例(例如,问答对),这些示例将用于优化pipeline。
  2. 编写DSPy程序:用签名(signature)和模块(module)以及组件之间的信息流定义程序的逻辑,以解决你的任务。
  3. 定义验证逻辑:使用验证度量和优化器(teleprompter)定义优化程序的逻辑。
  4. 编译DSPy程序:DSPy编译器考虑训练数据、编写程序、优化器和验证度量,以优化程序(例如,提示或微调)。
  5. 迭代:通过改进数据、编写程序或验证来重复该过程,直到对pipeline的性能感到满意为止。

进一步了解DSPy请参考以下链接:

  • DSPy Paper: DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines
  • DSPy GitHub: github.com/stanfordnlp…

举个例子

可能理解起来还有点抽象,我们再举一个例子:

比如说,我们想解决“姚明的妻子的出生年龄?”这个问题。看到这个问题,大家脑子里肯定蹦出了一堆的解决方案。这是个多跳问题,几乎不可能通过单轮搜索来解决这个问题,大多数系统可以得出“姚明的妻子是谁?”,但是无法回答后续的年龄问题。多轮搜索的系统,通过生成额外的搜索,收集必要的信息,可以得出最终答案,整体上还是蛮复杂的。但是这里举个例子,如何用DSPY只需要几行代码来实现并优化这个问题。

原文链接:blog.csdn.net/weixin_5875… ,如有侵权请联系删除

python代码解读复制代码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 )   

加载测试数据,多跳问题,可以使用HotPotQA测试

python代码解读复制代码from dspy.datasets import HotPotQA      dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)      trainset = [x.with_inputs('question') for x in dataset.train]   
devset = [x.with_inputs('question') for x in dataset.dev]      
len(trainset), 
len(devset)   
#(20, 50)   

设置Signatures

签名是最小形式的输入和输出字段的元组。下面,您可以看到一些简写语法签名的示例。

与手写提示相比,签名可以通过为每个签名引导示例编译成自完善和自适应管道的prompt或fine-tune。

arduino代码解读复制代码"question -> answer""long-document -> summary""context, question -> answer"
python代码解读复制代码class GenerateAnswer(dspy.Signature):       
context = dspy.InputField()       
question = dspy.InputField()       
answer = dspy.OutputField()         class GenerateSearchQuery(dspy.Signature):          
context = dspy.InputField()       
question = dspy.InputField()       
query = dspy.OutputField()   

构建DSPY pipeline

您可能熟悉几种不同的提示技巧,例如添加Your task is to …之类的句子。或“You are a …”在提示开头,思维链(“让我们一步一步地思考”),或者在提示结尾添加 “Don’t make anything up” 或“Only use the provided context”这样的句子。

对DSPy中的模块进行模板化和参数化,以抽象这些提示技术。这意味着它们用于通过应用提示、微调、增强和推理技术使DSPy签名适应任务。

将签名传递给ChainOfThought模块,然后使用输入字段contextquestion的值进行调用。

使用ChainOfThought初步实施签名“context, question -> answer”

在撰写本文时,DSPy实现了以下六个Module:

  • dspy.Predict:处理输入和输出字段,生成指令,并为指定的signature创建模板。
  • dspy.ChainOfThought:继承了Predict模块,并增加了“ Chain of Thought “处理的功能。
  • dspy.ChainOfThoughtWithHint:继承了Predict模块,并增强了ChainOfThought模块,增加了提供推理提示的选项。
  • dspy.MultiChainComparison:继承了Predict模块,并增加了多链比较的功能。
  • dspy.Retrieve:从检索器模块检索段落。
  • dspy.ReAct:旨在组成思想,行动和观察的交错步骤。
python代码解读复制代码from dsp.utils import deduplicate      class SimplifiedBaleen(dspy.Module):       
def __init__(self, passages_per_hop=3, max_hops=2):           
super().__init__()              
self.generate_query = [dspy.ChainOfThought(GenerateSearchQuery) for _ in range(max_hops)]  
# 多跳,每一跳都使用一个dspy.ChainOfThought           
self.retrieve = dspy.Retrieve(k=passages_per_hop)           
self.generate_answer = dspy.ChainOfThought(GenerateAnswer)           
self.max_hops = max_hops          def forward(self, question):           
context = []                      
for hop in range(self.max_hops):               
query = self.generate_query[hop](context=context, question=question).query       
passages = self.retrieve(query).passages               
context = deduplicate(context + passages)              
pred = self.generate_answer(context=context, question=question)           
return dspy.Prediction(context=context, answer=pred.answer)   

测试

python代码解读复制代码my_question = "How many storeys are in the castle that David Gregory inherited?"  
uncompiled_baleen = SimplifiedBaleen()     
pred = uncompiled_baleen(my_question)      
print(f"Question: {my_question}")   
print(f"Predicted Answer: {pred.answer}")   
print(f"Retrieved Contexts (truncated): {[c[:200] + '...' for c in pred.context]}")   

优化

上面提到过,可以用某个打分来优化DSPY的结果,定义一个评估函数

  • 预测答案与真实答案相符。
  • 检索到的上下文包含真实答案
  • 生成的搜索查询不能太杂乱,小于100个字符
  • 生成的搜索查询尽量不要重复(跟历史的相比,不能超过0.8)。
python代码解读复制代码def validate_context_and_answer_and_hops(example, pred, trace=None):       
if not dspy.evaluate.answer_exact_match(example, pred): return False       
if not dspy.evaluate.answer_passage_match(example, pred): return False          
hops = [example.question] + [outputs.query for *_, outputs in trace if 'query' in outputs]          
if max([len(h) for h in hops]) > 100: return False       
if any(dspy.evaluate.answer_exact_match_str(hops[idx], hops[:idx], frac=0.8) for idx in range(2, len(hops))): return False          
return True   

使用 DSPy 中的BootstrapFewShot,通过少量示例来优化流程的预测器。 在撰写本文时,DSPy实现了以下五个提词器:

  • dspy.LabeledFewShot:定义预测器使用的k个样本数。
  • dspy.BootstrapFewShot:引导Few-Shot。
  • dspy.BootstrapFewShotWithRandomSearch:继承了BootstrapFewShot提词器,并为随机搜索过程引入了额外的属性。
  • dspy.BootstrapFinetune:t将提词器定义为用于微调编译的BootstrapFewShot实例。
  • dspy.Ensemble:创建多个程序的集成版本,将不同程序的各种输出减少到单个输出。 还有SignatureOptimizer和BayesianSignatureOptimizer,它们在zero/few-shot 设置中改善模块中签名的输出前缀和指令。

不同的提词器在优化成本和质量等方面提供了不同的权衡。

python代码解读复制代码from dspy.teleprompt import BootstrapFewShot      
teleprompter = BootstrapFewShot(metric=validate_context_and_answer_and_hops)   
compiled_baleen = teleprompter.compile(SimplifiedBaleen(), teacher=SimplifiedBaleen(passages_per_hop=2), trainset=trainset)   

评估

python代码解读复制代码from dspy.evaluate.evaluate import Evaluate         
def gold_passages_retrieved(example, pred, trace=None):       
gold_titles = set(map(dspy.evaluate.normalize_text, example["gold_titles"]))       
found_titles = set(           
map(dspy.evaluate.normalize_text, [c.split(" | ")[0] for c in pred.context])       
)       
return gold_titles.issubset(found_titles)      
evaluate_on_hotpotqa = Evaluate(devset=devset, num_threads=1, display_progress=True, display_table=5)      
uncompiled_baleen_retrieval_score = evaluate_on_hotpotqa(uncompiled_baleen, metric=gold_passages_retrieved, display=False)      
compiled_baleen_retrieval_score = evaluate_on_hotpotqa(compiled_baleen, metric=gold_passages_retrieved)      
print(f"## Retrieval Score for uncompiled Baleen: {uncompiled_baleen_retrieval_score}")   
print(f"## Retrieval Score for compiled Baleen: {compiled_baleen_retrieval_score}")         
#Output   
## Retrieval Score for uncompiled Baleen: 36.0   
## Retrieval Score for compiled Baleen: 60.0   

DSPy与LangChain或LlamaIndex有何不同?

LangChain、LlamaIndex和DSPy都是帮助开发人员轻松构建基于LM的应用的框架。使用LangChain和LlamaIndex的典型pipeline通常使用prompt template来实现,这使得整个pipeline对组件更改非常敏感。相比之下,DSPy将构建基于LM的管道从操作prompt 转移到更贴近编程。

DSPy中新引入的编译器在更改基于LM的应用程序(如LM或数据)中的部件时,消除了任何额外的Prompt工程或微调工作。相反,开发人员可以简单地重新编译程序,以优化pipeline适应新添加的更改。因此,与LangChain或LlamaIndex相比,DSPy可以帮助开发人员以更少的努力获得pipeline的性能。

总结

本文我们一是回顾了prompt使用过程中的痛点和问题,同时介绍了DSPy一种program的全新的大模型应用方式,并通过一个例子初步了解了DSPy是如何工作的,目前生成式人工智能社区对该框架非常感兴趣。DSPy 框架引入了一系列概念,将构建基于 LM 的应用程序从手动提示工程转向编程。

大模型资源分享

针对所有自学遇到困难的同学,我为大家系统梳理了大模型学习的脉络,并且分享这份LLM大模型资料:其中包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等。😝有需要的小伙伴,可以扫描下方二维码免费领取↓↓↓

在这里插入图片描述

一、全套 AGI 大模型学习路线

AI 大模型时代的精彩学习之旅:从根基铸就到前沿探索,牢牢掌握人工智能核心技能!

在这里插入图片描述

二、640 套 AI 大模型报告合集

此套涵盖 640 份报告的精彩合集,全面涉及 AI 大模型的理论研究、技术实现以及行业应用等诸多方面。无论你是科研工作者、工程师,还是对 AI 大模型满怀热忱的爱好者,这套报告合集都将为你呈上宝贵的信息与深刻的启示。

在这里插入图片描述

三、AI 大模型经典 PDF 书籍

伴随人工智能技术的迅猛发展,AI 大模型已然成为当今科技领域的一大热点。这些大型预训练模型,诸如 GPT-3、BERT、XLNet 等,凭借其强大的语言理解与生成能力,正在重塑我们对人工智能的认知。而以下这些 PDF 书籍无疑是极为出色的学习资源。
在这里插入图片描述
在这里插入图片描述

阶段 1:AI 大模型时代的基础认知

  • 目标:深入洞悉 AI 大模型的基本概念、发展历程以及核心原理。

  • 内容

    • L1.1 人工智能概述与大模型起源探寻。
    • L1.2 大模型与通用人工智能的紧密关联。
    • L1.3 GPT 模型的辉煌发展历程。
    • L1.4 模型工程解析。
    • L1.4.1 知识大模型阐释。
    • L1.4.2 生产大模型剖析。
    • L1.4.3 模型工程方法论阐述。
    • L1.4.4 模型工程实践展示。
    • L1.5 GPT 应用案例分享。

阶段 2:AI 大模型 API 应用开发工程

  • 目标:熟练掌握 AI 大模型 API 的运用与开发,以及相关编程技能。

  • 内容

    • L2.1 API 接口详解。
    • L2.1.1 OpenAI API 接口解读。
    • L2.1.2 Python 接口接入指南。
    • L2.1.3 BOT 工具类框架介绍。
    • L2.1.4 代码示例呈现。
    • L2.2 Prompt 框架阐释。
    • L2.2.1 何为 Prompt。
    • L2.2.2 Prompt 框架应用现状分析。
    • L2.2.3 基于 GPTAS 的 Prompt 框架剖析。
    • L2.2.4 Prompt 框架与 Thought 的关联探讨。
    • L2.2.5 Prompt 框架与提示词的深入解读。
    • L2.3 流水线工程阐述。
    • L2.3.1 流水线工程的概念解析。
    • L2.3.2 流水线工程的优势展现。
    • L2.3.3 流水线工程的应用场景探索。
    • L2.4 总结与展望。

阶段 3:AI 大模型应用架构实践

  • 目标:深刻理解 AI 大模型的应用架构,并能够实现私有化部署。

  • 内容

    • L3.1 Agent 模型框架解读。
    • L3.1.1 Agent 模型框架的设计理念阐述。
    • L3.1.2 Agent 模型框架的核心组件剖析。
    • L3.1.3 Agent 模型框架的实现细节展示。
    • L3.2 MetaGPT 详解。
    • L3.2.1 MetaGPT 的基本概念阐释。
    • L3.2.2 MetaGPT 的工作原理剖析。
    • L3.2.3 MetaGPT 的应用场景探讨。
    • L3.3 ChatGLM 解析。
    • L3.3.1 ChatGLM 的特色呈现。
    • L3.3.2 ChatGLM 的开发环境介绍。
    • L3.3.3 ChatGLM 的使用示例展示。
    • L3.4 LLAMA 阐释。
    • L3.4.1 LLAMA 的特点剖析。
    • L3.4.2 LLAMA 的开发环境说明。
    • L3.4.3 LLAMA 的使用示例呈现。
    • L3.5 其他大模型介绍。

阶段 4:AI 大模型私有化部署

  • 目标:熟练掌握多种 AI 大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述。
    • L4.2 模型私有化部署的关键技术解析。
    • L4.3 模型私有化部署的实施步骤详解。
    • L4.4 模型私有化部署的应用场景探讨。

学习计划:

  • 阶段 1:历时 1 至 2 个月,构建起 AI 大模型的基础知识体系。
  • 阶段 2:花费 2 至 3 个月,专注于提升 API 应用开发能力。
  • 阶段 3:用 3 至 4 个月,深入实践 AI 大模型的应用架构与私有化部署。
  • 阶段 4:历经 4 至 5 个月,专注于高级模型的应用与部署。
    在这里插入图片描述

http://www.mrgr.cn/news/30106.html

相关文章:

  • 基于JavaSwing实现的酒店管理系统
  • Android插件化(四)基础之文件存储
  • Java线程---锁机制
  • 【记录一下】jenkins的安装与部署教程
  • 从北大张泽民院士团队的研究成果中寻找医学AI未来的发展方向|个人观点·24-09-19
  • 【日记】书荒了(337 字)
  • 耐压110V茂睿芯MK9019可以向下兼容MK9016
  • 电脑怎么设置开机密码?3个方法迅速搞定!
  • 大华主动注册协议接入SVMSPro平台
  • 【数据结构】排序算法---计数排序
  • python多进程程序设计 之三
  • 最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)
  • 如何将MySQL卸载干净(win11)
  • C++学习, 异常处理
  • Docker常用命令总结
  • Java线程池运行流程、配置参数及线程池类型
  • MATLAB系列08:输入/输入函数
  • 江协科技STM32学习- P13 TIM定时器中断
  • 探秘Python中的链表:从零开始的奇妙之旅
  • JAVA惊喜连连无限可能沉浸式盲盒商城系统小程序源码